@omnitronix/lucky-sharky-game-engine 1.0.0 → 1.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.
- package/README.md +43 -0
- package/dist/__tests__/cheat-trigger-bonus.test.d.ts +8 -0
- package/dist/__tests__/cheat-trigger-bonus.test.d.ts.map +1 -0
- package/dist/__tests__/cheat-trigger-bonus.test.js +410 -0
- package/dist/__tests__/cheat-trigger-bonus.test.js.map +1 -0
- package/dist/domain/types/cheat-trigger-bonus-command.d.ts +10 -0
- package/dist/domain/types/cheat-trigger-bonus-command.d.ts.map +1 -0
- package/dist/domain/types/cheat-trigger-bonus-command.js +3 -0
- package/dist/domain/types/cheat-trigger-bonus-command.js.map +1 -0
- package/dist/logic/lucky-sharky.game-logic.d.ts +16 -0
- package/dist/logic/lucky-sharky.game-logic.d.ts.map +1 -1
- package/dist/logic/lucky-sharky.game-logic.js +42 -0
- package/dist/logic/lucky-sharky.game-logic.js.map +1 -1
- package/dist/lucky-sharky-v1.game-engine.d.ts.map +1 -1
- package/dist/lucky-sharky-v1.game-engine.js +20 -1
- package/dist/lucky-sharky-v1.game-engine.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -81,6 +81,49 @@ const spinResult = await engine.processCommand(
|
|
|
81
81
|
- 4 Jackpots: Mini (30x), Midi (100x), Maxi (500x), Mega (5000x)
|
|
82
82
|
- Full screen bonus: 1000x
|
|
83
83
|
|
|
84
|
+
## Debug/Cheat Commands (Testing/Admin)
|
|
85
|
+
|
|
86
|
+
The engine supports debug commands for QA testing via the dev-tools service. These commands are **blocked in REAL_MONEY mode**.
|
|
87
|
+
|
|
88
|
+
### CHEAT_TRIGGER_BONUS
|
|
89
|
+
|
|
90
|
+
Force trigger a specific bonus round for testing.
|
|
91
|
+
|
|
92
|
+
**Payload:**
|
|
93
|
+
```typescript
|
|
94
|
+
interface CheatTriggerBonusCommand {
|
|
95
|
+
sessionId: string;
|
|
96
|
+
bonusType: 'FREE_SPINS' | 'HOLD_WIN_BONUS';
|
|
97
|
+
betAmount: number;
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Usage:**
|
|
102
|
+
```typescript
|
|
103
|
+
const result = await engine.processCommand(
|
|
104
|
+
publicState,
|
|
105
|
+
privateState,
|
|
106
|
+
{
|
|
107
|
+
id: 'cheat-cmd-1',
|
|
108
|
+
type: 'CHEAT_TRIGGER_BONUS',
|
|
109
|
+
payload: {
|
|
110
|
+
sessionId: 'session-123',
|
|
111
|
+
bonusType: 'FREE_SPINS', // or 'HOLD_WIN_BONUS'
|
|
112
|
+
betAmount: 1.0,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Bonus Types:**
|
|
119
|
+
|
|
120
|
+
| Type | Description |
|
|
121
|
+
|------|-------------|
|
|
122
|
+
| `FREE_SPINS` | Triggers free spins with scatter win |
|
|
123
|
+
| `HOLD_WIN_BONUS` | Triggers Hold & Win with respins and jackpots |
|
|
124
|
+
|
|
125
|
+
**Returns:** Updated state with bonus pending. Execute `START_BONUS_ROUND` to begin the bonus.
|
|
126
|
+
|
|
84
127
|
## Development
|
|
85
128
|
|
|
86
129
|
```bash
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CHEAT_TRIGGER_BONUS Command Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the dev-tools cheat command that triggers bonus rounds for testing.
|
|
5
|
+
* Tests the LuckySharkyGameLogic.cheatTriggerBonus method directly.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=cheat-trigger-bonus.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cheat-trigger-bonus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cheat-trigger-bonus.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CHEAT_TRIGGER_BONUS Command Tests
|
|
4
|
+
*
|
|
5
|
+
* Tests for the dev-tools cheat command that triggers bonus rounds for testing.
|
|
6
|
+
* Tests the LuckySharkyGameLogic.cheatTriggerBonus method directly.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const lucky_sharky_game_logic_1 = require("../logic/lucky-sharky.game-logic");
|
|
10
|
+
const lucky_sharky_types_1 = require("../logic/lucky-sharky.types");
|
|
11
|
+
const rng_service_1 = require("../rng/rng-service");
|
|
12
|
+
// Mock RNG client for testing
|
|
13
|
+
const mockRngClient = {
|
|
14
|
+
getSingleNumber: jest.fn().mockResolvedValue({ value: 0, seed: 12345 }),
|
|
15
|
+
};
|
|
16
|
+
describe('CHEAT_TRIGGER_BONUS Command', () => {
|
|
17
|
+
let gameLogic;
|
|
18
|
+
let rngService;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
rngService = new rng_service_1.RngService(mockRngClient);
|
|
21
|
+
gameLogic = new lucky_sharky_game_logic_1.LuckySharkyGameLogic(rngService);
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Creates a valid initialized public state for testing
|
|
25
|
+
*/
|
|
26
|
+
function createInitializedPublicState() {
|
|
27
|
+
return {
|
|
28
|
+
boosterLevel: 0,
|
|
29
|
+
freeSpinsRemaining: 0,
|
|
30
|
+
coinValues: [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates a valid initialized private state for testing
|
|
35
|
+
*/
|
|
36
|
+
function createInitializedPrivateState() {
|
|
37
|
+
return {
|
|
38
|
+
boosterLevel: 0,
|
|
39
|
+
boosterMemory: 0,
|
|
40
|
+
nextSpinType: lucky_sharky_types_1.SpinType.BASE_GAME_SPIN,
|
|
41
|
+
pendingBonuses: [],
|
|
42
|
+
guaranteeSpinCount: 0,
|
|
43
|
+
screen: [
|
|
44
|
+
[0, 1, 2],
|
|
45
|
+
[3, 4, 5],
|
|
46
|
+
[6, 7, 0],
|
|
47
|
+
[1, 2, 3],
|
|
48
|
+
[4, 5, 6],
|
|
49
|
+
],
|
|
50
|
+
lastBetAmount: 1,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Creates a CheatTriggerBonusCommand payload
|
|
55
|
+
*/
|
|
56
|
+
function createCheatTriggerBonusParams(bonusType, betAmount = 1, sessionId = 'test-session-123') {
|
|
57
|
+
return {
|
|
58
|
+
sessionId,
|
|
59
|
+
bonusType,
|
|
60
|
+
betAmount,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
describe('FREE_SPINS bonusType', () => {
|
|
64
|
+
it('should successfully trigger FREE_SPINS bonus', () => {
|
|
65
|
+
const publicState = createInitializedPublicState();
|
|
66
|
+
const privateState = createInitializedPrivateState();
|
|
67
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
68
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
69
|
+
expect(result).toBeDefined();
|
|
70
|
+
expect(result.publicState).toBeDefined();
|
|
71
|
+
expect(result.privateState).toBeDefined();
|
|
72
|
+
expect(result.outcome).toBeDefined();
|
|
73
|
+
});
|
|
74
|
+
it('should set nextSpinType to FREE_SPIN', () => {
|
|
75
|
+
const publicState = createInitializedPublicState();
|
|
76
|
+
const privateState = createInitializedPrivateState();
|
|
77
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
78
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
79
|
+
expect(result.privateState.nextSpinType).toBe(lucky_sharky_types_1.SpinType.FREE_SPIN);
|
|
80
|
+
});
|
|
81
|
+
it('should add FREE_SPINS bonus to pendingBonuses array', () => {
|
|
82
|
+
const publicState = createInitializedPublicState();
|
|
83
|
+
const privateState = createInitializedPrivateState();
|
|
84
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
85
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
86
|
+
expect(result.privateState.pendingBonuses).toHaveLength(1);
|
|
87
|
+
expect(result.privateState.pendingBonuses[0].bonusType).toBe(lucky_sharky_types_1.BonusType.FREE_SPINS);
|
|
88
|
+
});
|
|
89
|
+
it('should return outcome with triggeredBonus details', () => {
|
|
90
|
+
const publicState = createInitializedPublicState();
|
|
91
|
+
const privateState = createInitializedPrivateState();
|
|
92
|
+
const betAmount = 5;
|
|
93
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', betAmount);
|
|
94
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
95
|
+
expect(result.outcome).toBeDefined();
|
|
96
|
+
expect(result.outcome.triggeredBonus).toBeDefined();
|
|
97
|
+
expect(result.outcome.triggeredBonus.bonusType).toBe('FREE_SPINS');
|
|
98
|
+
expect(result.outcome.triggeredBonus.betAmount).toBe(betAmount);
|
|
99
|
+
expect(result.outcome.triggeredBonus.bonusId).toBeDefined();
|
|
100
|
+
expect(result.outcome.triggeredBonus.bonusId).toMatch(/^cheat-/);
|
|
101
|
+
});
|
|
102
|
+
it('should preserve existing publicState', () => {
|
|
103
|
+
const publicState = {
|
|
104
|
+
boosterLevel: 5,
|
|
105
|
+
freeSpinsRemaining: 3,
|
|
106
|
+
coinValues: [1, 2, 3],
|
|
107
|
+
};
|
|
108
|
+
const privateState = createInitializedPrivateState();
|
|
109
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
110
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
111
|
+
expect(result.publicState.boosterLevel).toBe(5);
|
|
112
|
+
expect(result.publicState.freeSpinsRemaining).toBe(3);
|
|
113
|
+
expect(result.publicState.coinValues).toEqual([1, 2, 3]);
|
|
114
|
+
});
|
|
115
|
+
it('should store correct betAmount in pending bonus', () => {
|
|
116
|
+
const publicState = createInitializedPublicState();
|
|
117
|
+
const privateState = createInitializedPrivateState();
|
|
118
|
+
const betAmount = 10;
|
|
119
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', betAmount);
|
|
120
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
121
|
+
expect(result.privateState.pendingBonuses[0].betAmount).toBe(betAmount);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('HOLD_WIN_BONUS bonusType', () => {
|
|
125
|
+
it('should successfully trigger HOLD_WIN_BONUS', () => {
|
|
126
|
+
const publicState = createInitializedPublicState();
|
|
127
|
+
const privateState = createInitializedPrivateState();
|
|
128
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 1);
|
|
129
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
130
|
+
expect(result).toBeDefined();
|
|
131
|
+
expect(result.publicState).toBeDefined();
|
|
132
|
+
expect(result.privateState).toBeDefined();
|
|
133
|
+
expect(result.outcome).toBeDefined();
|
|
134
|
+
});
|
|
135
|
+
it('should set nextSpinType to HOLD_WIN_BONUS_SPIN', () => {
|
|
136
|
+
const publicState = createInitializedPublicState();
|
|
137
|
+
const privateState = createInitializedPrivateState();
|
|
138
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 1);
|
|
139
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
140
|
+
expect(result.privateState.nextSpinType).toBe(lucky_sharky_types_1.SpinType.HOLD_WIN_BONUS_SPIN);
|
|
141
|
+
});
|
|
142
|
+
it('should add HOLD_WIN_BONUS to pendingBonuses array', () => {
|
|
143
|
+
const publicState = createInitializedPublicState();
|
|
144
|
+
const privateState = createInitializedPrivateState();
|
|
145
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 1);
|
|
146
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
147
|
+
expect(result.privateState.pendingBonuses).toHaveLength(1);
|
|
148
|
+
expect(result.privateState.pendingBonuses[0].bonusType).toBe(lucky_sharky_types_1.BonusType.HOLD_WIN_BONUS);
|
|
149
|
+
});
|
|
150
|
+
it('should return outcome with triggeredBonus details', () => {
|
|
151
|
+
const publicState = createInitializedPublicState();
|
|
152
|
+
const privateState = createInitializedPrivateState();
|
|
153
|
+
const betAmount = 20;
|
|
154
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', betAmount);
|
|
155
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
156
|
+
expect(result.outcome).toBeDefined();
|
|
157
|
+
expect(result.outcome.triggeredBonus).toBeDefined();
|
|
158
|
+
expect(result.outcome.triggeredBonus.bonusType).toBe('HOLD_WIN_BONUS');
|
|
159
|
+
expect(result.outcome.triggeredBonus.betAmount).toBe(betAmount);
|
|
160
|
+
expect(result.outcome.triggeredBonus.bonusId).toBeDefined();
|
|
161
|
+
});
|
|
162
|
+
it('should preserve existing pendingBonuses when adding new bonus', () => {
|
|
163
|
+
const publicState = createInitializedPublicState();
|
|
164
|
+
const existingBonus = {
|
|
165
|
+
bonusId: 'existing-bonus-123',
|
|
166
|
+
bonusType: lucky_sharky_types_1.BonusType.FREE_SPINS,
|
|
167
|
+
betAmount: 5,
|
|
168
|
+
};
|
|
169
|
+
const privateState = {
|
|
170
|
+
...createInitializedPrivateState(),
|
|
171
|
+
pendingBonuses: [existingBonus],
|
|
172
|
+
};
|
|
173
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 10);
|
|
174
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
175
|
+
expect(result.privateState.pendingBonuses).toHaveLength(2);
|
|
176
|
+
expect(result.privateState.pendingBonuses[0]).toEqual(existingBonus);
|
|
177
|
+
expect(result.privateState.pendingBonuses[1].bonusType).toBe(lucky_sharky_types_1.BonusType.HOLD_WIN_BONUS);
|
|
178
|
+
});
|
|
179
|
+
it('should store correct betAmount in pending bonus', () => {
|
|
180
|
+
const publicState = createInitializedPublicState();
|
|
181
|
+
const privateState = createInitializedPrivateState();
|
|
182
|
+
const betAmount = 100;
|
|
183
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', betAmount);
|
|
184
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
185
|
+
expect(result.privateState.pendingBonuses[0].betAmount).toBe(betAmount);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('Error Cases', () => {
|
|
189
|
+
describe('Unknown bonusType', () => {
|
|
190
|
+
it('should throw error for unknown bonusType', () => {
|
|
191
|
+
const publicState = createInitializedPublicState();
|
|
192
|
+
const privateState = createInitializedPrivateState();
|
|
193
|
+
const params = {
|
|
194
|
+
sessionId: 'test-session',
|
|
195
|
+
bonusType: 'UNKNOWN_BONUS',
|
|
196
|
+
betAmount: 1,
|
|
197
|
+
};
|
|
198
|
+
expect(() => {
|
|
199
|
+
gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
200
|
+
}).toThrow('Unknown bonus type: UNKNOWN_BONUS');
|
|
201
|
+
});
|
|
202
|
+
it('should throw error for empty bonusType', () => {
|
|
203
|
+
const publicState = createInitializedPublicState();
|
|
204
|
+
const privateState = createInitializedPrivateState();
|
|
205
|
+
const params = {
|
|
206
|
+
sessionId: 'test-session',
|
|
207
|
+
bonusType: '',
|
|
208
|
+
betAmount: 1,
|
|
209
|
+
};
|
|
210
|
+
expect(() => {
|
|
211
|
+
gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
212
|
+
}).toThrow('Unknown bonus type:');
|
|
213
|
+
});
|
|
214
|
+
it('should throw error for null bonusType', () => {
|
|
215
|
+
const publicState = createInitializedPublicState();
|
|
216
|
+
const privateState = createInitializedPrivateState();
|
|
217
|
+
const params = {
|
|
218
|
+
sessionId: 'test-session',
|
|
219
|
+
bonusType: null,
|
|
220
|
+
betAmount: 1,
|
|
221
|
+
};
|
|
222
|
+
expect(() => {
|
|
223
|
+
gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
224
|
+
}).toThrow('Unknown bonus type');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('State not initialized', () => {
|
|
228
|
+
it('should handle null publicState by returning null publicState', () => {
|
|
229
|
+
const privateState = createInitializedPrivateState();
|
|
230
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
231
|
+
// The cheatTriggerBonus method returns publicState as-is
|
|
232
|
+
const result = gameLogic.cheatTriggerBonus(null, privateState, params);
|
|
233
|
+
expect(result.publicState).toBeNull();
|
|
234
|
+
expect(result.privateState).toBeDefined();
|
|
235
|
+
});
|
|
236
|
+
it('should handle undefined publicState by returning undefined publicState', () => {
|
|
237
|
+
const privateState = createInitializedPrivateState();
|
|
238
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
239
|
+
const result = gameLogic.cheatTriggerBonus(undefined, privateState, params);
|
|
240
|
+
expect(result.publicState).toBeUndefined();
|
|
241
|
+
});
|
|
242
|
+
it('should throw error when privateState is null', () => {
|
|
243
|
+
const publicState = createInitializedPublicState();
|
|
244
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
245
|
+
// When privateState is null, spreading pendingBonuses will throw
|
|
246
|
+
expect(() => {
|
|
247
|
+
gameLogic.cheatTriggerBonus(publicState, null, params);
|
|
248
|
+
}).toThrow();
|
|
249
|
+
});
|
|
250
|
+
it('should throw error when privateState is undefined', () => {
|
|
251
|
+
const publicState = createInitializedPublicState();
|
|
252
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
253
|
+
expect(() => {
|
|
254
|
+
gameLogic.cheatTriggerBonus(publicState, undefined, params);
|
|
255
|
+
}).toThrow();
|
|
256
|
+
});
|
|
257
|
+
it('should throw error when privateState has no pendingBonuses array', () => {
|
|
258
|
+
const publicState = createInitializedPublicState();
|
|
259
|
+
const emptyPrivateState = {};
|
|
260
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
261
|
+
// Spreading undefined pendingBonuses will cause issues
|
|
262
|
+
expect(() => {
|
|
263
|
+
gameLogic.cheatTriggerBonus(publicState, emptyPrivateState, params);
|
|
264
|
+
}).toThrow();
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe('pendingBonus state verification', () => {
|
|
269
|
+
it('should generate unique bonusId for each trigger', () => {
|
|
270
|
+
const publicState = createInitializedPublicState();
|
|
271
|
+
const privateState1 = createInitializedPrivateState();
|
|
272
|
+
const privateState2 = createInitializedPrivateState();
|
|
273
|
+
const params1 = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
274
|
+
const params2 = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
275
|
+
const result1 = gameLogic.cheatTriggerBonus(publicState, privateState1, params1);
|
|
276
|
+
const result2 = gameLogic.cheatTriggerBonus(publicState, privateState2, params2);
|
|
277
|
+
expect(result1.outcome.triggeredBonus.bonusId).not.toBe(result2.outcome.triggeredBonus.bonusId);
|
|
278
|
+
});
|
|
279
|
+
it('should correctly set pendingBonus with all required fields', () => {
|
|
280
|
+
const publicState = createInitializedPublicState();
|
|
281
|
+
const privateState = createInitializedPrivateState();
|
|
282
|
+
const betAmount = 50;
|
|
283
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', betAmount);
|
|
284
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
285
|
+
const pendingBonus = result.privateState.pendingBonuses[0];
|
|
286
|
+
expect(pendingBonus).toHaveProperty('bonusId');
|
|
287
|
+
expect(pendingBonus).toHaveProperty('bonusType');
|
|
288
|
+
expect(pendingBonus).toHaveProperty('betAmount');
|
|
289
|
+
expect(pendingBonus.bonusId).toBeTruthy();
|
|
290
|
+
expect(pendingBonus.bonusType).toBe(lucky_sharky_types_1.BonusType.FREE_SPINS);
|
|
291
|
+
expect(pendingBonus.betAmount).toBe(betAmount);
|
|
292
|
+
});
|
|
293
|
+
it('should preserve other privateState fields when setting pending bonus', () => {
|
|
294
|
+
const publicState = createInitializedPublicState();
|
|
295
|
+
const privateState = {
|
|
296
|
+
boosterLevel: 3,
|
|
297
|
+
boosterMemory: 2,
|
|
298
|
+
nextSpinType: lucky_sharky_types_1.SpinType.BASE_GAME_SPIN,
|
|
299
|
+
pendingBonuses: [],
|
|
300
|
+
guaranteeSpinCount: 5,
|
|
301
|
+
screen: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 1, 2], [3, 4, 5]],
|
|
302
|
+
lastBetAmount: 10,
|
|
303
|
+
};
|
|
304
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 1);
|
|
305
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
306
|
+
// Verify other fields are preserved
|
|
307
|
+
expect(result.privateState.boosterLevel).toBe(3);
|
|
308
|
+
expect(result.privateState.boosterMemory).toBe(2);
|
|
309
|
+
expect(result.privateState.guaranteeSpinCount).toBe(5);
|
|
310
|
+
expect(result.privateState.screen).toEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 1, 2], [3, 4, 5]]);
|
|
311
|
+
expect(result.privateState.lastBetAmount).toBe(10);
|
|
312
|
+
// But nextSpinType should be updated
|
|
313
|
+
expect(result.privateState.nextSpinType).toBe(lucky_sharky_types_1.SpinType.HOLD_WIN_BONUS_SPIN);
|
|
314
|
+
});
|
|
315
|
+
it('should match bonusId between outcome and pendingBonuses', () => {
|
|
316
|
+
const publicState = createInitializedPublicState();
|
|
317
|
+
const privateState = createInitializedPrivateState();
|
|
318
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
319
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
320
|
+
expect(result.outcome.triggeredBonus.bonusId).toBe(result.privateState.pendingBonuses[result.privateState.pendingBonuses.length - 1].bonusId);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe('Bet amount variations', () => {
|
|
324
|
+
it('should work with different bet amounts', () => {
|
|
325
|
+
const publicState = createInitializedPublicState();
|
|
326
|
+
const betAmounts = [0.1, 1, 5, 10, 50, 100, 1000];
|
|
327
|
+
for (const betAmount of betAmounts) {
|
|
328
|
+
const privateState = createInitializedPrivateState();
|
|
329
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', betAmount);
|
|
330
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
331
|
+
expect(result.outcome.triggeredBonus.betAmount).toBe(betAmount);
|
|
332
|
+
expect(result.privateState.pendingBonuses[0].betAmount).toBe(betAmount);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
it('should work with zero bet amount', () => {
|
|
336
|
+
const publicState = createInitializedPublicState();
|
|
337
|
+
const privateState = createInitializedPrivateState();
|
|
338
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 0);
|
|
339
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
340
|
+
expect(result.outcome.triggeredBonus.betAmount).toBe(0);
|
|
341
|
+
expect(result.privateState.pendingBonuses[0].betAmount).toBe(0);
|
|
342
|
+
});
|
|
343
|
+
it('should work with negative bet amount (edge case)', () => {
|
|
344
|
+
const publicState = createInitializedPublicState();
|
|
345
|
+
const privateState = createInitializedPrivateState();
|
|
346
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', -5);
|
|
347
|
+
// Method does not validate bet amount
|
|
348
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
349
|
+
expect(result.outcome.triggeredBonus.betAmount).toBe(-5);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
describe('Session ID variations', () => {
|
|
353
|
+
it('should work with different session IDs', () => {
|
|
354
|
+
const publicState = createInitializedPublicState();
|
|
355
|
+
const privateState = createInitializedPrivateState();
|
|
356
|
+
const sessionId = 'custom-session-abc-123';
|
|
357
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 1, sessionId);
|
|
358
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
359
|
+
expect(result).toBeDefined();
|
|
360
|
+
expect(result.outcome.triggeredBonus).toBeDefined();
|
|
361
|
+
});
|
|
362
|
+
it('should work with empty session ID', () => {
|
|
363
|
+
const publicState = createInitializedPublicState();
|
|
364
|
+
const privateState = createInitializedPrivateState();
|
|
365
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', 1, '');
|
|
366
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
367
|
+
expect(result).toBeDefined();
|
|
368
|
+
});
|
|
369
|
+
it('should work with very long session ID', () => {
|
|
370
|
+
const publicState = createInitializedPublicState();
|
|
371
|
+
const privateState = createInitializedPrivateState();
|
|
372
|
+
const longSessionId = 'a'.repeat(1000);
|
|
373
|
+
const params = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 1, longSessionId);
|
|
374
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
375
|
+
expect(result).toBeDefined();
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
describe('Multiple consecutive triggers', () => {
|
|
379
|
+
it('should handle multiple bonus triggers on the same private state', () => {
|
|
380
|
+
const publicState = createInitializedPublicState();
|
|
381
|
+
let privateState = createInitializedPrivateState();
|
|
382
|
+
// First trigger
|
|
383
|
+
const params1 = createCheatTriggerBonusParams('FREE_SPINS', 1);
|
|
384
|
+
const result1 = gameLogic.cheatTriggerBonus(publicState, privateState, params1);
|
|
385
|
+
privateState = result1.privateState;
|
|
386
|
+
// Second trigger on the updated state
|
|
387
|
+
const params2 = createCheatTriggerBonusParams('HOLD_WIN_BONUS', 5);
|
|
388
|
+
const result2 = gameLogic.cheatTriggerBonus(publicState, privateState, params2);
|
|
389
|
+
expect(result2.privateState.pendingBonuses).toHaveLength(2);
|
|
390
|
+
expect(result2.privateState.pendingBonuses[0].bonusType).toBe(lucky_sharky_types_1.BonusType.FREE_SPINS);
|
|
391
|
+
expect(result2.privateState.pendingBonuses[1].bonusType).toBe(lucky_sharky_types_1.BonusType.HOLD_WIN_BONUS);
|
|
392
|
+
// nextSpinType should be the latest bonus type
|
|
393
|
+
expect(result2.privateState.nextSpinType).toBe(lucky_sharky_types_1.SpinType.HOLD_WIN_BONUS_SPIN);
|
|
394
|
+
});
|
|
395
|
+
it('should handle three consecutive FREE_SPINS triggers', () => {
|
|
396
|
+
const publicState = createInitializedPublicState();
|
|
397
|
+
let privateState = createInitializedPrivateState();
|
|
398
|
+
for (let i = 0; i < 3; i++) {
|
|
399
|
+
const params = createCheatTriggerBonusParams('FREE_SPINS', i + 1);
|
|
400
|
+
const result = gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
401
|
+
privateState = result.privateState;
|
|
402
|
+
}
|
|
403
|
+
expect(privateState.pendingBonuses).toHaveLength(3);
|
|
404
|
+
expect(privateState.pendingBonuses[0].betAmount).toBe(1);
|
|
405
|
+
expect(privateState.pendingBonuses[1].betAmount).toBe(2);
|
|
406
|
+
expect(privateState.pendingBonuses[2].betAmount).toBe(3);
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
//# sourceMappingURL=cheat-trigger-bonus.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cheat-trigger-bonus.test.js","sourceRoot":"","sources":["../../src/__tests__/cheat-trigger-bonus.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command payload for CHEAT_TRIGGER_BONUS
|
|
3
|
+
* Allows dev-tools to trigger bonus rounds for testing
|
|
4
|
+
*/
|
|
5
|
+
export interface CheatTriggerBonusCommand {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
bonusType: 'FREE_SPINS' | 'HOLD_WIN_BONUS';
|
|
8
|
+
betAmount: number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=cheat-trigger-bonus-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cheat-trigger-bonus-command.d.ts","sourceRoot":"","sources":["../../../src/domain/types/cheat-trigger-bonus-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,GAAG,gBAAgB,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cheat-trigger-bonus-command.js","sourceRoot":"","sources":["../../../src/domain/types/cheat-trigger-bonus-command.ts"],"names":[],"mappings":""}
|
|
@@ -4,6 +4,7 @@ import { LuckySharkyGameLogicConfigInterface } from './game-logic-config.interfa
|
|
|
4
4
|
import { GameSpinInputDto } from '../domain/types/game-spin-input.dto';
|
|
5
5
|
import { StartBonusRoundInputDto } from '../domain/types/start-bonus-round-input.dto';
|
|
6
6
|
import { BaseGameSpinResult, BonusType, GetSymbolsResult, LuckySharkyGameLogicSpinResult, LuckySharkyPrivateState, LuckySharkyPublicState, SpinResultResponse } from './lucky-sharky.types';
|
|
7
|
+
import { CheatTriggerBonusCommand } from '../domain/types/cheat-trigger-bonus-command';
|
|
7
8
|
export interface LuckySharkySessionStateInterface {
|
|
8
9
|
publicState: LuckySharkyPublicState;
|
|
9
10
|
privateState: LuckySharkyPrivateState;
|
|
@@ -22,5 +23,20 @@ export declare class LuckySharkyGameLogic {
|
|
|
22
23
|
private handleHoldWinBonus;
|
|
23
24
|
getSymbols(gameLogicConfig: LuckySharkyGameLogicConfigInterface): GetSymbolsResult;
|
|
24
25
|
static getBonusTypeForTrigger(bonusType: BonusType): string;
|
|
26
|
+
/**
|
|
27
|
+
* Cheat command to trigger a bonus round directly
|
|
28
|
+
* Used by dev-tools for testing bonus mechanics
|
|
29
|
+
*/
|
|
30
|
+
cheatTriggerBonus(publicState: LuckySharkyPublicState, privateState: LuckySharkyPrivateState, params: CheatTriggerBonusCommand): {
|
|
31
|
+
publicState: LuckySharkyPublicState;
|
|
32
|
+
privateState: LuckySharkyPrivateState;
|
|
33
|
+
outcome: {
|
|
34
|
+
triggeredBonus: {
|
|
35
|
+
bonusId: string;
|
|
36
|
+
bonusType: string;
|
|
37
|
+
betAmount: number;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
};
|
|
25
41
|
}
|
|
26
42
|
//# sourceMappingURL=lucky-sharky.game-logic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucky-sharky.game-logic.d.ts","sourceRoot":"","sources":["../../src/logic/lucky-sharky.game-logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,mCAAmC,EAAE,MAAM,+BAA+B,CAAC;AAKpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"lucky-sharky.game-logic.d.ts","sourceRoot":"","sources":["../../src/logic/lucky-sharky.game-logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,mCAAmC,EAAE,MAAM,+BAA+B,CAAC;AAKpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAEvF,MAAM,WAAW,gCAAgC;IAC/C,WAAW,EAAE,sBAAsB,CAAC;IACpC,YAAY,EAAE,uBAAuB,CAAC;CACvC;AAED,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEtC,gBAAgB,CAC3B,eAAe,EAAE,mCAAmC,EACpD,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE;QAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,EACvE,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gCAAgC,CAAC;IA6B/B,IAAI,CACf,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,uBAAuB,EACrC,MAAM,EAAE,mCAAmC,EAC3C,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAmErC,eAAe,CAC1B,MAAM,EAAE,uBAAuB,EAC/B,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,uBAAuB,EACrC,MAAM,EAAE,mCAAmC,EAC3C,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,8BAA8B,CAAC;IA4B1C,OAAO,CAAC,qBAAqB;YAqBf,oBAAoB;YA+BpB,kBAAkB;IAwBzB,UAAU,CACf,eAAe,EAAE,mCAAmC,GACnD,gBAAgB;WAYL,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IAWlE;;;OAGG;IACI,iBAAiB,CACtB,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,uBAAuB,EACrC,MAAM,EAAE,wBAAwB,GAC/B;QACD,WAAW,EAAE,sBAAsB,CAAC;QACpC,YAAY,EAAE,uBAAuB,CAAC;QACtC,OAAO,EAAE;YACP,cAAc,EAAE;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,SAAS,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;aACnB,CAAC;SACH,CAAC;KACH;CA0CF"}
|
|
@@ -126,6 +126,48 @@ class LuckySharkyGameLogic {
|
|
|
126
126
|
return 'unknown';
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Cheat command to trigger a bonus round directly
|
|
131
|
+
* Used by dev-tools for testing bonus mechanics
|
|
132
|
+
*/
|
|
133
|
+
cheatTriggerBonus(publicState, privateState, params) {
|
|
134
|
+
const bonusId = `cheat-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
135
|
+
// Determine the next spin type based on bonus type
|
|
136
|
+
let nextSpinType;
|
|
137
|
+
switch (params.bonusType) {
|
|
138
|
+
case 'FREE_SPINS':
|
|
139
|
+
nextSpinType = lucky_sharky_types_1.SpinType.FREE_SPIN;
|
|
140
|
+
break;
|
|
141
|
+
case 'HOLD_WIN_BONUS':
|
|
142
|
+
nextSpinType = lucky_sharky_types_1.SpinType.HOLD_WIN_BONUS_SPIN;
|
|
143
|
+
break;
|
|
144
|
+
default:
|
|
145
|
+
throw new Error(`Unknown bonus type: ${params.bonusType}`);
|
|
146
|
+
}
|
|
147
|
+
// Create the bonus trigger
|
|
148
|
+
const bonusTrigger = {
|
|
149
|
+
bonusId,
|
|
150
|
+
bonusType: params.bonusType === 'FREE_SPINS' ? lucky_sharky_types_1.BonusType.FREE_SPINS : lucky_sharky_types_1.BonusType.HOLD_WIN_BONUS,
|
|
151
|
+
betAmount: params.betAmount,
|
|
152
|
+
};
|
|
153
|
+
// Update state to indicate bonus is pending
|
|
154
|
+
const updatedPrivateState = {
|
|
155
|
+
...privateState,
|
|
156
|
+
nextSpinType,
|
|
157
|
+
pendingBonuses: [...privateState.pendingBonuses, bonusTrigger],
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
publicState,
|
|
161
|
+
privateState: updatedPrivateState,
|
|
162
|
+
outcome: {
|
|
163
|
+
triggeredBonus: {
|
|
164
|
+
bonusId,
|
|
165
|
+
bonusType: params.bonusType,
|
|
166
|
+
betAmount: params.betAmount,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
129
171
|
}
|
|
130
172
|
exports.LuckySharkyGameLogic = LuckySharkyGameLogic;
|
|
131
173
|
//# sourceMappingURL=lucky-sharky.game-logic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucky-sharky.game-logic.js","sourceRoot":"","sources":["../../src/logic/lucky-sharky.game-logic.ts"],"names":[],"mappings":";;;AAGA,+EAAyE;AACzE,oEAA+D;AAC/D,sEAAiE;AACjE,8EAAwE;AAGxE,6DAS8B;
|
|
1
|
+
{"version":3,"file":"lucky-sharky.game-logic.js","sourceRoot":"","sources":["../../src/logic/lucky-sharky.game-logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucky-sharky-v1.game-engine.d.ts","sourceRoot":"","sources":["../src/lucky-sharky-v1.game-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EAGvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAIvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAG5F,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uDAAuD,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"lucky-sharky-v1.game-engine.d.ts","sourceRoot":"","sources":["../src/lucky-sharky-v1.game-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EAGvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAIvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAG5F,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uDAAuD,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,qBAAa,uBACX,YAAW,UAAU,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,GAAG,CAAC;IAE3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,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,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,KAAK,CAAwC;IAErD,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,GAAE,gBAAqB;IAalC,iBAAiB,IAAI,cAAc;YAW5B,OAAO;IAuCR,cAAc,CACzB,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,uBAAuB,EACrC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CACR,uBAAuB,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAC9E;CAqJF"}
|
|
@@ -61,7 +61,12 @@ class LuckySharkyV1GameEngine {
|
|
|
61
61
|
if (!baseReels) {
|
|
62
62
|
throw new Error('Base game reels not found');
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
// Ensure gameConfig has required fields with defaults
|
|
65
|
+
const gameConfig = {
|
|
66
|
+
betAmountThresholds: command.payload?.betAmountThresholds ?? [0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100],
|
|
67
|
+
defaultBetAmount: command.payload?.defaultBetAmount ?? command.payload?.betStake ?? 1,
|
|
68
|
+
};
|
|
69
|
+
const result = await this.gameLogic.initSessionState(this.config, baseReels, gameConfig, command.id);
|
|
65
70
|
const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
|
|
66
71
|
this.rngService.removeCommand(command.id);
|
|
67
72
|
return {
|
|
@@ -137,6 +142,20 @@ class LuckySharkyV1GameEngine {
|
|
|
137
142
|
rngOutcome: undefined,
|
|
138
143
|
};
|
|
139
144
|
}
|
|
145
|
+
case 'CHEAT_TRIGGER_BONUS': {
|
|
146
|
+
const params = command.payload;
|
|
147
|
+
const result = this.gameLogic.cheatTriggerBonus(publicState, privateState, params);
|
|
148
|
+
const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
|
|
149
|
+
this.rngService.removeCommand(command.id);
|
|
150
|
+
return {
|
|
151
|
+
success: true,
|
|
152
|
+
publicState: result.publicState,
|
|
153
|
+
privateState: result.privateState,
|
|
154
|
+
outcome: result.outcome,
|
|
155
|
+
message: 'Bonus triggered via cheat command',
|
|
156
|
+
rngOutcome,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
140
159
|
default: {
|
|
141
160
|
return {
|
|
142
161
|
success: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucky-sharky-v1.game-engine.js","sourceRoot":"","sources":["../src/lucky-sharky-v1.game-engine.ts"],"names":[],"mappings":";;;AAcA,6EAAuE;AAEvE,0HAAkH;AAClH,6HAAqH;AAErH,gEAA0D;AAE1D,4CAAyC;AAGzC,0FAAoF;AACpF,iEAA4D;AAC5D,mDAA+C;
|
|
1
|
+
{"version":3,"file":"lucky-sharky-v1.game-engine.js","sourceRoot":"","sources":["../src/lucky-sharky-v1.game-engine.ts"],"names":[],"mappings":"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"}
|