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