@energy8platform/game-engine 0.9.2 → 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/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
- export { AssetManager, AudioManager, BalanceDisplay, Button, DevBridge, Easing, EventEmitter, FPSOverlay, GameApplication, InputManager, Label, Layout, LoadingScene, Modal, Orientation, Panel, ProgressBar, ScaleMode, Scene, SceneManager, ScrollContainer, SpineHelper, SpriteAnimation, StateMachine, Timeline, Toast, TransitionType, Tween, ViewportManager, WinDisplay };
1889
- export type { AssetBundle, AssetEntry, AssetManifest, AudioConfig, BalanceDisplayConfig, ButtonConfig, ButtonState, DevBridgeConfig, EasingFunction, GameApplicationConfig, GameEngineEvents, IScene, LabelConfig, LayoutAlignment, LayoutAnchor, LayoutConfig, LayoutDirection, LoadingScreenConfig, ModalConfig, PanelConfig, ProgressBarConfig, SceneConstructor, ScrollContainerConfig, ScrollDirection, SpriteAnimationConfig, ToastConfig, ToastType, TransitionConfig, TweenOptions, WinDisplayConfig };
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 };