@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,430 @@
|
|
|
1
|
+
interface CellFrameStyle {
|
|
2
|
+
radius?: number;
|
|
3
|
+
idle?: {
|
|
4
|
+
color: number;
|
|
5
|
+
alpha: number;
|
|
6
|
+
};
|
|
7
|
+
winning?: {
|
|
8
|
+
color: number;
|
|
9
|
+
alpha: number;
|
|
10
|
+
};
|
|
11
|
+
removed?: {
|
|
12
|
+
color: number;
|
|
13
|
+
alpha: number;
|
|
14
|
+
};
|
|
15
|
+
fresh?: {
|
|
16
|
+
color: number;
|
|
17
|
+
alpha: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Per-strip cell size override: a square scalar, or an explicit width/height. */
|
|
22
|
+
type CellSizeSpec = number | {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/** Names of easing functions available in the engine's `Easing` map (see anim/easing-map.ts). */
|
|
28
|
+
type EasingName = 'linear' | 'easeInQuad' | 'easeOutQuad' | 'easeInOutQuad' | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic' | 'easeInBack' | 'easeOutBack' | 'easeInOutBack' | 'easeOutBounce' | 'easeInBounce' | 'easeOutElastic' | 'easeInSine' | 'easeOutSine' | 'easeInOutSine';
|
|
29
|
+
/** Win-evaluation model. Purely presentational here (affects geometry + highlight), the math lives in Lua. */
|
|
30
|
+
type EvaluationMode = 'lines' | 'ways' | 'anywhere' | 'cluster' | 'megaways' | 'infinity';
|
|
31
|
+
interface GridConfig {
|
|
32
|
+
cols: number;
|
|
33
|
+
/** Uniform row count. Ignored when `rowsPerReel` is set. */
|
|
34
|
+
rows: number;
|
|
35
|
+
/** Per-reel row counts (Megaways / variable-height reels). Length should equal `cols`. */
|
|
36
|
+
rowsPerReel?: number[];
|
|
37
|
+
/** Square cell size (shorthand: same width & height, all reels). */
|
|
38
|
+
cellSize: number;
|
|
39
|
+
/** Rectangular cells, uniform across reels. Override `cellSize` when set. */
|
|
40
|
+
cellWidth?: number;
|
|
41
|
+
cellHeight?: number;
|
|
42
|
+
/** Per-strip cell size (square scalar or {width,height}). Overrides the above for that reel. */
|
|
43
|
+
cellSizePerReel?: CellSizeSpec[];
|
|
44
|
+
/** Uniform gap (shorthand for both axes). */
|
|
45
|
+
gap: number;
|
|
46
|
+
/** Horizontal gap between adjacent reels. Scalar, or per-boundary (length cols-1). Overrides `gap`. */
|
|
47
|
+
colGap?: number | number[];
|
|
48
|
+
/** Vertical gap between rows. Scalar, or per-reel (length cols). Overrides `gap`. */
|
|
49
|
+
rowGap?: number | number[];
|
|
50
|
+
evaluation: EvaluationMode;
|
|
51
|
+
/** For Megaways: clamp per-reel rows to [minRows, maxRows]. */
|
|
52
|
+
minRows?: number;
|
|
53
|
+
maxRows?: number;
|
|
54
|
+
/** Megaways top horizontal reel (renders above the grid, adds to ways). */
|
|
55
|
+
topReel?: {
|
|
56
|
+
size: number;
|
|
57
|
+
} | null;
|
|
58
|
+
mask: boolean;
|
|
59
|
+
frameStyle?: CellFrameStyle;
|
|
60
|
+
decoration?: {
|
|
61
|
+
padding?: number;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
type MotionStyle = 'swap' | 'strip' | 'cascade-drop';
|
|
65
|
+
type StopMode = 'sequential' | 'sync' | 'random';
|
|
66
|
+
type StopOrder = 'ltr' | 'rtl';
|
|
67
|
+
type Intensity = 'full' | 'reduced' | 'minimal';
|
|
68
|
+
interface SettleConfig {
|
|
69
|
+
/** Overshoot amplitude in px applied to the reel before it springs back. */
|
|
70
|
+
amp: number;
|
|
71
|
+
ms: number;
|
|
72
|
+
easing: EasingName;
|
|
73
|
+
}
|
|
74
|
+
/** Squash & stretch on landing impact (Stone-Rush / magnus style). */
|
|
75
|
+
interface SquashConfig {
|
|
76
|
+
enabled: boolean;
|
|
77
|
+
scaleX: number;
|
|
78
|
+
scaleY: number;
|
|
79
|
+
ms: number;
|
|
80
|
+
}
|
|
81
|
+
interface BlurConfig {
|
|
82
|
+
enabled: boolean;
|
|
83
|
+
/** Alpha applied to in-motion symbols (hot-ross uses 0.82). */
|
|
84
|
+
alpha: number;
|
|
85
|
+
/** Runtime BlurFilter strength factor (PixiJS slots demo uses ~8), 0 disables the filter. */
|
|
86
|
+
strength: number;
|
|
87
|
+
/** Draw vertical motion streaks behind moving symbols. */
|
|
88
|
+
streaks: boolean;
|
|
89
|
+
}
|
|
90
|
+
interface MotionConfig {
|
|
91
|
+
style: MotionStyle;
|
|
92
|
+
/** Base spin-up duration (ms) before the first reel can stop. */
|
|
93
|
+
spinUp: number;
|
|
94
|
+
/** Extra hold (ms) at full speed before deceleration. */
|
|
95
|
+
hold: number;
|
|
96
|
+
/** Delay (ms) between consecutive reel stops in sequential mode. */
|
|
97
|
+
stopStagger: number;
|
|
98
|
+
stopMode: StopMode;
|
|
99
|
+
stopOrder: StopOrder;
|
|
100
|
+
settle: SettleConfig;
|
|
101
|
+
squash: SquashConfig;
|
|
102
|
+
blur: BlurConfig;
|
|
103
|
+
/** Multiply all durations in turbo mode (0.5 = twice as fast). */
|
|
104
|
+
turboFactor: number;
|
|
105
|
+
/** Global animation-intensity scale (accessibility): full=1, reduced=0.7, minimal=0.4. */
|
|
106
|
+
intensity: Intensity;
|
|
107
|
+
/** Allow slam/quick-stop (snaps reels to target without changing outcome). */
|
|
108
|
+
slamStop: boolean;
|
|
109
|
+
/** Symbols visible on a reel tape while spinning (swap/strip). */
|
|
110
|
+
symbolsPerReel: number;
|
|
111
|
+
}
|
|
112
|
+
interface AnticipationConfig {
|
|
113
|
+
enabled: boolean;
|
|
114
|
+
/** Symbols that count toward the anticipation threshold (scatter/bonus). */
|
|
115
|
+
triggerSymbols: string[];
|
|
116
|
+
/** Number of trigger symbols already landed that arms anticipation (N−1, usually 2). */
|
|
117
|
+
threshold: number;
|
|
118
|
+
/** Which reels get the slow treatment: the still-spinning trailing reels, or explicit indices. */
|
|
119
|
+
reels: 'trailing' | number[];
|
|
120
|
+
/** Multiply the trailing reel's spin speed (lower = slower / longer). */
|
|
121
|
+
slowdownFactor: number;
|
|
122
|
+
/** Extra hold (ms) before the final anticipation reel lands (300–500 typical). */
|
|
123
|
+
holdMs: number;
|
|
124
|
+
/** Optional grid zoom while anticipating (magnum-opus uses 1.3×). */
|
|
125
|
+
zoom: {
|
|
126
|
+
enabled: boolean;
|
|
127
|
+
scale: number;
|
|
128
|
+
ms: number;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
interface CascadeConfig {
|
|
132
|
+
enabled: boolean;
|
|
133
|
+
/** Animate surviving symbols sliding down into the gaps (true tumble). */
|
|
134
|
+
gravity: boolean;
|
|
135
|
+
timings: {
|
|
136
|
+
reveal: number;
|
|
137
|
+
highlight: number;
|
|
138
|
+
remove: number;
|
|
139
|
+
drop: number;
|
|
140
|
+
refill: number;
|
|
141
|
+
wait: number;
|
|
142
|
+
};
|
|
143
|
+
easings: {
|
|
144
|
+
highlight: EasingName;
|
|
145
|
+
remove: EasingName;
|
|
146
|
+
drop: EasingName;
|
|
147
|
+
};
|
|
148
|
+
/** Slow each successive cascade step to build tension: factor = 1 + step*perStepDecel (capped). */
|
|
149
|
+
perStepDecel: number;
|
|
150
|
+
perStepDecelCap: number;
|
|
151
|
+
/** Dim non-winning symbols during the highlight phase. */
|
|
152
|
+
dimNonWinners: boolean;
|
|
153
|
+
dimAlpha: number;
|
|
154
|
+
/** Running win multiplier that climbs per cascade (Pragmatic Tumble / Avalanche). */
|
|
155
|
+
multiplier: {
|
|
156
|
+
enabled: boolean;
|
|
157
|
+
start: number;
|
|
158
|
+
/** 'add' → +step each step; 'mul' → ×step each step. */
|
|
159
|
+
mode: 'add' | 'mul';
|
|
160
|
+
step: number;
|
|
161
|
+
cap: number | null;
|
|
162
|
+
/** Keep climbing across free-spins instead of resetting per spin. */
|
|
163
|
+
persistInFreeSpins: boolean;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
interface WinConfig {
|
|
167
|
+
highlightScale: number;
|
|
168
|
+
glow: boolean;
|
|
169
|
+
/** Frame shake on landing/win. */
|
|
170
|
+
frameShake: {
|
|
171
|
+
enabled: boolean;
|
|
172
|
+
amp: number;
|
|
173
|
+
ms: number;
|
|
174
|
+
onlyOnSymbols: string[] | null;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
interface ExpandingWildConfig {
|
|
178
|
+
enabled: boolean;
|
|
179
|
+
symbol: string;
|
|
180
|
+
/** Reels that may host an expanding wild (empty = all). */
|
|
181
|
+
reels: number[];
|
|
182
|
+
/** Expand to the full reel height. */
|
|
183
|
+
toFullReel: boolean;
|
|
184
|
+
ms: number;
|
|
185
|
+
easing: EasingName;
|
|
186
|
+
onlyInFreeSpins: boolean;
|
|
187
|
+
}
|
|
188
|
+
interface StickyConfig {
|
|
189
|
+
enabled: boolean;
|
|
190
|
+
symbols: string[];
|
|
191
|
+
/** How many spins a sticky symbol persists (0 = whole feature/bonus). */
|
|
192
|
+
durationSpins: number;
|
|
193
|
+
/** Ring colour drawn around sticky cells. */
|
|
194
|
+
ringColor: number;
|
|
195
|
+
}
|
|
196
|
+
interface WalkingWildConfig {
|
|
197
|
+
enabled: boolean;
|
|
198
|
+
symbol: string;
|
|
199
|
+
direction: 'left' | 'right';
|
|
200
|
+
stepPerSpin: number;
|
|
201
|
+
awardsRespin: boolean;
|
|
202
|
+
asStacked: boolean;
|
|
203
|
+
}
|
|
204
|
+
interface MultiplierConfig {
|
|
205
|
+
enabled: boolean;
|
|
206
|
+
/** Multiplier symbol id (carries a value), or null when multipliers are per-cell data. */
|
|
207
|
+
symbol: string | null;
|
|
208
|
+
scope: 'perSymbol' | 'perReel' | 'global';
|
|
209
|
+
combine: 'additive' | 'multiplicative';
|
|
210
|
+
attachedToWild: boolean;
|
|
211
|
+
max: number;
|
|
212
|
+
accumulateAcrossFreeSpins: boolean;
|
|
213
|
+
}
|
|
214
|
+
interface MysteryConfig {
|
|
215
|
+
enabled: boolean;
|
|
216
|
+
symbol: string;
|
|
217
|
+
/** Eligible reveal targets; all mystery tiles reveal the SAME single draw per spin. */
|
|
218
|
+
revealPool: string[];
|
|
219
|
+
canRevealWild: boolean;
|
|
220
|
+
ms: number;
|
|
221
|
+
}
|
|
222
|
+
interface TransformConfig {
|
|
223
|
+
enabled: boolean;
|
|
224
|
+
/** Trigger symbol whose landing fires the transform (null = data-driven). */
|
|
225
|
+
trigger: string | null;
|
|
226
|
+
/** 'randomLow' picks one low symbol at random; or pin a specific source. */
|
|
227
|
+
source: 'randomLow' | string;
|
|
228
|
+
target: string;
|
|
229
|
+
/** Convert every instance of the source symbol. */
|
|
230
|
+
allInstances: boolean;
|
|
231
|
+
/** Restrict to low→high (upgrade) direction. */
|
|
232
|
+
upgradeOnly: boolean;
|
|
233
|
+
ms: number;
|
|
234
|
+
}
|
|
235
|
+
interface GiantConfig {
|
|
236
|
+
enabled: boolean;
|
|
237
|
+
/** Footprint in cells. */
|
|
238
|
+
width: number;
|
|
239
|
+
height: number;
|
|
240
|
+
/** Symbols that may appear giant (empty = any). */
|
|
241
|
+
symbols: string[];
|
|
242
|
+
/** Pick one giant symbol type per spin. */
|
|
243
|
+
chosenPerSpin: boolean;
|
|
244
|
+
onlyInFreeSpins: boolean;
|
|
245
|
+
}
|
|
246
|
+
interface SplitConfig {
|
|
247
|
+
enabled: boolean;
|
|
248
|
+
symbol: string;
|
|
249
|
+
factor: number;
|
|
250
|
+
/** Reels that can host the split trigger (xSplit lands on the last reel). */
|
|
251
|
+
reels: number[];
|
|
252
|
+
/** Defer the split execution until all respins finish. */
|
|
253
|
+
deferUntilRespinsEnd: boolean;
|
|
254
|
+
}
|
|
255
|
+
interface StackedConfig {
|
|
256
|
+
enabled: boolean;
|
|
257
|
+
symbols: string[];
|
|
258
|
+
/** Max stack height (positions of the same symbol on one reel). */
|
|
259
|
+
height: number;
|
|
260
|
+
}
|
|
261
|
+
interface NudgeConfig {
|
|
262
|
+
enabled: boolean;
|
|
263
|
+
/** Reels eligible to nudge. */
|
|
264
|
+
reels: number[];
|
|
265
|
+
step: number;
|
|
266
|
+
/** xNudge: nudge a stacked wild into full view, +1 multiplier per nudge. */
|
|
267
|
+
toFullReel: boolean;
|
|
268
|
+
multiplierStart: number;
|
|
269
|
+
multiplierPerNudge: number;
|
|
270
|
+
}
|
|
271
|
+
interface ReelModifierConfig {
|
|
272
|
+
enabled: boolean;
|
|
273
|
+
/** Random pre-spin modifiers, each with a trigger weight. */
|
|
274
|
+
pool: {
|
|
275
|
+
effect: 'addRows' | 'addWilds' | 'setGiant' | 'guaranteedWilds';
|
|
276
|
+
magnitude: number;
|
|
277
|
+
weight: number;
|
|
278
|
+
}[];
|
|
279
|
+
appliesIn: 'base' | 'freeSpins' | 'both';
|
|
280
|
+
}
|
|
281
|
+
interface HoldAndSpinConfig {
|
|
282
|
+
enabled: boolean;
|
|
283
|
+
lockSymbols: string[];
|
|
284
|
+
triggerThreshold: number;
|
|
285
|
+
respinsAwarded: number;
|
|
286
|
+
/** Reset the respin counter to full whenever a new symbol locks. */
|
|
287
|
+
resetOnNewSymbol: boolean;
|
|
288
|
+
jackpotTiers: string[];
|
|
289
|
+
fullGridAwardsGrand: boolean;
|
|
290
|
+
}
|
|
291
|
+
interface RandomWildConfig {
|
|
292
|
+
enabled: boolean;
|
|
293
|
+
/** Fixed count, or [min,max] range. */
|
|
294
|
+
count: number | [number, number];
|
|
295
|
+
sticky: boolean;
|
|
296
|
+
multiplier: number;
|
|
297
|
+
trigger: 'randomBaseSpin' | 'onFreeSpins';
|
|
298
|
+
chance: number;
|
|
299
|
+
}
|
|
300
|
+
interface FeaturesConfig {
|
|
301
|
+
expandingWild: ExpandingWildConfig;
|
|
302
|
+
sticky: StickyConfig;
|
|
303
|
+
walkingWild: WalkingWildConfig;
|
|
304
|
+
multiplier: MultiplierConfig;
|
|
305
|
+
mystery: MysteryConfig;
|
|
306
|
+
transform: TransformConfig;
|
|
307
|
+
giant: GiantConfig;
|
|
308
|
+
split: SplitConfig;
|
|
309
|
+
stacked: StackedConfig;
|
|
310
|
+
nudge: NudgeConfig;
|
|
311
|
+
reelModifier: ReelModifierConfig;
|
|
312
|
+
holdAndSpin: HoldAndSpinConfig;
|
|
313
|
+
randomWild: RandomWildConfig;
|
|
314
|
+
}
|
|
315
|
+
interface ReelSystemConfig {
|
|
316
|
+
grid: GridConfig;
|
|
317
|
+
motion: MotionConfig;
|
|
318
|
+
anticipation: AnticipationConfig;
|
|
319
|
+
cascade: CascadeConfig;
|
|
320
|
+
win: WinConfig;
|
|
321
|
+
features: FeaturesConfig;
|
|
322
|
+
}
|
|
323
|
+
/** Deep-partial helper for overrides. */
|
|
324
|
+
type DeepPartial<T> = {
|
|
325
|
+
[K in keyof T]?: T[K] extends (infer U)[] ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
/** Minimal ReelSystem surface the bridge needs (keeps it decoupled/testable). */
|
|
329
|
+
interface ReelDevBridgeTarget {
|
|
330
|
+
readonly config: ReelSystemConfig;
|
|
331
|
+
update(partial: DeepPartial<ReelSystemConfig>): void;
|
|
332
|
+
}
|
|
333
|
+
interface ReelDevBridgeOptions {
|
|
334
|
+
system: ReelDevBridgeTarget;
|
|
335
|
+
/** postMessage targetOrigin for the parent. Default '*' (dev harness, same-origin). */
|
|
336
|
+
targetOrigin?: string;
|
|
337
|
+
/**
|
|
338
|
+
* Guard: only mount when true. Defaults to `import.meta.env?.DEV` when available,
|
|
339
|
+
* else true. Pass `false` to hard-disable.
|
|
340
|
+
*/
|
|
341
|
+
enabled?: boolean;
|
|
342
|
+
}
|
|
343
|
+
interface ReelDevBridge {
|
|
344
|
+
/** Re-announce the current config to the parent. */
|
|
345
|
+
announce(): void;
|
|
346
|
+
/** Detach the message listener. */
|
|
347
|
+
dispose(): void;
|
|
348
|
+
}
|
|
349
|
+
declare function mountReelDevBridge(opts: ReelDevBridgeOptions): ReelDevBridge;
|
|
350
|
+
|
|
351
|
+
type Control = {
|
|
352
|
+
kind: 'select';
|
|
353
|
+
path: string;
|
|
354
|
+
label: string;
|
|
355
|
+
options: string[];
|
|
356
|
+
} | {
|
|
357
|
+
kind: 'range';
|
|
358
|
+
path: string;
|
|
359
|
+
label: string;
|
|
360
|
+
min: number;
|
|
361
|
+
max: number;
|
|
362
|
+
step: number;
|
|
363
|
+
/** When the bound value is unset (undefined / non-scalar), show this path's value instead. */
|
|
364
|
+
fallback?: string;
|
|
365
|
+
} | {
|
|
366
|
+
kind: 'toggle';
|
|
367
|
+
path: string;
|
|
368
|
+
label: string;
|
|
369
|
+
} | {
|
|
370
|
+
kind: 'color';
|
|
371
|
+
path: string;
|
|
372
|
+
label: string;
|
|
373
|
+
};
|
|
374
|
+
/** Stable section identifiers — used to toggle whole sections on/off from the plugin. */
|
|
375
|
+
type SectionKey = 'geometry' | 'motion' | 'anticipation' | 'cascade' | 'win' | 'features';
|
|
376
|
+
/** All section keys, in panel order. */
|
|
377
|
+
declare const REEL_SECTION_KEYS: SectionKey[];
|
|
378
|
+
interface Section {
|
|
379
|
+
/** Stable key for enabling/disabling the whole section (optional for ad-hoc schemas). */
|
|
380
|
+
key?: SectionKey;
|
|
381
|
+
title: string;
|
|
382
|
+
controls: Control[];
|
|
383
|
+
collapsed?: boolean;
|
|
384
|
+
}
|
|
385
|
+
/** The editable reel-config fields, grouped into collapsible sections. */
|
|
386
|
+
declare const REEL_FIELD_SCHEMA: Section[];
|
|
387
|
+
|
|
388
|
+
declare function getPath(obj: any, path: string): any;
|
|
389
|
+
declare function setPath(obj: any, path: string, value: any): void;
|
|
390
|
+
interface ControlPanelOptions {
|
|
391
|
+
/** The live config object the controls read from and mutate. */
|
|
392
|
+
config: unknown;
|
|
393
|
+
/** Called with the changed dot-path after each edit. */
|
|
394
|
+
onChange: (path: string) => void;
|
|
395
|
+
/** Schema to render. Defaults to REEL_FIELD_SCHEMA. */
|
|
396
|
+
schema?: Section[];
|
|
397
|
+
}
|
|
398
|
+
/** Build the control panel into `root`. Returns a `refresh()` that re-syncs inputs from config. */
|
|
399
|
+
declare function buildControlPanel(root: HTMLElement, opts: ControlPanelOptions): {
|
|
400
|
+
refresh: () => void;
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
/** Deep diff `obj` against `base`: arrays compared whole, objects recursed, scalars by !==. */
|
|
404
|
+
declare function configDiff(base: any, obj: any): any;
|
|
405
|
+
/** Diff a working config against DEFAULT_REEL_CONFIG (via resolveReelConfig()). */
|
|
406
|
+
declare function diffFromDefaults(config: ReelSystemConfig): Partial<ReelSystemConfig>;
|
|
407
|
+
/** Emit a paste-ready TS module exporting the reel config as overrides-only. */
|
|
408
|
+
declare function emitReelConfigTs(config: ReelSystemConfig): string;
|
|
409
|
+
|
|
410
|
+
/** Game → panel: announces the current resolved config (on mount + on request). */
|
|
411
|
+
interface ReelReadyMessage {
|
|
412
|
+
type: 'e8:reel:ready';
|
|
413
|
+
config: ReelSystemConfig;
|
|
414
|
+
}
|
|
415
|
+
/** Panel → game: apply a partial config live (system.update). */
|
|
416
|
+
interface ReelApplyMessage {
|
|
417
|
+
type: 'e8:reel:apply';
|
|
418
|
+
patch: DeepPartial<ReelSystemConfig>;
|
|
419
|
+
}
|
|
420
|
+
/** Panel → game: (re)request the current config, e.g. when the panel opens late. */
|
|
421
|
+
interface ReelRequestMessage {
|
|
422
|
+
type: 'e8:reel:request';
|
|
423
|
+
}
|
|
424
|
+
type ReelDevMessage = ReelReadyMessage | ReelApplyMessage | ReelRequestMessage;
|
|
425
|
+
declare const REEL_READY = "e8:reel:ready";
|
|
426
|
+
declare const REEL_APPLY = "e8:reel:apply";
|
|
427
|
+
declare const REEL_REQUEST = "e8:reel:request";
|
|
428
|
+
|
|
429
|
+
export { REEL_APPLY, REEL_FIELD_SCHEMA, REEL_READY, REEL_REQUEST, REEL_SECTION_KEYS, buildControlPanel, configDiff, diffFromDefaults, emitReelConfigTs, getPath, mountReelDevBridge, setPath };
|
|
430
|
+
export type { Control, ControlPanelOptions, ReelApplyMessage, ReelDevBridge, ReelDevBridgeOptions, ReelDevBridgeTarget, ReelDevMessage, ReelReadyMessage, ReelRequestMessage, Section, SectionKey };
|