@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.
Files changed (80) hide show
  1. package/README.md +1134 -0
  2. package/dist/animation.cjs.js +505 -0
  3. package/dist/animation.cjs.js.map +1 -0
  4. package/dist/animation.d.ts +235 -0
  5. package/dist/animation.esm.js +500 -0
  6. package/dist/animation.esm.js.map +1 -0
  7. package/dist/assets.cjs.js +148 -0
  8. package/dist/assets.cjs.js.map +1 -0
  9. package/dist/assets.d.ts +97 -0
  10. package/dist/assets.esm.js +146 -0
  11. package/dist/assets.esm.js.map +1 -0
  12. package/dist/audio.cjs.js +345 -0
  13. package/dist/audio.cjs.js.map +1 -0
  14. package/dist/audio.d.ts +135 -0
  15. package/dist/audio.esm.js +343 -0
  16. package/dist/audio.esm.js.map +1 -0
  17. package/dist/core.cjs.js +1832 -0
  18. package/dist/core.cjs.js.map +1 -0
  19. package/dist/core.d.ts +633 -0
  20. package/dist/core.esm.js +1827 -0
  21. package/dist/core.esm.js.map +1 -0
  22. package/dist/debug.cjs.js +298 -0
  23. package/dist/debug.cjs.js.map +1 -0
  24. package/dist/debug.d.ts +114 -0
  25. package/dist/debug.esm.js +295 -0
  26. package/dist/debug.esm.js.map +1 -0
  27. package/dist/index.cjs.js +3623 -0
  28. package/dist/index.cjs.js.map +1 -0
  29. package/dist/index.d.ts +1607 -0
  30. package/dist/index.esm.js +3598 -0
  31. package/dist/index.esm.js.map +1 -0
  32. package/dist/ui.cjs.js +1081 -0
  33. package/dist/ui.cjs.js.map +1 -0
  34. package/dist/ui.d.ts +387 -0
  35. package/dist/ui.esm.js +1072 -0
  36. package/dist/ui.esm.js.map +1 -0
  37. package/dist/vite.cjs.js +125 -0
  38. package/dist/vite.cjs.js.map +1 -0
  39. package/dist/vite.d.ts +42 -0
  40. package/dist/vite.esm.js +122 -0
  41. package/dist/vite.esm.js.map +1 -0
  42. package/package.json +107 -0
  43. package/src/animation/Easing.ts +116 -0
  44. package/src/animation/SpineHelper.ts +162 -0
  45. package/src/animation/Timeline.ts +138 -0
  46. package/src/animation/Tween.ts +225 -0
  47. package/src/animation/index.ts +4 -0
  48. package/src/assets/AssetManager.ts +174 -0
  49. package/src/assets/index.ts +2 -0
  50. package/src/audio/AudioManager.ts +366 -0
  51. package/src/audio/index.ts +1 -0
  52. package/src/core/EventEmitter.ts +47 -0
  53. package/src/core/GameApplication.ts +306 -0
  54. package/src/core/Scene.ts +48 -0
  55. package/src/core/SceneManager.ts +258 -0
  56. package/src/core/index.ts +4 -0
  57. package/src/debug/DevBridge.ts +259 -0
  58. package/src/debug/FPSOverlay.ts +102 -0
  59. package/src/debug/index.ts +3 -0
  60. package/src/index.ts +71 -0
  61. package/src/input/InputManager.ts +171 -0
  62. package/src/input/index.ts +1 -0
  63. package/src/loading/CSSPreloader.ts +155 -0
  64. package/src/loading/LoadingScene.ts +356 -0
  65. package/src/loading/index.ts +2 -0
  66. package/src/state/StateMachine.ts +228 -0
  67. package/src/state/index.ts +1 -0
  68. package/src/types.ts +218 -0
  69. package/src/ui/BalanceDisplay.ts +155 -0
  70. package/src/ui/Button.ts +199 -0
  71. package/src/ui/Label.ts +111 -0
  72. package/src/ui/Modal.ts +134 -0
  73. package/src/ui/Panel.ts +125 -0
  74. package/src/ui/ProgressBar.ts +121 -0
  75. package/src/ui/Toast.ts +124 -0
  76. package/src/ui/WinDisplay.ts +133 -0
  77. package/src/ui/index.ts +16 -0
  78. package/src/viewport/ViewportManager.ts +241 -0
  79. package/src/viewport/index.ts +1 -0
  80. package/src/vite/index.ts +153 -0
@@ -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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"}