@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.
- package/dist/game-spec.cjs.js +209 -0
- package/dist/game-spec.cjs.js.map +1 -0
- package/dist/game-spec.d.ts +164 -0
- package/dist/game-spec.esm.js +198 -0
- package/dist/game-spec.esm.js.map +1 -0
- package/dist/index.cjs.js +57 -0
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +44 -1
- package/dist/index.esm.js +57 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/lua.cjs.js +5 -2
- package/dist/lua.cjs.js.map +1 -1
- package/dist/lua.d.ts +9 -0
- package/dist/lua.esm.js +5 -2
- package/dist/lua.esm.js.map +1 -1
- package/dist/shell.cjs.js +35 -0
- package/dist/shell.cjs.js.map +1 -1
- package/dist/shell.d.ts +16 -1
- package/dist/shell.esm.js +35 -1
- package/dist/shell.esm.js.map +1 -1
- package/dist/simulation.cjs.js +40 -22
- package/dist/simulation.cjs.js.map +1 -1
- package/dist/simulation.d.ts +35 -2
- package/dist/simulation.esm.js +39 -23
- package/dist/simulation.esm.js.map +1 -1
- package/dist/slot-result.cjs.js +17 -0
- package/dist/slot-result.cjs.js.map +1 -0
- package/dist/slot-result.d.ts +26 -0
- package/dist/slot-result.esm.js +14 -0
- package/dist/slot-result.esm.js.map +1 -0
- package/package.json +12 -1
- package/scripts/gen-version.mjs +21 -0
- package/src/PlatformSession.ts +28 -0
- package/src/game-spec/defineGame.ts +16 -0
- package/src/game-spec/derive.ts +135 -0
- package/src/game-spec/export.ts +17 -0
- package/src/game-spec/index.ts +6 -0
- package/src/game-spec/types.ts +81 -0
- package/src/game-spec/validate.ts +49 -0
- package/src/lua/LuaEngine.ts +5 -2
- package/src/lua/types.ts +8 -0
- package/src/shell/GameShell.ts +19 -1
- package/src/shell/components/GameInfo.ts +13 -0
- package/src/shell/index.ts +1 -0
- package/src/shell/shell.css.ts +2 -0
- package/src/shell/types.ts +3 -0
- package/src/shell/version.ts +3 -0
- package/src/simulation/NativeSimulationRunner.ts +62 -26
- package/src/simulation/index.ts +3 -0
- package/src/slot-result/coerce.ts +11 -0
- package/src/slot-result/index.ts +2 -0
- package/src/slot-result/types.ts +19 -0
package/dist/simulation.esm.js
CHANGED
|
@@ -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.
|
|
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})`);
|
package/src/PlatformSession.ts
CHANGED
|
@@ -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
|
+
}
|