@energy8platform/game-engine 0.24.0 → 0.26.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.
@@ -0,0 +1,580 @@
1
+ // packages/game-engine/src/slot/devtools/protocol.ts
2
+ //
3
+ // The postMessage protocol between the harness reel panel (parent window) and the
4
+ // reel dev bridge (game iframe). Pure constants + message types — no deps.
5
+ const REEL_READY = 'e8:reel:ready';
6
+ const REEL_APPLY = 'e8:reel:apply';
7
+ const REEL_REQUEST = 'e8:reel:request';
8
+
9
+ // packages/game-engine/src/slot/devtools/reelDevBridge.ts
10
+ //
11
+ // Game-side opt-in bridge for the harness reel panel. Call once, after creating the
12
+ // ReelSystem, to let the harness sidebar tune the reels LIVE:
13
+ //
14
+ // import { mountReelDevBridge } from '@energy8platform/game-engine/devtools';
15
+ // const bridge = mountReelDevBridge({ system });
16
+ //
17
+ // It announces the system's current config to the parent (the harness wrapper) and
18
+ // applies incoming patches via `system.update()`. Changes are EPHEMERAL — they live
19
+ // only in this running iframe and are lost on reload. To persist, use the panel's
20
+ // "Copy config" button and paste the snippet into your game's reel config.
21
+ //
22
+ // No-op outside an iframe (window.parent === window), so it is safe to leave in.
23
+ function defaultEnabled() {
24
+ try {
25
+ // vite injects import.meta.env.DEV; guard so non-vite builds don't throw.
26
+ const env = import.meta.env;
27
+ return env?.DEV ?? true;
28
+ }
29
+ catch {
30
+ return true;
31
+ }
32
+ }
33
+ function mountReelDevBridge(opts) {
34
+ const enabled = opts.enabled ?? defaultEnabled();
35
+ const noop = { announce: () => { }, dispose: () => { } };
36
+ if (!enabled || typeof window === 'undefined' || window.parent === window)
37
+ return noop;
38
+ const origin = opts.targetOrigin ?? '*';
39
+ const { system } = opts;
40
+ const announce = () => {
41
+ window.parent.postMessage({ type: REEL_READY, config: system.config }, origin);
42
+ };
43
+ const onMessage = (e) => {
44
+ if (e.source !== window.parent)
45
+ return;
46
+ const msg = e.data;
47
+ if (!msg || typeof msg !== 'object')
48
+ return;
49
+ if (msg.type === REEL_APPLY)
50
+ system.update(msg.patch);
51
+ else if (msg.type === REEL_REQUEST)
52
+ announce();
53
+ };
54
+ window.addEventListener('message', onMessage);
55
+ announce(); // cover the panel-already-open case
56
+ return {
57
+ announce,
58
+ dispose: () => window.removeEventListener('message', onMessage),
59
+ };
60
+ }
61
+
62
+ // packages/game-engine/src/slot/devtools/fieldSchema.ts
63
+ //
64
+ // Declarative description of the reel-config control panel. Each control binds to a
65
+ // dot-path in the ReelSystemConfig. Pure data — no pixi, no DOM — so it bundles into
66
+ // the self-contained panel client served by the harness.
67
+ //
68
+ // NOTE: board shape (grid.cols / grid.rows / rowsPerReel) is intentionally OMITTED.
69
+ // The board shape is math-tied (paylines / ways / book geometry) and must not be
70
+ // tuned live from the harness. Everything else — cosmetic geometry, motion,
71
+ // anticipation, cascade, win presentation and features — is tunable.
72
+ /** All section keys, in panel order. */
73
+ const REEL_SECTION_KEYS = [
74
+ 'geometry',
75
+ 'motion',
76
+ 'anticipation',
77
+ 'cascade',
78
+ 'win',
79
+ 'features',
80
+ ];
81
+ const EASINGS = [
82
+ 'linear',
83
+ 'easeOutQuad',
84
+ 'easeOutCubic',
85
+ 'easeOutBack',
86
+ 'easeOutBounce',
87
+ 'easeInBack',
88
+ 'easeOutElastic',
89
+ 'easeInOutSine',
90
+ 'easeInOutQuad',
91
+ ];
92
+ /** The editable reel-config fields, grouped into collapsible sections. */
93
+ const REEL_FIELD_SCHEMA = [
94
+ {
95
+ key: 'geometry',
96
+ title: 'Cell geometry',
97
+ controls: [
98
+ { kind: 'range', path: 'grid.cellSize', label: 'Cell size', min: 40, max: 120, step: 1 },
99
+ { kind: 'range', path: 'grid.gap', label: 'Gap', min: 0, max: 16, step: 1 },
100
+ {
101
+ kind: 'select',
102
+ path: 'grid.evaluation',
103
+ label: 'Evaluation',
104
+ options: ['lines', 'ways', 'anywhere', 'cluster', 'megaways', 'infinity'],
105
+ },
106
+ { kind: 'toggle', path: 'grid.mask', label: 'Mask reels' },
107
+ {
108
+ kind: 'range',
109
+ path: 'grid.cellWidth',
110
+ label: 'Cell width',
111
+ min: 40,
112
+ max: 160,
113
+ step: 1,
114
+ fallback: 'grid.cellSize',
115
+ },
116
+ {
117
+ kind: 'range',
118
+ path: 'grid.cellHeight',
119
+ label: 'Cell height',
120
+ min: 40,
121
+ max: 160,
122
+ step: 1,
123
+ fallback: 'grid.cellSize',
124
+ },
125
+ {
126
+ kind: 'range',
127
+ path: 'grid.colGap',
128
+ label: 'Column gap',
129
+ min: 0,
130
+ max: 40,
131
+ step: 1,
132
+ fallback: 'grid.gap',
133
+ },
134
+ {
135
+ kind: 'range',
136
+ path: 'grid.rowGap',
137
+ label: 'Row gap',
138
+ min: 0,
139
+ max: 40,
140
+ step: 1,
141
+ fallback: 'grid.gap',
142
+ },
143
+ ],
144
+ },
145
+ {
146
+ key: 'motion',
147
+ title: 'Motion',
148
+ controls: [
149
+ { kind: 'select', path: 'motion.style', label: 'Style', options: ['swap', 'strip', 'cascade-drop'] },
150
+ { kind: 'range', path: 'motion.spinUp', label: 'Spin-up (ms)', min: 100, max: 2500, step: 10 },
151
+ { kind: 'range', path: 'motion.hold', label: 'Hold (ms)', min: 0, max: 800, step: 10 },
152
+ { kind: 'range', path: 'motion.stopStagger', label: 'Stop stagger (ms)', min: 0, max: 400, step: 5 },
153
+ { kind: 'select', path: 'motion.stopMode', label: 'Stop mode', options: ['sequential', 'sync', 'random'] },
154
+ { kind: 'select', path: 'motion.stopOrder', label: 'Stop order', options: ['ltr', 'rtl'] },
155
+ { kind: 'range', path: 'motion.settle.amp', label: 'Settle amp (px)', min: 0, max: 24, step: 1 },
156
+ { kind: 'range', path: 'motion.settle.ms', label: 'Settle (ms)', min: 60, max: 500, step: 10 },
157
+ { kind: 'select', path: 'motion.settle.easing', label: 'Settle easing', options: EASINGS },
158
+ { kind: 'toggle', path: 'motion.squash.enabled', label: 'Squash on land' },
159
+ { kind: 'range', path: 'motion.squash.scaleX', label: 'Squash X', min: 1, max: 1.5, step: 0.01 },
160
+ { kind: 'range', path: 'motion.squash.scaleY', label: 'Squash Y', min: 0.5, max: 1, step: 0.01 },
161
+ { kind: 'toggle', path: 'motion.blur.enabled', label: 'Motion blur' },
162
+ { kind: 'range', path: 'motion.blur.alpha', label: 'Blur alpha', min: 0.3, max: 1, step: 0.01 },
163
+ { kind: 'range', path: 'motion.blur.strength', label: 'Blur strength', min: 0, max: 16, step: 1 },
164
+ { kind: 'toggle', path: 'motion.blur.streaks', label: 'Blur streaks' },
165
+ { kind: 'range', path: 'motion.turboFactor', label: 'Turbo factor', min: 0.2, max: 1, step: 0.05 },
166
+ { kind: 'select', path: 'motion.intensity', label: 'Intensity', options: ['full', 'reduced', 'minimal'] },
167
+ { kind: 'toggle', path: 'motion.slamStop', label: 'Slam stop' },
168
+ { kind: 'range', path: 'motion.symbolsPerReel', label: 'Tape length', min: 3, max: 24, step: 1 },
169
+ ],
170
+ },
171
+ {
172
+ key: 'anticipation',
173
+ title: 'Anticipation',
174
+ controls: [
175
+ { kind: 'toggle', path: 'anticipation.enabled', label: 'Enabled' },
176
+ { kind: 'range', path: 'anticipation.threshold', label: 'Threshold (N−1)', min: 1, max: 6, step: 1 },
177
+ { kind: 'range', path: 'anticipation.slowdownFactor', label: 'Slowdown', min: 0.1, max: 1, step: 0.05 },
178
+ { kind: 'range', path: 'anticipation.holdMs', label: 'Hold (ms)', min: 0, max: 1200, step: 50 },
179
+ { kind: 'toggle', path: 'anticipation.zoom.enabled', label: 'Reel zoom' },
180
+ { kind: 'range', path: 'anticipation.zoom.scale', label: 'Zoom scale', min: 1, max: 1.6, step: 0.05 },
181
+ { kind: 'range', path: 'anticipation.zoom.ms', label: 'Zoom (ms)', min: 200, max: 1200, step: 50 },
182
+ ],
183
+ },
184
+ {
185
+ key: 'cascade',
186
+ title: 'Cascade / Tumble',
187
+ controls: [
188
+ { kind: 'toggle', path: 'cascade.enabled', label: 'Enabled' },
189
+ { kind: 'toggle', path: 'cascade.gravity', label: 'Gravity (survivors slide)' },
190
+ { kind: 'toggle', path: 'cascade.dimNonWinners', label: 'Dim non-winners' },
191
+ { kind: 'range', path: 'cascade.dimAlpha', label: 'Dim alpha', min: 0.1, max: 1, step: 0.05 },
192
+ { kind: 'range', path: 'cascade.perStepDecel', label: 'Per-step decel', min: 0, max: 0.4, step: 0.01 },
193
+ { kind: 'range', path: 'cascade.perStepDecelCap', label: 'Decel cap', min: 1, max: 3, step: 0.1 },
194
+ { kind: 'range', path: 'cascade.timings.remove', label: 'Remove (ms)', min: 80, max: 600, step: 10 },
195
+ { kind: 'range', path: 'cascade.timings.drop', label: 'Drop (ms)', min: 80, max: 600, step: 10 },
196
+ { kind: 'select', path: 'cascade.easings.drop', label: 'Drop easing', options: EASINGS },
197
+ { kind: 'toggle', path: 'cascade.multiplier.enabled', label: 'Win multiplier' },
198
+ { kind: 'select', path: 'cascade.multiplier.mode', label: 'Multiplier mode', options: ['add', 'mul'] },
199
+ { kind: 'range', path: 'cascade.multiplier.step', label: 'Multiplier step', min: 1, max: 5, step: 1 },
200
+ ],
201
+ },
202
+ {
203
+ key: 'win',
204
+ title: 'Win presentation',
205
+ controls: [
206
+ { kind: 'range', path: 'win.highlightScale', label: 'Highlight scale', min: 1, max: 1.4, step: 0.01 },
207
+ { kind: 'toggle', path: 'win.glow', label: 'Glow' },
208
+ { kind: 'toggle', path: 'win.frameShake.enabled', label: 'Frame shake' },
209
+ { kind: 'range', path: 'win.frameShake.amp', label: 'Shake amp', min: 0, max: 10, step: 0.5 },
210
+ ],
211
+ },
212
+ {
213
+ key: 'features',
214
+ title: 'Features',
215
+ controls: [
216
+ { kind: 'toggle', path: 'features.expandingWild.enabled', label: 'Expanding wild' },
217
+ { kind: 'toggle', path: 'features.expandingWild.toFullReel', label: '· to full reel' },
218
+ { kind: 'toggle', path: 'features.sticky.enabled', label: 'Sticky symbols' },
219
+ { kind: 'range', path: 'features.sticky.durationSpins', label: '· duration spins', min: 0, max: 6, step: 1 },
220
+ { kind: 'toggle', path: 'features.walkingWild.enabled', label: 'Walking wild' },
221
+ { kind: 'select', path: 'features.walkingWild.direction', label: '· direction', options: ['left', 'right'] },
222
+ { kind: 'toggle', path: 'features.randomWild.enabled', label: 'Random wild inject' },
223
+ { kind: 'toggle', path: 'features.randomWild.sticky', label: '· sticky' },
224
+ { kind: 'toggle', path: 'features.mystery.enabled', label: 'Mystery symbols' },
225
+ { kind: 'toggle', path: 'features.transform.enabled', label: 'Transform / upgrade' },
226
+ { kind: 'toggle', path: 'features.transform.upgradeOnly', label: '· upgrade only' },
227
+ { kind: 'toggle', path: 'features.giant.enabled', label: 'Giant symbol' },
228
+ { kind: 'range', path: 'features.giant.width', label: '· width', min: 1, max: 5, step: 1 },
229
+ { kind: 'range', path: 'features.giant.height', label: '· height', min: 1, max: 5, step: 1 },
230
+ { kind: 'toggle', path: 'features.split.enabled', label: 'Split (xSplit)' },
231
+ { kind: 'range', path: 'features.split.factor', label: '· factor', min: 2, max: 4, step: 1 },
232
+ { kind: 'toggle', path: 'features.stacked.enabled', label: 'Stacked symbols' },
233
+ { kind: 'range', path: 'features.stacked.height', label: '· stack height', min: 2, max: 7, step: 1 },
234
+ { kind: 'toggle', path: 'features.nudge.enabled', label: 'Nudge / xNudge' },
235
+ { kind: 'toggle', path: 'features.nudge.toFullReel', label: '· xNudge fill' },
236
+ { kind: 'toggle', path: 'features.multiplier.enabled', label: 'Multiplier symbols' },
237
+ { kind: 'select', path: 'features.multiplier.combine', label: '· combine', options: ['additive', 'multiplicative'] },
238
+ { kind: 'toggle', path: 'features.holdAndSpin.enabled', label: 'Hold & Spin' },
239
+ { kind: 'range', path: 'features.holdAndSpin.respinsAwarded', label: '· respins', min: 1, max: 5, step: 1 },
240
+ { kind: 'toggle', path: 'features.reelModifier.enabled', label: 'Reel modifier' },
241
+ ],
242
+ },
243
+ ];
244
+
245
+ // packages/game-engine/src/slot/devtools/controlPanel.ts
246
+ //
247
+ // Renders the reel-config field schema into a DOM panel and binds each control to a
248
+ // live config object. Pure DOM — no pixi. Shared by the harness reel sidebar and the
249
+ // reel-lab playground.
250
+ /* eslint-disable @typescript-eslint/no-explicit-any */
251
+ function getPath(obj, path) {
252
+ return path.split('.').reduce((o, k) => (o == null ? o : o[k]), obj);
253
+ }
254
+ function setPath(obj, path, value) {
255
+ const keys = path.split('.');
256
+ const last = keys.pop();
257
+ const target = keys.reduce((o, k) => (o[k] ??= {}), obj);
258
+ target[last] = value;
259
+ }
260
+ /** Build the control panel into `root`. Returns a `refresh()` that re-syncs inputs from config. */
261
+ function buildControlPanel(root, opts) {
262
+ const schema = opts.schema ?? REEL_FIELD_SCHEMA;
263
+ const updaters = [];
264
+ root.innerHTML = '';
265
+ for (const section of schema)
266
+ root.appendChild(renderSection(section, opts, updaters));
267
+ return { refresh: () => updaters.forEach((u) => u()) };
268
+ }
269
+ function renderSection(section, opts, updaters) {
270
+ const wrap = document.createElement('section');
271
+ wrap.className = 'panel-section';
272
+ const head = document.createElement('button');
273
+ head.className = 'section-head';
274
+ head.textContent = section.title;
275
+ const body = document.createElement('div');
276
+ body.className = 'section-body';
277
+ if (section.collapsed)
278
+ body.style.display = 'none';
279
+ head.addEventListener('click', () => {
280
+ body.style.display = body.style.display === 'none' ? '' : 'none';
281
+ });
282
+ wrap.appendChild(head);
283
+ wrap.appendChild(body);
284
+ for (const c of section.controls)
285
+ body.appendChild(renderControl(c, opts, updaters));
286
+ return wrap;
287
+ }
288
+ function renderControl(c, opts, updaters) {
289
+ const row = document.createElement('label');
290
+ row.className = 'control';
291
+ const name = document.createElement('span');
292
+ name.className = 'control-label';
293
+ name.textContent = c.label;
294
+ row.appendChild(name);
295
+ const emit = () => opts.onChange(c.path);
296
+ if (c.kind === 'toggle') {
297
+ const input = document.createElement('input');
298
+ input.type = 'checkbox';
299
+ const sync = () => {
300
+ input.checked = !!getPath(opts.config, c.path);
301
+ };
302
+ sync();
303
+ input.addEventListener('change', () => {
304
+ setPath(opts.config, c.path, input.checked);
305
+ emit();
306
+ });
307
+ row.classList.add('control-toggle');
308
+ row.appendChild(input);
309
+ updaters.push(sync);
310
+ }
311
+ else if (c.kind === 'select') {
312
+ const sel = document.createElement('select');
313
+ for (const o of c.options) {
314
+ const opt = document.createElement('option');
315
+ opt.value = o;
316
+ opt.textContent = o;
317
+ sel.appendChild(opt);
318
+ }
319
+ const sync = () => {
320
+ sel.value = String(getPath(opts.config, c.path));
321
+ };
322
+ sync();
323
+ sel.addEventListener('change', () => {
324
+ setPath(opts.config, c.path, sel.value);
325
+ emit();
326
+ });
327
+ row.appendChild(sel);
328
+ updaters.push(sync);
329
+ }
330
+ else if (c.kind === 'range') {
331
+ const input = document.createElement('input');
332
+ input.type = 'range';
333
+ input.min = String(c.min);
334
+ input.max = String(c.max);
335
+ input.step = String(c.step);
336
+ const val = document.createElement('output');
337
+ val.className = 'control-value';
338
+ const sync = () => {
339
+ let raw = getPath(opts.config, c.path);
340
+ if ((raw == null || typeof raw !== 'number') && c.fallback != null)
341
+ raw = getPath(opts.config, c.fallback);
342
+ const v = Number(raw);
343
+ input.value = String(v);
344
+ val.textContent = String(v);
345
+ };
346
+ sync();
347
+ input.addEventListener('input', () => {
348
+ const v = Number(input.value);
349
+ setPath(opts.config, c.path, v);
350
+ val.textContent = String(v);
351
+ emit();
352
+ });
353
+ row.appendChild(input);
354
+ row.appendChild(val);
355
+ updaters.push(sync);
356
+ }
357
+ else {
358
+ const input = document.createElement('input');
359
+ input.type = 'color';
360
+ const sync = () => {
361
+ input.value =
362
+ '#' +
363
+ Number(getPath(opts.config, c.path) ?? 0)
364
+ .toString(16)
365
+ .padStart(6, '0');
366
+ };
367
+ sync();
368
+ input.addEventListener('input', () => {
369
+ setPath(opts.config, c.path, parseInt(input.value.slice(1), 16));
370
+ emit();
371
+ });
372
+ row.appendChild(input);
373
+ updaters.push(sync);
374
+ }
375
+ return row;
376
+ }
377
+
378
+ // packages/game-engine/src/slot/config/ReelSystemConfig.ts
379
+ //
380
+ // The single, fully-typed configuration object for the configurable reel system.
381
+ // Everything is optional with sensible defaults — `resolveReelConfig(partial)` deep-merges
382
+ // a partial config onto DEFAULT_REEL_CONFIG so games (and the reel-lab playground) can
383
+ // override only what they need.
384
+ //
385
+ // Design notes are in docs/reels-analysis-and-design.md.
386
+ // ─────────────────────────────────────────────────────────────────────────────
387
+ // Defaults
388
+ // ─────────────────────────────────────────────────────────────────────────────
389
+ const DEFAULT_REEL_CONFIG = {
390
+ grid: {
391
+ cols: 5,
392
+ rows: 3,
393
+ cellSize: 96,
394
+ gap: 6,
395
+ evaluation: 'lines',
396
+ minRows: 2,
397
+ maxRows: 7,
398
+ topReel: null,
399
+ mask: true,
400
+ decoration: { padding: 0 },
401
+ },
402
+ motion: {
403
+ style: 'swap',
404
+ spinUp: 500,
405
+ hold: 200,
406
+ stopStagger: 120,
407
+ stopMode: 'sequential',
408
+ stopOrder: 'ltr',
409
+ settle: { amp: 7, ms: 240, easing: 'easeOutBack' },
410
+ squash: { enabled: false, scaleX: 1.18, scaleY: 0.82, ms: 90 },
411
+ blur: { enabled: false, alpha: 0.85, strength: 8, streaks: false },
412
+ turboFactor: 0.5,
413
+ intensity: 'full',
414
+ slamStop: true,
415
+ symbolsPerReel: 6,
416
+ },
417
+ anticipation: {
418
+ enabled: false,
419
+ triggerSymbols: ['scatter'],
420
+ threshold: 2,
421
+ reels: 'trailing',
422
+ slowdownFactor: 0.3,
423
+ holdMs: 400,
424
+ zoom: { enabled: false, scale: 1.15, ms: 600 },
425
+ },
426
+ cascade: {
427
+ enabled: false,
428
+ gravity: true,
429
+ timings: { reveal: 300, highlight: 400, remove: 250, drop: 220, refill: 220, wait: 150 },
430
+ easings: { highlight: 'easeOutQuad', remove: 'easeInBack', drop: 'easeOutBounce' },
431
+ perStepDecel: 0.08,
432
+ perStepDecelCap: 1.5,
433
+ dimNonWinners: false,
434
+ dimAlpha: 0.35,
435
+ multiplier: {
436
+ enabled: false,
437
+ start: 1,
438
+ mode: 'add',
439
+ step: 1,
440
+ cap: null,
441
+ persistInFreeSpins: false,
442
+ },
443
+ },
444
+ win: {
445
+ highlightScale: 1.12,
446
+ glow: true,
447
+ frameShake: { enabled: false, amp: 3, ms: 180, onlyOnSymbols: null },
448
+ },
449
+ features: {
450
+ expandingWild: {
451
+ enabled: false,
452
+ symbol: 'wild',
453
+ reels: [],
454
+ toFullReel: true,
455
+ ms: 420,
456
+ easing: 'easeOutBack',
457
+ onlyInFreeSpins: false,
458
+ },
459
+ sticky: { enabled: false, symbols: ['wild'], durationSpins: 3, ringColor: 0xec4899 },
460
+ walkingWild: {
461
+ enabled: false,
462
+ symbol: 'wild',
463
+ direction: 'left',
464
+ stepPerSpin: 1,
465
+ awardsRespin: true,
466
+ asStacked: false,
467
+ },
468
+ multiplier: {
469
+ enabled: false,
470
+ symbol: null,
471
+ scope: 'perSymbol',
472
+ combine: 'additive',
473
+ attachedToWild: false,
474
+ max: 128,
475
+ accumulateAcrossFreeSpins: false,
476
+ },
477
+ mystery: { enabled: false, symbol: 'mystery', revealPool: [], canRevealWild: false, ms: 300 },
478
+ transform: {
479
+ enabled: false,
480
+ trigger: null,
481
+ source: 'randomLow',
482
+ target: 'wild',
483
+ allInstances: true,
484
+ upgradeOnly: false,
485
+ ms: 320,
486
+ },
487
+ giant: {
488
+ enabled: false,
489
+ width: 2,
490
+ height: 2,
491
+ symbols: [],
492
+ chosenPerSpin: false,
493
+ onlyInFreeSpins: false,
494
+ },
495
+ split: { enabled: false, symbol: 'split', factor: 2, reels: [], deferUntilRespinsEnd: true },
496
+ stacked: { enabled: false, symbols: [], height: 3 },
497
+ nudge: {
498
+ enabled: false,
499
+ reels: [],
500
+ step: 1,
501
+ toFullReel: false,
502
+ multiplierStart: 1,
503
+ multiplierPerNudge: 1,
504
+ },
505
+ reelModifier: { enabled: false, pool: [], appliesIn: 'both' },
506
+ holdAndSpin: {
507
+ enabled: false,
508
+ lockSymbols: ['coin'],
509
+ triggerThreshold: 6,
510
+ respinsAwarded: 3,
511
+ resetOnNewSymbol: true,
512
+ jackpotTiers: ['Mini', 'Minor', 'Major', 'Grand'],
513
+ fullGridAwardsGrand: true,
514
+ },
515
+ randomWild: {
516
+ enabled: false,
517
+ count: [1, 3],
518
+ sticky: false,
519
+ multiplier: 1,
520
+ trigger: 'onFreeSpins',
521
+ chance: 0.2,
522
+ },
523
+ },
524
+ };
525
+ /** Deep-merge `partial` onto `base` (arrays replace, objects merge). Returns a new object. */
526
+ function mergeReelConfig(base, partial) {
527
+ return structuredCloneSafe(base);
528
+ }
529
+ /** Resolve a partial config to a fully-populated `ReelSystemConfig`. */
530
+ function resolveReelConfig(partial) {
531
+ return mergeReelConfig(DEFAULT_REEL_CONFIG);
532
+ }
533
+ function structuredCloneSafe(v) {
534
+ // structuredClone is available in modern browsers + Node 17+; fall back to JSON for safety.
535
+ if (typeof structuredClone === 'function')
536
+ return structuredClone(v);
537
+ return JSON.parse(JSON.stringify(v));
538
+ }
539
+
540
+ // packages/game-engine/src/slot/devtools/configDiff.ts
541
+ //
542
+ // Compute the minimal override diff of a reel config against the defaults, and emit a
543
+ // paste-ready `resolveReelConfig({...})` TypeScript snippet. Pure — no pixi, no DOM.
544
+ /* eslint-disable @typescript-eslint/no-explicit-any */
545
+ /** Deep diff `obj` against `base`: arrays compared whole, objects recursed, scalars by !==. */
546
+ function configDiff(base, obj) {
547
+ const out = {};
548
+ for (const k of Object.keys(obj ?? {})) {
549
+ const a = base?.[k];
550
+ const b = obj[k];
551
+ if (Array.isArray(b)) {
552
+ if (JSON.stringify(a) !== JSON.stringify(b))
553
+ out[k] = b;
554
+ }
555
+ else if (b && typeof b === 'object') {
556
+ const d = configDiff(a ?? {}, b);
557
+ if (Object.keys(d).length)
558
+ out[k] = d;
559
+ }
560
+ else if (a !== b) {
561
+ out[k] = b;
562
+ }
563
+ }
564
+ return out;
565
+ }
566
+ /* eslint-enable @typescript-eslint/no-explicit-any */
567
+ /** Diff a working config against DEFAULT_REEL_CONFIG (via resolveReelConfig()). */
568
+ function diffFromDefaults(config) {
569
+ return configDiff(resolveReelConfig(), config);
570
+ }
571
+ /** Emit a paste-ready TS module exporting the reel config as overrides-only. */
572
+ function emitReelConfigTs(config) {
573
+ const diff = diffFromDefaults(config);
574
+ return (`import { resolveReelConfig } from '@energy8platform/game-engine/slot';\n\n` +
575
+ `// Only the overrides vs DEFAULT_REEL_CONFIG.\n` +
576
+ `export const reelConfig = resolveReelConfig(${JSON.stringify(diff, null, 2)} as const);\n`);
577
+ }
578
+
579
+ export { REEL_APPLY, REEL_FIELD_SCHEMA, REEL_READY, REEL_REQUEST, REEL_SECTION_KEYS, buildControlPanel, configDiff, diffFromDefaults, emitReelConfigTs, getPath, mountReelDevBridge, setPath };
580
+ //# sourceMappingURL=devtools.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.esm.js","sources":["../src/slot/devtools/protocol.ts","../src/slot/devtools/reelDevBridge.ts","../src/slot/devtools/fieldSchema.ts","../src/slot/devtools/controlPanel.ts","../src/slot/config/ReelSystemConfig.ts","../src/slot/devtools/configDiff.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ var node_url = require('node:url');
4
+
5
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
6
+ /**
7
+ * `@energy8platform/game-engine/harness` — node-only entry.
8
+ *
9
+ * Contributes the reel-config **panel** to `@energy8platform/harness`: a docked
10
+ * right sidebar that tunes a running game's ReelSystem live. Pair it with
11
+ * `mountReelDevBridge` (from `@energy8platform/game-engine/devtools`) in the game.
12
+ *
13
+ * Usage in a game's vite.config:
14
+ * import { createHarness } from '@energy8platform/harness';
15
+ * import { reelDevtoolsPlugin } from '@energy8platform/game-engine/harness';
16
+ * createHarness({ plugins: [ reelDevtoolsPlugin({ sections: { geometry: false } }) ] });
17
+ *
18
+ * Node-only: resolves the built, self-contained panel-client ESM the harness serves.
19
+ */
20
+ function reelDevtoolsPlugin(opts = {}) {
21
+ // The self-contained panel client sits next to this module in dist/.
22
+ const clientEntry = node_url.fileURLToPath(new URL('./reel-panel-client.esm.js', (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('harness.cjs.js', document.baseURI).href))));
23
+ const panel = {
24
+ id: 'reels',
25
+ title: opts.title ?? 'Reels',
26
+ placement: 'sidebar',
27
+ clientEntry,
28
+ config: opts.sections ? { sections: opts.sections } : undefined,
29
+ };
30
+ return { panel };
31
+ }
32
+
33
+ exports.reelDevtoolsPlugin = reelDevtoolsPlugin;
34
+ //# sourceMappingURL=harness.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.cjs.js","sources":["../src/harness/index.ts"],"sourcesContent":[null],"names":["fileURLToPath"],"mappings":";;;;;AAAA;;;;;;;;;;;;;AAaG;AAkBG,SAAU,kBAAkB,CAAC,IAAA,GAAkC,EAAE,EAAA;;AAErE,IAAA,MAAM,WAAW,GAAGA,sBAAa,CAAC,IAAI,GAAG,CAAC,4BAA4B,EAAE,gQAAe,CAAC,CAAC;AACzF,IAAA,MAAM,KAAK,GAAiB;AAC1B,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO;AAC5B,QAAA,SAAS,EAAE,SAAS;QACpB,WAAW;AACX,QAAA,MAAM,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS;KAChE;IACD,OAAO,EAAE,KAAK,EAAE;AAClB;;;;"}