@energy8platform/game-engine 0.9.1 → 0.10.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/README.md +293 -1414
- package/bin/simulate.ts +75 -0
- package/dist/debug.cjs.js +892 -18
- package/dist/debug.cjs.js.map +1 -1
- package/dist/debug.d.ts +64 -0
- package/dist/debug.esm.js +892 -18
- package/dist/debug.esm.js.map +1 -1
- package/dist/index.cjs.js +899 -18
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +239 -2
- package/dist/index.esm.js +893 -19
- package/dist/index.esm.js.map +1 -1
- package/dist/lua.cjs.js +1000 -0
- package/dist/lua.cjs.js.map +1 -0
- package/dist/lua.d.ts +296 -0
- package/dist/lua.esm.js +990 -0
- package/dist/lua.esm.js.map +1 -0
- package/dist/vite.cjs.js +34 -0
- package/dist/vite.cjs.js.map +1 -1
- package/dist/vite.esm.js +34 -0
- package/dist/vite.esm.js.map +1 -1
- package/package.json +29 -13
- package/src/debug/DevBridge.ts +73 -22
- package/src/index.ts +17 -0
- package/src/lua/ActionRouter.ts +132 -0
- package/src/lua/LuaEngine.ts +322 -0
- package/src/lua/LuaEngineAPI.ts +305 -0
- package/src/lua/PersistentState.ts +80 -0
- package/src/lua/SessionManager.ts +178 -0
- package/src/lua/SimulationRunner.ts +195 -0
- package/src/lua/index.ts +22 -0
- package/src/lua/types.ts +132 -0
- package/src/vite/index.ts +37 -0
package/dist/index.d.ts
CHANGED
|
@@ -1813,6 +1813,80 @@ declare class LoadingScene extends Scene {
|
|
|
1813
1813
|
private transitionToGame;
|
|
1814
1814
|
}
|
|
1815
1815
|
|
|
1816
|
+
interface GameDefinition {
|
|
1817
|
+
id: string;
|
|
1818
|
+
type: 'SLOT' | 'TABLE';
|
|
1819
|
+
actions: Record<string, ActionDefinition>;
|
|
1820
|
+
bet_levels?: number[] | BetLevelsConfig;
|
|
1821
|
+
max_win?: MaxWinConfig;
|
|
1822
|
+
buy_bonus?: BuyBonusConfig;
|
|
1823
|
+
ante_bet?: AnteBetConfig;
|
|
1824
|
+
persistent_state?: PersistentStateConfig;
|
|
1825
|
+
}
|
|
1826
|
+
interface BetLevelsConfig {
|
|
1827
|
+
levels?: number[];
|
|
1828
|
+
min?: number;
|
|
1829
|
+
max?: number;
|
|
1830
|
+
}
|
|
1831
|
+
interface MaxWinConfig {
|
|
1832
|
+
multiplier?: number;
|
|
1833
|
+
fixed?: number;
|
|
1834
|
+
}
|
|
1835
|
+
interface BuyBonusConfig {
|
|
1836
|
+
modes: Record<string, BuyBonusMode>;
|
|
1837
|
+
}
|
|
1838
|
+
interface BuyBonusMode {
|
|
1839
|
+
cost_multiplier: number;
|
|
1840
|
+
scatter_distribution: Record<string, number>;
|
|
1841
|
+
}
|
|
1842
|
+
interface AnteBetConfig {
|
|
1843
|
+
cost_multiplier: number;
|
|
1844
|
+
}
|
|
1845
|
+
interface PersistentStateConfig {
|
|
1846
|
+
vars: string[];
|
|
1847
|
+
exposed_vars: string[];
|
|
1848
|
+
}
|
|
1849
|
+
interface ActionDefinition {
|
|
1850
|
+
stage: string;
|
|
1851
|
+
debit: 'bet' | 'buy_bonus_cost' | 'ante_bet_cost' | 'none';
|
|
1852
|
+
credit?: 'win' | 'none' | 'defer';
|
|
1853
|
+
requires_session?: boolean;
|
|
1854
|
+
buy_bonus_mode?: string;
|
|
1855
|
+
transitions: TransitionRule[];
|
|
1856
|
+
input_schema?: Record<string, unknown>;
|
|
1857
|
+
}
|
|
1858
|
+
interface TransitionRule {
|
|
1859
|
+
condition: string;
|
|
1860
|
+
creates_session?: boolean;
|
|
1861
|
+
complete_session?: boolean;
|
|
1862
|
+
credit_override?: 'defer';
|
|
1863
|
+
next_actions: string[];
|
|
1864
|
+
session_config?: SessionConfig;
|
|
1865
|
+
add_spins_var?: string;
|
|
1866
|
+
}
|
|
1867
|
+
interface SessionConfig {
|
|
1868
|
+
total_spins_var: string;
|
|
1869
|
+
persistent_vars?: string[];
|
|
1870
|
+
}
|
|
1871
|
+
interface LuaEngineConfig {
|
|
1872
|
+
/** Lua script source code */
|
|
1873
|
+
script: string;
|
|
1874
|
+
/** Platform game definition (actions, transitions, bet levels, etc.) */
|
|
1875
|
+
gameDefinition: GameDefinition;
|
|
1876
|
+
/** Seed for deterministic RNG (for simulation/replay) */
|
|
1877
|
+
seed?: number;
|
|
1878
|
+
/** Custom logger function */
|
|
1879
|
+
logger?: (level: string, msg: string) => void;
|
|
1880
|
+
}
|
|
1881
|
+
interface LuaPlayResult {
|
|
1882
|
+
totalWin: number;
|
|
1883
|
+
data: Record<string, unknown>;
|
|
1884
|
+
nextActions: string[];
|
|
1885
|
+
session: SessionData | null;
|
|
1886
|
+
variables: Record<string, number>;
|
|
1887
|
+
creditDeferred: boolean;
|
|
1888
|
+
}
|
|
1889
|
+
|
|
1816
1890
|
interface DevBridgeConfig {
|
|
1817
1891
|
/** Mock initial balance */
|
|
1818
1892
|
balance?: number;
|
|
@@ -1830,6 +1904,12 @@ interface DevBridgeConfig {
|
|
|
1830
1904
|
networkDelay?: number;
|
|
1831
1905
|
/** Enable debug logging */
|
|
1832
1906
|
debug?: boolean;
|
|
1907
|
+
/** Lua script source code. When set, overrides onPlay with LuaEngine. */
|
|
1908
|
+
luaScript?: string;
|
|
1909
|
+
/** Game definition for Lua engine (actions, transitions, etc.) */
|
|
1910
|
+
gameDefinition?: GameDefinition;
|
|
1911
|
+
/** RNG seed for deterministic Lua execution */
|
|
1912
|
+
luaSeed?: number;
|
|
1833
1913
|
}
|
|
1834
1914
|
/**
|
|
1835
1915
|
* Mock host bridge for local development.
|
|
@@ -1865,6 +1945,7 @@ declare class DevBridge {
|
|
|
1865
1945
|
private _balance;
|
|
1866
1946
|
private _roundCounter;
|
|
1867
1947
|
private _bridge;
|
|
1948
|
+
private _luaEngine;
|
|
1868
1949
|
constructor(config?: DevBridgeConfig);
|
|
1869
1950
|
/** Current mock balance */
|
|
1870
1951
|
get balance(): number;
|
|
@@ -1876,6 +1957,7 @@ declare class DevBridge {
|
|
|
1876
1957
|
setBalance(balance: number): void;
|
|
1877
1958
|
/** Destroy the dev bridge */
|
|
1878
1959
|
destroy(): void;
|
|
1960
|
+
private initLuaEngine;
|
|
1879
1961
|
private handleGameReady;
|
|
1880
1962
|
private handlePlayRequest;
|
|
1881
1963
|
private handlePlayAck;
|
|
@@ -1885,5 +1967,160 @@ declare class DevBridge {
|
|
|
1885
1967
|
private delayedSend;
|
|
1886
1968
|
}
|
|
1887
1969
|
|
|
1888
|
-
|
|
1889
|
-
|
|
1970
|
+
/**
|
|
1971
|
+
* Runs Lua game scripts locally, replicating the platform's server-side execution.
|
|
1972
|
+
*
|
|
1973
|
+
* Implements the full lifecycle: action routing → state assembly → Lua execute() →
|
|
1974
|
+
* result extraction → transition evaluation → session management.
|
|
1975
|
+
*
|
|
1976
|
+
* @example
|
|
1977
|
+
* ```ts
|
|
1978
|
+
* const engine = new LuaEngine({
|
|
1979
|
+
* script: luaSource,
|
|
1980
|
+
* gameDefinition: { id: 'my-slot', type: 'SLOT', actions: { ... } },
|
|
1981
|
+
* });
|
|
1982
|
+
*
|
|
1983
|
+
* const result = engine.execute({ action: 'spin', bet: 1.0 });
|
|
1984
|
+
* // result.data.matrix, result.totalWin, result.nextActions, etc.
|
|
1985
|
+
* ```
|
|
1986
|
+
*/
|
|
1987
|
+
declare class LuaEngine {
|
|
1988
|
+
private L;
|
|
1989
|
+
private api;
|
|
1990
|
+
private actionRouter;
|
|
1991
|
+
private sessionManager;
|
|
1992
|
+
private persistentState;
|
|
1993
|
+
private gameDefinition;
|
|
1994
|
+
private variables;
|
|
1995
|
+
constructor(config: LuaEngineConfig);
|
|
1996
|
+
/** Current session data (if any) */
|
|
1997
|
+
get session(): SessionData | null;
|
|
1998
|
+
/** Current persistent state values */
|
|
1999
|
+
get persistentVars(): Record<string, number>;
|
|
2000
|
+
/**
|
|
2001
|
+
* Execute a play action — the main entry point.
|
|
2002
|
+
* This is what DevBridge calls on each PLAY_REQUEST.
|
|
2003
|
+
*/
|
|
2004
|
+
execute(params: PlayParams): LuaPlayResult;
|
|
2005
|
+
/** Reset all state (sessions, persistent vars, variables) */
|
|
2006
|
+
reset(): void;
|
|
2007
|
+
/** Destroy the Lua VM */
|
|
2008
|
+
destroy(): void;
|
|
2009
|
+
private loadScript;
|
|
2010
|
+
private callLuaExecute;
|
|
2011
|
+
private calculateMaxWinCap;
|
|
2012
|
+
private pickFromDistribution;
|
|
2013
|
+
}
|
|
2014
|
+
|
|
2015
|
+
type RngFunction = () => number;
|
|
2016
|
+
/**
|
|
2017
|
+
* Seeded xoshiro128** PRNG for deterministic simulation/replay.
|
|
2018
|
+
* Period: 2^128 - 1
|
|
2019
|
+
*/
|
|
2020
|
+
declare function createSeededRng(seed: number): RngFunction;
|
|
2021
|
+
/**
|
|
2022
|
+
* Implements and registers all platform `engine.*` functions into a Lua state.
|
|
2023
|
+
*/
|
|
2024
|
+
declare class LuaEngineAPI {
|
|
2025
|
+
private rng;
|
|
2026
|
+
private logger;
|
|
2027
|
+
private gameDefinition;
|
|
2028
|
+
constructor(gameDefinition: GameDefinition, rng?: RngFunction, logger?: (level: string, msg: string) => void);
|
|
2029
|
+
/** Register `engine` global table on the Lua state */
|
|
2030
|
+
register(L: any): void;
|
|
2031
|
+
random(min: number, max: number): number;
|
|
2032
|
+
randomFloat(): number;
|
|
2033
|
+
randomWeighted(weights: number[]): number;
|
|
2034
|
+
shuffle<T>(arr: T[]): T[];
|
|
2035
|
+
getConfig(): Record<string, unknown>;
|
|
2036
|
+
private registerFunction;
|
|
2037
|
+
}
|
|
2038
|
+
|
|
2039
|
+
interface TransitionMatch {
|
|
2040
|
+
rule: TransitionRule;
|
|
2041
|
+
nextActions: string[];
|
|
2042
|
+
}
|
|
2043
|
+
/**
|
|
2044
|
+
* Replicates the platform's action dispatch and transition evaluation.
|
|
2045
|
+
* Routes play requests to the correct action, evaluates transition conditions
|
|
2046
|
+
* against current variables to determine next actions and session operations.
|
|
2047
|
+
*/
|
|
2048
|
+
declare class ActionRouter {
|
|
2049
|
+
private actions;
|
|
2050
|
+
constructor(gameDefinition: GameDefinition);
|
|
2051
|
+
/** Look up action by name and validate prerequisites */
|
|
2052
|
+
resolveAction(actionName: string, hasSession: boolean): ActionDefinition;
|
|
2053
|
+
/** Evaluate transitions in order, return the first matching rule */
|
|
2054
|
+
evaluateTransitions(action: ActionDefinition, variables: Record<string, number>): TransitionMatch;
|
|
2055
|
+
}
|
|
2056
|
+
/**
|
|
2057
|
+
* Evaluates a transition condition expression against variables.
|
|
2058
|
+
*
|
|
2059
|
+
* Supports:
|
|
2060
|
+
* - "always" → true
|
|
2061
|
+
* - Simple comparisons: "var > 0", "var == 1", "var >= 10", "var != 0", "var < 5", "var <= 3"
|
|
2062
|
+
* - Logical connectives: "expr && expr", "expr || expr"
|
|
2063
|
+
*
|
|
2064
|
+
* This covers all patterns used by the platform's govaluate conditions.
|
|
2065
|
+
*/
|
|
2066
|
+
declare function evaluateCondition(condition: string, variables: Record<string, number>): boolean;
|
|
2067
|
+
|
|
2068
|
+
/**
|
|
2069
|
+
* Manages session lifecycle: creation, spin counting, retriggers, and completion.
|
|
2070
|
+
* Handles both slot sessions (fixed spin count) and table game sessions (unlimited).
|
|
2071
|
+
* Also manages _persist_ data roundtrip between Lua calls.
|
|
2072
|
+
*/
|
|
2073
|
+
declare class SessionManager {
|
|
2074
|
+
private session;
|
|
2075
|
+
get isActive(): boolean;
|
|
2076
|
+
get current(): SessionData | null;
|
|
2077
|
+
get sessionTotalWin(): number;
|
|
2078
|
+
/** Create a new session from a transition rule */
|
|
2079
|
+
createSession(rule: TransitionRule, variables: Record<string, number>, bet: number): SessionData;
|
|
2080
|
+
/** Update session after a spin: decrement counter, accumulate win, handle retrigger */
|
|
2081
|
+
updateSession(rule: TransitionRule, variables: Record<string, number>, spinWin: number): SessionData;
|
|
2082
|
+
/** Complete the session, return accumulated totalWin */
|
|
2083
|
+
completeSession(): {
|
|
2084
|
+
totalWin: number;
|
|
2085
|
+
session: SessionData;
|
|
2086
|
+
};
|
|
2087
|
+
/** Mark max win reached — stops the session */
|
|
2088
|
+
markMaxWinReached(): void;
|
|
2089
|
+
/** Store _persist_* data extracted from Lua result */
|
|
2090
|
+
storePersistData(data: Record<string, unknown>): void;
|
|
2091
|
+
/** Get _ps_* params to inject into next execute() call */
|
|
2092
|
+
getPersistentParams(): Record<string, unknown>;
|
|
2093
|
+
/** Reset all session state */
|
|
2094
|
+
reset(): void;
|
|
2095
|
+
private toSessionData;
|
|
2096
|
+
}
|
|
2097
|
+
|
|
2098
|
+
/**
|
|
2099
|
+
* Manages cross-spin persistent state — variables that survive between base game spins.
|
|
2100
|
+
* Separate from session-scoped persistence (handled by SessionManager).
|
|
2101
|
+
*
|
|
2102
|
+
* Handles two mechanisms:
|
|
2103
|
+
* 1. Numeric vars declared in `persistent_state.vars` — stored in state.variables
|
|
2104
|
+
* 2. Complex data with `_persist_game_*` prefix — stored separately, injected as `_ps_*`
|
|
2105
|
+
*/
|
|
2106
|
+
declare class PersistentState {
|
|
2107
|
+
private config;
|
|
2108
|
+
private vars;
|
|
2109
|
+
private gameData;
|
|
2110
|
+
constructor(config?: PersistentStateConfig);
|
|
2111
|
+
/** Load persistent vars into variables map before execute() */
|
|
2112
|
+
loadIntoVariables(variables: Record<string, number>): void;
|
|
2113
|
+
/** Save persistent vars from variables map after execute() */
|
|
2114
|
+
saveFromVariables(variables: Record<string, number>): void;
|
|
2115
|
+
/** Extract _persist_game_* keys from Lua return data, store them */
|
|
2116
|
+
storeGameData(data: Record<string, unknown>): void;
|
|
2117
|
+
/** Get _ps_* params for next execute() call */
|
|
2118
|
+
getGameDataParams(): Record<string, unknown>;
|
|
2119
|
+
/** Get exposed vars for client data.persistent_state */
|
|
2120
|
+
getExposedVars(): Record<string, number> | undefined;
|
|
2121
|
+
/** Reset all state */
|
|
2122
|
+
reset(): void;
|
|
2123
|
+
}
|
|
2124
|
+
|
|
2125
|
+
export { ActionRouter, AssetManager, AudioManager, BalanceDisplay, Button, DevBridge, Easing, EventEmitter, FPSOverlay, GameApplication, InputManager, Label, Layout, LoadingScene, LuaEngine, LuaEngineAPI, Modal, Orientation, Panel, PersistentState, ProgressBar, ScaleMode, Scene, SceneManager, ScrollContainer, SessionManager, SpineHelper, SpriteAnimation, StateMachine, Timeline, Toast, TransitionType, Tween, ViewportManager, WinDisplay, createSeededRng, evaluateCondition };
|
|
2126
|
+
export type { ActionDefinition, AssetBundle, AssetEntry, AssetManifest, AudioConfig, BalanceDisplayConfig, ButtonConfig, ButtonState, DevBridgeConfig, EasingFunction, GameApplicationConfig, GameDefinition, GameEngineEvents, IScene, LabelConfig, LayoutAlignment, LayoutAnchor, LayoutConfig, LayoutDirection, LoadingScreenConfig, LuaEngineConfig, LuaPlayResult, ModalConfig, PanelConfig, ProgressBarConfig, SceneConstructor, ScrollContainerConfig, ScrollDirection, SpriteAnimationConfig, ToastConfig, ToastType, TransitionConfig, TransitionRule, TweenOptions, WinDisplayConfig };
|