@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,295 @@
1
+ import { Container, Text } from 'pixi.js';
2
+
3
+ const DEFAULT_CONFIG = {
4
+ balance: 10000,
5
+ currency: 'USD',
6
+ gameConfig: {
7
+ id: 'dev-game',
8
+ type: 'slot',
9
+ version: '1.0.0',
10
+ viewport: { width: 1920, height: 1080 },
11
+ betLevels: [0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50],
12
+ },
13
+ assetsUrl: '/assets/',
14
+ session: null,
15
+ onPlay: () => ({}),
16
+ networkDelay: 200,
17
+ debug: true,
18
+ };
19
+ /**
20
+ * Mock host bridge for local development.
21
+ *
22
+ * Intercepts postMessage communication from the SDK and responds
23
+ * with mock data, simulating a real casino host environment.
24
+ *
25
+ * This allows games to be developed and tested without a real backend.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // In your dev entry point or vite plugin
30
+ * import { DevBridge } from '@energy8platform/game-engine/debug';
31
+ *
32
+ * const devBridge = new DevBridge({
33
+ * balance: 5000,
34
+ * currency: 'EUR',
35
+ * gameConfig: { id: 'my-slot', type: 'slot', betLevels: [0.2, 0.5, 1, 2] },
36
+ * onPlay: ({ action, bet }) => ({
37
+ * totalWin: Math.random() > 0.5 ? bet * (Math.random() * 20) : 0,
38
+ * data: {
39
+ * matrix: generateRandomMatrix(5, 3, 10),
40
+ * win_lines: [],
41
+ * },
42
+ * }),
43
+ * });
44
+ * devBridge.start();
45
+ * ```
46
+ */
47
+ class DevBridge {
48
+ _config;
49
+ _balance;
50
+ _roundCounter = 0;
51
+ _listening = false;
52
+ _handler = null;
53
+ constructor(config = {}) {
54
+ this._config = { ...DEFAULT_CONFIG, ...config };
55
+ this._balance = this._config.balance;
56
+ }
57
+ /** Current mock balance */
58
+ get balance() {
59
+ return this._balance;
60
+ }
61
+ /** Start listening for SDK messages */
62
+ start() {
63
+ if (this._listening)
64
+ return;
65
+ this._handler = (e) => {
66
+ this.handleMessage(e);
67
+ };
68
+ window.addEventListener('message', this._handler);
69
+ this._listening = true;
70
+ if (this._config.debug) {
71
+ console.log('[DevBridge] Started — listening for SDK messages');
72
+ }
73
+ }
74
+ /** Stop listening */
75
+ stop() {
76
+ if (this._handler) {
77
+ window.removeEventListener('message', this._handler);
78
+ this._handler = null;
79
+ }
80
+ this._listening = false;
81
+ if (this._config.debug) {
82
+ console.log('[DevBridge] Stopped');
83
+ }
84
+ }
85
+ /** Set mock balance */
86
+ setBalance(balance) {
87
+ this._balance = balance;
88
+ // Send balance update
89
+ this.sendMessage('BALANCE_UPDATE', { balance: this._balance });
90
+ }
91
+ /** Destroy the dev bridge */
92
+ destroy() {
93
+ this.stop();
94
+ }
95
+ // ─── Message Handling ──────────────────────────────────
96
+ handleMessage(e) {
97
+ const data = e.data;
98
+ // Only process bridge messages
99
+ if (!data || data.__casino_bridge !== true)
100
+ return;
101
+ if (this._config.debug) {
102
+ console.log('[DevBridge] ←', data.type, data.payload);
103
+ }
104
+ switch (data.type) {
105
+ case 'GAME_READY':
106
+ this.handleGameReady(data.id);
107
+ break;
108
+ case 'PLAY_REQUEST':
109
+ this.handlePlayRequest(data.payload, data.id);
110
+ break;
111
+ case 'PLAY_RESULT_ACK':
112
+ this.handlePlayAck(data.payload, data.id);
113
+ break;
114
+ case 'GET_BALANCE':
115
+ this.handleGetBalance(data.id);
116
+ break;
117
+ case 'GET_STATE':
118
+ this.handleGetState(data.id);
119
+ break;
120
+ case 'OPEN_DEPOSIT':
121
+ this.handleOpenDeposit();
122
+ break;
123
+ default:
124
+ if (this._config.debug) {
125
+ console.log('[DevBridge] Unknown message type:', data.type);
126
+ }
127
+ }
128
+ }
129
+ handleGameReady(id) {
130
+ const initData = {
131
+ balance: this._balance,
132
+ currency: this._config.currency,
133
+ config: this._config.gameConfig,
134
+ session: this._config.session,
135
+ assetsUrl: this._config.assetsUrl,
136
+ };
137
+ this.delayedSend('INIT', initData, id);
138
+ }
139
+ handlePlayRequest(payload, id) {
140
+ const { action, bet, roundId } = payload;
141
+ // Deduct bet
142
+ this._balance -= bet;
143
+ this._roundCounter++;
144
+ // Generate result
145
+ const customResult = this._config.onPlay({ action, bet, roundId });
146
+ const totalWin = customResult.totalWin ?? (Math.random() > 0.6 ? bet * (1 + Math.random() * 10) : 0);
147
+ // Credit win
148
+ this._balance += totalWin;
149
+ const result = {
150
+ roundId: roundId ?? `dev-round-${this._roundCounter}`,
151
+ action,
152
+ balanceAfter: this._balance,
153
+ totalWin: Math.round(totalWin * 100) / 100,
154
+ data: customResult.data ?? {},
155
+ nextActions: customResult.nextActions ?? ['spin'],
156
+ session: customResult.session ?? null,
157
+ creditPending: false,
158
+ };
159
+ this.delayedSend('PLAY_RESULT', result, id);
160
+ }
161
+ handlePlayAck(_payload, _id) {
162
+ if (this._config.debug) {
163
+ console.log('[DevBridge] Play acknowledged');
164
+ }
165
+ }
166
+ handleGetBalance(id) {
167
+ this.delayedSend('BALANCE_RESPONSE', { balance: this._balance }, id);
168
+ }
169
+ handleGetState(id) {
170
+ this.delayedSend('STATE_RESPONSE', this._config.session, id);
171
+ }
172
+ handleOpenDeposit() {
173
+ if (this._config.debug) {
174
+ console.log('[DevBridge] 💰 Open deposit requested (mock: adding 1000)');
175
+ }
176
+ this._balance += 1000;
177
+ this.sendMessage('BALANCE_UPDATE', { balance: this._balance });
178
+ }
179
+ // ─── Communication ─────────────────────────────────────
180
+ delayedSend(type, payload, id) {
181
+ const delay = this._config.networkDelay;
182
+ if (delay > 0) {
183
+ setTimeout(() => this.sendMessage(type, payload, id), delay);
184
+ }
185
+ else {
186
+ this.sendMessage(type, payload, id);
187
+ }
188
+ }
189
+ sendMessage(type, payload, id) {
190
+ const message = {
191
+ __casino_bridge: true,
192
+ type,
193
+ payload,
194
+ id,
195
+ };
196
+ if (this._config.debug) {
197
+ console.log('[DevBridge] →', type, payload);
198
+ }
199
+ // Post to the same window (SDK listens on window)
200
+ window.postMessage(message, '*');
201
+ }
202
+ }
203
+
204
+ /**
205
+ * FPS overlay for debugging performance.
206
+ *
207
+ * Shows FPS, frame time, and draw call count in the corner of the screen.
208
+ *
209
+ * @example
210
+ * ```ts
211
+ * const fps = new FPSOverlay(app);
212
+ * fps.show();
213
+ * ```
214
+ */
215
+ class FPSOverlay {
216
+ _app;
217
+ _container;
218
+ _fpsText;
219
+ _visible = false;
220
+ _samples = [];
221
+ _maxSamples = 60;
222
+ _lastUpdate = 0;
223
+ _tickFn = null;
224
+ constructor(app) {
225
+ this._app = app;
226
+ this._container = new Container();
227
+ this._container.label = 'FPSOverlay';
228
+ this._container.zIndex = 99999;
229
+ this._fpsText = new Text({
230
+ text: 'FPS: --',
231
+ style: {
232
+ fontFamily: 'monospace',
233
+ fontSize: 14,
234
+ fill: 0x00ff00,
235
+ stroke: { color: 0x000000, width: 2 },
236
+ },
237
+ });
238
+ this._fpsText.x = 8;
239
+ this._fpsText.y = 8;
240
+ this._container.addChild(this._fpsText);
241
+ }
242
+ /** Show the FPS overlay */
243
+ show() {
244
+ if (this._visible)
245
+ return;
246
+ this._visible = true;
247
+ this._app.stage.addChild(this._container);
248
+ this._tickFn = (ticker) => {
249
+ this._samples.push(ticker.FPS);
250
+ if (this._samples.length > this._maxSamples) {
251
+ this._samples.shift();
252
+ }
253
+ // Update display every ~500ms
254
+ const now = Date.now();
255
+ if (now - this._lastUpdate > 500) {
256
+ const avg = this._samples.reduce((a, b) => a + b, 0) / this._samples.length;
257
+ const min = Math.min(...this._samples);
258
+ this._fpsText.text = [
259
+ `FPS: ${Math.round(avg)} (min: ${Math.round(min)})`,
260
+ `Frame: ${ticker.deltaMS.toFixed(1)}ms`,
261
+ ].join('\n');
262
+ this._lastUpdate = now;
263
+ }
264
+ };
265
+ this._app.ticker.add(this._tickFn);
266
+ }
267
+ /** Hide the FPS overlay */
268
+ hide() {
269
+ if (!this._visible)
270
+ return;
271
+ this._visible = false;
272
+ this._container.removeFromParent();
273
+ if (this._tickFn) {
274
+ this._app.ticker.remove(this._tickFn);
275
+ this._tickFn = null;
276
+ }
277
+ }
278
+ /** Toggle visibility */
279
+ toggle() {
280
+ if (this._visible) {
281
+ this.hide();
282
+ }
283
+ else {
284
+ this.show();
285
+ }
286
+ }
287
+ /** Destroy the overlay */
288
+ destroy() {
289
+ this.hide();
290
+ this._container.destroy({ children: true });
291
+ }
292
+ }
293
+
294
+ export { DevBridge, FPSOverlay };
295
+ //# sourceMappingURL=debug.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.esm.js","sources":["../src/debug/DevBridge.ts","../src/debug/FPSOverlay.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}