@energy8platform/game-engine 0.17.0 → 0.19.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/dist/audio.cjs.js +15 -5
- package/dist/audio.cjs.js.map +1 -1
- package/dist/audio.d.ts +5 -0
- package/dist/audio.esm.js +15 -5
- package/dist/audio.esm.js.map +1 -1
- package/dist/core.cjs.js +108 -19
- package/dist/core.cjs.js.map +1 -1
- package/dist/core.d.ts +46 -3
- package/dist/core.esm.js +109 -21
- package/dist/core.esm.js.map +1 -1
- package/dist/game-spec.cjs.js +13 -0
- package/dist/game-spec.cjs.js.map +1 -0
- package/dist/game-spec.d.ts +1 -0
- package/dist/game-spec.esm.js +2 -0
- package/dist/game-spec.esm.js.map +1 -0
- package/dist/host.cjs.js +3612 -0
- package/dist/host.cjs.js.map +1 -0
- package/dist/host.d.ts +1000 -0
- package/dist/host.esm.js +3603 -0
- package/dist/host.esm.js.map +1 -0
- package/dist/index.cjs.js +59 -19
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +19 -2
- package/dist/index.esm.js +59 -19
- package/dist/index.esm.js.map +1 -1
- package/dist/react.cjs.js.map +1 -1
- package/dist/react.d.ts +19 -2
- package/dist/react.esm.js.map +1 -1
- package/dist/shell.cjs.js +19 -0
- package/dist/shell.cjs.js.map +1 -0
- package/dist/shell.d.ts +1 -0
- package/dist/shell.esm.js +2 -0
- package/dist/shell.esm.js.map +1 -0
- package/dist/slot.cjs.js +998 -0
- package/dist/slot.cjs.js.map +1 -0
- package/dist/slot.d.ts +333 -0
- package/dist/slot.esm.js +985 -0
- package/dist/slot.esm.js.map +1 -0
- package/package.json +28 -2
- package/src/audio/AudioManager.ts +17 -5
- package/src/core/GameApplication.ts +38 -6
- package/src/core/index.ts +2 -0
- package/src/game-spec/index.ts +1 -0
- package/src/host/autoplay.ts +78 -0
- package/src/host/balanceGate.ts +46 -0
- package/src/host/buildConfig.ts +28 -0
- package/src/host/createSlotGame.ts +543 -0
- package/src/host/fatalError.ts +104 -0
- package/src/host/freeSpinsCounter.ts +44 -0
- package/src/host/index.ts +21 -0
- package/src/host/overlayController.ts +81 -0
- package/src/host/pauseController.ts +21 -0
- package/src/host/playError.ts +64 -0
- package/src/host/preboot.ts +25 -0
- package/src/host/replay.ts +9 -0
- package/src/host/runRound.ts +55 -0
- package/src/host/sceneAudio.ts +14 -0
- package/src/host/sceneController.ts +96 -0
- package/src/host/sceneStart.ts +25 -0
- package/src/host/shellConfig.ts +384 -0
- package/src/host/skipGesture.ts +24 -0
- package/src/host/slotPlay.ts +62 -0
- package/src/host/types.ts +74 -0
- package/src/scenes/IntroScene.ts +66 -0
- package/src/shell/index.ts +20 -0
- package/src/slot/anim/CascadeController.ts +102 -0
- package/src/slot/anim/ReelSpinController.ts +81 -0
- package/src/slot/anim/easing-map.ts +14 -0
- package/src/slot/freeSpins/FreeSpinsSession.ts +40 -0
- package/src/slot/grid/AnimatedSymbol.ts +68 -0
- package/src/slot/grid/ReelGrid.ts +92 -0
- package/src/slot/grid/SymbolCell.ts +127 -0
- package/src/slot/grid/SymbolView.ts +13 -0
- package/src/slot/index.ts +21 -0
- package/src/slot/multiplier/MultiplierAccumulator.ts +29 -0
- package/src/slot/overlay/BigWinOverlay.ts +89 -0
- package/src/slot/overlay/CountUpDisplay.ts +56 -0
- package/src/slot/overlay/tiers.ts +29 -0
- package/src/types.ts +3 -0
- package/src/viewport/ViewportManager.ts +19 -9
package/dist/audio.cjs.js
CHANGED
|
@@ -28,6 +28,7 @@ class AudioManager {
|
|
|
28
28
|
_persist;
|
|
29
29
|
_storageKey;
|
|
30
30
|
_categories;
|
|
31
|
+
_masterGain = 1.0;
|
|
31
32
|
_currentMusic = null;
|
|
32
33
|
_unlocked = false;
|
|
33
34
|
_unlockHandler = null;
|
|
@@ -87,7 +88,7 @@ class AudioManager {
|
|
|
87
88
|
if (this._globalMuted || this._categories[category].muted)
|
|
88
89
|
return;
|
|
89
90
|
const { sound } = this._soundModule;
|
|
90
|
-
const vol = (options?.volume ?? 1) * this._categories[category].volume;
|
|
91
|
+
const vol = (options?.volume ?? 1) * this._categories[category].volume * this._masterGain;
|
|
91
92
|
try {
|
|
92
93
|
sound.play(alias, {
|
|
93
94
|
volume: vol,
|
|
@@ -116,7 +117,7 @@ class AudioManager {
|
|
|
116
117
|
if (this._globalMuted || this._categories.music.muted)
|
|
117
118
|
return;
|
|
118
119
|
// Fade out the previous track
|
|
119
|
-
this.fadeVolume(prevAlias, this._categories.music.volume, 0, fadeDuration, () => {
|
|
120
|
+
this.fadeVolume(prevAlias, this._categories.music.volume * this._masterGain, 0, fadeDuration, () => {
|
|
120
121
|
try {
|
|
121
122
|
sound.stop(prevAlias);
|
|
122
123
|
}
|
|
@@ -128,7 +129,7 @@ class AudioManager {
|
|
|
128
129
|
volume: 0,
|
|
129
130
|
loop: true,
|
|
130
131
|
});
|
|
131
|
-
this.fadeVolume(alias, 0, this._categories.music.volume, fadeDuration);
|
|
132
|
+
this.fadeVolume(alias, 0, this._categories.music.volume * this._masterGain, fadeDuration);
|
|
132
133
|
}
|
|
133
134
|
catch (e) {
|
|
134
135
|
console.warn(`[AudioManager] Failed to play music "${alias}":`, e);
|
|
@@ -147,7 +148,7 @@ class AudioManager {
|
|
|
147
148
|
return;
|
|
148
149
|
try {
|
|
149
150
|
sound.play(alias, {
|
|
150
|
-
volume: this._categories.music.volume,
|
|
151
|
+
volume: this._categories.music.volume * this._masterGain,
|
|
151
152
|
loop: true,
|
|
152
153
|
});
|
|
153
154
|
}
|
|
@@ -181,6 +182,15 @@ class AudioManager {
|
|
|
181
182
|
sound.stopAll();
|
|
182
183
|
this._currentMusic = null;
|
|
183
184
|
}
|
|
185
|
+
/** Global gain (0..1) folded into every category's effective volume. Driven by the shell's
|
|
186
|
+
* 'master' settingChange. Does not affect the persisted per-category volumes. */
|
|
187
|
+
setMasterVolume(volume) {
|
|
188
|
+
this._masterGain = Math.max(0, Math.min(1, volume));
|
|
189
|
+
this.applyVolumes();
|
|
190
|
+
}
|
|
191
|
+
getMasterVolume() {
|
|
192
|
+
return this._masterGain;
|
|
193
|
+
}
|
|
184
194
|
/**
|
|
185
195
|
* Set volume for a category.
|
|
186
196
|
*/
|
|
@@ -326,7 +336,7 @@ class AudioManager {
|
|
|
326
336
|
const { sound } = this._soundModule;
|
|
327
337
|
// Global mute is owned by sound.muteAll()/unmuteAll() (context.muted),
|
|
328
338
|
// not by volumeAll — mixing both leaves mute un-undoable after reload.
|
|
329
|
-
sound.volumeAll =
|
|
339
|
+
sound.volumeAll = this._masterGain; // master multiplies the global bus
|
|
330
340
|
}
|
|
331
341
|
setupMobileUnlock() {
|
|
332
342
|
if (this._unlocked)
|
package/dist/audio.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.cjs.js","sources":["../src/audio/AudioManager.ts"],"sourcesContent":[null],"names":[],"mappings":";;AASA;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,YAAY,CAAA;IACf,YAAY,GAAQ,IAAI;IACxB,YAAY,GAAG,KAAK;IACpB,YAAY,GAAG,KAAK;AACpB,IAAA,QAAQ;AACR,IAAA,WAAW;AACX,IAAA,WAAW;IACX,aAAa,GAAkB,IAAI;IACnC,SAAS,GAAG,KAAK;IACjB,cAAc,GAAwB,IAAI;AAElD,IAAA,WAAA,CAAY,MAAoB,EAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI;QACvC,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,UAAU,IAAI,UAAU;QAEnD,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AACrD,YAAA,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AACjD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AAC/C,YAAA,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1D;;AAGD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;;AAGA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;;AAGA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,YAAY;IAC1B;AAEA;;;AAGG;AACH,IAAA,MAAM,IAAI,GAAA;QACR,IAAI,IAAI,CAAC,YAAY;YAAE;AAEvB,QAAA,IAAI;YACF,IAAI,CAAC,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AAC/C,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YACxB,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;YACnC;YACA,IAAI,CAAC,iBAAiB,EAAE;QAC1B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CACV,2DAA2D,CAC5D;AACD,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QAC3B;IACF;AAEA;;;;;;AAMG;AACH,IAAA,IAAI,CACF,KAAa,EACb,QAAA,GAA8B,KAAK,EACnC,OAA6D,EAAA;QAE7D,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAC9C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,KAAK;YAAE;AAE3D,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"audio.cjs.js","sources":["../src/audio/AudioManager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/audio.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ declare class AudioManager {
|
|
|
39
39
|
private _persist;
|
|
40
40
|
private _storageKey;
|
|
41
41
|
private _categories;
|
|
42
|
+
private _masterGain;
|
|
42
43
|
private _currentMusic;
|
|
43
44
|
private _unlocked;
|
|
44
45
|
private _unlockHandler;
|
|
@@ -79,6 +80,10 @@ declare class AudioManager {
|
|
|
79
80
|
* Stop all sounds.
|
|
80
81
|
*/
|
|
81
82
|
stopAll(): void;
|
|
83
|
+
/** Global gain (0..1) folded into every category's effective volume. Driven by the shell's
|
|
84
|
+
* 'master' settingChange. Does not affect the persisted per-category volumes. */
|
|
85
|
+
setMasterVolume(volume: number): void;
|
|
86
|
+
getMasterVolume(): number;
|
|
82
87
|
/**
|
|
83
88
|
* Set volume for a category.
|
|
84
89
|
*/
|
package/dist/audio.esm.js
CHANGED
|
@@ -26,6 +26,7 @@ class AudioManager {
|
|
|
26
26
|
_persist;
|
|
27
27
|
_storageKey;
|
|
28
28
|
_categories;
|
|
29
|
+
_masterGain = 1.0;
|
|
29
30
|
_currentMusic = null;
|
|
30
31
|
_unlocked = false;
|
|
31
32
|
_unlockHandler = null;
|
|
@@ -85,7 +86,7 @@ class AudioManager {
|
|
|
85
86
|
if (this._globalMuted || this._categories[category].muted)
|
|
86
87
|
return;
|
|
87
88
|
const { sound } = this._soundModule;
|
|
88
|
-
const vol = (options?.volume ?? 1) * this._categories[category].volume;
|
|
89
|
+
const vol = (options?.volume ?? 1) * this._categories[category].volume * this._masterGain;
|
|
89
90
|
try {
|
|
90
91
|
sound.play(alias, {
|
|
91
92
|
volume: vol,
|
|
@@ -114,7 +115,7 @@ class AudioManager {
|
|
|
114
115
|
if (this._globalMuted || this._categories.music.muted)
|
|
115
116
|
return;
|
|
116
117
|
// Fade out the previous track
|
|
117
|
-
this.fadeVolume(prevAlias, this._categories.music.volume, 0, fadeDuration, () => {
|
|
118
|
+
this.fadeVolume(prevAlias, this._categories.music.volume * this._masterGain, 0, fadeDuration, () => {
|
|
118
119
|
try {
|
|
119
120
|
sound.stop(prevAlias);
|
|
120
121
|
}
|
|
@@ -126,7 +127,7 @@ class AudioManager {
|
|
|
126
127
|
volume: 0,
|
|
127
128
|
loop: true,
|
|
128
129
|
});
|
|
129
|
-
this.fadeVolume(alias, 0, this._categories.music.volume, fadeDuration);
|
|
130
|
+
this.fadeVolume(alias, 0, this._categories.music.volume * this._masterGain, fadeDuration);
|
|
130
131
|
}
|
|
131
132
|
catch (e) {
|
|
132
133
|
console.warn(`[AudioManager] Failed to play music "${alias}":`, e);
|
|
@@ -145,7 +146,7 @@ class AudioManager {
|
|
|
145
146
|
return;
|
|
146
147
|
try {
|
|
147
148
|
sound.play(alias, {
|
|
148
|
-
volume: this._categories.music.volume,
|
|
149
|
+
volume: this._categories.music.volume * this._masterGain,
|
|
149
150
|
loop: true,
|
|
150
151
|
});
|
|
151
152
|
}
|
|
@@ -179,6 +180,15 @@ class AudioManager {
|
|
|
179
180
|
sound.stopAll();
|
|
180
181
|
this._currentMusic = null;
|
|
181
182
|
}
|
|
183
|
+
/** Global gain (0..1) folded into every category's effective volume. Driven by the shell's
|
|
184
|
+
* 'master' settingChange. Does not affect the persisted per-category volumes. */
|
|
185
|
+
setMasterVolume(volume) {
|
|
186
|
+
this._masterGain = Math.max(0, Math.min(1, volume));
|
|
187
|
+
this.applyVolumes();
|
|
188
|
+
}
|
|
189
|
+
getMasterVolume() {
|
|
190
|
+
return this._masterGain;
|
|
191
|
+
}
|
|
182
192
|
/**
|
|
183
193
|
* Set volume for a category.
|
|
184
194
|
*/
|
|
@@ -324,7 +334,7 @@ class AudioManager {
|
|
|
324
334
|
const { sound } = this._soundModule;
|
|
325
335
|
// Global mute is owned by sound.muteAll()/unmuteAll() (context.muted),
|
|
326
336
|
// not by volumeAll — mixing both leaves mute un-undoable after reload.
|
|
327
|
-
sound.volumeAll =
|
|
337
|
+
sound.volumeAll = this._masterGain; // master multiplies the global bus
|
|
328
338
|
}
|
|
329
339
|
setupMobileUnlock() {
|
|
330
340
|
if (this._unlocked)
|
package/dist/audio.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.esm.js","sources":["../src/audio/AudioManager.ts"],"sourcesContent":[null],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,YAAY,CAAA;IACf,YAAY,GAAQ,IAAI;IACxB,YAAY,GAAG,KAAK;IACpB,YAAY,GAAG,KAAK;AACpB,IAAA,QAAQ;AACR,IAAA,WAAW;AACX,IAAA,WAAW;IACX,aAAa,GAAkB,IAAI;IACnC,SAAS,GAAG,KAAK;IACjB,cAAc,GAAwB,IAAI;AAElD,IAAA,WAAA,CAAY,MAAoB,EAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI;QACvC,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,UAAU,IAAI,UAAU;QAEnD,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AACrD,YAAA,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AACjD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AAC/C,YAAA,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1D;;AAGD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;;AAGA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;;AAGA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,YAAY;IAC1B;AAEA;;;AAGG;AACH,IAAA,MAAM,IAAI,GAAA;QACR,IAAI,IAAI,CAAC,YAAY;YAAE;AAEvB,QAAA,IAAI;YACF,IAAI,CAAC,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AAC/C,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YACxB,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;YACnC;YACA,IAAI,CAAC,iBAAiB,EAAE;QAC1B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CACV,2DAA2D,CAC5D;AACD,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QAC3B;IACF;AAEA;;;;;;AAMG;AACH,IAAA,IAAI,CACF,KAAa,EACb,QAAA,GAA8B,KAAK,EACnC,OAA6D,EAAA;QAE7D,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAC9C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,KAAK;YAAE;AAE3D,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"audio.esm.js","sources":["../src/audio/AudioManager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/core.cjs.js
CHANGED
|
@@ -664,6 +664,7 @@ class AudioManager {
|
|
|
664
664
|
_persist;
|
|
665
665
|
_storageKey;
|
|
666
666
|
_categories;
|
|
667
|
+
_masterGain = 1.0;
|
|
667
668
|
_currentMusic = null;
|
|
668
669
|
_unlocked = false;
|
|
669
670
|
_unlockHandler = null;
|
|
@@ -723,7 +724,7 @@ class AudioManager {
|
|
|
723
724
|
if (this._globalMuted || this._categories[category].muted)
|
|
724
725
|
return;
|
|
725
726
|
const { sound } = this._soundModule;
|
|
726
|
-
const vol = (options?.volume ?? 1) * this._categories[category].volume;
|
|
727
|
+
const vol = (options?.volume ?? 1) * this._categories[category].volume * this._masterGain;
|
|
727
728
|
try {
|
|
728
729
|
sound.play(alias, {
|
|
729
730
|
volume: vol,
|
|
@@ -752,7 +753,7 @@ class AudioManager {
|
|
|
752
753
|
if (this._globalMuted || this._categories.music.muted)
|
|
753
754
|
return;
|
|
754
755
|
// Fade out the previous track
|
|
755
|
-
this.fadeVolume(prevAlias, this._categories.music.volume, 0, fadeDuration, () => {
|
|
756
|
+
this.fadeVolume(prevAlias, this._categories.music.volume * this._masterGain, 0, fadeDuration, () => {
|
|
756
757
|
try {
|
|
757
758
|
sound.stop(prevAlias);
|
|
758
759
|
}
|
|
@@ -764,7 +765,7 @@ class AudioManager {
|
|
|
764
765
|
volume: 0,
|
|
765
766
|
loop: true,
|
|
766
767
|
});
|
|
767
|
-
this.fadeVolume(alias, 0, this._categories.music.volume, fadeDuration);
|
|
768
|
+
this.fadeVolume(alias, 0, this._categories.music.volume * this._masterGain, fadeDuration);
|
|
768
769
|
}
|
|
769
770
|
catch (e) {
|
|
770
771
|
console.warn(`[AudioManager] Failed to play music "${alias}":`, e);
|
|
@@ -783,7 +784,7 @@ class AudioManager {
|
|
|
783
784
|
return;
|
|
784
785
|
try {
|
|
785
786
|
sound.play(alias, {
|
|
786
|
-
volume: this._categories.music.volume,
|
|
787
|
+
volume: this._categories.music.volume * this._masterGain,
|
|
787
788
|
loop: true,
|
|
788
789
|
});
|
|
789
790
|
}
|
|
@@ -817,6 +818,15 @@ class AudioManager {
|
|
|
817
818
|
sound.stopAll();
|
|
818
819
|
this._currentMusic = null;
|
|
819
820
|
}
|
|
821
|
+
/** Global gain (0..1) folded into every category's effective volume. Driven by the shell's
|
|
822
|
+
* 'master' settingChange. Does not affect the persisted per-category volumes. */
|
|
823
|
+
setMasterVolume(volume) {
|
|
824
|
+
this._masterGain = Math.max(0, Math.min(1, volume));
|
|
825
|
+
this.applyVolumes();
|
|
826
|
+
}
|
|
827
|
+
getMasterVolume() {
|
|
828
|
+
return this._masterGain;
|
|
829
|
+
}
|
|
820
830
|
/**
|
|
821
831
|
* Set volume for a category.
|
|
822
832
|
*/
|
|
@@ -962,7 +972,7 @@ class AudioManager {
|
|
|
962
972
|
const { sound } = this._soundModule;
|
|
963
973
|
// Global mute is owned by sound.muteAll()/unmuteAll() (context.muted),
|
|
964
974
|
// not by volumeAll — mixing both leaves mute un-undoable after reload.
|
|
965
|
-
sound.volumeAll =
|
|
975
|
+
sound.volumeAll = this._masterGain; // master multiplies the global bus
|
|
966
976
|
}
|
|
967
977
|
setupMobileUnlock() {
|
|
968
978
|
if (this._unlocked)
|
|
@@ -1230,6 +1240,7 @@ class ViewportManager extends EventEmitter {
|
|
|
1230
1240
|
_app;
|
|
1231
1241
|
_container;
|
|
1232
1242
|
_config;
|
|
1243
|
+
_target;
|
|
1233
1244
|
_resizeObserver = null;
|
|
1234
1245
|
_currentOrientation = Orientation.LANDSCAPE;
|
|
1235
1246
|
_currentWidth = 0;
|
|
@@ -1237,11 +1248,15 @@ class ViewportManager extends EventEmitter {
|
|
|
1237
1248
|
_currentScale = 1;
|
|
1238
1249
|
_destroyed = false;
|
|
1239
1250
|
_resizeTimeout = null;
|
|
1240
|
-
constructor(app, container, config) {
|
|
1251
|
+
constructor(app, container, config, target) {
|
|
1241
1252
|
super();
|
|
1242
1253
|
this._app = app;
|
|
1243
1254
|
this._container = container;
|
|
1244
1255
|
this._config = config;
|
|
1256
|
+
// The container this manager scales/offsets. Defaults to app.stage for backward
|
|
1257
|
+
// compatibility; the engine passes a dedicated scaled world root so app.stage stays
|
|
1258
|
+
// identity (screen space) for unscaled UI layers.
|
|
1259
|
+
this._target = target ?? app.stage;
|
|
1245
1260
|
this.setupObserver();
|
|
1246
1261
|
}
|
|
1247
1262
|
/** Current canvas width in game units */
|
|
@@ -1330,19 +1345,19 @@ class ViewportManager extends EventEmitter {
|
|
|
1330
1345
|
const stageScale = scaleMode === ScaleMode.STRETCH
|
|
1331
1346
|
? Math.min(containerWidth / designWidth, containerHeight / designHeight)
|
|
1332
1347
|
: scale;
|
|
1333
|
-
this.
|
|
1348
|
+
this._target.scale.set(stageScale);
|
|
1334
1349
|
// Center the stage for FIT mode
|
|
1335
1350
|
if (scaleMode === ScaleMode.FIT) {
|
|
1336
|
-
this.
|
|
1337
|
-
this.
|
|
1351
|
+
this._target.x = Math.round((containerWidth - designWidth * stageScale) / 2);
|
|
1352
|
+
this._target.y = Math.round((containerHeight - designHeight * stageScale) / 2);
|
|
1338
1353
|
}
|
|
1339
1354
|
else if (scaleMode === ScaleMode.FILL) {
|
|
1340
|
-
this.
|
|
1341
|
-
this.
|
|
1355
|
+
this._target.x = Math.round((containerWidth - gameWidth * stageScale) / 2);
|
|
1356
|
+
this._target.y = Math.round((containerHeight - gameHeight * stageScale) / 2);
|
|
1342
1357
|
}
|
|
1343
1358
|
else {
|
|
1344
|
-
this.
|
|
1345
|
-
this.
|
|
1359
|
+
this._target.x = 0;
|
|
1360
|
+
this._target.y = 0;
|
|
1346
1361
|
}
|
|
1347
1362
|
this._currentWidth = gameWidth;
|
|
1348
1363
|
this._currentHeight = gameHeight;
|
|
@@ -1833,6 +1848,12 @@ class GameApplication extends EventEmitter {
|
|
|
1833
1848
|
input;
|
|
1834
1849
|
/** Viewport manager */
|
|
1835
1850
|
viewport;
|
|
1851
|
+
/** Scaled world root (holds scenes). Transformed by the ViewportManager to fit the design
|
|
1852
|
+
* resolution; lives below the UI layer on app.stage. */
|
|
1853
|
+
worldRoot;
|
|
1854
|
+
/** Unscaled, screen-space UI layer. Sits above {@link worldRoot} and is NOT touched by the
|
|
1855
|
+
* viewport transform — children fill the real screen (e.g. the host's shell + overlay). */
|
|
1856
|
+
uiLayer;
|
|
1836
1857
|
/** SDK instance (null in offline mode) */
|
|
1837
1858
|
sdk = null;
|
|
1838
1859
|
/** FPS overlay instance (only when debug: true) */
|
|
@@ -1841,6 +1862,8 @@ class GameApplication extends EventEmitter {
|
|
|
1841
1862
|
initData = null;
|
|
1842
1863
|
/** Platform session (SDK + optional DevBridge). null until start() runs. */
|
|
1843
1864
|
platformSession = null;
|
|
1865
|
+
/** Branded game shell (only when config.shell is set). */
|
|
1866
|
+
shell;
|
|
1844
1867
|
/** Configuration */
|
|
1845
1868
|
config;
|
|
1846
1869
|
// ─── Private state ──────────────────────────────────────
|
|
@@ -1902,6 +1925,11 @@ class GameApplication extends EventEmitter {
|
|
|
1902
1925
|
await this.initPixi();
|
|
1903
1926
|
// 4. Initialize SDK (if enabled)
|
|
1904
1927
|
await this.initSDK();
|
|
1928
|
+
// 4b. Mount the branded game shell after the SDK handshake (optional)
|
|
1929
|
+
if (this.config.shell) {
|
|
1930
|
+
const { createGameShell } = await import('@energy8platform/platform-core/shell');
|
|
1931
|
+
this.shell = createGameShell(this.config.shell);
|
|
1932
|
+
}
|
|
1905
1933
|
// 5. Merge design dimensions from SDK config
|
|
1906
1934
|
this.applySDKConfig();
|
|
1907
1935
|
// 6. Initialize sub-systems
|
|
@@ -1925,11 +1953,16 @@ class GameApplication extends EventEmitter {
|
|
|
1925
1953
|
/**
|
|
1926
1954
|
* Destroy the engine and free all resources.
|
|
1927
1955
|
*/
|
|
1928
|
-
destroy() {
|
|
1956
|
+
async destroy() {
|
|
1929
1957
|
if (this._destroyed)
|
|
1930
1958
|
return;
|
|
1931
1959
|
this._destroyed = true;
|
|
1932
1960
|
this._running = false;
|
|
1961
|
+
if (this.shell) {
|
|
1962
|
+
const { removeGameShell } = await import('@energy8platform/platform-core/shell');
|
|
1963
|
+
await removeGameShell();
|
|
1964
|
+
this.shell = undefined;
|
|
1965
|
+
}
|
|
1933
1966
|
this.scenes?.destroy();
|
|
1934
1967
|
this.input?.destroy();
|
|
1935
1968
|
this.audio?.destroy();
|
|
@@ -2000,20 +2033,27 @@ class GameApplication extends EventEmitter {
|
|
|
2000
2033
|
this.audio = new AudioManager(this.config.audio);
|
|
2001
2034
|
// Input Manager
|
|
2002
2035
|
this.input = new InputManager(this.app.canvas);
|
|
2003
|
-
//
|
|
2036
|
+
// Stage layers: a scaled world root (scenes, transformed to design resolution by the
|
|
2037
|
+
// viewport) below an unscaled UI layer (screen space). app.stage itself stays identity.
|
|
2038
|
+
this.worldRoot = new pixi_js.Container();
|
|
2039
|
+
this.worldRoot.label = 'world';
|
|
2040
|
+
this.uiLayer = new pixi_js.Container();
|
|
2041
|
+
this.uiLayer.label = 'ui';
|
|
2042
|
+
this.app.stage.addChild(this.worldRoot, this.uiLayer);
|
|
2043
|
+
// Viewport Manager — scales worldRoot (NOT app.stage), so the UI layer is unscaled.
|
|
2004
2044
|
this.viewport = new ViewportManager(this.app, this._container, {
|
|
2005
2045
|
designWidth: this.config.designWidth,
|
|
2006
2046
|
designHeight: this.config.designHeight,
|
|
2007
2047
|
scaleMode: this.config.scaleMode,
|
|
2008
2048
|
orientation: this.config.orientation,
|
|
2009
|
-
});
|
|
2010
|
-
// Wire SceneManager to the
|
|
2011
|
-
this.scenes.setRoot(this.
|
|
2049
|
+
}, this.worldRoot);
|
|
2050
|
+
// Wire SceneManager to the scaled world root
|
|
2051
|
+
this.scenes.setRoot(this.worldRoot);
|
|
2012
2052
|
this.scenes.setApp(this);
|
|
2013
2053
|
// Wire viewport resize → scene manager + input manager
|
|
2014
2054
|
this.viewport.on('resize', ({ width, height, scale }) => {
|
|
2015
2055
|
this.scenes.resize(width, height);
|
|
2016
|
-
this.input.setViewportTransform(scale, this.
|
|
2056
|
+
this.input.setViewportTransform(scale, this.worldRoot.x, this.worldRoot.y);
|
|
2017
2057
|
this.emit('resize', { width, height });
|
|
2018
2058
|
});
|
|
2019
2059
|
this.viewport.on('orientationChange', (orientation) => {
|
|
@@ -2048,8 +2088,57 @@ class GameApplication extends EventEmitter {
|
|
|
2048
2088
|
}
|
|
2049
2089
|
}
|
|
2050
2090
|
|
|
2091
|
+
// packages/game-engine/src/scenes/IntroScene.ts
|
|
2092
|
+
/**
|
|
2093
|
+
* Reusable splash scene: shows a title (or logo) + "tap to start", then advances.
|
|
2094
|
+
*
|
|
2095
|
+
* The host no longer special-cases the intro. Navigation works like every other
|
|
2096
|
+
* scene: the host injects `goto(key)` into this scene's start data. On tap this
|
|
2097
|
+
* scene calls `onStart` if the game supplied one, otherwise `goto(next ?? 'game')`.
|
|
2098
|
+
* (The built-in can't know the game's scene key generically, so it falls back to
|
|
2099
|
+
* the conventional 'game' key — override via `next`. Scaffold-generated intros
|
|
2100
|
+
* skip this primitive and call `goto('game')` directly.)
|
|
2101
|
+
*/
|
|
2102
|
+
class IntroScene extends Scene {
|
|
2103
|
+
layer;
|
|
2104
|
+
async onEnter(data) {
|
|
2105
|
+
const cfg = (data ?? {});
|
|
2106
|
+
const start = () => cfg.onStart ? cfg.onStart() : cfg.goto?.(cfg.next ?? 'game');
|
|
2107
|
+
const layer = new pixi_js.Container();
|
|
2108
|
+
this.layer = layer;
|
|
2109
|
+
this.container.addChild(layer);
|
|
2110
|
+
const title = new pixi_js.Text({
|
|
2111
|
+
text: cfg.title ?? 'PLAY',
|
|
2112
|
+
style: { fill: 0xffffff, fontSize: 96, fontFamily: 'Inter', align: 'center' },
|
|
2113
|
+
});
|
|
2114
|
+
title.anchor.set(0.5);
|
|
2115
|
+
title.position.set(960, 460);
|
|
2116
|
+
layer.addChild(title);
|
|
2117
|
+
if (cfg.tapToStart !== false) {
|
|
2118
|
+
const hint = new pixi_js.Text({
|
|
2119
|
+
text: 'Tap to start',
|
|
2120
|
+
style: { fill: 0xffd24a, fontSize: 36, fontFamily: 'Inter' },
|
|
2121
|
+
});
|
|
2122
|
+
hint.anchor.set(0.5);
|
|
2123
|
+
hint.position.set(960, 600);
|
|
2124
|
+
layer.addChild(hint);
|
|
2125
|
+
}
|
|
2126
|
+
// full-screen tap target
|
|
2127
|
+
const hit = new pixi_js.Graphics().rect(0, 0, 1920, 1080).fill({ color: 0x000000, alpha: 0.001 });
|
|
2128
|
+
hit.eventMode = 'static';
|
|
2129
|
+
hit.cursor = 'pointer';
|
|
2130
|
+
hit.once('pointerdown', () => start());
|
|
2131
|
+
layer.addChild(hit);
|
|
2132
|
+
}
|
|
2133
|
+
onExit() {
|
|
2134
|
+
this.layer?.destroy({ children: true });
|
|
2135
|
+
this.layer = undefined;
|
|
2136
|
+
}
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2051
2139
|
exports.EventEmitter = EventEmitter;
|
|
2052
2140
|
exports.GameApplication = GameApplication;
|
|
2141
|
+
exports.IntroScene = IntroScene;
|
|
2053
2142
|
exports.Scene = Scene;
|
|
2054
2143
|
exports.SceneManager = SceneManager;
|
|
2055
2144
|
//# sourceMappingURL=core.cjs.js.map
|