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

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.
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ /**
3
+ * HappyPandaV1GameEngine
4
+ *
5
+ * Wrapper class that adapts HappyPandaEngine to the standard GameEngine interface
6
+ * expected by the game-engine-service infrastructure.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.HappyPandaV1GameEngine = void 0;
10
+ const happy_panda_engine_1 = require("./engine/happy-panda-engine");
11
+ const types_1 = require("./domain/types");
12
+ /**
13
+ * RNG adapter that tracks outcomes for the game engine service
14
+ */
15
+ class TrackedRngProvider {
16
+ constructor() {
17
+ this.outcomes = new Map();
18
+ this.currentCommandId = '';
19
+ this.seedCounter = 0;
20
+ }
21
+ setCommandId(commandId) {
22
+ this.currentCommandId = commandId;
23
+ if (!this.outcomes.has(commandId)) {
24
+ this.outcomes.set(commandId, []);
25
+ }
26
+ }
27
+ 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;
37
+ }
38
+ async randomBatch(count, max) {
39
+ const results = [];
40
+ for (let i = 0; i < count; i++) {
41
+ results.push(await this.random(max));
42
+ }
43
+ return results;
44
+ }
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
+ }
57
+ /**
58
+ * Happy Panda V1 Game Engine
59
+ *
60
+ * Implements the standard GameEngine interface for use with game-engine-service.
61
+ */
62
+ class HappyPandaV1GameEngine {
63
+ constructor() {
64
+ this.gameCode = 'happy-panda';
65
+ this.version = '1.0.0';
66
+ this.rtp = 96.05;
67
+ this.gameType = 'slot';
68
+ this.gameName = 'Happy Panda';
69
+ this.provider = 'Omnitronix';
70
+ this.rngProvider = new TrackedRngProvider();
71
+ this.engine = new happy_panda_engine_1.HappyPandaEngine(this.rngProvider);
72
+ }
73
+ getGameEngineInfo() {
74
+ return {
75
+ gameCode: this.gameCode,
76
+ version: this.version,
77
+ rtp: this.rtp,
78
+ gameType: this.gameType,
79
+ gameName: this.gameName,
80
+ provider: this.provider,
81
+ };
82
+ }
83
+ async processCommand(publicState, privateState, command) {
84
+ this.rngProvider.setCommandId(command.id);
85
+ try {
86
+ switch (command.type) {
87
+ case 'INIT_SESSION_STATE': {
88
+ const payload = command.payload || {};
89
+ const gameDirection = payload.gameDirection ?? types_1.GameDirection.SINGLE;
90
+ const betStake = payload.betStake ?? 1;
91
+ const result = await this.engine.handleCommand({
92
+ command: types_1.CommandType.INIT_SESSION_STATE,
93
+ sessionId: command.id,
94
+ gameDirection,
95
+ betStake,
96
+ });
97
+ const rngOutcome = this.rngProvider.getOutcomes(command.id);
98
+ this.rngProvider.clearOutcomes(command.id);
99
+ return {
100
+ success: true,
101
+ publicState: result.state.publicState,
102
+ privateState: result.state.privateState,
103
+ outcome: result.response,
104
+ message: 'Session initialized',
105
+ rngOutcome,
106
+ };
107
+ }
108
+ case 'SPIN': {
109
+ if (!publicState || !privateState) {
110
+ return {
111
+ success: false,
112
+ publicState: publicState,
113
+ privateState: privateState,
114
+ message: 'State not initialized',
115
+ };
116
+ }
117
+ // Create a proper SessionState from public/private state
118
+ const sessionState = {
119
+ sessionId: command.id,
120
+ publicState,
121
+ privateState,
122
+ createdAt: new Date(),
123
+ updatedAt: new Date(),
124
+ };
125
+ const result = await this.engine.handleCommand({
126
+ command: types_1.CommandType.SPIN,
127
+ sessionId: command.id,
128
+ }, sessionState);
129
+ const rngOutcome = this.rngProvider.getOutcomes(command.id);
130
+ this.rngProvider.clearOutcomes(command.id);
131
+ return {
132
+ success: true,
133
+ publicState: result.state.publicState,
134
+ privateState: result.state.privateState,
135
+ outcome: result.response,
136
+ message: 'Spin completed',
137
+ rngOutcome,
138
+ };
139
+ }
140
+ case 'GET_SYMBOLS': {
141
+ const result = await this.engine.handleCommand({
142
+ command: types_1.CommandType.GET_SYMBOLS,
143
+ sessionId: command.id,
144
+ });
145
+ this.rngProvider.clearOutcomes(command.id);
146
+ return {
147
+ success: true,
148
+ publicState: publicState,
149
+ privateState: privateState,
150
+ outcome: result.response,
151
+ message: 'Symbols retrieved',
152
+ };
153
+ }
154
+ default: {
155
+ this.rngProvider.clearOutcomes(command.id);
156
+ return {
157
+ success: false,
158
+ publicState: publicState,
159
+ privateState: privateState,
160
+ message: `Unknown command type: ${command.type}`,
161
+ };
162
+ }
163
+ }
164
+ }
165
+ catch (error) {
166
+ this.rngProvider.clearOutcomes(command.id);
167
+ return {
168
+ success: false,
169
+ publicState: publicState,
170
+ privateState: privateState,
171
+ message: error.message || 'Unknown error',
172
+ };
173
+ }
174
+ }
175
+ }
176
+ exports.HappyPandaV1GameEngine = HappyPandaV1GameEngine;
177
+ //# sourceMappingURL=happy-panda-v1.game-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"happy-panda-v1.game-engine.js","sourceRoot":"","sources":["../src/happy-panda-v1.game-engine.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,oEAA+D;AAC/D,0CAOwB;AAsDxB;;GAEG;AACH,MAAM,kBAAkB;IAAxB;QACU,aAAQ,GAAoC,IAAI,GAAG,EAAE,CAAC;QACtD,qBAAgB,GAAW,EAAE,CAAC;QAC9B,gBAAW,GAAW,CAAC,CAAC;IAyClC,CAAC;IAvCC,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAqB;YAC/B,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,GAAG,GAAG,CAAC;SACb,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,GAAW;QAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,OAAO,CAAC,OAAO,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAa,sBAAsB;IAWjC;QAViB,aAAQ,GAAG,aAAa,CAAC;QACzB,YAAO,GAAG,OAAO,CAAC;QAClB,QAAG,GAAG,KAAK,CAAC;QACZ,aAAQ,GAAG,MAAM,CAAC;QAClB,aAAQ,GAAG,aAAa,CAAC;QACzB,aAAQ,GAAG,YAAY,CAAC;QAMvC,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,qCAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAEM,iBAAiB;QACtB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,WAA+B,EAC/B,YAAiC,EACjC,OAA0B;QAE1B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,oBAAoB,CAAC,CAAC,CAAC;oBAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;oBACtC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,qBAAa,CAAC,MAAM,CAAC;oBACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;oBAEvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;wBAC7C,OAAO,EAAE,mBAAW,CAAC,kBAAkB;wBACvC,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,aAAa;wBACb,QAAQ;qBACT,CAAC,CAAC;oBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAE3C,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;wBACrC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;wBACvC,OAAO,EAAE,MAAM,CAAC,QAAQ;wBACxB,OAAO,EAAE,qBAAqB;wBAC9B,UAAU;qBACX,CAAC;gBACJ,CAAC;gBAED,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClC,OAAO;4BACL,OAAO,EAAE,KAAK;4BACd,WAAW,EAAE,WAA0B;4BACvC,YAAY,EAAE,YAA4B;4BAC1C,OAAO,EAAE,uBAAuB;yBACjC,CAAC;oBACJ,CAAC;oBAED,yDAAyD;oBACzD,MAAM,YAAY,GAAiB;wBACjC,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,WAAW;wBACX,YAAY;wBACZ,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC;oBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAC5C;wBACE,OAAO,EAAE,mBAAW,CAAC,IAAI;wBACzB,SAAS,EAAE,OAAO,CAAC,EAAE;qBACtB,EACD,YAAY,CACb,CAAC;oBAEF,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAE3C,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;wBACrC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;wBACvC,OAAO,EAAE,MAAM,CAAC,QAAQ;wBACxB,OAAO,EAAE,gBAAgB;wBACzB,UAAU;qBACX,CAAC;gBACJ,CAAC;gBAED,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;wBAC7C,OAAO,EAAE,mBAAW,CAAC,WAAW;wBAChC,SAAS,EAAE,OAAO,CAAC,EAAE;qBACtB,CAAC,CAAC;oBAEH,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAE3C,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE,WAA0B;wBACvC,YAAY,EAAE,YAA4B;wBAC1C,OAAO,EAAE,MAAM,CAAC,QAAQ;wBACxB,OAAO,EAAE,mBAAmB;qBAC7B,CAAC;gBACJ,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC3C,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,WAA0B;wBACvC,YAAY,EAAE,YAA4B;wBAC1C,OAAO,EAAE,yBAAyB,OAAO,CAAC,IAAI,EAAE;qBACjD,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,WAA0B;gBACvC,YAAY,EAAE,YAA4B;gBAC1C,OAAO,EAAG,KAAe,CAAC,OAAO,IAAI,eAAe;aACrD,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAzID,wDAyIC"}
package/dist/index.js CHANGED
@@ -7,7 +7,10 @@
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 = void 0;
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;
11
+ // V1 Game Engine (for game-engine-service integration)
12
+ var happy_panda_v1_game_engine_1 = require("./happy-panda-v1.game-engine");
13
+ Object.defineProperty(exports, "HappyPandaV1GameEngine", { enumerable: true, get: function () { return happy_panda_v1_game_engine_1.HappyPandaV1GameEngine; } });
11
14
  // Core engine
12
15
  var engine_1 = require("./engine");
13
16
  Object.defineProperty(exports, "HappyPandaEngine", { enumerable: true, get: function () { return engine_1.HappyPandaEngine; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnitronix/happy-panda-game-engine",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Happy Panda Game Engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",