@energy8platform/game-engine 0.24.0 → 0.25.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 @@
1
+ {"version":3,"file":"reel-panel-client.esm.js","sources":["../src/slot/devtools/fieldSchema.ts","../src/slot/devtools/controlPanel.ts","../src/slot/config/ReelSystemConfig.ts","../src/slot/devtools/configDiff.ts","../src/slot/devtools/protocol.ts","../src/slot/devtools/panelClient.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energy8platform/game-engine",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "description": "Universal casino game engine built on PixiJS v8 and @energy8platform/game-sdk",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -66,6 +66,16 @@
66
66
  "import": "./dist/slot.esm.js",
67
67
  "require": "./dist/slot.cjs.js",
68
68
  "types": "./dist/slot.d.ts"
69
+ },
70
+ "./devtools": {
71
+ "import": "./dist/devtools.esm.js",
72
+ "require": "./dist/devtools.cjs.js",
73
+ "types": "./dist/devtools.d.ts"
74
+ },
75
+ "./harness": {
76
+ "import": "./dist/harness.esm.js",
77
+ "require": "./dist/harness.cjs.js",
78
+ "types": "./dist/harness.d.ts"
69
79
  }
70
80
  },
71
81
  "files": [
@@ -89,9 +99,13 @@
89
99
  "peerDependencies": {
90
100
  "@energy8platform/game-sdk": "^2.8.0",
91
101
  "@energy8platform/stake-bridge": ">=0.2.1",
102
+ "@energy8platform/harness": "*",
92
103
  "pixi.js": "^8.16.0"
93
104
  },
94
105
  "peerDependenciesMeta": {
106
+ "@energy8platform/harness": {
107
+ "optional": true
108
+ },
95
109
  "@energy8platform/stake-bridge": {
96
110
  "optional": true
97
111
  },
@@ -104,6 +118,7 @@
104
118
  },
105
119
  "devDependencies": {
106
120
  "@energy8platform/game-sdk": "^2.8.0",
121
+ "@energy8platform/harness": "*",
107
122
  "@energy8platform/stake-bridge": "*",
108
123
  "@esotericsoftware/spine-pixi-v8": "~4.2.0",
109
124
  "@pixi/sound": "^6.0.0",
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `@energy8platform/game-engine/harness` — node-only entry.
3
+ *
4
+ * Contributes the reel-config **panel** to `@energy8platform/harness`: a docked
5
+ * right sidebar that tunes a running game's ReelSystem live. Pair it with
6
+ * `mountReelDevBridge` (from `@energy8platform/game-engine/devtools`) in the game.
7
+ *
8
+ * Usage in a game's vite.config:
9
+ * import { createHarness } from '@energy8platform/harness';
10
+ * import { reelDevtoolsPlugin } from '@energy8platform/game-engine/harness';
11
+ * createHarness({ plugins: [ reelDevtoolsPlugin() ] });
12
+ *
13
+ * Node-only: resolves the built, self-contained panel-client ESM the harness serves.
14
+ */
15
+
16
+ import { fileURLToPath } from 'node:url';
17
+
18
+ import type { HarnessPanel, HarnessPlugin } from '@energy8platform/harness';
19
+
20
+ export interface ReelDevtoolsPluginOptions {
21
+ /** Sidebar header / tab label. Default 'Reels'. */
22
+ title?: string;
23
+ }
24
+
25
+ export function reelDevtoolsPlugin(opts: ReelDevtoolsPluginOptions = {}): HarnessPlugin {
26
+ // The self-contained panel client sits next to this module in dist/.
27
+ const clientEntry = fileURLToPath(new URL('./reel-panel-client.esm.js', import.meta.url));
28
+ const panel: HarnessPanel = {
29
+ id: 'reels',
30
+ title: opts.title ?? 'Reels',
31
+ placement: 'sidebar',
32
+ clientEntry,
33
+ };
34
+ return { panel };
35
+ }
@@ -0,0 +1,41 @@
1
+ // packages/game-engine/src/slot/devtools/configDiff.ts
2
+ //
3
+ // Compute the minimal override diff of a reel config against the defaults, and emit a
4
+ // paste-ready `resolveReelConfig({...})` TypeScript snippet. Pure — no pixi, no DOM.
5
+
6
+ import { resolveReelConfig, type ReelSystemConfig } from '../config/ReelSystemConfig';
7
+
8
+ /* eslint-disable @typescript-eslint/no-explicit-any */
9
+ /** Deep diff `obj` against `base`: arrays compared whole, objects recursed, scalars by !==. */
10
+ export function configDiff(base: any, obj: any): any {
11
+ const out: any = {};
12
+ for (const k of Object.keys(obj ?? {})) {
13
+ const a = base?.[k];
14
+ const b = obj[k];
15
+ if (Array.isArray(b)) {
16
+ if (JSON.stringify(a) !== JSON.stringify(b)) out[k] = b;
17
+ } else if (b && typeof b === 'object') {
18
+ const d = configDiff(a ?? {}, b);
19
+ if (Object.keys(d).length) out[k] = d;
20
+ } else if (a !== b) {
21
+ out[k] = b;
22
+ }
23
+ }
24
+ return out;
25
+ }
26
+ /* eslint-enable @typescript-eslint/no-explicit-any */
27
+
28
+ /** Diff a working config against DEFAULT_REEL_CONFIG (via resolveReelConfig()). */
29
+ export function diffFromDefaults(config: ReelSystemConfig): Partial<ReelSystemConfig> {
30
+ return configDiff(resolveReelConfig(), config) as Partial<ReelSystemConfig>;
31
+ }
32
+
33
+ /** Emit a paste-ready TS module exporting the reel config as overrides-only. */
34
+ export function emitReelConfigTs(config: ReelSystemConfig): string {
35
+ const diff = diffFromDefaults(config);
36
+ return (
37
+ `import { resolveReelConfig } from '@energy8platform/game-engine/slot';\n\n` +
38
+ `// Only the overrides vs DEFAULT_REEL_CONFIG.\n` +
39
+ `export const reelConfig = resolveReelConfig(${JSON.stringify(diff, null, 2)} as const);\n`
40
+ );
41
+ }
@@ -0,0 +1,151 @@
1
+ // packages/game-engine/src/slot/devtools/controlPanel.ts
2
+ //
3
+ // Renders the reel-config field schema into a DOM panel and binds each control to a
4
+ // live config object. Pure DOM — no pixi. Shared by the harness reel sidebar and the
5
+ // reel-lab playground.
6
+
7
+ import { REEL_FIELD_SCHEMA, type Control, type Section } from './fieldSchema';
8
+
9
+ /* eslint-disable @typescript-eslint/no-explicit-any */
10
+ export function getPath(obj: any, path: string): any {
11
+ return path.split('.').reduce((o, k) => (o == null ? o : o[k]), obj);
12
+ }
13
+ export function setPath(obj: any, path: string, value: any): void {
14
+ const keys = path.split('.');
15
+ const last = keys.pop() as string;
16
+ const target = keys.reduce((o, k) => (o[k] ??= {}), obj);
17
+ target[last] = value;
18
+ }
19
+ /* eslint-enable @typescript-eslint/no-explicit-any */
20
+
21
+ export interface ControlPanelOptions {
22
+ /** The live config object the controls read from and mutate. */
23
+ config: unknown;
24
+ /** Called with the changed dot-path after each edit. */
25
+ onChange: (path: string) => void;
26
+ /** Schema to render. Defaults to REEL_FIELD_SCHEMA. */
27
+ schema?: Section[];
28
+ }
29
+
30
+ /** Build the control panel into `root`. Returns a `refresh()` that re-syncs inputs from config. */
31
+ export function buildControlPanel(
32
+ root: HTMLElement,
33
+ opts: ControlPanelOptions,
34
+ ): { refresh: () => void } {
35
+ const schema = opts.schema ?? REEL_FIELD_SCHEMA;
36
+ const updaters: (() => void)[] = [];
37
+ root.innerHTML = '';
38
+ for (const section of schema) root.appendChild(renderSection(section, opts, updaters));
39
+ return { refresh: () => updaters.forEach((u) => u()) };
40
+ }
41
+
42
+ function renderSection(
43
+ section: Section,
44
+ opts: ControlPanelOptions,
45
+ updaters: (() => void)[],
46
+ ): HTMLElement {
47
+ const wrap = document.createElement('section');
48
+ wrap.className = 'panel-section';
49
+ const head = document.createElement('button');
50
+ head.className = 'section-head';
51
+ head.textContent = section.title;
52
+ const body = document.createElement('div');
53
+ body.className = 'section-body';
54
+ if (section.collapsed) body.style.display = 'none';
55
+ head.addEventListener('click', () => {
56
+ body.style.display = body.style.display === 'none' ? '' : 'none';
57
+ });
58
+ wrap.appendChild(head);
59
+ wrap.appendChild(body);
60
+ for (const c of section.controls) body.appendChild(renderControl(c, opts, updaters));
61
+ return wrap;
62
+ }
63
+
64
+ function renderControl(c: Control, opts: ControlPanelOptions, updaters: (() => void)[]): HTMLElement {
65
+ const row = document.createElement('label');
66
+ row.className = 'control';
67
+ const name = document.createElement('span');
68
+ name.className = 'control-label';
69
+ name.textContent = c.label;
70
+ row.appendChild(name);
71
+
72
+ const emit = (): void => opts.onChange(c.path);
73
+
74
+ if (c.kind === 'toggle') {
75
+ const input = document.createElement('input');
76
+ input.type = 'checkbox';
77
+ const sync = (): void => {
78
+ input.checked = !!getPath(opts.config, c.path);
79
+ };
80
+ sync();
81
+ input.addEventListener('change', () => {
82
+ setPath(opts.config, c.path, input.checked);
83
+ emit();
84
+ });
85
+ row.classList.add('control-toggle');
86
+ row.appendChild(input);
87
+ updaters.push(sync);
88
+ } else if (c.kind === 'select') {
89
+ const sel = document.createElement('select');
90
+ for (const o of c.options) {
91
+ const opt = document.createElement('option');
92
+ opt.value = o;
93
+ opt.textContent = o;
94
+ sel.appendChild(opt);
95
+ }
96
+ const sync = (): void => {
97
+ sel.value = String(getPath(opts.config, c.path));
98
+ };
99
+ sync();
100
+ sel.addEventListener('change', () => {
101
+ setPath(opts.config, c.path, sel.value);
102
+ emit();
103
+ });
104
+ row.appendChild(sel);
105
+ updaters.push(sync);
106
+ } else if (c.kind === 'range') {
107
+ const input = document.createElement('input');
108
+ input.type = 'range';
109
+ input.min = String(c.min);
110
+ input.max = String(c.max);
111
+ input.step = String(c.step);
112
+ const val = document.createElement('output');
113
+ val.className = 'control-value';
114
+ const sync = (): void => {
115
+ let raw = getPath(opts.config, c.path);
116
+ if ((raw == null || typeof raw !== 'number') && c.fallback != null)
117
+ raw = getPath(opts.config, c.fallback);
118
+ const v = Number(raw);
119
+ input.value = String(v);
120
+ val.textContent = String(v);
121
+ };
122
+ sync();
123
+ input.addEventListener('input', () => {
124
+ const v = Number(input.value);
125
+ setPath(opts.config, c.path, v);
126
+ val.textContent = String(v);
127
+ emit();
128
+ });
129
+ row.appendChild(input);
130
+ row.appendChild(val);
131
+ updaters.push(sync);
132
+ } else {
133
+ const input = document.createElement('input');
134
+ input.type = 'color';
135
+ const sync = (): void => {
136
+ input.value =
137
+ '#' +
138
+ Number(getPath(opts.config, c.path) ?? 0)
139
+ .toString(16)
140
+ .padStart(6, '0');
141
+ };
142
+ sync();
143
+ input.addEventListener('input', () => {
144
+ setPath(opts.config, c.path, parseInt(input.value.slice(1), 16));
145
+ emit();
146
+ });
147
+ row.appendChild(input);
148
+ updaters.push(sync);
149
+ }
150
+ return row;
151
+ }
@@ -0,0 +1,190 @@
1
+ // packages/game-engine/src/slot/devtools/fieldSchema.ts
2
+ //
3
+ // Declarative description of the reel-config control panel. Each control binds to a
4
+ // dot-path in the ReelSystemConfig. Pure data — no pixi, no DOM — so it bundles into
5
+ // the self-contained panel client served by the harness.
6
+ //
7
+ // NOTE: board shape (grid.cols / grid.rows / rowsPerReel) is intentionally OMITTED.
8
+ // The board shape is math-tied (paylines / ways / book geometry) and must not be
9
+ // tuned live from the harness. Everything else — cosmetic geometry, motion,
10
+ // anticipation, cascade, win presentation and features — is tunable.
11
+
12
+ export type Control =
13
+ | { kind: 'select'; path: string; label: string; options: string[] }
14
+ | {
15
+ kind: 'range';
16
+ path: string;
17
+ label: string;
18
+ min: number;
19
+ max: number;
20
+ step: number;
21
+ /** When the bound value is unset (undefined / non-scalar), show this path's value instead. */
22
+ fallback?: string;
23
+ }
24
+ | { kind: 'toggle'; path: string; label: string }
25
+ | { kind: 'color'; path: string; label: string };
26
+
27
+ export interface Section {
28
+ title: string;
29
+ controls: Control[];
30
+ collapsed?: boolean;
31
+ }
32
+
33
+ const EASINGS = [
34
+ 'linear',
35
+ 'easeOutQuad',
36
+ 'easeOutCubic',
37
+ 'easeOutBack',
38
+ 'easeOutBounce',
39
+ 'easeInBack',
40
+ 'easeOutElastic',
41
+ 'easeInOutSine',
42
+ 'easeInOutQuad',
43
+ ];
44
+
45
+ /** The editable reel-config fields, grouped into collapsible sections. */
46
+ export const REEL_FIELD_SCHEMA: Section[] = [
47
+ {
48
+ title: 'Cell geometry',
49
+ controls: [
50
+ { kind: 'range', path: 'grid.cellSize', label: 'Cell size', min: 40, max: 120, step: 1 },
51
+ { kind: 'range', path: 'grid.gap', label: 'Gap', min: 0, max: 16, step: 1 },
52
+ {
53
+ kind: 'select',
54
+ path: 'grid.evaluation',
55
+ label: 'Evaluation',
56
+ options: ['lines', 'ways', 'anywhere', 'cluster', 'megaways', 'infinity'],
57
+ },
58
+ { kind: 'toggle', path: 'grid.mask', label: 'Mask reels' },
59
+ {
60
+ kind: 'range',
61
+ path: 'grid.cellWidth',
62
+ label: 'Cell width',
63
+ min: 40,
64
+ max: 160,
65
+ step: 1,
66
+ fallback: 'grid.cellSize',
67
+ },
68
+ {
69
+ kind: 'range',
70
+ path: 'grid.cellHeight',
71
+ label: 'Cell height',
72
+ min: 40,
73
+ max: 160,
74
+ step: 1,
75
+ fallback: 'grid.cellSize',
76
+ },
77
+ {
78
+ kind: 'range',
79
+ path: 'grid.colGap',
80
+ label: 'Column gap',
81
+ min: 0,
82
+ max: 40,
83
+ step: 1,
84
+ fallback: 'grid.gap',
85
+ },
86
+ {
87
+ kind: 'range',
88
+ path: 'grid.rowGap',
89
+ label: 'Row gap',
90
+ min: 0,
91
+ max: 40,
92
+ step: 1,
93
+ fallback: 'grid.gap',
94
+ },
95
+ ],
96
+ },
97
+ {
98
+ title: 'Motion',
99
+ controls: [
100
+ { kind: 'select', path: 'motion.style', label: 'Style', options: ['swap', 'strip', 'cascade-drop'] },
101
+ { kind: 'range', path: 'motion.spinUp', label: 'Spin-up (ms)', min: 100, max: 2500, step: 10 },
102
+ { kind: 'range', path: 'motion.hold', label: 'Hold (ms)', min: 0, max: 800, step: 10 },
103
+ { kind: 'range', path: 'motion.stopStagger', label: 'Stop stagger (ms)', min: 0, max: 400, step: 5 },
104
+ { kind: 'select', path: 'motion.stopMode', label: 'Stop mode', options: ['sequential', 'sync', 'random'] },
105
+ { kind: 'select', path: 'motion.stopOrder', label: 'Stop order', options: ['ltr', 'rtl'] },
106
+ { kind: 'range', path: 'motion.settle.amp', label: 'Settle amp (px)', min: 0, max: 24, step: 1 },
107
+ { kind: 'range', path: 'motion.settle.ms', label: 'Settle (ms)', min: 60, max: 500, step: 10 },
108
+ { kind: 'select', path: 'motion.settle.easing', label: 'Settle easing', options: EASINGS },
109
+ { kind: 'toggle', path: 'motion.squash.enabled', label: 'Squash on land' },
110
+ { kind: 'range', path: 'motion.squash.scaleX', label: 'Squash X', min: 1, max: 1.5, step: 0.01 },
111
+ { kind: 'range', path: 'motion.squash.scaleY', label: 'Squash Y', min: 0.5, max: 1, step: 0.01 },
112
+ { kind: 'toggle', path: 'motion.blur.enabled', label: 'Motion blur' },
113
+ { kind: 'range', path: 'motion.blur.alpha', label: 'Blur alpha', min: 0.3, max: 1, step: 0.01 },
114
+ { kind: 'range', path: 'motion.blur.strength', label: 'Blur strength', min: 0, max: 16, step: 1 },
115
+ { kind: 'toggle', path: 'motion.blur.streaks', label: 'Blur streaks' },
116
+ { kind: 'range', path: 'motion.turboFactor', label: 'Turbo factor', min: 0.2, max: 1, step: 0.05 },
117
+ { kind: 'select', path: 'motion.intensity', label: 'Intensity', options: ['full', 'reduced', 'minimal'] },
118
+ { kind: 'toggle', path: 'motion.slamStop', label: 'Slam stop' },
119
+ { kind: 'range', path: 'motion.symbolsPerReel', label: 'Tape length', min: 3, max: 24, step: 1 },
120
+ ],
121
+ },
122
+ {
123
+ title: 'Anticipation',
124
+ controls: [
125
+ { kind: 'toggle', path: 'anticipation.enabled', label: 'Enabled' },
126
+ { kind: 'range', path: 'anticipation.threshold', label: 'Threshold (N−1)', min: 1, max: 6, step: 1 },
127
+ { kind: 'range', path: 'anticipation.slowdownFactor', label: 'Slowdown', min: 0.1, max: 1, step: 0.05 },
128
+ { kind: 'range', path: 'anticipation.holdMs', label: 'Hold (ms)', min: 0, max: 1200, step: 50 },
129
+ { kind: 'toggle', path: 'anticipation.zoom.enabled', label: 'Reel zoom' },
130
+ { kind: 'range', path: 'anticipation.zoom.scale', label: 'Zoom scale', min: 1, max: 1.6, step: 0.05 },
131
+ { kind: 'range', path: 'anticipation.zoom.ms', label: 'Zoom (ms)', min: 200, max: 1200, step: 50 },
132
+ ],
133
+ },
134
+ {
135
+ title: 'Cascade / Tumble',
136
+ controls: [
137
+ { kind: 'toggle', path: 'cascade.enabled', label: 'Enabled' },
138
+ { kind: 'toggle', path: 'cascade.gravity', label: 'Gravity (survivors slide)' },
139
+ { kind: 'toggle', path: 'cascade.dimNonWinners', label: 'Dim non-winners' },
140
+ { kind: 'range', path: 'cascade.dimAlpha', label: 'Dim alpha', min: 0.1, max: 1, step: 0.05 },
141
+ { kind: 'range', path: 'cascade.perStepDecel', label: 'Per-step decel', min: 0, max: 0.4, step: 0.01 },
142
+ { kind: 'range', path: 'cascade.perStepDecelCap', label: 'Decel cap', min: 1, max: 3, step: 0.1 },
143
+ { kind: 'range', path: 'cascade.timings.remove', label: 'Remove (ms)', min: 80, max: 600, step: 10 },
144
+ { kind: 'range', path: 'cascade.timings.drop', label: 'Drop (ms)', min: 80, max: 600, step: 10 },
145
+ { kind: 'select', path: 'cascade.easings.drop', label: 'Drop easing', options: EASINGS },
146
+ { kind: 'toggle', path: 'cascade.multiplier.enabled', label: 'Win multiplier' },
147
+ { kind: 'select', path: 'cascade.multiplier.mode', label: 'Multiplier mode', options: ['add', 'mul'] },
148
+ { kind: 'range', path: 'cascade.multiplier.step', label: 'Multiplier step', min: 1, max: 5, step: 1 },
149
+ ],
150
+ },
151
+ {
152
+ title: 'Win presentation',
153
+ controls: [
154
+ { kind: 'range', path: 'win.highlightScale', label: 'Highlight scale', min: 1, max: 1.4, step: 0.01 },
155
+ { kind: 'toggle', path: 'win.glow', label: 'Glow' },
156
+ { kind: 'toggle', path: 'win.frameShake.enabled', label: 'Frame shake' },
157
+ { kind: 'range', path: 'win.frameShake.amp', label: 'Shake amp', min: 0, max: 10, step: 0.5 },
158
+ ],
159
+ },
160
+ {
161
+ title: 'Features',
162
+ controls: [
163
+ { kind: 'toggle', path: 'features.expandingWild.enabled', label: 'Expanding wild' },
164
+ { kind: 'toggle', path: 'features.expandingWild.toFullReel', label: '· to full reel' },
165
+ { kind: 'toggle', path: 'features.sticky.enabled', label: 'Sticky symbols' },
166
+ { kind: 'range', path: 'features.sticky.durationSpins', label: '· duration spins', min: 0, max: 6, step: 1 },
167
+ { kind: 'toggle', path: 'features.walkingWild.enabled', label: 'Walking wild' },
168
+ { kind: 'select', path: 'features.walkingWild.direction', label: '· direction', options: ['left', 'right'] },
169
+ { kind: 'toggle', path: 'features.randomWild.enabled', label: 'Random wild inject' },
170
+ { kind: 'toggle', path: 'features.randomWild.sticky', label: '· sticky' },
171
+ { kind: 'toggle', path: 'features.mystery.enabled', label: 'Mystery symbols' },
172
+ { kind: 'toggle', path: 'features.transform.enabled', label: 'Transform / upgrade' },
173
+ { kind: 'toggle', path: 'features.transform.upgradeOnly', label: '· upgrade only' },
174
+ { kind: 'toggle', path: 'features.giant.enabled', label: 'Giant symbol' },
175
+ { kind: 'range', path: 'features.giant.width', label: '· width', min: 1, max: 5, step: 1 },
176
+ { kind: 'range', path: 'features.giant.height', label: '· height', min: 1, max: 5, step: 1 },
177
+ { kind: 'toggle', path: 'features.split.enabled', label: 'Split (xSplit)' },
178
+ { kind: 'range', path: 'features.split.factor', label: '· factor', min: 2, max: 4, step: 1 },
179
+ { kind: 'toggle', path: 'features.stacked.enabled', label: 'Stacked symbols' },
180
+ { kind: 'range', path: 'features.stacked.height', label: '· stack height', min: 2, max: 7, step: 1 },
181
+ { kind: 'toggle', path: 'features.nudge.enabled', label: 'Nudge / xNudge' },
182
+ { kind: 'toggle', path: 'features.nudge.toFullReel', label: '· xNudge fill' },
183
+ { kind: 'toggle', path: 'features.multiplier.enabled', label: 'Multiplier symbols' },
184
+ { kind: 'select', path: 'features.multiplier.combine', label: '· combine', options: ['additive', 'multiplicative'] },
185
+ { kind: 'toggle', path: 'features.holdAndSpin.enabled', label: 'Hold & Spin' },
186
+ { kind: 'range', path: 'features.holdAndSpin.respinsAwarded', label: '· respins', min: 1, max: 5, step: 1 },
187
+ { kind: 'toggle', path: 'features.reelModifier.enabled', label: 'Reel modifier' },
188
+ ],
189
+ },
190
+ ];
@@ -0,0 +1,31 @@
1
+ // packages/game-engine/src/slot/devtools/index.ts
2
+ //
3
+ // Browser-facing reel devtools: the game-side bridge plus the shared control-panel /
4
+ // diff builders (reused by the reel-lab playground). Pixi-free.
5
+
6
+ export { mountReelDevBridge } from './reelDevBridge';
7
+ export type {
8
+ ReelDevBridge,
9
+ ReelDevBridgeOptions,
10
+ ReelDevBridgeTarget,
11
+ } from './reelDevBridge';
12
+
13
+ export { buildControlPanel, getPath, setPath } from './controlPanel';
14
+ export type { ControlPanelOptions } from './controlPanel';
15
+
16
+ export { REEL_FIELD_SCHEMA } from './fieldSchema';
17
+ export type { Control, Section } from './fieldSchema';
18
+
19
+ export { configDiff, diffFromDefaults, emitReelConfigTs } from './configDiff';
20
+
21
+ export {
22
+ REEL_READY,
23
+ REEL_APPLY,
24
+ REEL_REQUEST,
25
+ } from './protocol';
26
+ export type {
27
+ ReelDevMessage,
28
+ ReelReadyMessage,
29
+ ReelApplyMessage,
30
+ ReelRequestMessage,
31
+ } from './protocol';
@@ -0,0 +1,113 @@
1
+ // packages/game-engine/src/slot/devtools/panelClient.ts
2
+ //
3
+ // The harness "Reels" sidebar panel client. Built as a SELF-CONTAINED browser ESM
4
+ // (dist/reel-panel-client.js) and served by the harness at /__harness/panel/reels.js.
5
+ // Default-exports the HarnessPanelMount the core client calls.
6
+ //
7
+ // It seeds its controls from the running game's config (received over the bus), applies
8
+ // every edit LIVE (posts a patch → the game's reel bridge calls system.update), and
9
+ // offers a "Copy config" button that emits the paste-ready overrides snippet.
10
+
11
+ import type { HarnessPanelMount } from '@energy8platform/harness/panel';
12
+ import type { ReelSystemConfig } from '../config/ReelSystemConfig';
13
+ import { buildControlPanel } from './controlPanel';
14
+ import { emitReelConfigTs } from './configDiff';
15
+ import { REEL_APPLY, REEL_READY, REEL_REQUEST, type ReelDevMessage } from './protocol';
16
+
17
+ const CSS = `
18
+ .e8rp-wait { color: #6b7480; font-size: 12px; line-height: 1.6; padding: 8px 2px; }
19
+ .e8rp-bar { display: flex; gap: 8px; margin-bottom: 12px; }
20
+ .e8rp-bar button {
21
+ flex: 1 1 0; background: #1c2128; color: #cfd5dd; border: 1px solid #3a414c; border-radius: 8px;
22
+ padding: 8px; font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
23
+ }
24
+ .e8rp-bar button:hover { border-color: #4b5563; color: #fff; }
25
+ .e8rp-status { font-size: 11px; color: #6b7480; min-height: 14px; margin-bottom: 8px; }
26
+ .e8rp-controls .panel-section { border-top: 1px solid #1d222a; }
27
+ .e8rp-controls .section-head {
28
+ width: 100%; text-align: left; background: transparent; border: 0; color: #aab2bd;
29
+ font: inherit; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
30
+ padding: 10px 2px 6px; cursor: pointer;
31
+ }
32
+ .e8rp-controls .section-body { display: flex; flex-direction: column; gap: 2px; padding-bottom: 6px; }
33
+ .e8rp-controls .control {
34
+ display: flex; align-items: center; gap: 8px; padding: 4px 2px; font-size: 12px; color: #d3d8df;
35
+ }
36
+ .e8rp-controls .control-label { flex: 1 1 auto; }
37
+ .e8rp-controls .control-value { width: 34px; text-align: right; color: #828b98; font-variant-numeric: tabular-nums; }
38
+ .e8rp-controls input[type=range] { flex: 0 0 120px; }
39
+ .e8rp-controls select { background: #1c2128; color: #e9ecf1; border: 1px solid #3a414c; border-radius: 6px; padding: 3px 6px; font: inherit; font-size: 12px; }
40
+ .e8rp-controls .control-toggle { justify-content: space-between; }
41
+ `;
42
+
43
+ function injectCss(): void {
44
+ if (document.getElementById('e8-reel-panel-css')) return;
45
+ const style = document.createElement('style');
46
+ style.id = 'e8-reel-panel-css';
47
+ style.textContent = CSS;
48
+ document.head.appendChild(style);
49
+ }
50
+
51
+ const mount: HarnessPanelMount = (ctx) => {
52
+ injectCss();
53
+ const root = ctx.root;
54
+ root.innerHTML = '<p class="e8rp-wait">Waiting for the game’s reel bridge…<br/>(the game must call <code>mountReelDevBridge</code>.)</p>';
55
+
56
+ let working: ReelSystemConfig | null = null;
57
+ let built = false;
58
+
59
+ const status = (msg: string): void => {
60
+ const el = root.querySelector<HTMLElement>('.e8rp-status');
61
+ if (el) el.textContent = msg;
62
+ };
63
+ const copy = (text: string, label: string): void => {
64
+ navigator.clipboard
65
+ ?.writeText(text)
66
+ .then(() => status(`${label} copied`))
67
+ .catch(() => status('Copy failed'));
68
+ };
69
+
70
+ const buildUi = (config: ReelSystemConfig): void => {
71
+ working = structuredClone(config);
72
+ root.innerHTML = '';
73
+
74
+ const bar = document.createElement('div');
75
+ bar.className = 'e8rp-bar';
76
+ const copyTs = document.createElement('button');
77
+ copyTs.textContent = 'Copy config';
78
+ copyTs.addEventListener('click', () => working && copy(emitReelConfigTs(working), 'TS config'));
79
+ const copyJson = document.createElement('button');
80
+ copyJson.textContent = 'Copy JSON';
81
+ copyJson.addEventListener('click', () => working && copy(JSON.stringify(working, null, 2), 'JSON'));
82
+ bar.append(copyTs, copyJson);
83
+
84
+ const statusEl = document.createElement('div');
85
+ statusEl.className = 'e8rp-status';
86
+
87
+ const controls = document.createElement('div');
88
+ controls.className = 'e8rp-controls';
89
+
90
+ root.append(bar, statusEl, controls);
91
+
92
+ buildControlPanel(controls, {
93
+ config: working,
94
+ onChange: () => {
95
+ ctx.post({ type: REEL_APPLY, patch: working as ReelSystemConfig } satisfies ReelDevMessage);
96
+ },
97
+ });
98
+ built = true;
99
+ };
100
+
101
+ ctx.on((raw) => {
102
+ const msg = raw as ReelDevMessage | undefined;
103
+ if (msg && typeof msg === 'object' && msg.type === REEL_READY) buildUi(msg.config);
104
+ });
105
+
106
+ // Ask the game for its config (covers the game-loaded-first case); retry a couple times.
107
+ const request = (): void => ctx.post({ type: REEL_REQUEST } satisfies ReelDevMessage);
108
+ request();
109
+ window.setTimeout(() => !built && request(), 400);
110
+ window.setTimeout(() => !built && request(), 1200);
111
+ };
112
+
113
+ export default mount;