@energy8platform/platform-core 0.24.6 → 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.
Files changed (52) hide show
  1. package/dist/game-spec.cjs.js +209 -0
  2. package/dist/game-spec.cjs.js.map +1 -0
  3. package/dist/game-spec.d.ts +164 -0
  4. package/dist/game-spec.esm.js +198 -0
  5. package/dist/game-spec.esm.js.map +1 -0
  6. package/dist/index.cjs.js +57 -0
  7. package/dist/index.cjs.js.map +1 -1
  8. package/dist/index.d.ts +44 -1
  9. package/dist/index.esm.js +57 -0
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/lua.cjs.js +5 -2
  12. package/dist/lua.cjs.js.map +1 -1
  13. package/dist/lua.d.ts +9 -0
  14. package/dist/lua.esm.js +5 -2
  15. package/dist/lua.esm.js.map +1 -1
  16. package/dist/shell.cjs.js +35 -0
  17. package/dist/shell.cjs.js.map +1 -1
  18. package/dist/shell.d.ts +16 -1
  19. package/dist/shell.esm.js +35 -1
  20. package/dist/shell.esm.js.map +1 -1
  21. package/dist/simulation.cjs.js +40 -22
  22. package/dist/simulation.cjs.js.map +1 -1
  23. package/dist/simulation.d.ts +35 -2
  24. package/dist/simulation.esm.js +39 -23
  25. package/dist/simulation.esm.js.map +1 -1
  26. package/dist/slot-result.cjs.js +17 -0
  27. package/dist/slot-result.cjs.js.map +1 -0
  28. package/dist/slot-result.d.ts +26 -0
  29. package/dist/slot-result.esm.js +14 -0
  30. package/dist/slot-result.esm.js.map +1 -0
  31. package/package.json +12 -1
  32. package/scripts/gen-version.mjs +21 -0
  33. package/src/PlatformSession.ts +28 -0
  34. package/src/game-spec/defineGame.ts +16 -0
  35. package/src/game-spec/derive.ts +135 -0
  36. package/src/game-spec/export.ts +17 -0
  37. package/src/game-spec/index.ts +6 -0
  38. package/src/game-spec/types.ts +81 -0
  39. package/src/game-spec/validate.ts +49 -0
  40. package/src/lua/LuaEngine.ts +5 -2
  41. package/src/lua/types.ts +8 -0
  42. package/src/shell/GameShell.ts +19 -1
  43. package/src/shell/components/GameInfo.ts +13 -0
  44. package/src/shell/index.ts +1 -0
  45. package/src/shell/shell.css.ts +2 -0
  46. package/src/shell/types.ts +3 -0
  47. package/src/shell/version.ts +3 -0
  48. package/src/simulation/NativeSimulationRunner.ts +62 -26
  49. package/src/simulation/index.ts +3 -0
  50. package/src/slot-result/coerce.ts +11 -0
  51. package/src/slot-result/index.ts +2 -0
  52. package/src/slot-result/types.ts +19 -0
@@ -7,6 +7,28 @@ import { randomBytes } from 'crypto';
7
7
  import { fileURLToPath } from 'url';
8
8
  import { Worker } from 'worker_threads';
9
9
 
10
+ /**
11
+ * Build the CLI args array for the native simulation binary.
12
+ * Pure function — no I/O, easily testable.
13
+ */
14
+ function buildNativeArgs(a) {
15
+ const args = ['-config', a.configPath, '-iterations', String(a.iterations), '-bet', String(a.bet), '-format', 'json'];
16
+ if (a.action)
17
+ args.push('-action', a.action);
18
+ if (a.params !== undefined && a.params !== null && (typeof a.params !== 'object' || Object.keys(a.params).length > 0)) {
19
+ args.push('-params', JSON.stringify(a.params));
20
+ }
21
+ if (a.rng)
22
+ args.push('-rng', a.rng);
23
+ if (a.seed)
24
+ args.push('-seed', a.seed);
25
+ if (a.dump)
26
+ args.push('-dump', a.dump);
27
+ if (a.replay) {
28
+ args.push('-replay-server-seed', a.replay.serverSeed, '-replay-client-seed', a.replay.clientSeed, '-replay-nonce-start', String(a.replay.nonceStart));
29
+ }
30
+ return args;
31
+ }
10
32
  // ─── Runner ─────────────────────────────────────────────
11
33
  class NativeSimulationRunner {
12
34
  config;
@@ -14,7 +36,7 @@ class NativeSimulationRunner {
14
36
  this.config = config;
15
37
  }
16
38
  async run() {
17
- const { binaryPath, script, gameDefinition, iterations, bet, action, params, seed, rng, replay } = this.config;
39
+ const { binaryPath, script, gameDefinition, iterations, bet, action, params, seed, rng, replay, dump } = this.config;
18
40
  if (replay && rng && rng !== 'provably-fair') {
19
41
  throw new Error(`Replay mode requires rng="provably-fair" (got rng="${rng}")`);
20
42
  }
@@ -29,27 +51,7 @@ class NativeSimulationRunner {
29
51
  writeFile(configPath, JSON.stringify({ ...gameDefinition, script_path: luaPath }), 'utf-8'),
30
52
  ]);
31
53
  // Build CLI args
32
- const args = [
33
- '-config', configPath,
34
- '-iterations', String(iterations),
35
- '-bet', String(bet),
36
- '-format', 'json',
37
- ];
38
- if (action) {
39
- args.push('-action', action);
40
- }
41
- if (params && Object.keys(params).length > 0) {
42
- args.push('-params', JSON.stringify(params));
43
- }
44
- if (rng) {
45
- args.push('-rng', rng);
46
- }
47
- if (seed) {
48
- args.push('-seed', seed);
49
- }
50
- if (replay) {
51
- args.push('-replay-server-seed', replay.serverSeed, '-replay-client-seed', replay.clientSeed, '-replay-nonce-start', String(replay.nonceStart));
52
- }
54
+ const args = buildNativeArgs({ configPath, iterations, bet, action, params, rng, seed, dump, replay });
53
55
  // Execute binary
54
56
  const output = await this.exec(binaryPath, args);
55
57
  // Parse JSON output
@@ -203,6 +205,20 @@ function findNativeBinary(baseDir) {
203
205
  }
204
206
  return null;
205
207
  }
208
+ /**
209
+ * Return the native binary path or throw a clear, install-guiding error.
210
+ * The math pipeline is go-native only — NO JS fallback.
211
+ *
212
+ * @param finder - injectable finder for testability; defaults to findNativeBinary.
213
+ */
214
+ function requireNativeBinary(finder = findNativeBinary) {
215
+ const bin = finder();
216
+ if (!bin) {
217
+ throw new Error('native simulation binary not found — run `npm install` (platform-core fetches it via install-simulate). ' +
218
+ 'The math pipeline is go-native only (no JS fallback).');
219
+ }
220
+ return bin;
221
+ }
206
222
  function isExecutable(path) {
207
223
  try {
208
224
  accessSync(path, constants.X_OK);
@@ -395,5 +411,5 @@ function aggregateResults(results) {
395
411
  };
396
412
  }
397
413
 
398
- export { NativeSimulationRunner, ParallelSimulationRunner, findNativeBinary, formatNativeResult };
414
+ export { NativeSimulationRunner, ParallelSimulationRunner, buildNativeArgs, findNativeBinary, formatNativeResult, requireNativeBinary };
399
415
  //# sourceMappingURL=simulation.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"simulation.esm.js","sources":["../src/simulation/NativeSimulationRunner.ts","../src/simulation/ParallelSimulationRunner.ts"],"sourcesContent":[null,null],"names":["fsConstants"],"mappings":"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"}
1
+ {"version":3,"file":"simulation.esm.js","sources":["../src/simulation/NativeSimulationRunner.ts","../src/simulation/ParallelSimulationRunner.ts"],"sourcesContent":[null,null],"names":["fsConstants"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ /** Lua empty tables decode as {} — turn a possibly-{} value into a real array. */
4
+ function asArray(value) {
5
+ return Array.isArray(value) ? value : [];
6
+ }
7
+ /** Apply asArray() to the named fields of a record (Lua {} → []). Optional helper for a game's normalizer. */
8
+ function coerceLuaArrays(obj, fields) {
9
+ const out = { ...obj };
10
+ for (const f of fields)
11
+ out[f] = asArray(out[f]);
12
+ return out;
13
+ }
14
+
15
+ exports.asArray = asArray;
16
+ exports.coerceLuaArrays = coerceLuaArrays;
17
+ //# sourceMappingURL=slot-result.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot-result.cjs.js","sources":["../src/slot-result/coerce.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;AACM,SAAU,OAAO,CAAc,KAAc,EAAA;AACjD,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAI,KAAa,GAAG,EAAE;AACnD;AAEA;AACM,SAAU,eAAe,CAAoC,GAAM,EAAE,MAAgB,EAAA;AACzF,IAAA,MAAM,GAAG,GAA4B,EAAE,GAAG,GAAG,EAAE;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChD,IAAA,OAAO,GAAQ;AACjB;;;;;"}
@@ -0,0 +1,26 @@
1
+ /** Minimal, renderer-agnostic base every normalized slot result satisfies. */
2
+ interface SlotSpinResultBase {
3
+ /** Currency win amount for this play (PlatformSession.play() already applied the bet). */
4
+ totalWin: number;
5
+ freeSpins?: {
6
+ awarded?: number;
7
+ total?: number;
8
+ remaining?: number;
9
+ };
10
+ /** Round id to pass back to `play(action, bet, roundId)` for the next segment of THIS round. */
11
+ roundId?: string;
12
+ /** Actions valid for the next segment; `nextActions[0]` is what to play to advance the round. */
13
+ nextActions?: string[];
14
+ /** True once the round has no further segments to drain (single spin, or final bonus spin). */
15
+ complete?: boolean;
16
+ }
17
+ /** A game declares one of these; the host invokes it on every play. Generic over the game's result type. */
18
+ type SlotResultNormalizer<T extends SlotSpinResultBase> = (raw: unknown) => T;
19
+
20
+ /** Lua empty tables decode as {} — turn a possibly-{} value into a real array. */
21
+ declare function asArray<T = unknown>(value: unknown): T[];
22
+ /** Apply asArray() to the named fields of a record (Lua {} → []). Optional helper for a game's normalizer. */
23
+ declare function coerceLuaArrays<T extends Record<string, unknown>>(obj: T, fields: string[]): T;
24
+
25
+ export { asArray, coerceLuaArrays };
26
+ export type { SlotResultNormalizer, SlotSpinResultBase };
@@ -0,0 +1,14 @@
1
+ /** Lua empty tables decode as {} — turn a possibly-{} value into a real array. */
2
+ function asArray(value) {
3
+ return Array.isArray(value) ? value : [];
4
+ }
5
+ /** Apply asArray() to the named fields of a record (Lua {} → []). Optional helper for a game's normalizer. */
6
+ function coerceLuaArrays(obj, fields) {
7
+ const out = { ...obj };
8
+ for (const f of fields)
9
+ out[f] = asArray(out[f]);
10
+ return out;
11
+ }
12
+
13
+ export { asArray, coerceLuaArrays };
14
+ //# sourceMappingURL=slot-result.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot-result.esm.js","sources":["../src/slot-result/coerce.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACM,SAAU,OAAO,CAAc,KAAc,EAAA;AACjD,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAI,KAAa,GAAG,EAAE;AACnD;AAEA;AACM,SAAU,eAAe,CAAoC,GAAM,EAAE,MAAgB,EAAA;AACzF,IAAA,MAAM,GAAG,GAA4B,EAAE,GAAG,GAAG,EAAE;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChD,IAAA,OAAO,GAAQ;AACjB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energy8platform/platform-core",
3
- "version": "0.24.6",
3
+ "version": "0.25.0",
4
4
  "description": "Energy8 platform core: Lua engine, DevBridge, RTP simulation, and SDK session orchestration. Renderer-agnostic — pair with any game framework (Pixi, Phaser, Three.js, custom).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -44,6 +44,16 @@
44
44
  "import": "./dist/shell.esm.js",
45
45
  "require": "./dist/shell.cjs.js",
46
46
  "types": "./dist/shell.d.ts"
47
+ },
48
+ "./game-spec": {
49
+ "import": "./dist/game-spec.esm.js",
50
+ "require": "./dist/game-spec.cjs.js",
51
+ "types": "./dist/game-spec.d.ts"
52
+ },
53
+ "./slot-result": {
54
+ "import": "./dist/slot-result.esm.js",
55
+ "require": "./dist/slot-result.cjs.js",
56
+ "types": "./dist/slot-result.d.ts"
47
57
  }
48
58
  },
49
59
  "files": [
@@ -54,6 +64,7 @@
54
64
  ],
55
65
  "scripts": {
56
66
  "simulate": "tsx bin/simulate.ts",
67
+ "prebuild": "node scripts/gen-version.mjs",
57
68
  "build": "rollup -c rollup.config.mjs",
58
69
  "dev": "rollup -c rollup.config.mjs -w",
59
70
  "lint": "eslint src/ --ext .ts",
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ // Regenerates src/shell/version.ts from package.json so the bundled shell can stamp the
3
+ // engine version into the game-info footer without importing package.json at runtime (no
4
+ // JSON-bundling plugin in the rollup pipeline). Wired as the `prebuild` npm script, so every
5
+ // `npm run build` (and `prepublishOnly`) refreshes it; committed like the generated fonts.ts.
6
+
7
+ import { readFile, writeFile } from 'node:fs/promises';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { dirname, resolve } from 'node:path';
10
+
11
+ const here = dirname(fileURLToPath(import.meta.url));
12
+ const pkg = JSON.parse(await readFile(resolve(here, '../package.json'), 'utf8'));
13
+ const out = resolve(here, '../src/shell/version.ts');
14
+
15
+ const body = `// AUTO-GENERATED by scripts/gen-version.mjs — do not edit. Mirrors package.json "version".
16
+ /** The @energy8platform/platform-core package version, stamped at build time. */
17
+ export const PACKAGE_VERSION = '${pkg.version}';
18
+ `;
19
+
20
+ await writeFile(out, body);
21
+ console.log(`wrote ${out} (PACKAGE_VERSION = ${pkg.version})`);
@@ -4,6 +4,7 @@ import type {
4
4
  PlayParams,
5
5
  PlayResultData,
6
6
  BalanceData,
7
+ ConnectionStatePayload,
7
8
  } from '@energy8platform/game-sdk';
8
9
  import { DevBridge, type DevBridgeConfig } from './dev-bridge/DevBridge';
9
10
  import { EventEmitter } from './EventEmitter';
@@ -44,6 +45,9 @@ export interface PlatformSessionEvents {
44
45
  balanceUpdate: BalanceData;
45
46
  /** SDK or transport error */
46
47
  error: Error;
48
+ /** Host link state changed (forwarded from the SDK): 'connecting' | 'lost' | 'restored'.
49
+ * The host renders a reconnect overlay on lost/connecting and dismisses it on restored. */
50
+ connectionStateChanged: ConnectionStatePayload;
47
51
  }
48
52
 
49
53
  /**
@@ -114,6 +118,27 @@ export class PlatformSession extends EventEmitter<PlatformSessionEvents> {
114
118
  return this.sdk.play(params);
115
119
  }
116
120
 
121
+ /**
122
+ * Acknowledge a finished PLAY_RESULT (call AFTER the game has animated it).
123
+ *
124
+ * The host uses this to know the client is ready for the next action and, on
125
+ * Stake, to settle the round (`/wallet/end-round`) only once the win
126
+ * animation has played. No-op when constructed with `sdk: false`.
127
+ */
128
+ playAck(result: PlayResultData): void {
129
+ this.sdk?.playAck(result);
130
+ }
131
+
132
+ /**
133
+ * Query the host for an in-flight round (e.g. after a page reload). Resolves with the last
134
+ * result snapshot when a round is still open, or `null`. Used to offer a "resume / finish"
135
+ * choice on boot. Resolves `null` when constructed with `sdk: false`.
136
+ */
137
+ async getState(): Promise<PlayResultData | null> {
138
+ if (!this.sdk) return null;
139
+ return this.sdk.getState();
140
+ }
141
+
117
142
  /** Tear down the SDK, DevBridge, and clear listeners. */
118
143
  destroy(): void {
119
144
  this.sdk?.destroy();
@@ -160,6 +185,9 @@ export async function createPlatformSession(
160
185
  sdk.on('balanceUpdate', (data: BalanceData) => {
161
186
  session.emit('balanceUpdate', data);
162
187
  });
188
+ sdk.on('connectionStateChanged', (state: ConnectionStatePayload) => {
189
+ session.emit('connectionStateChanged', state);
190
+ });
163
191
  }
164
192
 
165
193
  return session;
@@ -0,0 +1,16 @@
1
+ import type { GameSpec, GameModel } from './types';
2
+ import { validateSpec } from './validate';
3
+ import { toGameDefinition, toLuaPrelude, toModeMap, toMathModes, toPaytableView } from './derive';
4
+
5
+ export function defineGame(spec: GameSpec): GameModel {
6
+ validateSpec(spec);
7
+ return {
8
+ spec,
9
+ gameDefinition: toGameDefinition(spec),
10
+ luaPrelude: toLuaPrelude(spec),
11
+ modeMap: toModeMap(spec),
12
+ mathModes: toMathModes(spec),
13
+ paytable: toPaytableView(spec),
14
+ symbols: spec.symbols,
15
+ };
16
+ }
@@ -0,0 +1,135 @@
1
+ // packages/platform-core/src/game-spec/derive.ts
2
+ import type { GameDefinition, ActionDefinition, TransitionRule } from '../lua/types';
3
+ import type { GameSpec, ActionSpec, ActionRole, MathModeSpec, PaytableView } from './types';
4
+
5
+ function freeActionKey(spec: GameSpec): string | undefined {
6
+ return Object.keys(spec.actions).find((k) => spec.actions[k].role === 'free');
7
+ }
8
+
9
+ function defaultStage(role: ActionRole): string {
10
+ return role === 'free' ? 'free_spins' : 'base_game';
11
+ }
12
+
13
+ function defaultTransitions(role: ActionRole, freeKey: string | undefined, actionKey: string): TransitionRule[] {
14
+ if (role === 'free') {
15
+ if (!freeKey) return [];
16
+ return [
17
+ { condition: 'retrigger_spins > 0', add_spins_var: 'retrigger_spins', next_actions: [freeKey] },
18
+ { condition: 'always', next_actions: [freeKey] },
19
+ ];
20
+ }
21
+ // base | buy — always include an "always" fallback so the engine can route back
22
+ const transitions: TransitionRule[] = [];
23
+ if (freeKey) {
24
+ transitions.push({
25
+ condition: 'free_spins_awarded > 0',
26
+ creates_session: true,
27
+ next_actions: [freeKey],
28
+ session_config: { total_spins_var: 'free_spins_awarded' },
29
+ });
30
+ }
31
+ transitions.push({ condition: 'always', next_actions: [actionKey] });
32
+ return transitions;
33
+ }
34
+
35
+ function toActionDefinition(key: string, action: ActionSpec, freeKey: string | undefined): ActionDefinition {
36
+ const role = action.role ?? 'base';
37
+ const transitions = action.transitions ?? defaultTransitions(role, freeKey, key);
38
+ if (role === 'free') {
39
+ return {
40
+ stage: action.stage ?? defaultStage(role),
41
+ debit: 'none',
42
+ credit: 'defer',
43
+ requires_session: true,
44
+ transitions,
45
+ ...(action.feature ? { feature_data: action.feature } : {}),
46
+ };
47
+ }
48
+ return {
49
+ stage: action.stage ?? defaultStage(role),
50
+ debit: 'bet',
51
+ cost_multiplier: action.cost ?? 1,
52
+ credit: role === 'buy' ? 'none' : 'win',
53
+ transitions,
54
+ ...(action.feature ? { feature_data: action.feature } : {}),
55
+ };
56
+ }
57
+
58
+ export function toGameDefinition(spec: GameSpec): GameDefinition {
59
+ const freeKey = freeActionKey(spec);
60
+ const actions: Record<string, ActionDefinition> = {};
61
+ for (const [key, action] of Object.entries(spec.actions)) {
62
+ actions[key] = toActionDefinition(key, action, freeKey);
63
+ }
64
+ return {
65
+ id: spec.id,
66
+ type: 'SLOT',
67
+ actions,
68
+ bet_levels: [...spec.betLevels],
69
+ max_win: { multiplier: spec.maxWin },
70
+ };
71
+ }
72
+
73
+ function luaTable(record: Record<number, number>): string {
74
+ const parts = Object.entries(record).map(([k, v]) => `[${k}]=${v}`);
75
+ return `{${parts.join(', ')}}`;
76
+ }
77
+
78
+ export function toLuaPrelude(spec: GameSpec): string {
79
+ const lines: string[] = ['-- AUTO-GENERATED from game.spec.ts — do not edit'];
80
+ lines.push(`SPEC = { cols = ${spec.grid.cols}, rows = ${spec.grid.rows}, max_win = ${spec.maxWin} }`);
81
+
82
+ const symNames = spec.symbols.map((s) => `"${s.id}"`).join(', ');
83
+ lines.push(`SYMBOLS = { ${symNames} }`);
84
+
85
+ const symIndex = spec.symbols.map((s, i) => `${s.id}=${i + 1}`).join(', ');
86
+ lines.push(`SYM = { ${symIndex} }`);
87
+
88
+ const payEntries = spec.symbols
89
+ .filter((s) => s.pay)
90
+ .map((s) => ` ${s.id} = ${luaTable(s.pay as Record<number, number>)}`);
91
+ lines.push(`PAYTABLE = {\n${payEntries.join(',\n')}\n}`);
92
+
93
+ const valEntries = spec.symbols
94
+ .filter((s) => s.value !== undefined)
95
+ .map((s) => ` ${s.id} = ${Array.isArray(s.value) ? `{${s.value.join(', ')}}` : s.value}`);
96
+ if (valEntries.length) lines.push(`VALUES = {\n${valEntries.join(',\n')}\n}`);
97
+
98
+ return lines.join('\n') + '\n';
99
+ }
100
+
101
+ export function toModeMap(spec: GameSpec): Record<string, string> {
102
+ const map: Record<string, string> = {};
103
+ for (const [key, action] of Object.entries(spec.actions)) {
104
+ const role = action.role ?? 'base';
105
+ if (role === 'free') continue;
106
+ const mode = action.mode ?? (role === 'base' ? 'BASE' : key.toUpperCase());
107
+ map[key] = mode;
108
+ }
109
+ return map;
110
+ }
111
+
112
+ export function toMathModes(spec: GameSpec): MathModeSpec[] {
113
+ const modes: MathModeSpec[] = [];
114
+ for (const [key, action] of Object.entries(spec.actions)) {
115
+ const role = action.role ?? 'base';
116
+ if (role === 'free') continue;
117
+ const mode = action.mode ?? (role === 'base' ? 'BASE' : key.toUpperCase());
118
+ modes.push({
119
+ action: key,
120
+ mode,
121
+ costMultiplier: action.cost ?? 1,
122
+ ...(typeof action.rtp === 'number' ? { rtp: action.rtp } : {}),
123
+ maxWin: action.maxWin ?? spec.maxWin,
124
+ });
125
+ }
126
+ return modes;
127
+ }
128
+
129
+ export function toPaytableView(spec: GameSpec): PaytableView {
130
+ return {
131
+ symbols: spec.symbols
132
+ .filter((s) => s.pay)
133
+ .map((s) => ({ id: s.id, name: s.name ?? s.id, kind: s.kind, pay: { ...(s.pay as Record<number, number>) } })),
134
+ };
135
+ }
@@ -0,0 +1,17 @@
1
+ import type { GameSpec, GameModel } from './types';
2
+ import { defineGame } from './defineGame';
3
+
4
+ export function buildLuaScript(model: GameModel, logicLua: string): string {
5
+ return model.luaPrelude + '\n' + logicLua;
6
+ }
7
+
8
+ export function exportGame(
9
+ spec: GameSpec,
10
+ opts: { logicLua: string },
11
+ ): { 'gameDefinition.json': string; 'script.lua': string } {
12
+ const model = defineGame(spec);
13
+ return {
14
+ 'gameDefinition.json': JSON.stringify(model.gameDefinition, null, 2),
15
+ 'script.lua': buildLuaScript(model, opts.logicLua),
16
+ };
17
+ }
@@ -0,0 +1,6 @@
1
+ export * from './types';
2
+ export { validateSpec, GameSpecError } from './validate';
3
+ export { toGameDefinition, toLuaPrelude, toModeMap, toMathModes, toPaytableView } from './derive';
4
+ export { defineGame } from './defineGame';
5
+ export { buildLuaScript, exportGame } from './export';
6
+ export type { GameDefinition, ActionDefinition, TransitionRule, MaxWinConfig } from '../lua/types';
@@ -0,0 +1,81 @@
1
+ import type { GameDefinition, TransitionRule } from '../lua/types';
2
+
3
+ export type SymbolKind = 'high' | 'mid' | 'low' | 'wild' | 'scatter' | 'multiplier' | 'custom';
4
+ export type ActionRole = 'base' | 'feature' | 'buy' | 'free';
5
+
6
+ export interface SymbolSpec {
7
+ id: string;
8
+ name?: string;
9
+ kind: SymbolKind;
10
+ pay?: Record<number, number>;
11
+ /** Multiplier-symbol x-value(s) (e.g. 100, or [2,3,5]). */
12
+ value?: number | number[];
13
+ /** Arbitrary per-symbol config (tier tables, behavior flags). */
14
+ meta?: Record<string, unknown>;
15
+ }
16
+
17
+ export interface ActionSpec {
18
+ role?: ActionRole;
19
+ stage?: string;
20
+ cost?: number;
21
+ mode?: string;
22
+ feature?: Record<string, unknown>;
23
+ /** Shell display for buy/feature actions (SSOT). */
24
+ title?: string;
25
+ description?: string;
26
+ /** Target RTP for THIS mode (0..1), e.g. 0.96. Single source of truth: seeds the math
27
+ * pipeline's `targetRTP` AND the Game Info per-mode table. `math.config` keeps only optimizer
28
+ * tuning (CV / hit-rate / nRowsOut / tolerances), never the RTP. */
29
+ rtp?: number;
30
+ /** Max win for THIS mode as a bet-multiplier; defaults to the game-level `spec.maxWin`. Seeds the
31
+ * curate cap (`capMaxWin`) for the mode AND the Game Info per-mode "Max Win" cell. */
32
+ maxWin?: number;
33
+ transitions?: TransitionRule[];
34
+ }
35
+
36
+ export interface GameSpec {
37
+ id: string;
38
+ type: 'slot';
39
+ grid: { cols: number; rows: number };
40
+ betLevels: number[];
41
+ defaultBet?: number;
42
+ maxWin: number;
43
+ currency?: string;
44
+ symbols: SymbolSpec[];
45
+ actions: Record<string, ActionSpec>;
46
+ /** Open hint for codegen/UI: 'cascade' | 'cluster' | 'ways' | 'lines' | … */
47
+ mechanic?: string;
48
+ /** Game-level escape hatch. */
49
+ meta?: Record<string, unknown>;
50
+ }
51
+
52
+ export interface MathModeSpec {
53
+ action: string;
54
+ mode: string;
55
+ costMultiplier: number;
56
+ /** Target RTP for the mode (from `ActionSpec.rtp`), if declared — seeds the math pipeline. */
57
+ rtp?: number;
58
+ /** Max win (bet-multiplier) for the mode: `ActionSpec.maxWin` ?? game-level `spec.maxWin`. */
59
+ maxWin: number;
60
+ }
61
+
62
+ export interface PaytableEntry {
63
+ id: string;
64
+ name: string;
65
+ kind: SymbolKind;
66
+ pay: Record<number, number>;
67
+ }
68
+
69
+ export interface PaytableView {
70
+ symbols: PaytableEntry[];
71
+ }
72
+
73
+ export interface GameModel {
74
+ spec: GameSpec;
75
+ gameDefinition: GameDefinition;
76
+ luaPrelude: string;
77
+ modeMap: Record<string, string>;
78
+ mathModes: MathModeSpec[];
79
+ paytable: PaytableView;
80
+ symbols: SymbolSpec[];
81
+ }
@@ -0,0 +1,49 @@
1
+ import type { GameSpec } from './types';
2
+
3
+ export class GameSpecError extends Error {
4
+ constructor(message: string) {
5
+ super(message);
6
+ this.name = 'GameSpecError';
7
+ }
8
+ }
9
+
10
+ export function validateSpec(spec: GameSpec): void {
11
+ if (!spec.id || spec.id.trim() === '') throw new GameSpecError('spec.id is required');
12
+ if (spec.maxWin <= 0) throw new GameSpecError('spec.maxWin must be > 0');
13
+ if (spec.grid.cols <= 0 || spec.grid.rows <= 0) throw new GameSpecError('spec.grid dimensions must be > 0');
14
+
15
+ if (!spec.betLevels.length) throw new GameSpecError('spec.betLevels must be non-empty');
16
+ for (let i = 1; i < spec.betLevels.length; i++) {
17
+ if (spec.betLevels[i] <= spec.betLevels[i - 1]) {
18
+ throw new GameSpecError('spec.betLevels must be strictly ascending');
19
+ }
20
+ }
21
+
22
+ const ids = new Set<string>();
23
+ for (const sym of spec.symbols) {
24
+ if (ids.has(sym.id)) throw new GameSpecError(`duplicate symbol id: ${sym.id}`);
25
+ ids.add(sym.id);
26
+ if (sym.pay) {
27
+ for (const [count, mult] of Object.entries(sym.pay)) {
28
+ if (Number(count) <= 0 || !Number.isInteger(Number(count))) {
29
+ throw new GameSpecError(`symbol ${sym.id} pay key must be a positive integer: ${count}`);
30
+ }
31
+ if (mult <= 0) throw new GameSpecError(`symbol ${sym.id} pay[${count}] must be > 0`);
32
+ }
33
+ }
34
+ }
35
+
36
+ const actionKeys = new Set(Object.keys(spec.actions));
37
+ for (const [key, action] of Object.entries(spec.actions)) {
38
+ if (action.cost !== undefined && action.cost <= 0) {
39
+ throw new GameSpecError(`action ${key} cost must be > 0`);
40
+ }
41
+ for (const t of action.transitions ?? []) {
42
+ for (const next of t.next_actions) {
43
+ if (!actionKeys.has(next)) {
44
+ throw new GameSpecError(`action ${key} transition next_actions references unknown action: ${next}`);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }