@omnitronix/happy-panda-game-engine 0.0.2 → 0.0.4

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 (94) hide show
  1. package/README.md +584 -120
  2. package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
  3. package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
  4. package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
  5. package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
  6. package/dist/__tests__/counter-manager.test.d.ts +7 -0
  7. package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
  8. package/dist/__tests__/cpp-parity.test.d.ts +39 -0
  9. package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
  10. package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
  11. package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
  12. package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
  13. package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
  14. package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
  15. package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
  16. package/dist/__tests__/rtp-1million.test.d.ts +8 -0
  17. package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
  18. package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
  19. package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
  20. package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
  21. package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
  22. package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
  23. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
  24. package/dist/__tests__/special-wins.test.d.ts +7 -0
  25. package/dist/__tests__/special-wins.test.d.ts.map +1 -0
  26. package/dist/__tests__/spin-generator.test.d.ts +7 -0
  27. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  28. package/dist/__tests__/spin-handler.test.d.ts +7 -0
  29. package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
  30. package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
  31. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  32. package/dist/__tests__/weighted-random.test.d.ts +7 -0
  33. package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
  34. package/dist/__tests__/win-evaluator.test.d.ts +7 -0
  35. package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
  36. package/dist/config/happy-panda.config.d.ts +212 -0
  37. package/dist/config/happy-panda.config.d.ts.map +1 -0
  38. package/dist/config/index.d.ts +5 -0
  39. package/dist/config/index.d.ts.map +1 -0
  40. package/dist/domain/index.d.ts +5 -0
  41. package/dist/domain/index.d.ts.map +1 -0
  42. package/dist/domain/types.d.ts +205 -0
  43. package/dist/domain/types.d.ts.map +1 -0
  44. package/dist/engine/happy-panda-engine.d.ts +50 -0
  45. package/dist/engine/happy-panda-engine.d.ts.map +1 -0
  46. package/dist/engine/index.d.ts +5 -0
  47. package/dist/engine/index.d.ts.map +1 -0
  48. package/dist/happy-panda-v1.game-engine.d.ts +63 -0
  49. package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
  50. package/dist/happy-panda-v1.game-engine.js +37 -39
  51. package/dist/happy-panda-v1.game-engine.js.map +1 -1
  52. package/dist/index.d.ts +19 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +7 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/logic/handlers/index.d.ts +5 -0
  57. package/dist/logic/handlers/index.d.ts.map +1 -0
  58. package/dist/logic/handlers/spin-handler.d.ts +54 -0
  59. package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
  60. package/dist/logic/index.d.ts +6 -0
  61. package/dist/logic/index.d.ts.map +1 -0
  62. package/dist/logic/services/counter-manager.d.ts +60 -0
  63. package/dist/logic/services/counter-manager.d.ts.map +1 -0
  64. package/dist/logic/services/index.d.ts +7 -0
  65. package/dist/logic/services/index.d.ts.map +1 -0
  66. package/dist/logic/services/jackpot-manager.d.ts +59 -0
  67. package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
  68. package/dist/logic/services/win-evaluator.d.ts +49 -0
  69. package/dist/logic/services/win-evaluator.d.ts.map +1 -0
  70. package/dist/rng/dummy-rng-client.d.ts +39 -0
  71. package/dist/rng/dummy-rng-client.d.ts.map +1 -0
  72. package/dist/rng/dummy-rng-client.js +77 -0
  73. package/dist/rng/dummy-rng-client.js.map +1 -0
  74. package/dist/rng/index.d.ts +10 -0
  75. package/dist/rng/index.d.ts.map +1 -0
  76. package/dist/rng/index.js +5 -0
  77. package/dist/rng/index.js.map +1 -1
  78. package/dist/rng/rng-client.factory.d.ts +33 -0
  79. package/dist/rng/rng-client.factory.d.ts.map +1 -0
  80. package/dist/rng/rng-client.factory.js +57 -0
  81. package/dist/rng/rng-client.factory.js.map +1 -0
  82. package/dist/rng/rng-client.interface.d.ts +51 -0
  83. package/dist/rng/rng-client.interface.d.ts.map +1 -0
  84. package/dist/rng/rng-client.interface.js +9 -0
  85. package/dist/rng/rng-client.interface.js.map +1 -0
  86. package/dist/rng/rng-service.d.ts +93 -0
  87. package/dist/rng/rng-service.d.ts.map +1 -0
  88. package/dist/rng/rng-service.js +124 -0
  89. package/dist/rng/rng-service.js.map +1 -0
  90. package/dist/rng/spin-generator.d.ts +31 -0
  91. package/dist/rng/spin-generator.d.ts.map +1 -0
  92. package/dist/rng/weighted-random.d.ts +30 -0
  93. package/dist/rng/weighted-random.d.ts.map +1 -0
  94. package/package.json +1 -1
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Happy Panda Game Engine - Domain Types
3
+ *
4
+ * Core type definitions for game state and spin results.
5
+ */
6
+ import { Symbol, SpinType, ScreenWinType } from '../config/happy-panda.config';
7
+ /** 3x3 grid indexed by [reel][row] */
8
+ export type Grid = Symbol[][];
9
+ /** Position on the grid */
10
+ export interface Position {
11
+ reel: number;
12
+ row: number;
13
+ }
14
+ /** Line win result */
15
+ export interface LineWin {
16
+ lineIndex: number;
17
+ symbol: Symbol;
18
+ matchLength: number;
19
+ payout: number;
20
+ positions: Position[];
21
+ }
22
+ /** Wall (3x3) win result */
23
+ export interface WallWin {
24
+ wallType: ScreenWinType;
25
+ payout: number;
26
+ positions: Position[];
27
+ }
28
+ /** Scatter win result (Seven/Super Seven) */
29
+ export interface ScatterWin {
30
+ symbol: Symbol;
31
+ count: number;
32
+ payout: number;
33
+ positions: Position[];
34
+ isSuperSevenOnly: boolean;
35
+ }
36
+ /** Special bonus win (cherry pieces, bell scatter, super bar scatter) */
37
+ export interface SpecialWin {
38
+ winType: ScreenWinType;
39
+ count: number;
40
+ payout: number;
41
+ positions: Position[];
42
+ }
43
+ /** Combined win result for a spin */
44
+ export interface SpinWinResult {
45
+ lineWins: LineWin[];
46
+ wallWin: WallWin | null;
47
+ scatterWins: ScatterWin[];
48
+ specialWins: SpecialWin[];
49
+ totalPayout: number;
50
+ }
51
+ /** Bonus counter state */
52
+ export interface BonusCounters {
53
+ /** Jackpot bonus counter (triggers at 0, resets to 1) */
54
+ jackpot: number;
55
+ /** Cherry bonus counter (triggers at 0, resets to 6 or 9) */
56
+ cherry: number;
57
+ /** Bell bonus counter (triggers at 0, resets to 3 or 5) */
58
+ bell: number;
59
+ /** Bar1 bonus counter (triggers at 0, resets to 1) */
60
+ bar1: number;
61
+ }
62
+ /** Pending bonus queue */
63
+ export interface PendingBonuses {
64
+ /** Number of pending jackpot bonuses */
65
+ jackpot: number;
66
+ /** Number of pending cherry bonuses */
67
+ cherry: number;
68
+ /** Number of pending bell bonuses (each grants 5 spins) */
69
+ bell: number;
70
+ /** Number of pending bar1 bonuses (each grants 7 spins) */
71
+ bar1: number;
72
+ /** Number of pending center cherry respins */
73
+ respin: number;
74
+ }
75
+ /** Jackpot state */
76
+ export interface JackpotState {
77
+ /** Progressive jackpot value (accumulates on losing paid spins) */
78
+ bonusJackpotValue: number;
79
+ /** Pool jackpot value (paid when bell bonus triggers) */
80
+ poolJackpotValue: number;
81
+ }
82
+ /** Game direction/mode */
83
+ export declare enum GameDirection {
84
+ SINGLE = 0,// 8 lines
85
+ BOTH = 1
86
+ }
87
+ /** Core game state */
88
+ export interface GameState {
89
+ /** Game mode (8 or 16 lines) */
90
+ gameDirection: GameDirection;
91
+ /** Bet multiplier (line bet) */
92
+ betStake: number;
93
+ /** Total bet per spin (8 or 16 x betStake) */
94
+ betGame: number;
95
+ /** Current spin type */
96
+ currentSpinType: SpinType;
97
+ /** Next spin type (determined after current spin) */
98
+ nextSpinType: SpinType;
99
+ /** Remaining spins in current bonus (0 for paid spin) */
100
+ spinsRemaining: number;
101
+ /** Bonus counters */
102
+ counters: BonusCounters;
103
+ /** Pending bonuses to execute */
104
+ pendingBonuses: PendingBonuses;
105
+ /** Jackpot values */
106
+ jackpots: JackpotState;
107
+ /** Current grid (3x3) */
108
+ grid: Grid;
109
+ /** Accumulated bonus wins (reset when bonus sequence ends) */
110
+ accumulatedBonusWins: number;
111
+ /** Center cherry symbol for respin (if active) */
112
+ centerCherrySymbol: Symbol | null;
113
+ }
114
+ /** State visible to client */
115
+ export interface PublicState {
116
+ gameDirection: GameDirection;
117
+ betStake: number;
118
+ betGame: number;
119
+ currentSpinType: SpinType;
120
+ spinsRemaining: number;
121
+ grid: Grid;
122
+ bonusJackpotValue: number;
123
+ poolJackpotValue: number;
124
+ /** Indicates if a bonus is pending (without revealing which) */
125
+ hasPendingBonus: boolean;
126
+ }
127
+ /** Server-side only state */
128
+ export interface PrivateState {
129
+ counters: BonusCounters;
130
+ pendingBonuses: PendingBonuses;
131
+ nextSpinType: SpinType;
132
+ accumulatedBonusWins: number;
133
+ centerCherrySymbol: Symbol | null;
134
+ }
135
+ /** Spin request from client */
136
+ export interface SpinRequest {
137
+ /** Session ID */
138
+ sessionId: string;
139
+ /** Game direction (8 or 16 lines) */
140
+ gameDirection: GameDirection;
141
+ /** Bet multiplier */
142
+ betStake: number;
143
+ }
144
+ /** Spin response to client */
145
+ export interface SpinResponse {
146
+ /** Session ID */
147
+ sessionId: string;
148
+ /** Resulting grid */
149
+ grid: Grid;
150
+ /** Win results */
151
+ wins: SpinWinResult;
152
+ /** Updated public state */
153
+ state: PublicState;
154
+ /** Jackpot won this spin (if any) */
155
+ jackpotWon: number;
156
+ /** Pool jackpot won this spin (if any) */
157
+ poolJackpotWon: number;
158
+ /** Bonus type triggered (for animation) */
159
+ bonusTriggered: SpinType | null;
160
+ /** Is this the final spin of a bonus sequence */
161
+ isBonusComplete: boolean;
162
+ }
163
+ /** Full session state (for persistence) */
164
+ export interface SessionState {
165
+ sessionId: string;
166
+ publicState: PublicState;
167
+ privateState: PrivateState;
168
+ createdAt: Date;
169
+ updatedAt: Date;
170
+ }
171
+ /** RNG interface for dependency injection */
172
+ export interface RngProvider {
173
+ /** Generate random integer in range [0, max) */
174
+ random(max: number): Promise<number>;
175
+ /** Generate multiple random integers */
176
+ randomBatch(count: number, max: number): Promise<number[]>;
177
+ }
178
+ /** Game command types */
179
+ export declare enum CommandType {
180
+ INIT_SESSION_STATE = "INIT_SESSION_STATE",
181
+ SPIN = "SPIN",
182
+ GET_SYMBOLS = "GET_SYMBOLS"
183
+ }
184
+ /** Command request base */
185
+ export interface CommandRequest {
186
+ command: CommandType;
187
+ sessionId: string;
188
+ }
189
+ /** Init session command */
190
+ export interface InitSessionRequest extends CommandRequest {
191
+ command: CommandType.INIT_SESSION_STATE;
192
+ gameDirection: GameDirection;
193
+ betStake: number;
194
+ }
195
+ /** Spin command */
196
+ export interface SpinCommandRequest extends CommandRequest {
197
+ command: CommandType.SPIN;
198
+ }
199
+ /** Get symbols command */
200
+ export interface GetSymbolsRequest extends CommandRequest {
201
+ command: CommandType.GET_SYMBOLS;
202
+ }
203
+ /** Union of all commands */
204
+ export type GameCommand = InitSessionRequest | SpinCommandRequest | GetSymbolsRequest;
205
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Happy Panda Game Engine
3
+ *
4
+ * Main engine class that provides the public API for the game.
5
+ * Implements the command pattern used by other Omnitronix game engines.
6
+ */
7
+ import { GameDirection, SessionState, RngProvider, GameCommand } from '../domain/types';
8
+ export declare class HappyPandaEngine {
9
+ private rng;
10
+ constructor(rngProvider: RngProvider);
11
+ /**
12
+ * Handle a game command.
13
+ */
14
+ handleCommand(command: GameCommand, currentState?: SessionState): Promise<{
15
+ response: unknown;
16
+ state: SessionState;
17
+ }>;
18
+ private handleInitSession;
19
+ private handleSpin;
20
+ private handleGetSymbols;
21
+ /**
22
+ * Extract public state from game state.
23
+ */
24
+ private extractPublicState;
25
+ /**
26
+ * Extract private state from game state.
27
+ */
28
+ private extractPrivateState;
29
+ /**
30
+ * Create session state from game state.
31
+ */
32
+ private createSessionState;
33
+ /**
34
+ * Reconstruct game state from session state.
35
+ */
36
+ private reconstructGameState;
37
+ /**
38
+ * Create empty session for commands that don't need state.
39
+ */
40
+ private createEmptySession;
41
+ /**
42
+ * Update bet settings (only when no bonus pending).
43
+ */
44
+ updateBet(session: SessionState, gameDirection: GameDirection, betStake: number): SessionState;
45
+ /**
46
+ * Check if player can change bet.
47
+ */
48
+ canChangeBet(session: SessionState): boolean;
49
+ }
50
+ //# sourceMappingURL=happy-panda-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-panda-engine.d.ts","sourceRoot":"","sources":["../../src/engine/happy-panda-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,aAAa,EAGb,YAAY,EACZ,WAAW,EAEX,WAAW,EAIZ,MAAM,iBAAiB,CAAC;AAczB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAc;gBAEb,WAAW,EAAE,WAAW;IAQpC;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,WAAW,EACpB,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC;YAuBxC,iBAAiB;YAiBjB,UAAU;YAiCV,gBAAgB;IAkB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,SAAS,CACP,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,MAAM,GACf,YAAY;IAMf;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;CAM7C"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Engine module exports
3
+ */
4
+ export * from './happy-panda-engine';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * HappyPandaV1GameEngine
3
+ *
4
+ * Wrapper class that adapts HappyPandaEngine to the standard GameEngine interface
5
+ * expected by the game-engine-service infrastructure.
6
+ *
7
+ * Uses the proper RNG infrastructure matching Heroes of Aether and Bonny's Fortune:
8
+ * - RngClientFactory for environment-based client selection
9
+ * - RngService for audit trail tracking
10
+ * - Full RNG outcome reporting for compliance
11
+ */
12
+ import { PublicState, PrivateState } from './domain/types';
13
+ import { RngOutcome, RngOutcomeRecord } from './rng/rng-service';
14
+ export { RngOutcome, RngOutcomeRecord };
15
+ export interface GameEngineInfo {
16
+ gameCode: string;
17
+ version: string;
18
+ rtp: number;
19
+ gameType: string;
20
+ gameName: string;
21
+ provider: string;
22
+ }
23
+ export interface CommandProcessingResult<TPublicState = unknown, TPrivateState = unknown, TOutcome = unknown> {
24
+ success: boolean;
25
+ publicState: TPublicState;
26
+ privateState: TPrivateState;
27
+ outcome?: TOutcome;
28
+ message?: string;
29
+ rngOutcome?: RngOutcome;
30
+ }
31
+ export interface GameActionCommand<TPayload = unknown> {
32
+ id: string;
33
+ type: string;
34
+ payload?: TPayload;
35
+ }
36
+ export interface GameEngine<TPublicState = unknown, TPrivateState = unknown, TOutcome = unknown> {
37
+ processCommand(publicState: TPublicState, privateState: TPrivateState, command: GameActionCommand): Promise<CommandProcessingResult<TPublicState, TPrivateState, TOutcome>>;
38
+ getGameEngineInfo(): GameEngineInfo;
39
+ }
40
+ export interface HappyPandaV1GameEngineConfig {
41
+ metrics?: unknown;
42
+ }
43
+ /**
44
+ * Happy Panda V1 Game Engine
45
+ *
46
+ * Implements the standard GameEngine interface for use with game-engine-service.
47
+ * Uses proper RNG infrastructure with full audit trail support.
48
+ */
49
+ export declare class HappyPandaV1GameEngine implements GameEngine<PublicState, PrivateState, unknown> {
50
+ private readonly gameCode;
51
+ private readonly version;
52
+ private readonly rtp;
53
+ private readonly gameType;
54
+ private readonly gameName;
55
+ private readonly provider;
56
+ private readonly rngService;
57
+ private readonly rngAdapter;
58
+ private readonly engine;
59
+ constructor(config?: HappyPandaV1GameEngineConfig);
60
+ getGameEngineInfo(): GameEngineInfo;
61
+ processCommand(publicState: PublicState | null, privateState: PrivateState | null, command: GameActionCommand): Promise<CommandProcessingResult<PublicState, PrivateState, unknown>>;
62
+ }
63
+ //# sourceMappingURL=happy-panda-v1.game-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-panda-v1.game-engine.d.ts","sourceRoot":"","sources":["../src/happy-panda-v1.game-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAGL,WAAW,EACX,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AAGxC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB,CACtC,YAAY,GAAG,OAAO,EACtB,aAAa,GAAG,OAAO,EACvB,QAAQ,GAAG,OAAO;IAElB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,YAAY,CAAC;IAC1B,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB,CAAC,QAAQ,GAAG,OAAO;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,UAAU,CACzB,YAAY,GAAG,OAAO,EACtB,aAAa,GAAG,OAAO,EACvB,QAAQ,GAAG,OAAO;IAElB,cAAc,CACZ,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,aAAa,EAC3B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,uBAAuB,CAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3E,iBAAiB,IAAI,cAAc,CAAC;CACrC;AAoCD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,qBAAa,sBACX,YAAW,UAAU,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC;IAEzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,MAAM,GAAE,4BAAiC;IAc9C,iBAAiB,IAAI,cAAc;IAW7B,cAAc,CACzB,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,uBAAuB,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;CAmHxE"}
@@ -4,36 +4,35 @@
4
4
  *
5
5
  * Wrapper class that adapts HappyPandaEngine to the standard GameEngine interface
6
6
  * expected by the game-engine-service infrastructure.
7
+ *
8
+ * Uses the proper RNG infrastructure matching Heroes of Aether and Bonny's Fortune:
9
+ * - RngClientFactory for environment-based client selection
10
+ * - RngService for audit trail tracking
11
+ * - Full RNG outcome reporting for compliance
7
12
  */
8
13
  Object.defineProperty(exports, "__esModule", { value: true });
9
14
  exports.HappyPandaV1GameEngine = void 0;
10
15
  const happy_panda_engine_1 = require("./engine/happy-panda-engine");
11
16
  const types_1 = require("./domain/types");
17
+ const rng_client_factory_1 = require("./rng/rng-client.factory");
18
+ const rng_service_1 = require("./rng/rng-service");
12
19
  /**
13
- * RNG adapter that tracks outcomes for the game engine service
20
+ * RNG Provider adapter that bridges RngService to the engine's RngProvider interface
14
21
  */
15
- class TrackedRngProvider {
16
- constructor() {
17
- this.outcomes = new Map();
22
+ class RngServiceAdapter {
23
+ constructor(rngService) {
24
+ this.rngService = rngService;
18
25
  this.currentCommandId = '';
19
- this.seedCounter = 0;
26
+ this.actionCounter = 0;
20
27
  }
21
28
  setCommandId(commandId) {
22
29
  this.currentCommandId = commandId;
23
- if (!this.outcomes.has(commandId)) {
24
- this.outcomes.set(commandId, []);
25
- }
30
+ this.actionCounter = 0;
26
31
  }
27
32
  async random(max) {
28
- const result = Math.floor(Math.random() * max);
29
- const record = {
30
- result,
31
- seed: this.seedCounter++,
32
- min: 0,
33
- max: max - 1,
34
- };
35
- this.outcomes.get(this.currentCommandId)?.push(record);
36
- return result;
33
+ const actionId = `rng_${this.actionCounter++}`;
34
+ const { value } = await this.rngService.getSingleNumber(0, max - 1, this.currentCommandId, actionId);
35
+ return value;
37
36
  }
38
37
  async randomBatch(count, max) {
39
38
  const results = [];
@@ -42,33 +41,29 @@ class TrackedRngProvider {
42
41
  }
43
42
  return results;
44
43
  }
45
- getOutcomes(commandId) {
46
- const records = this.outcomes.get(commandId) || [];
47
- const outcome = {};
48
- records.forEach((record, index) => {
49
- outcome[`rng_${index}`] = record;
50
- });
51
- return outcome;
52
- }
53
- clearOutcomes(commandId) {
54
- this.outcomes.delete(commandId);
55
- }
56
44
  }
57
45
  /**
58
46
  * Happy Panda V1 Game Engine
59
47
  *
60
48
  * Implements the standard GameEngine interface for use with game-engine-service.
49
+ * Uses proper RNG infrastructure with full audit trail support.
61
50
  */
62
51
  class HappyPandaV1GameEngine {
63
- constructor() {
52
+ constructor(config = {}) {
64
53
  this.gameCode = 'happy-panda';
65
54
  this.version = '1.0.0';
66
55
  this.rtp = 96.05;
67
56
  this.gameType = 'slot';
68
57
  this.gameName = 'Happy Panda';
69
58
  this.provider = 'Omnitronix';
70
- this.rngProvider = new TrackedRngProvider();
71
- this.engine = new happy_panda_engine_1.HappyPandaEngine(this.rngProvider);
59
+ // Create RNG client based on environment (local for dev, external for prod)
60
+ const rngClient = rng_client_factory_1.RngClientFactory.create({ metrics: config.metrics });
61
+ // Wrap in service for audit trail tracking
62
+ this.rngService = new rng_service_1.RngService(rngClient);
63
+ // Create adapter to bridge to engine's RngProvider interface
64
+ this.rngAdapter = new RngServiceAdapter(this.rngService);
65
+ // Initialize engine with RNG adapter
66
+ this.engine = new happy_panda_engine_1.HappyPandaEngine(this.rngAdapter);
72
67
  }
73
68
  getGameEngineInfo() {
74
69
  return {
@@ -81,7 +76,9 @@ class HappyPandaV1GameEngine {
81
76
  };
82
77
  }
83
78
  async processCommand(publicState, privateState, command) {
84
- this.rngProvider.setCommandId(command.id);
79
+ // Register command for RNG audit trail
80
+ this.rngService.registerCommand(command.id);
81
+ this.rngAdapter.setCommandId(command.id);
85
82
  try {
86
83
  switch (command.type) {
87
84
  case 'INIT_SESSION_STATE': {
@@ -94,8 +91,8 @@ class HappyPandaV1GameEngine {
94
91
  gameDirection,
95
92
  betStake,
96
93
  });
97
- const rngOutcome = this.rngProvider.getOutcomes(command.id);
98
- this.rngProvider.clearOutcomes(command.id);
94
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
95
+ this.rngService.removeCommand(command.id);
99
96
  return {
100
97
  success: true,
101
98
  publicState: result.state.publicState,
@@ -107,6 +104,7 @@ class HappyPandaV1GameEngine {
107
104
  }
108
105
  case 'SPIN': {
109
106
  if (!publicState || !privateState) {
107
+ this.rngService.removeCommand(command.id);
110
108
  return {
111
109
  success: false,
112
110
  publicState: publicState,
@@ -126,8 +124,8 @@ class HappyPandaV1GameEngine {
126
124
  command: types_1.CommandType.SPIN,
127
125
  sessionId: command.id,
128
126
  }, sessionState);
129
- const rngOutcome = this.rngProvider.getOutcomes(command.id);
130
- this.rngProvider.clearOutcomes(command.id);
127
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
128
+ this.rngService.removeCommand(command.id);
131
129
  return {
132
130
  success: true,
133
131
  publicState: result.state.publicState,
@@ -142,7 +140,7 @@ class HappyPandaV1GameEngine {
142
140
  command: types_1.CommandType.GET_SYMBOLS,
143
141
  sessionId: command.id,
144
142
  });
145
- this.rngProvider.clearOutcomes(command.id);
143
+ this.rngService.removeCommand(command.id);
146
144
  return {
147
145
  success: true,
148
146
  publicState: publicState,
@@ -152,7 +150,7 @@ class HappyPandaV1GameEngine {
152
150
  };
153
151
  }
154
152
  default: {
155
- this.rngProvider.clearOutcomes(command.id);
153
+ this.rngService.removeCommand(command.id);
156
154
  return {
157
155
  success: false,
158
156
  publicState: publicState,
@@ -163,7 +161,7 @@ class HappyPandaV1GameEngine {
163
161
  }
164
162
  }
165
163
  catch (error) {
166
- this.rngProvider.clearOutcomes(command.id);
164
+ this.rngService.removeCommand(command.id);
167
165
  return {
168
166
  success: false,
169
167
  publicState: publicState,
@@ -1 +1 @@
1
- {"version":3,"file":"happy-panda-v1.game-engine.js","sourceRoot":"","sources":["../src/happy-panda-v1.game-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"happy-panda-v1.game-engine.js","sourceRoot":"","sources":["../src/happy-panda-v1.game-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Happy Panda Game Engine
3
+ *
4
+ * A 3x3 slot game engine with 8/16 bidirectional paylines.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { HappyPandaV1GameEngine } from './happy-panda-v1.game-engine';
9
+ export type { GameEngine, GameEngineInfo, GameActionCommand, CommandProcessingResult, RngOutcome, RngOutcomeRecord, } from './happy-panda-v1.game-engine';
10
+ export { HappyPandaEngine } from './engine';
11
+ export { Symbol, SpinType, ScreenWinType, GRID, LINE_SHAPES, LINES_PER_DIRECTION, } from './config';
12
+ export { Grid, Position, LineWin, WallWin, ScatterWin, SpecialWin, SpinWinResult, BonusCounters, PendingBonuses, JackpotState, GameDirection, GameState, PublicState, PrivateState, SpinRequest, SpinResponse, SessionState, RngProvider, CommandType, GameCommand, InitSessionRequest, SpinCommandRequest, GetSymbolsRequest, } from './domain';
13
+ export { evaluateSpin, evaluateLineWins, evaluateWallWin, evaluateScatterWins } from './logic/services';
14
+ export { generateGrid } from './rng';
15
+ export { IRngClient, RngSingleResponse, RngBatchResponse, } from './rng/rng-client.interface';
16
+ export { DummyRngClient } from './rng/dummy-rng-client';
17
+ export { RngClientFactory, RngClientConfig } from './rng/rng-client.factory';
18
+ export { RngService } from './rng/rng-service';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EACL,MAAM,EACN,QAAQ,EACR,aAAa,EACb,IAAI,EACJ,WAAW,EACX,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * @packageDocumentation
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.generateGrid = exports.evaluateScatterWins = exports.evaluateWallWin = exports.evaluateLineWins = exports.evaluateSpin = exports.CommandType = exports.GameDirection = exports.LINES_PER_DIRECTION = exports.LINE_SHAPES = exports.GRID = exports.ScreenWinType = exports.SpinType = exports.Symbol = exports.HappyPandaEngine = exports.HappyPandaV1GameEngine = void 0;
10
+ exports.RngService = exports.RngClientFactory = exports.DummyRngClient = exports.generateGrid = exports.evaluateScatterWins = exports.evaluateWallWin = exports.evaluateLineWins = exports.evaluateSpin = exports.CommandType = exports.GameDirection = exports.LINES_PER_DIRECTION = exports.LINE_SHAPES = exports.GRID = exports.ScreenWinType = exports.SpinType = exports.Symbol = exports.HappyPandaEngine = exports.HappyPandaV1GameEngine = void 0;
11
11
  // V1 Game Engine (for game-engine-service integration)
12
12
  var happy_panda_v1_game_engine_1 = require("./happy-panda-v1.game-engine");
13
13
  Object.defineProperty(exports, "HappyPandaV1GameEngine", { enumerable: true, get: function () { return happy_panda_v1_game_engine_1.HappyPandaV1GameEngine; } });
@@ -34,4 +34,10 @@ Object.defineProperty(exports, "evaluateWallWin", { enumerable: true, get: funct
34
34
  Object.defineProperty(exports, "evaluateScatterWins", { enumerable: true, get: function () { return services_1.evaluateScatterWins; } });
35
35
  var rng_1 = require("./rng");
36
36
  Object.defineProperty(exports, "generateGrid", { enumerable: true, get: function () { return rng_1.generateGrid; } });
37
+ var dummy_rng_client_1 = require("./rng/dummy-rng-client");
38
+ Object.defineProperty(exports, "DummyRngClient", { enumerable: true, get: function () { return dummy_rng_client_1.DummyRngClient; } });
39
+ var rng_client_factory_1 = require("./rng/rng-client.factory");
40
+ Object.defineProperty(exports, "RngClientFactory", { enumerable: true, get: function () { return rng_client_factory_1.RngClientFactory; } });
41
+ var rng_service_1 = require("./rng/rng-service");
42
+ Object.defineProperty(exports, "RngService", { enumerable: true, get: function () { return rng_service_1.RngService; } });
37
43
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,uDAAuD;AACvD,2EAAsE;AAA7D,oIAAA,sBAAsB,OAAA;AAU/B,cAAc;AACd,mCAA4C;AAAnC,0GAAA,gBAAgB,OAAA;AAEzB,gBAAgB;AAChB,mCAOkB;AANhB,gGAAA,MAAM,OAAA;AACN,kGAAA,QAAQ,OAAA;AACR,uGAAA,aAAa,OAAA;AACb,8FAAA,IAAI,OAAA;AACJ,qGAAA,WAAW,OAAA;AACX,6GAAA,mBAAmB,OAAA;AAGrB,eAAe;AACf,mCAwBkB;AAbhB,uGAAA,aAAa,OAAA;AAQb,qGAAA,WAAW,OAAA;AAOb,yCAAyC;AACzC,6CAAwG;AAA/F,wGAAA,YAAY,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAC7E,6BAAqC;AAA5B,mGAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,uDAAuD;AACvD,2EAAsE;AAA7D,oIAAA,sBAAsB,OAAA;AAU/B,cAAc;AACd,mCAA4C;AAAnC,0GAAA,gBAAgB,OAAA;AAEzB,gBAAgB;AAChB,mCAOkB;AANhB,gGAAA,MAAM,OAAA;AACN,kGAAA,QAAQ,OAAA;AACR,uGAAA,aAAa,OAAA;AACb,8FAAA,IAAI,OAAA;AACJ,qGAAA,WAAW,OAAA;AACX,6GAAA,mBAAmB,OAAA;AAGrB,eAAe;AACf,mCAwBkB;AAbhB,uGAAA,aAAa,OAAA;AAQb,qGAAA,WAAW,OAAA;AAOb,yCAAyC;AACzC,6CAAwG;AAA/F,wGAAA,YAAY,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAC7E,6BAAqC;AAA5B,mGAAA,YAAY,OAAA;AAQrB,2DAAwD;AAA/C,kHAAA,cAAc,OAAA;AACvB,+DAA6E;AAApE,sHAAA,gBAAgB,OAAA;AACzB,iDAA+C;AAAtC,yGAAA,UAAU,OAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Logic handlers exports
3
+ */
4
+ export * from './spin-handler';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/logic/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Spin Handler
3
+ *
4
+ * Coordinates the entire spin flow:
5
+ * 1. Determine spin type
6
+ * 2. Generate grid
7
+ * 3. Evaluate wins
8
+ * 4. Update counters
9
+ * 5. Update jackpots
10
+ * 6. Determine next spin type
11
+ * 7. Build response
12
+ */
13
+ import { SpinType } from '../../config/happy-panda.config';
14
+ import { Grid, GameDirection, GameState, SpinWinResult, RngProvider } from '../../domain/types';
15
+ export interface SpinResult {
16
+ /** Resulting grid */
17
+ grid: Grid;
18
+ /** Win evaluation results */
19
+ wins: SpinWinResult;
20
+ /** Updated game state */
21
+ state: GameState;
22
+ /** Progressive jackpot won (if any) */
23
+ jackpotWon: number;
24
+ /** Pool jackpot won (if any) */
25
+ poolJackpotWon: number;
26
+ /** Bonus type triggered this spin */
27
+ bonusTriggered: SpinType | null;
28
+ /** Is this the final spin of bonus sequence */
29
+ isBonusComplete: boolean;
30
+ }
31
+ /**
32
+ * Execute a single spin.
33
+ */
34
+ export declare function executeSpin(state: GameState, rng: RngProvider): Promise<SpinResult>;
35
+ /** Minimum bet stake */
36
+ export declare const MIN_BET_STAKE = 1;
37
+ /** Maximum bet stake (reasonable upper bound) */
38
+ export declare const MAX_BET_STAKE = 100;
39
+ /**
40
+ * Validate bet parameters.
41
+ * @throws Error if parameters are invalid
42
+ */
43
+ export declare function validateBetParams(gameDirection: GameDirection, betStake: number): void;
44
+ /**
45
+ * Create initial game state.
46
+ * @throws Error if parameters are invalid
47
+ */
48
+ export declare function createInitialState(gameDirection: GameDirection, betStake: number): GameState;
49
+ /**
50
+ * Update state for new bet.
51
+ * @throws Error if parameters are invalid
52
+ */
53
+ export declare function updateBet(state: GameState, gameDirection: GameDirection, betStake: number): GameState;
54
+ //# sourceMappingURL=spin-handler.d.ts.map