@omnitronix/bonnys-fortune-game-engine 1.2.0 → 1.2.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.
Files changed (137) hide show
  1. package/dist/__tests__/comprehensive.test.js +741 -0
  2. package/dist/__tests__/comprehensive.test.js.map +1 -0
  3. package/dist/bonnys-fortune-v1.game-engine.js +12 -7
  4. package/dist/bonnys-fortune-v1.game-engine.js.map +1 -1
  5. package/dist/domain/types/{cheat-trigger-bonus-command.js → debug-trigger-bonus-command.js} +1 -1
  6. package/dist/domain/types/debug-trigger-bonus-command.js.map +1 -0
  7. package/dist/domain/types/{cheat-trigger-bonus-request.dto.js → debug-trigger-bonus-request.dto.js} +1 -1
  8. package/dist/domain/types/debug-trigger-bonus-request.dto.js.map +1 -0
  9. package/dist/domain/types/{cheat-update-bonus-meter-progress-command.js → debug-update-bonus-meter-progress-command.js} +1 -1
  10. package/dist/domain/types/debug-update-bonus-meter-progress-command.js.map +1 -0
  11. package/dist/domain/types/{cheat-update-bonus-meter-progress-request.dto.js → debug-update-bonus-meter-progress-request.dto.js} +1 -1
  12. package/dist/domain/types/debug-update-bonus-meter-progress-request.dto.js.map +1 -0
  13. package/dist/logic/bonnys-fortune.game-logic.js +4 -2
  14. package/dist/logic/bonnys-fortune.game-logic.js.map +1 -1
  15. package/dist/rng/DummyRngClient.js +8 -1
  16. package/dist/rng/DummyRngClient.js.map +1 -1
  17. package/dist/rng/rng-client.factory.js +1 -2
  18. package/dist/rng/rng-client.factory.js.map +1 -1
  19. package/package.json +3 -4
  20. package/dist/__tests__/bonnys-fortune-v1.game-engine.test.d.ts +0 -1
  21. package/dist/bonnys-fortune-v1.game-engine.d.ts +0 -32
  22. package/dist/config/game-logic-config/file-system.game-logic-config-loader.d.ts +0 -4
  23. package/dist/config/game-logic-config/game-logic-config-loader.d.ts +0 -3
  24. package/dist/config/game-logic-config/game-logic-config.d.ts +0 -2
  25. package/dist/config/reel-strips-config/file-system.reel-strips-config-loader.d.ts +0 -4
  26. package/dist/config/reel-strips-config/reel-strip-option.dto.d.ts +0 -4
  27. package/dist/config/reel-strips-config/reel-strips-config-loader.d.ts +0 -3
  28. package/dist/config/reel-strips-config/reel-strips-config.dto.d.ts +0 -5
  29. package/dist/config/reel-strips-config/reel.dto.d.ts +0 -5
  30. package/dist/domain/game-round.types.d.ts +0 -9
  31. package/dist/domain/mappers/reel-strips-config.mapper.d.ts +0 -4
  32. package/dist/domain/reel-strip-option.d.ts +0 -7
  33. package/dist/domain/reel-strips-config.d.ts +0 -9
  34. package/dist/domain/reel.d.ts +0 -8
  35. package/dist/domain/types/cheat-trigger-bonus-command.d.ts +0 -5
  36. package/dist/domain/types/cheat-trigger-bonus-command.js.map +0 -1
  37. package/dist/domain/types/cheat-trigger-bonus-request.dto.d.ts +0 -5
  38. package/dist/domain/types/cheat-trigger-bonus-request.dto.js.map +0 -1
  39. package/dist/domain/types/cheat-update-bonus-meter-progress-command.d.ts +0 -5
  40. package/dist/domain/types/cheat-update-bonus-meter-progress-command.js.map +0 -1
  41. package/dist/domain/types/cheat-update-bonus-meter-progress-request.dto.d.ts +0 -5
  42. package/dist/domain/types/cheat-update-bonus-meter-progress-request.dto.js.map +0 -1
  43. package/dist/domain/types/game-spin-command.d.ts +0 -8
  44. package/dist/domain/types/game-spin-input.dto.d.ts +0 -8
  45. package/dist/domain/types/game-spin-output.dto.d.ts +0 -119
  46. package/dist/domain/types/game-symbols.response.dto.d.ts +0 -10
  47. package/dist/domain/types/reel-strip-option.dto.d.ts +0 -4
  48. package/dist/domain/types/reel-strips-config.dto.d.ts +0 -5
  49. package/dist/domain/types/reel.dto.d.ts +0 -5
  50. package/dist/domain/types/start-bonus-round-command.d.ts +0 -8
  51. package/dist/domain/types/start-bonus-round-input.dto.d.ts +0 -10
  52. package/dist/game-engine.interface.d.ts +0 -41
  53. package/dist/helpers/generate-hash.d.ts +0 -1
  54. package/dist/helpers/number-helper.d.ts +0 -23
  55. package/dist/helpers/optional-boolean-mapper.d.ts +0 -1
  56. package/dist/helpers/uuid-helper.d.ts +0 -3
  57. package/dist/helpers/validation-helper.d.ts +0 -14
  58. package/dist/index.d.ts +0 -2
  59. package/dist/logger/logger.d.ts +0 -22
  60. package/dist/logic/bonnys-fortune.game-logic.d.ts +0 -32
  61. package/dist/logic/bonnys-fortune.spin-generator.d.ts +0 -19
  62. package/dist/logic/bonnys-fortune.types.d.ts +0 -170
  63. package/dist/logic/bonnys-fortune.win-calculator.d.ts +0 -10
  64. package/dist/logic/game-logic-config.interface.d.ts +0 -178
  65. package/dist/logic/handlers/base-game.handler.d.ts +0 -15
  66. package/dist/logic/handlers/collect-feature-bonus.handler.d.ts +0 -13
  67. package/dist/logic/handlers/free-spins-bonus.handler.d.ts +0 -11
  68. package/dist/logic/handlers/steering-to-the-fortune-bonus.handler.d.ts +0 -11
  69. package/dist/logic/handlers/treasure-hunt-bonus.handler.d.ts +0 -15
  70. package/dist/rng/DummyRngClient.d.ts +0 -18
  71. package/dist/rng/rng-client.factory.d.ts +0 -7
  72. package/dist/rng/rng-client.interface.d.ts +0 -16
  73. package/dist/rng/rng-service.d.ts +0 -26
  74. package/dist/validation/abstract-game-logic-config.validator.d.ts +0 -4
  75. package/dist/validation/bonnys-fortune/bonnys-fortune-config.dto.d.ts +0 -129
  76. package/dist/validation/bonnys-fortune/bonnys-fortune-config.validator.d.ts +0 -5
  77. package/dist/validation/custom-decorators/IsNestedIntArray.d.ts +0 -2
  78. package/dist/validation/game-logic-config-validation.service.d.ts +0 -8
  79. package/dist/validation/reel-strips-config-validation.service.d.ts +0 -5
  80. package/src/__tests__/bonnys-fortune-v1.game-engine.test.ts +0 -80
  81. package/src/bonnys-fortune-v1.game-engine.ts +0 -285
  82. package/src/config/game-logic-config/file-system.game-logic-config-loader.ts +0 -27
  83. package/src/config/game-logic-config/game-logic-config-loader.ts +0 -3
  84. package/src/config/game-logic-config/game-logic-config.ts +0 -380
  85. package/src/config/reel-strips-config/file-system.reel-strips-config-loader.ts +0 -43
  86. package/src/config/reel-strips-config/reel-strip-option.dto.ts +0 -13
  87. package/src/config/reel-strips-config/reel-strips-config-loader.ts +0 -9
  88. package/src/config/reel-strips-config/reel-strips-config.dto.ts +0 -16
  89. package/src/config/reel-strips-config/reel.dto.ts +0 -16
  90. package/src/config/reel-strips-config/reels-BASE.csv +0 -52
  91. package/src/config/reel-strips-config/reels-BONUS.csv +0 -52
  92. package/src/domain/game-round.types.ts +0 -10
  93. package/src/domain/mappers/reel-strips-config.mapper.ts +0 -16
  94. package/src/domain/reel-strip-option.ts +0 -15
  95. package/src/domain/reel-strips-config.ts +0 -21
  96. package/src/domain/reel.ts +0 -17
  97. package/src/domain/types/cheat-trigger-bonus-command.ts +0 -5
  98. package/src/domain/types/cheat-trigger-bonus-request.dto.ts +0 -5
  99. package/src/domain/types/cheat-update-bonus-meter-progress-command.ts +0 -6
  100. package/src/domain/types/cheat-update-bonus-meter-progress-request.dto.ts +0 -5
  101. package/src/domain/types/game-spin-command.ts +0 -8
  102. package/src/domain/types/game-spin-input.dto.ts +0 -8
  103. package/src/domain/types/game-spin-output.dto.ts +0 -142
  104. package/src/domain/types/game-symbols.response.dto.ts +0 -11
  105. package/src/domain/types/reel-strip-option.dto.ts +0 -13
  106. package/src/domain/types/reel-strips-config.dto.ts +0 -15
  107. package/src/domain/types/reel.dto.ts +0 -15
  108. package/src/domain/types/start-bonus-round-command.ts +0 -8
  109. package/src/domain/types/start-bonus-round-input.dto.ts +0 -10
  110. package/src/game-engine.interface.ts +0 -59
  111. package/src/helpers/generate-hash.ts +0 -5
  112. package/src/helpers/number-helper.ts +0 -41
  113. package/src/helpers/optional-boolean-mapper.ts +0 -5
  114. package/src/helpers/uuid-helper.ts +0 -7
  115. package/src/helpers/validation-helper.ts +0 -27
  116. package/src/index.ts +0 -3
  117. package/src/logger/logger.ts +0 -178
  118. package/src/logic/bonnys-fortune.game-logic.ts +0 -480
  119. package/src/logic/bonnys-fortune.spin-generator.ts +0 -277
  120. package/src/logic/bonnys-fortune.types.ts +0 -223
  121. package/src/logic/bonnys-fortune.win-calculator.ts +0 -210
  122. package/src/logic/game-logic-config.interface.ts +0 -174
  123. package/src/logic/handlers/base-game.handler.ts +0 -213
  124. package/src/logic/handlers/collect-feature-bonus.handler.ts +0 -301
  125. package/src/logic/handlers/free-spins-bonus.handler.ts +0 -119
  126. package/src/logic/handlers/steering-to-the-fortune-bonus.handler.ts +0 -118
  127. package/src/logic/handlers/treasure-hunt-bonus.handler.ts +0 -232
  128. package/src/rng/DummyRngClient.ts +0 -108
  129. package/src/rng/rng-client.factory.ts +0 -27
  130. package/src/rng/rng-client.interface.ts +0 -38
  131. package/src/rng/rng-service.ts +0 -130
  132. package/src/validation/abstract-game-logic-config.validator.ts +0 -20
  133. package/src/validation/bonnys-fortune/bonnys-fortune-config.dto.ts +0 -371
  134. package/src/validation/bonnys-fortune/bonnys-fortune-config.validator.ts +0 -8
  135. package/src/validation/custom-decorators/IsNestedIntArray.ts +0 -29
  136. package/src/validation/game-logic-config-validation.service.ts +0 -28
  137. package/src/validation/reel-strips-config-validation.service.ts +0 -29
@@ -1,285 +0,0 @@
1
- import {
2
- BonnysFortunePrivateState,
3
- BonnysFortunePublicState,
4
- } from './logic/bonnys-fortune.types';
5
- import {
6
- CommandProcessingResult,
7
- GameActionCommand,
8
- GameEngine,
9
- GameEngineConfig,
10
- GameEngineInfo,
11
- } from './game-engine.interface';
12
-
13
- import { BonnysFortuneGameLogic } from './logic/bonnys-fortune.game-logic';
14
- import { BonnysFortuneGameLogicConfigInterface } from './logic/game-logic-config.interface';
15
- import { BonnysFortuneGameLogicConfigValidator } from './validation/bonnys-fortune/bonnys-fortune-config.validator';
16
- import { CheatTriggerBonusCommand } from './domain/types/cheat-trigger-bonus-command';
17
- import { CheatUpdateBonusMeterProgressCommand } from './domain/types/cheat-update-bonus-meter-progress-command';
18
- import { FileSystemGameLogicConfigLoader } from './config/game-logic-config/file-system.game-logic-config-loader';
19
- import { FileSystemReelStripsConfigLoader } from './config/reel-strips-config/file-system.reel-strips-config-loader';
20
- import { GameLogicConfigLoader } from './config/game-logic-config/game-logic-config-loader';
21
- import { GameLogicConfigValidationService } from './validation/game-logic-config-validation.service';
22
- import { GameRoundType } from './domain/game-round.types';
23
- import { GameSpinCommand } from './domain/types/game-spin-command';
24
- import { Logger } from './logger/logger';
25
- import { ReelStripsConfig } from './domain/reel-strips-config';
26
- import { ReelStripsConfigLoader } from './config/reel-strips-config/reel-strips-config-loader';
27
- import { ReelStripsConfigMapper } from './domain/mappers/reel-strips-config.mapper';
28
- import { ReelStripsConfigValidationService } from './validation/reel-strips-config-validation.service';
29
- import { RngClientFactory } from './rng/rng-client.factory';
30
- import { RngService } from './rng/rng-service';
31
- import { StartBonusRoundCommand } from './domain/types/start-bonus-round-command';
32
-
33
- export class BonnysFortuneV1GameEngine
34
- implements
35
- GameEngine<BonnysFortunePublicState, BonnysFortunePrivateState, any>
36
- {
37
- private readonly gameCode = 'bonnys-fortune';
38
- private readonly version = '1.0.0';
39
- private readonly rtp = 96;
40
- private readonly gameType = 'slot';
41
- private readonly gameName = "Bonny's Fortune";
42
- private readonly provider = 'Omnitronix';
43
- private config!: BonnysFortuneGameLogicConfigInterface;
44
- private reels!: Map<GameRoundType, ReelStripsConfig>;
45
-
46
- readonly configOutPort: GameLogicConfigLoader;
47
- readonly reelsOutPort: ReelStripsConfigLoader;
48
- readonly configValidator: GameLogicConfigValidationService;
49
- readonly reelsValidator: ReelStripsConfigValidationService;
50
- readonly reelMapper: ReelStripsConfigMapper;
51
- readonly gameLogic: BonnysFortuneGameLogic;
52
- readonly rngService: RngService;
53
- readonly logger: Logger;
54
-
55
- constructor(config: GameEngineConfig = {}) {
56
- this.logger = new Logger('BonnysFortuneV1Engine');
57
- this.configOutPort = new FileSystemGameLogicConfigLoader();
58
- this.reelsOutPort = new FileSystemReelStripsConfigLoader();
59
-
60
- const rngClient = RngClientFactory.create({ metrics: config.metrics });
61
- this.rngService = new RngService(rngClient);
62
-
63
- this.configValidator = new GameLogicConfigValidationService();
64
- this.reelsValidator = new ReelStripsConfigValidationService();
65
- this.reelMapper = new ReelStripsConfigMapper();
66
- this.gameLogic = new BonnysFortuneGameLogic(this.rngService);
67
- this.preload();
68
- }
69
-
70
- public getGameEngineInfo(): GameEngineInfo {
71
- return {
72
- gameCode: this.gameCode,
73
- version: this.version,
74
- rtp: this.rtp,
75
- gameType: this.gameType,
76
- gameName: this.gameName,
77
- provider: this.provider,
78
- };
79
- }
80
-
81
- private async preload(): Promise<void> {
82
- this.logger.log('Preloading Bonnys Fortune engine');
83
- this.configValidator.register(
84
- this.gameCode,
85
- new BonnysFortuneGameLogicConfigValidator(),
86
- );
87
- const rawConfig =
88
- await this.configOutPort.loadConfig<BonnysFortuneGameLogicConfigInterface>(
89
- this.gameCode,
90
- this.version,
91
- );
92
- if (!rawConfig) {
93
- throw new Error('Bonnys Fortune game logic config not found');
94
- }
95
- await this.configValidator.validate(this.gameCode, rawConfig);
96
-
97
- const reelsCount = rawConfig.baseGame.baseGameConfig.layout.reels;
98
- const optionsCount =
99
- rawConfig.baseGame.baseGameConfig.reelsOptions.numberOfOptions;
100
-
101
- const rawBaseGameReels = await this.reelsOutPort.loadConfig(
102
- this.gameCode,
103
- this.version,
104
- GameRoundType.BASE,
105
- reelsCount,
106
- optionsCount,
107
- );
108
- await this.reelsValidator.validate(rawBaseGameReels);
109
-
110
- const rawBonusGame2Reels = await this.reelsOutPort.loadConfig(
111
- this.gameCode,
112
- this.version,
113
- GameRoundType.BONUS,
114
- reelsCount,
115
- optionsCount,
116
- );
117
- await this.reelsValidator.validate(rawBonusGame2Reels);
118
-
119
- this.config = rawConfig;
120
- this.reels = new Map([
121
- [GameRoundType.BASE, this.reelMapper.mapRawToDomain(rawBaseGameReels)],
122
- [GameRoundType.BONUS, this.reelMapper.mapRawToDomain(rawBonusGame2Reels)],
123
- ]);
124
- }
125
-
126
- public async processCommand(
127
- publicState: BonnysFortunePublicState,
128
- privateState: BonnysFortunePrivateState,
129
- command: GameActionCommand,
130
- ): Promise<
131
- CommandProcessingResult<
132
- BonnysFortunePublicState,
133
- BonnysFortunePrivateState,
134
- any
135
- >
136
- > {
137
- this.logger.log(`Processing command ${command.type}`);
138
- this.rngService.registerCommand(command.id);
139
- switch (command.type) {
140
- case 'INIT_SESSION_STATE': {
141
- const baseReels = this.reels.get(GameRoundType.BASE);
142
- if (!baseReels) {
143
- throw new Error('Base game reels not found');
144
- }
145
- const result = await this.gameLogic.initSessionState(
146
- this.config,
147
- baseReels,
148
- command.payload,
149
- command.id,
150
- );
151
- const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
152
- this.rngService.removeCommand(command.id);
153
- return {
154
- success: true,
155
- publicState: result.publicState,
156
- privateState: result.privateState,
157
- outcome: result,
158
- message: 'Session state initialized',
159
- rngOutcome,
160
- };
161
- }
162
-
163
- case 'SPIN': {
164
- const params = command.payload as GameSpinCommand;
165
- const baseReels = this.reels.get(GameRoundType.BASE);
166
- if (!baseReels) {
167
- throw new Error('Base game reels not found');
168
- }
169
- const outcome = await this.gameLogic.spin(
170
- params,
171
- publicState,
172
- privateState,
173
- this.config,
174
- baseReels,
175
- command.id,
176
- );
177
- const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
178
- this.rngService.removeCommand(command.id);
179
- return {
180
- success: true,
181
- publicState: outcome.publicState,
182
- privateState: outcome.privateState,
183
- outcome,
184
- message: 'Spin completed',
185
- rngOutcome,
186
- };
187
- }
188
-
189
- case 'START_BONUS_ROUND': {
190
- const params = command.payload as StartBonusRoundCommand;
191
- const bonusReels = this.reels.get(GameRoundType.BONUS);
192
- if (!bonusReels) {
193
- throw new Error('Bonus game reels not found');
194
- }
195
- const outcome = await this.gameLogic.startBonusRound(
196
- params,
197
- publicState,
198
- privateState,
199
- this.config,
200
- bonusReels,
201
- command.id,
202
- );
203
-
204
- if (!outcome) {
205
- throw new Error('Bonus round outcome not found');
206
- }
207
-
208
- const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
209
- this.rngService.removeCommand(command.id);
210
- return {
211
- success: true,
212
- publicState: outcome.publicState,
213
- privateState: outcome.privateState,
214
- outcome,
215
- message: 'Bonus round started',
216
- rngOutcome,
217
- };
218
- }
219
-
220
- case 'CHEAT_TRIGGER_BONUS': {
221
- const params = command.payload as CheatTriggerBonusCommand;
222
- const result = await this.gameLogic.cheatTriggerBonus(
223
- publicState,
224
- privateState,
225
- params,
226
- );
227
-
228
- const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
229
- this.rngService.removeCommand(command.id);
230
- return {
231
- success: true,
232
- publicState: result.publicState,
233
- privateState: result.privateState,
234
- outcome: result.outcome,
235
- message: 'Bonus triggered',
236
- rngOutcome,
237
- };
238
- }
239
-
240
- case 'CHEAT_UPDATE_BONUS_METER_PROGRESS': {
241
- const params = command.payload as CheatUpdateBonusMeterProgressCommand;
242
- const result = this.gameLogic.cheatUpdateBonusMeterProgress(
243
- publicState,
244
- privateState,
245
- params,
246
- this.config,
247
- );
248
-
249
- const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
250
- this.rngService.removeCommand(command.id);
251
- return {
252
- success: true,
253
- publicState: result.publicState,
254
- privateState: result.privateState,
255
- outcome: result.outcome,
256
- message: 'Bonus meter progress updated',
257
- rngOutcome,
258
- };
259
- }
260
-
261
- case 'GET_SYMBOLS': {
262
- this.rngService.removeCommand(command.id);
263
- return {
264
- success: true,
265
- publicState,
266
- privateState,
267
- outcome: this.gameLogic.getSymbols(this.config),
268
- message: 'Symbols retrieved',
269
- rngOutcome: undefined,
270
- };
271
- }
272
-
273
- default: {
274
- return {
275
- success: false,
276
- publicState: publicState,
277
- privateState: privateState,
278
- outcome: null,
279
- message: 'Command not found',
280
- rngOutcome: undefined,
281
- };
282
- }
283
- }
284
- }
285
- }
@@ -1,27 +0,0 @@
1
- import * as path from 'path';
2
-
3
- import { GameLogicConfigLoader } from './game-logic-config-loader';
4
- export class FileSystemGameLogicConfigLoader implements GameLogicConfigLoader {
5
- public async loadConfig<T>(
6
- gameId: string,
7
- variantId: string,
8
- ): Promise<T | null> {
9
- try {
10
- const configPath = path.resolve(__dirname, `./game-logic-config.js`);
11
-
12
- const configModule = await import(configPath);
13
-
14
- const config = <T>configModule.gameLogicConfig;
15
-
16
- if (!config) {
17
- console.warn(`Config object 'gameConfig' missing in ${configPath}`);
18
- return null;
19
- }
20
-
21
- return config;
22
- } catch (error) {
23
- console.warn(`Failed to load config for ${gameId}/${variantId}:`, error);
24
- return null;
25
- }
26
- }
27
- }
@@ -1,3 +0,0 @@
1
- export interface GameLogicConfigLoader {
2
- loadConfig<T>(gameId: string, variantId: string): Promise<T | null>;
3
- }
@@ -1,380 +0,0 @@
1
- import { BonnysFortuneGameLogicConfigInterface } from '../../logic/game-logic-config.interface';
2
-
3
- export const gameLogicConfig: BonnysFortuneGameLogicConfigInterface = {
4
- baseGame: {
5
- symbolMultipliers: [
6
- {
7
- symbolId: 0,
8
- name: 'H1',
9
- isWild: false,
10
- isScatter: false,
11
- multipliers: {
12
- x3: 50,
13
- x4: 150,
14
- x5: 500,
15
- },
16
- },
17
- {
18
- symbolId: 1,
19
- name: 'H2',
20
- isWild: false,
21
- isScatter: false,
22
- multipliers: {
23
- x3: 30,
24
- x4: 100,
25
- x5: 300,
26
- },
27
- },
28
- {
29
- symbolId: 2,
30
- name: 'H3',
31
- isWild: false,
32
- isScatter: false,
33
- multipliers: {
34
- x3: 20,
35
- x4: 50,
36
- x5: 150,
37
- },
38
- },
39
- {
40
- symbolId: 3,
41
- name: 'M1',
42
- isWild: false,
43
- isScatter: false,
44
- multipliers: {
45
- x3: 10,
46
- x4: 25,
47
- x5: 75,
48
- },
49
- },
50
- {
51
- symbolId: 4,
52
- name: 'M2',
53
- isWild: false,
54
- isScatter: false,
55
- multipliers: {
56
- x3: 7,
57
- x4: 15,
58
- x5: 50,
59
- },
60
- },
61
- {
62
- symbolId: 5,
63
- name: 'M3',
64
- isWild: false,
65
- isScatter: false,
66
- multipliers: {
67
- x3: 5,
68
- x4: 10,
69
- x5: 25,
70
- },
71
- },
72
- {
73
- symbolId: 6,
74
- name: 'L1',
75
- isWild: false,
76
- isScatter: false,
77
- multipliers: {
78
- x3: 3,
79
- x4: 6,
80
- x5: 15,
81
- },
82
- },
83
- {
84
- symbolId: 7,
85
- name: 'L2',
86
- isWild: false,
87
- isScatter: false,
88
- multipliers: {
89
- x3: 3,
90
- x4: 6,
91
- x5: 15,
92
- },
93
- },
94
- {
95
- symbolId: 8,
96
- name: 'L3',
97
- isWild: false,
98
- isScatter: false,
99
- multipliers: {
100
- x3: 2,
101
- x4: 4,
102
- x5: 10,
103
- },
104
- },
105
- {
106
- symbolId: 9,
107
- name: 'L4',
108
- isWild: false,
109
- isScatter: false,
110
- multipliers: {
111
- x3: 2,
112
- x4: 4,
113
- x5: 10,
114
- },
115
- },
116
- {
117
- symbolId: 10,
118
- name: 'WILD',
119
- isWild: true,
120
- isScatter: false,
121
- multipliers: {
122
- x3: 1,
123
- x4: 1,
124
- x5: 1,
125
- },
126
- },
127
- {
128
- symbolId: 11,
129
- name: 'SCATTER',
130
- isWild: false,
131
- isScatter: true,
132
- multipliers: {
133
- x3: 1,
134
- x4: 1,
135
- x5: 1,
136
- },
137
- },
138
- ],
139
- symbolDefinitions: {
140
- baseSymbols: {
141
- minIndex: 0,
142
- maxIndex: 9,
143
- },
144
- specialSymbols: {
145
- WILD: 10,
146
- SCATTER: 11,
147
- },
148
- collectFeatureSymbols: {
149
- multipliers: {
150
- CM1: 12,
151
- CM2: 13,
152
- CM3: 14,
153
- },
154
- values: {
155
- CV1: 15,
156
- CV2: 16,
157
- CV3: 17,
158
- },
159
- },
160
- },
161
- baseGameConfig: {
162
- layout: {
163
- rows: 3,
164
- reels: 5,
165
- },
166
- winConfig: {
167
- minLength: 3,
168
- maxLength: 5,
169
- },
170
- baseBet: 10,
171
- reelsOptions: {
172
- numberOfOptions: 4,
173
- optionWeights: [4, 4, 5, 5],
174
- },
175
- },
176
- paidHSymbolWeights: {
177
- None: 298,
178
- H1: 22,
179
- H2: 12,
180
- H3: 50,
181
- },
182
- paidHSymbolReelWeights: {
183
- H1: [5, 15],
184
- H2: [5, 15],
185
- H3: [5, 15],
186
- },
187
- paidScatterReelWeights: {
188
- reel1: [3, 15],
189
- reel2: [0, 5],
190
- reel3: [3, 15],
191
- reel4: [0, 5],
192
- reel5: [3, 15],
193
- },
194
- bonusGameMeters: {
195
- bonusGame1: {
196
- symbol: 'H1',
197
- min: 25,
198
- max: 100,
199
- percentageLevels: {
200
- level1: { min: 0, max: 0.25, value: 1 },
201
- level2: { min: 0.25, max: 0.65, value: 2 },
202
- level3: { min: 0.65, max: 0.8, value: 3 },
203
- level4: { min: 0.8, max: 1.0, value: 4 },
204
- level5: { min: 1.0, max: 1.0, value: 5 },
205
- },
206
- },
207
- bonusGame2: {
208
- symbol: 'H2',
209
- min: 25,
210
- max: 70,
211
- percentageLevels: {
212
- level1: { min: 0, max: 0.25, value: 1 },
213
- level2: { min: 0.25, max: 0.65, value: 2 },
214
- level3: { min: 0.65, max: 0.8, value: 3 },
215
- level4: { min: 0.8, max: 1.0, value: 4 },
216
- level5: { min: 1.0, max: 1.0, value: 5 },
217
- },
218
- },
219
- bonusGame3: {
220
- symbol: 'H3',
221
- min: 25,
222
- max: 80,
223
- percentageLevels: {
224
- level1: { min: 0, max: 0.25, value: 1 },
225
- level2: { min: 0.25, max: 0.65, value: 2 },
226
- level3: { min: 0.65, max: 0.8, value: 3 },
227
- level4: { min: 0.8, max: 1.0, value: 4 },
228
- level5: { min: 1.0, max: 1.0, value: 5 },
229
- },
230
- },
231
- },
232
- },
233
- bonusGames: {
234
- bonusGame1: {
235
- type: 'treasure_hunt',
236
- potMeter: 'bonusGame1',
237
- config: {
238
- symbolsCount: 25,
239
- stepsCount: 6,
240
- jackpotMultipliers: {
241
- mini: 20,
242
- minor: 50,
243
- major: 200,
244
- grand: 2000,
245
- },
246
- jackpotStartCounts: {
247
- mini: 0,
248
- minor: 0,
249
- major: 0,
250
- grand: 0,
251
- },
252
- jackpotScreenCounts: {
253
- mini: 10,
254
- minor: 7,
255
- major: 5,
256
- grand: 3,
257
- },
258
- winningWeights: {
259
- none: 30,
260
- mini: 90,
261
- minor: 25,
262
- major: 5,
263
- grand: 1,
264
- },
265
- },
266
- },
267
- bonusGame2: {
268
- type: 'free_spins',
269
- potMeter: 'bonusGame2',
270
- config: {
271
- spinTypes: [
272
- {
273
- layout: { reels: 5, rows: 3 },
274
- spins: 8,
275
- multiplier: 10,
276
- weight: 5,
277
- reelsOptionsWeights: [1, 1, 4, 4],
278
- },
279
- {
280
- layout: { reels: 5, rows: 3 },
281
- spins: 4,
282
- multiplier: 20,
283
- weight: 5,
284
- reelsOptionsWeights: [1, 1, 4, 4],
285
- },
286
- {
287
- layout: { reels: 5, rows: 4 },
288
- spins: 8,
289
- multiplier: 3,
290
- weight: 5,
291
- reelsOptionsWeights: [1, 1, 4, 4],
292
- },
293
- {
294
- layout: { reels: 5, rows: 4 },
295
- spins: 4,
296
- multiplier: 6,
297
- weight: 5,
298
- reelsOptionsWeights: [1, 1, 4, 4],
299
- },
300
- {
301
- layout: { reels: 5, rows: 5 },
302
- spins: 8,
303
- multiplier: 1,
304
- weight: 5,
305
- reelsOptionsWeights: [1, 1, 4, 4],
306
- },
307
- {
308
- layout: { reels: 5, rows: 5 },
309
- spins: 4,
310
- multiplier: 2,
311
- weight: 5,
312
- reelsOptionsWeights: [1, 1, 4, 4],
313
- },
314
- ],
315
- },
316
- },
317
- bonusGame3: {
318
- type: 'steering_to_the_fortune',
319
- potMeter: 'bonusGame3',
320
- config: {
321
- wheelResults: [
322
- { type: 'MULTIPLIER', value: 5, weight: 2 },
323
- { type: 'MULTIPLIER', value: 8, weight: 3 },
324
- { type: 'MULTIPLIER', value: 10, weight: 5 },
325
- { type: 'MULTIPLIER', value: 15, weight: 5 },
326
- { type: 'MULTIPLIER', value: 25, weight: 5 },
327
- { type: 'MULTIPLIER', value: 40, weight: 3 },
328
- { type: 'MULTIPLIER', value: 80, weight: 2 },
329
- { type: 'BONUS', bonusType: 'collectFeature', weight: 2 },
330
- { type: 'BONUS', bonusType: 'bonusGame1', weight: 2 },
331
- { type: 'BONUS', bonusType: 'bonusGame2', weight: 2 },
332
- ],
333
- },
334
- },
335
- },
336
- scatterGame: {
337
- config: {
338
- scatterMinNumber: 3,
339
- scatterSpins: 6,
340
- scatterCheckpoints: [
341
- { spin: 3, multiMinValue: 0, valueMinValue: 1 },
342
- { spin: 2, multiMinValue: 1, valueMinValue: 2 },
343
- ],
344
- scatterSymbols: [
345
- {
346
- symbolId: 'CM1',
347
- value: 1,
348
- weight: 20,
349
- },
350
- {
351
- symbolId: 'CM2',
352
- value: 2,
353
- weight: 10,
354
- },
355
- {
356
- symbolId: 'CM3',
357
- value: 3,
358
- weight: 2,
359
- },
360
- {
361
- symbolId: 'CV1',
362
- value: 1,
363
- weight: 50,
364
- },
365
- {
366
- symbolId: 'CV2',
367
- value: 2,
368
- weight: 15,
369
- },
370
- {
371
- symbolId: 'CV3',
372
- value: 5,
373
- weight: 5,
374
- },
375
- ],
376
- scatterSymbolSpins: [{ weight: 10 }, { weight: 4 }, { weight: 2 }],
377
- scatterSymbolSlash: [{ weight: 10 }, { weight: 6 }, { weight: 0 }],
378
- },
379
- },
380
- };