@energy8platform/game-engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1134 -0
- package/dist/animation.cjs.js +505 -0
- package/dist/animation.cjs.js.map +1 -0
- package/dist/animation.d.ts +235 -0
- package/dist/animation.esm.js +500 -0
- package/dist/animation.esm.js.map +1 -0
- package/dist/assets.cjs.js +148 -0
- package/dist/assets.cjs.js.map +1 -0
- package/dist/assets.d.ts +97 -0
- package/dist/assets.esm.js +146 -0
- package/dist/assets.esm.js.map +1 -0
- package/dist/audio.cjs.js +345 -0
- package/dist/audio.cjs.js.map +1 -0
- package/dist/audio.d.ts +135 -0
- package/dist/audio.esm.js +343 -0
- package/dist/audio.esm.js.map +1 -0
- package/dist/core.cjs.js +1832 -0
- package/dist/core.cjs.js.map +1 -0
- package/dist/core.d.ts +633 -0
- package/dist/core.esm.js +1827 -0
- package/dist/core.esm.js.map +1 -0
- package/dist/debug.cjs.js +298 -0
- package/dist/debug.cjs.js.map +1 -0
- package/dist/debug.d.ts +114 -0
- package/dist/debug.esm.js +295 -0
- package/dist/debug.esm.js.map +1 -0
- package/dist/index.cjs.js +3623 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +1607 -0
- package/dist/index.esm.js +3598 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/ui.cjs.js +1081 -0
- package/dist/ui.cjs.js.map +1 -0
- package/dist/ui.d.ts +387 -0
- package/dist/ui.esm.js +1072 -0
- package/dist/ui.esm.js.map +1 -0
- package/dist/vite.cjs.js +125 -0
- package/dist/vite.cjs.js.map +1 -0
- package/dist/vite.d.ts +42 -0
- package/dist/vite.esm.js +122 -0
- package/dist/vite.esm.js.map +1 -0
- package/package.json +107 -0
- package/src/animation/Easing.ts +116 -0
- package/src/animation/SpineHelper.ts +162 -0
- package/src/animation/Timeline.ts +138 -0
- package/src/animation/Tween.ts +225 -0
- package/src/animation/index.ts +4 -0
- package/src/assets/AssetManager.ts +174 -0
- package/src/assets/index.ts +2 -0
- package/src/audio/AudioManager.ts +366 -0
- package/src/audio/index.ts +1 -0
- package/src/core/EventEmitter.ts +47 -0
- package/src/core/GameApplication.ts +306 -0
- package/src/core/Scene.ts +48 -0
- package/src/core/SceneManager.ts +258 -0
- package/src/core/index.ts +4 -0
- package/src/debug/DevBridge.ts +259 -0
- package/src/debug/FPSOverlay.ts +102 -0
- package/src/debug/index.ts +3 -0
- package/src/index.ts +71 -0
- package/src/input/InputManager.ts +171 -0
- package/src/input/index.ts +1 -0
- package/src/loading/CSSPreloader.ts +155 -0
- package/src/loading/LoadingScene.ts +356 -0
- package/src/loading/index.ts +2 -0
- package/src/state/StateMachine.ts +228 -0
- package/src/state/index.ts +1 -0
- package/src/types.ts +218 -0
- package/src/ui/BalanceDisplay.ts +155 -0
- package/src/ui/Button.ts +199 -0
- package/src/ui/Label.ts +111 -0
- package/src/ui/Modal.ts +134 -0
- package/src/ui/Panel.ts +125 -0
- package/src/ui/ProgressBar.ts +121 -0
- package/src/ui/Toast.ts +124 -0
- package/src/ui/WinDisplay.ts +133 -0
- package/src/ui/index.ts +16 -0
- package/src/viewport/ViewportManager.ts +241 -0
- package/src/viewport/index.ts +1 -0
- package/src/vite/index.ts +153 -0
package/dist/audio.d.ts
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
interface AudioConfig {
|
|
2
|
+
/** Default volumes per category (0..1) */
|
|
3
|
+
music?: number;
|
|
4
|
+
sfx?: number;
|
|
5
|
+
ui?: number;
|
|
6
|
+
ambient?: number;
|
|
7
|
+
/** Persist mute state in localStorage */
|
|
8
|
+
persist?: boolean;
|
|
9
|
+
/** LocalStorage key prefix */
|
|
10
|
+
storageKey?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type AudioCategoryName = 'music' | 'sfx' | 'ui' | 'ambient';
|
|
14
|
+
/**
|
|
15
|
+
* Manages all game audio: music, SFX, UI sounds, ambient.
|
|
16
|
+
*
|
|
17
|
+
* Optional dependency on @pixi/sound — if not installed, AudioManager
|
|
18
|
+
* operates as a silent no-op (graceful degradation).
|
|
19
|
+
*
|
|
20
|
+
* Features:
|
|
21
|
+
* - Per-category volume control (music, sfx, ui, ambient)
|
|
22
|
+
* - Music crossfade and looping
|
|
23
|
+
* - Mobile audio unlock on first interaction
|
|
24
|
+
* - Mute state persistence in localStorage
|
|
25
|
+
* - Global mute/unmute
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const audio = new AudioManager({ music: 0.5, sfx: 0.8 });
|
|
30
|
+
* await audio.init();
|
|
31
|
+
* audio.playMusic('bg-music');
|
|
32
|
+
* audio.play('spin-click', 'sfx');
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare class AudioManager {
|
|
36
|
+
private _soundModule;
|
|
37
|
+
private _initialized;
|
|
38
|
+
private _globalMuted;
|
|
39
|
+
private _persist;
|
|
40
|
+
private _storageKey;
|
|
41
|
+
private _categories;
|
|
42
|
+
private _currentMusic;
|
|
43
|
+
private _unlocked;
|
|
44
|
+
private _unlockHandler;
|
|
45
|
+
constructor(config?: AudioConfig);
|
|
46
|
+
/** Whether the audio system is initialized */
|
|
47
|
+
get initialized(): boolean;
|
|
48
|
+
/** Whether audio is globally muted */
|
|
49
|
+
get muted(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Initialize the audio system.
|
|
52
|
+
* Dynamically imports @pixi/sound to keep it optional.
|
|
53
|
+
*/
|
|
54
|
+
init(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Play a sound effect.
|
|
57
|
+
*
|
|
58
|
+
* @param alias - Sound alias (must be loaded via AssetManager)
|
|
59
|
+
* @param category - Audio category (default: 'sfx')
|
|
60
|
+
* @param options - Additional play options
|
|
61
|
+
*/
|
|
62
|
+
play(alias: string, category?: AudioCategoryName, options?: {
|
|
63
|
+
volume?: number;
|
|
64
|
+
loop?: boolean;
|
|
65
|
+
speed?: number;
|
|
66
|
+
}): void;
|
|
67
|
+
/**
|
|
68
|
+
* Play background music with optional crossfade.
|
|
69
|
+
*
|
|
70
|
+
* @param alias - Music alias
|
|
71
|
+
* @param fadeDuration - Crossfade duration in ms (default: 500)
|
|
72
|
+
*/
|
|
73
|
+
playMusic(alias: string, fadeDuration?: number): void;
|
|
74
|
+
/**
|
|
75
|
+
* Stop current music.
|
|
76
|
+
*/
|
|
77
|
+
stopMusic(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Stop all sounds.
|
|
80
|
+
*/
|
|
81
|
+
stopAll(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Set volume for a category.
|
|
84
|
+
*/
|
|
85
|
+
setVolume(category: AudioCategoryName, volume: number): void;
|
|
86
|
+
/**
|
|
87
|
+
* Get volume for a category.
|
|
88
|
+
*/
|
|
89
|
+
getVolume(category: AudioCategoryName): number;
|
|
90
|
+
/**
|
|
91
|
+
* Mute a specific category.
|
|
92
|
+
*/
|
|
93
|
+
muteCategory(category: AudioCategoryName): void;
|
|
94
|
+
/**
|
|
95
|
+
* Unmute a specific category.
|
|
96
|
+
*/
|
|
97
|
+
unmuteCategory(category: AudioCategoryName): void;
|
|
98
|
+
/**
|
|
99
|
+
* Toggle mute for a category.
|
|
100
|
+
*/
|
|
101
|
+
toggleCategory(category: AudioCategoryName): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Mute all audio globally.
|
|
104
|
+
*/
|
|
105
|
+
muteAll(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Unmute all audio globally.
|
|
108
|
+
*/
|
|
109
|
+
unmuteAll(): void;
|
|
110
|
+
/**
|
|
111
|
+
* Toggle global mute.
|
|
112
|
+
*/
|
|
113
|
+
toggleMute(): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Duck music volume (e.g., during big win presentation).
|
|
116
|
+
*
|
|
117
|
+
* @param factor - Volume multiplier (0..1), e.g. 0.3 = 30% of normal
|
|
118
|
+
*/
|
|
119
|
+
duckMusic(factor: number): void;
|
|
120
|
+
/**
|
|
121
|
+
* Restore music to normal volume after ducking.
|
|
122
|
+
*/
|
|
123
|
+
unduckMusic(): void;
|
|
124
|
+
/**
|
|
125
|
+
* Destroy the audio manager and free resources.
|
|
126
|
+
*/
|
|
127
|
+
destroy(): void;
|
|
128
|
+
private applyVolumes;
|
|
129
|
+
private setupMobileUnlock;
|
|
130
|
+
private removeMobileUnlock;
|
|
131
|
+
private saveState;
|
|
132
|
+
private restoreState;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { AudioManager };
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages all game audio: music, SFX, UI sounds, ambient.
|
|
3
|
+
*
|
|
4
|
+
* Optional dependency on @pixi/sound — if not installed, AudioManager
|
|
5
|
+
* operates as a silent no-op (graceful degradation).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Per-category volume control (music, sfx, ui, ambient)
|
|
9
|
+
* - Music crossfade and looping
|
|
10
|
+
* - Mobile audio unlock on first interaction
|
|
11
|
+
* - Mute state persistence in localStorage
|
|
12
|
+
* - Global mute/unmute
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const audio = new AudioManager({ music: 0.5, sfx: 0.8 });
|
|
17
|
+
* await audio.init();
|
|
18
|
+
* audio.playMusic('bg-music');
|
|
19
|
+
* audio.play('spin-click', 'sfx');
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
class AudioManager {
|
|
23
|
+
_soundModule = null;
|
|
24
|
+
_initialized = false;
|
|
25
|
+
_globalMuted = false;
|
|
26
|
+
_persist;
|
|
27
|
+
_storageKey;
|
|
28
|
+
_categories;
|
|
29
|
+
_currentMusic = null;
|
|
30
|
+
_unlocked = false;
|
|
31
|
+
_unlockHandler = null;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this._persist = config?.persist ?? true;
|
|
34
|
+
this._storageKey = config?.storageKey ?? 'ge_audio';
|
|
35
|
+
this._categories = {
|
|
36
|
+
music: { volume: config?.music ?? 0.7, muted: false },
|
|
37
|
+
sfx: { volume: config?.sfx ?? 1.0, muted: false },
|
|
38
|
+
ui: { volume: config?.ui ?? 0.8, muted: false },
|
|
39
|
+
ambient: { volume: config?.ambient ?? 0.5, muted: false },
|
|
40
|
+
};
|
|
41
|
+
// Restore persisted state
|
|
42
|
+
if (this._persist) {
|
|
43
|
+
this.restoreState();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Whether the audio system is initialized */
|
|
47
|
+
get initialized() {
|
|
48
|
+
return this._initialized;
|
|
49
|
+
}
|
|
50
|
+
/** Whether audio is globally muted */
|
|
51
|
+
get muted() {
|
|
52
|
+
return this._globalMuted;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Initialize the audio system.
|
|
56
|
+
* Dynamically imports @pixi/sound to keep it optional.
|
|
57
|
+
*/
|
|
58
|
+
async init() {
|
|
59
|
+
if (this._initialized)
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
this._soundModule = await import('@pixi/sound');
|
|
63
|
+
this._initialized = true;
|
|
64
|
+
this.applyVolumes();
|
|
65
|
+
this.setupMobileUnlock();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
console.warn('[AudioManager] @pixi/sound not available. Audio disabled.');
|
|
69
|
+
this._initialized = false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Play a sound effect.
|
|
74
|
+
*
|
|
75
|
+
* @param alias - Sound alias (must be loaded via AssetManager)
|
|
76
|
+
* @param category - Audio category (default: 'sfx')
|
|
77
|
+
* @param options - Additional play options
|
|
78
|
+
*/
|
|
79
|
+
play(alias, category = 'sfx', options) {
|
|
80
|
+
if (!this._initialized || !this._soundModule)
|
|
81
|
+
return;
|
|
82
|
+
if (this._globalMuted || this._categories[category].muted)
|
|
83
|
+
return;
|
|
84
|
+
const { sound } = this._soundModule;
|
|
85
|
+
const vol = (options?.volume ?? 1) * this._categories[category].volume;
|
|
86
|
+
try {
|
|
87
|
+
sound.play(alias, {
|
|
88
|
+
volume: vol,
|
|
89
|
+
loop: options?.loop ?? false,
|
|
90
|
+
speed: options?.speed ?? 1,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
console.warn(`[AudioManager] Failed to play "${alias}":`, e);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Play background music with optional crossfade.
|
|
99
|
+
*
|
|
100
|
+
* @param alias - Music alias
|
|
101
|
+
* @param fadeDuration - Crossfade duration in ms (default: 500)
|
|
102
|
+
*/
|
|
103
|
+
playMusic(alias, fadeDuration = 500) {
|
|
104
|
+
if (!this._initialized || !this._soundModule)
|
|
105
|
+
return;
|
|
106
|
+
const { sound } = this._soundModule;
|
|
107
|
+
// Stop current music
|
|
108
|
+
if (this._currentMusic) {
|
|
109
|
+
try {
|
|
110
|
+
sound.stop(this._currentMusic);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// ignore
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
this._currentMusic = alias;
|
|
117
|
+
if (this._globalMuted || this._categories.music.muted)
|
|
118
|
+
return;
|
|
119
|
+
try {
|
|
120
|
+
sound.play(alias, {
|
|
121
|
+
volume: this._categories.music.volume,
|
|
122
|
+
loop: true,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
console.warn(`[AudioManager] Failed to play music "${alias}":`, e);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Stop current music.
|
|
131
|
+
*/
|
|
132
|
+
stopMusic() {
|
|
133
|
+
if (!this._initialized || !this._soundModule || !this._currentMusic)
|
|
134
|
+
return;
|
|
135
|
+
const { sound } = this._soundModule;
|
|
136
|
+
try {
|
|
137
|
+
sound.stop(this._currentMusic);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// ignore
|
|
141
|
+
}
|
|
142
|
+
this._currentMusic = null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Stop all sounds.
|
|
146
|
+
*/
|
|
147
|
+
stopAll() {
|
|
148
|
+
if (!this._initialized || !this._soundModule)
|
|
149
|
+
return;
|
|
150
|
+
const { sound } = this._soundModule;
|
|
151
|
+
sound.stopAll();
|
|
152
|
+
this._currentMusic = null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Set volume for a category.
|
|
156
|
+
*/
|
|
157
|
+
setVolume(category, volume) {
|
|
158
|
+
this._categories[category].volume = Math.max(0, Math.min(1, volume));
|
|
159
|
+
this.applyVolumes();
|
|
160
|
+
this.saveState();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get volume for a category.
|
|
164
|
+
*/
|
|
165
|
+
getVolume(category) {
|
|
166
|
+
return this._categories[category].volume;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Mute a specific category.
|
|
170
|
+
*/
|
|
171
|
+
muteCategory(category) {
|
|
172
|
+
this._categories[category].muted = true;
|
|
173
|
+
this.applyVolumes();
|
|
174
|
+
this.saveState();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Unmute a specific category.
|
|
178
|
+
*/
|
|
179
|
+
unmuteCategory(category) {
|
|
180
|
+
this._categories[category].muted = false;
|
|
181
|
+
this.applyVolumes();
|
|
182
|
+
this.saveState();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Toggle mute for a category.
|
|
186
|
+
*/
|
|
187
|
+
toggleCategory(category) {
|
|
188
|
+
this._categories[category].muted = !this._categories[category].muted;
|
|
189
|
+
this.applyVolumes();
|
|
190
|
+
this.saveState();
|
|
191
|
+
return this._categories[category].muted;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Mute all audio globally.
|
|
195
|
+
*/
|
|
196
|
+
muteAll() {
|
|
197
|
+
this._globalMuted = true;
|
|
198
|
+
if (this._soundModule) {
|
|
199
|
+
this._soundModule.sound.muteAll();
|
|
200
|
+
}
|
|
201
|
+
this.saveState();
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Unmute all audio globally.
|
|
205
|
+
*/
|
|
206
|
+
unmuteAll() {
|
|
207
|
+
this._globalMuted = false;
|
|
208
|
+
if (this._soundModule) {
|
|
209
|
+
this._soundModule.sound.unmuteAll();
|
|
210
|
+
}
|
|
211
|
+
this.saveState();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Toggle global mute.
|
|
215
|
+
*/
|
|
216
|
+
toggleMute() {
|
|
217
|
+
if (this._globalMuted) {
|
|
218
|
+
this.unmuteAll();
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
this.muteAll();
|
|
222
|
+
}
|
|
223
|
+
return this._globalMuted;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Duck music volume (e.g., during big win presentation).
|
|
227
|
+
*
|
|
228
|
+
* @param factor - Volume multiplier (0..1), e.g. 0.3 = 30% of normal
|
|
229
|
+
*/
|
|
230
|
+
duckMusic(factor) {
|
|
231
|
+
if (!this._initialized || !this._soundModule || !this._currentMusic)
|
|
232
|
+
return;
|
|
233
|
+
const { sound } = this._soundModule;
|
|
234
|
+
const vol = this._categories.music.volume * factor;
|
|
235
|
+
try {
|
|
236
|
+
sound.volume(this._currentMusic, vol);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// ignore
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Restore music to normal volume after ducking.
|
|
244
|
+
*/
|
|
245
|
+
unduckMusic() {
|
|
246
|
+
if (!this._initialized || !this._soundModule || !this._currentMusic)
|
|
247
|
+
return;
|
|
248
|
+
const { sound } = this._soundModule;
|
|
249
|
+
try {
|
|
250
|
+
sound.volume(this._currentMusic, this._categories.music.volume);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// ignore
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Destroy the audio manager and free resources.
|
|
258
|
+
*/
|
|
259
|
+
destroy() {
|
|
260
|
+
this.stopAll();
|
|
261
|
+
this.removeMobileUnlock();
|
|
262
|
+
if (this._soundModule) {
|
|
263
|
+
this._soundModule.sound.removeAll();
|
|
264
|
+
}
|
|
265
|
+
this._initialized = false;
|
|
266
|
+
}
|
|
267
|
+
// ─── Private ───────────────────────────────────────────
|
|
268
|
+
applyVolumes() {
|
|
269
|
+
if (!this._soundModule)
|
|
270
|
+
return;
|
|
271
|
+
const { sound } = this._soundModule;
|
|
272
|
+
sound.volumeAll = this._globalMuted ? 0 : 1;
|
|
273
|
+
}
|
|
274
|
+
setupMobileUnlock() {
|
|
275
|
+
if (this._unlocked)
|
|
276
|
+
return;
|
|
277
|
+
this._unlockHandler = () => {
|
|
278
|
+
if (!this._soundModule)
|
|
279
|
+
return;
|
|
280
|
+
const { sound } = this._soundModule;
|
|
281
|
+
// Resume WebAudio context
|
|
282
|
+
if (sound.context?.audioContext?.state === 'suspended') {
|
|
283
|
+
sound.context.audioContext.resume();
|
|
284
|
+
}
|
|
285
|
+
this._unlocked = true;
|
|
286
|
+
this.removeMobileUnlock();
|
|
287
|
+
};
|
|
288
|
+
const events = ['touchstart', 'mousedown', 'pointerdown', 'keydown'];
|
|
289
|
+
for (const event of events) {
|
|
290
|
+
document.addEventListener(event, this._unlockHandler, { once: true });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
removeMobileUnlock() {
|
|
294
|
+
if (!this._unlockHandler)
|
|
295
|
+
return;
|
|
296
|
+
const events = ['touchstart', 'mousedown', 'pointerdown', 'keydown'];
|
|
297
|
+
for (const event of events) {
|
|
298
|
+
document.removeEventListener(event, this._unlockHandler);
|
|
299
|
+
}
|
|
300
|
+
this._unlockHandler = null;
|
|
301
|
+
}
|
|
302
|
+
saveState() {
|
|
303
|
+
if (!this._persist)
|
|
304
|
+
return;
|
|
305
|
+
try {
|
|
306
|
+
const state = {
|
|
307
|
+
globalMuted: this._globalMuted,
|
|
308
|
+
categories: this._categories,
|
|
309
|
+
};
|
|
310
|
+
localStorage.setItem(this._storageKey, JSON.stringify(state));
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// localStorage may not be available
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
restoreState() {
|
|
317
|
+
try {
|
|
318
|
+
const raw = localStorage.getItem(this._storageKey);
|
|
319
|
+
if (!raw)
|
|
320
|
+
return;
|
|
321
|
+
const state = JSON.parse(raw);
|
|
322
|
+
if (typeof state.globalMuted === 'boolean') {
|
|
323
|
+
this._globalMuted = state.globalMuted;
|
|
324
|
+
}
|
|
325
|
+
if (state.categories) {
|
|
326
|
+
for (const key of ['music', 'sfx', 'ui', 'ambient']) {
|
|
327
|
+
if (state.categories[key]) {
|
|
328
|
+
this._categories[key] = {
|
|
329
|
+
volume: state.categories[key].volume ?? this._categories[key].volume,
|
|
330
|
+
muted: state.categories[key].muted ?? false,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// ignore
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export { AudioManager };
|
|
343
|
+
//# sourceMappingURL=audio.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.esm.js","sources":["../src/audio/AudioManager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|