@omnitronix/bonnys-fortune-game-engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +680 -0
  2. package/dist/__tests__/bonnys-fortune-v1.game-engine.test.js +71 -0
  3. package/dist/__tests__/bonnys-fortune-v1.game-engine.test.js.map +1 -0
  4. package/dist/bonnys-fortune-v1.game-engine.js +173 -0
  5. package/dist/bonnys-fortune-v1.game-engine.js.map +1 -0
  6. package/dist/config/game-logic-config/file-system.game-logic-config-loader.js +57 -0
  7. package/dist/config/game-logic-config/file-system.game-logic-config-loader.js.map +1 -0
  8. package/dist/config/game-logic-config/game-logic-config-loader.js +3 -0
  9. package/dist/config/game-logic-config/game-logic-config-loader.js.map +1 -0
  10. package/dist/config/game-logic-config/game-logic-config.js +386 -0
  11. package/dist/config/game-logic-config/game-logic-config.js.map +1 -0
  12. package/dist/config/reel-strips-config/file-system.reel-strips-config-loader.js +34 -0
  13. package/dist/config/reel-strips-config/file-system.reel-strips-config-loader.js.map +1 -0
  14. package/dist/config/reel-strips-config/reel-strip-option.dto.js +27 -0
  15. package/dist/config/reel-strips-config/reel-strip-option.dto.js.map +1 -0
  16. package/dist/config/reel-strips-config/reel-strips-config-loader.js +3 -0
  17. package/dist/config/reel-strips-config/reel-strips-config-loader.js.map +1 -0
  18. package/dist/config/reel-strips-config/reel-strips-config.dto.js +29 -0
  19. package/dist/config/reel-strips-config/reel-strips-config.dto.js.map +1 -0
  20. package/dist/config/reel-strips-config/reel.dto.js +29 -0
  21. package/dist/config/reel-strips-config/reel.dto.js.map +1 -0
  22. package/dist/config/reel-strips-config/reels-BASE.csv +52 -0
  23. package/dist/config/reel-strips-config/reels-BONUS.csv +52 -0
  24. package/dist/domain/game-logic-configs/bonnys-fortune-game-logic-config.domain.js +134 -0
  25. package/dist/domain/game-logic-configs/bonnys-fortune-game-logic-config.domain.js.map +1 -0
  26. package/dist/domain/game-round.types.js +9 -0
  27. package/dist/domain/game-round.types.js.map +1 -0
  28. package/dist/domain/mappers/base/game-logic-config-mapper.dispatcher.js +18 -0
  29. package/dist/domain/mappers/base/game-logic-config-mapper.dispatcher.js.map +1 -0
  30. package/dist/domain/mappers/base/game-logic-config-mapper.interface.js +3 -0
  31. package/dist/domain/mappers/base/game-logic-config-mapper.interface.js.map +1 -0
  32. package/dist/domain/mappers/game-logic-configs/bonnys-fortune-game-logic-config.mapper.js +11 -0
  33. package/dist/domain/mappers/game-logic-configs/bonnys-fortune-game-logic-config.mapper.js.map +1 -0
  34. package/dist/domain/mappers/reel-strips-config.mapper.js +17 -0
  35. package/dist/domain/mappers/reel-strips-config.mapper.js.map +1 -0
  36. package/dist/domain/reel-strip-option.js +19 -0
  37. package/dist/domain/reel-strip-option.js.map +1 -0
  38. package/dist/domain/reel-strips-config.js +22 -0
  39. package/dist/domain/reel-strips-config.js.map +1 -0
  40. package/dist/domain/reel.js +19 -0
  41. package/dist/domain/reel.js.map +1 -0
  42. package/dist/domain/types/cheat-trigger-bonus-command.js +3 -0
  43. package/dist/domain/types/cheat-trigger-bonus-command.js.map +1 -0
  44. package/dist/domain/types/cheat-trigger-bonus-request.dto.js +3 -0
  45. package/dist/domain/types/cheat-trigger-bonus-request.dto.js.map +1 -0
  46. package/dist/domain/types/cheat-update-bonus-meter-progress-command.js +3 -0
  47. package/dist/domain/types/cheat-update-bonus-meter-progress-command.js.map +1 -0
  48. package/dist/domain/types/cheat-update-bonus-meter-progress-request.dto.js +3 -0
  49. package/dist/domain/types/cheat-update-bonus-meter-progress-request.dto.js.map +1 -0
  50. package/dist/domain/types/game-spin-command.js +3 -0
  51. package/dist/domain/types/game-spin-command.js.map +1 -0
  52. package/dist/domain/types/game-spin-input.dto.js +3 -0
  53. package/dist/domain/types/game-spin-input.dto.js.map +1 -0
  54. package/dist/domain/types/game-spin-output.dto.js +17 -0
  55. package/dist/domain/types/game-spin-output.dto.js.map +1 -0
  56. package/dist/domain/types/game-symbols.response.dto.js +7 -0
  57. package/dist/domain/types/game-symbols.response.dto.js.map +1 -0
  58. package/dist/domain/types/reel-strip-option.dto.js +27 -0
  59. package/dist/domain/types/reel-strip-option.dto.js.map +1 -0
  60. package/dist/domain/types/reel-strips-config.dto.js +28 -0
  61. package/dist/domain/types/reel-strips-config.dto.js.map +1 -0
  62. package/dist/domain/types/reel.dto.js +28 -0
  63. package/dist/domain/types/reel.dto.js.map +1 -0
  64. package/dist/domain/types/start-bonus-round-command.js +3 -0
  65. package/dist/domain/types/start-bonus-round-command.js.map +1 -0
  66. package/dist/domain/types/start-bonus-round-input.dto.js +3 -0
  67. package/dist/domain/types/start-bonus-round-input.dto.js.map +1 -0
  68. package/dist/game-engine.interface.js +3 -0
  69. package/dist/game-engine.interface.js.map +1 -0
  70. package/dist/helpers/generate-hash.js +9 -0
  71. package/dist/helpers/generate-hash.js.map +1 -0
  72. package/dist/helpers/number-helper.js +43 -0
  73. package/dist/helpers/number-helper.js.map +1 -0
  74. package/dist/helpers/optional-boolean-mapper.js +9 -0
  75. package/dist/helpers/optional-boolean-mapper.js.map +1 -0
  76. package/dist/helpers/uuid-helper.js +11 -0
  77. package/dist/helpers/uuid-helper.js.map +1 -0
  78. package/dist/helpers/validation-helper.js +25 -0
  79. package/dist/helpers/validation-helper.js.map +1 -0
  80. package/dist/index.js +7 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/logger/logger.js +140 -0
  83. package/dist/logger/logger.js.map +1 -0
  84. package/dist/logic/bonnys-fortune.game-logic.js +242 -0
  85. package/dist/logic/bonnys-fortune.game-logic.js.map +1 -0
  86. package/dist/logic/bonnys-fortune.spin-generator.js +88 -0
  87. package/dist/logic/bonnys-fortune.spin-generator.js.map +1 -0
  88. package/dist/logic/bonnys-fortune.types.js +18 -0
  89. package/dist/logic/bonnys-fortune.types.js.map +1 -0
  90. package/dist/logic/bonnys-fortune.win-calculator.js +130 -0
  91. package/dist/logic/bonnys-fortune.win-calculator.js.map +1 -0
  92. package/dist/logic/game-logic-config.interface.js +12 -0
  93. package/dist/logic/game-logic-config.interface.js.map +1 -0
  94. package/dist/logic/handlers/base-game.handler.js +109 -0
  95. package/dist/logic/handlers/base-game.handler.js.map +1 -0
  96. package/dist/logic/handlers/collect-feature-bonus.handler.js +151 -0
  97. package/dist/logic/handlers/collect-feature-bonus.handler.js.map +1 -0
  98. package/dist/logic/handlers/free-spins-bonus.handler.js +68 -0
  99. package/dist/logic/handlers/free-spins-bonus.handler.js.map +1 -0
  100. package/dist/logic/handlers/steering-to-the-fortune-bonus.handler.js +74 -0
  101. package/dist/logic/handlers/steering-to-the-fortune-bonus.handler.js.map +1 -0
  102. package/dist/logic/handlers/treasure-hunt-bonus.handler.js +130 -0
  103. package/dist/logic/handlers/treasure-hunt-bonus.handler.js.map +1 -0
  104. package/dist/rng/DummyRngClient.js +89 -0
  105. package/dist/rng/DummyRngClient.js.map +1 -0
  106. package/dist/rng/rng-client.factory.js +23 -0
  107. package/dist/rng/rng-client.factory.js.map +1 -0
  108. package/dist/rng/rng-client.interface.js +3 -0
  109. package/dist/rng/rng-client.interface.js.map +1 -0
  110. package/dist/rng/rng-service.js +78 -0
  111. package/dist/rng/rng-service.js.map +1 -0
  112. package/dist/validation/abstract-game-logic-config.validator.js +18 -0
  113. package/dist/validation/abstract-game-logic-config.validator.js.map +1 -0
  114. package/dist/validation/bonnys-fortune/bonnys-fortune-config.dto.js +545 -0
  115. package/dist/validation/bonnys-fortune/bonnys-fortune-config.dto.js.map +1 -0
  116. package/dist/validation/bonnys-fortune/bonnys-fortune-config.validator.js +12 -0
  117. package/dist/validation/bonnys-fortune/bonnys-fortune-config.validator.js.map +1 -0
  118. package/dist/validation/custom-decorators/IsNestedIntArray.js +26 -0
  119. package/dist/validation/custom-decorators/IsNestedIntArray.js.map +1 -0
  120. package/dist/validation/game-logic-config-validation.service.js +20 -0
  121. package/dist/validation/game-logic-config-validation.service.js.map +1 -0
  122. package/dist/validation/reel-strips-config-validation.service.js +26 -0
  123. package/dist/validation/reel-strips-config-validation.service.js.map +1 -0
  124. package/package.json +48 -0
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BonnysFortuneWinCalculator = void 0;
4
+ const bonnys_fortune_types_1 = require("./bonnys-fortune.types");
5
+ const number_helper_1 = require("../helpers/number-helper");
6
+ class BonnysFortuneWinCalculator {
7
+ static calculateWins(screen, config, betStake, currentMultiplier, spinType, spinTypeIndex) {
8
+ if (!this.isEligibleSpin(spinType))
9
+ return { totalWin: 0, winningLines: [] };
10
+ const configData = this.buildConfigData(config, spinType, spinTypeIndex);
11
+ const { symbolsCount, symbolPositions } = this.analyzeScreenSymbols(screen, configData);
12
+ return this.findWinningLines({
13
+ symbolsCount,
14
+ symbolPositions,
15
+ configData,
16
+ betStake,
17
+ currentMultiplier,
18
+ });
19
+ }
20
+ static isEligibleSpin(spinType) {
21
+ return (spinType === bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN ||
22
+ spinType === bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN);
23
+ }
24
+ static buildConfigData(config, spinType, spinTypeIndex) {
25
+ const { minIndex: baseMin, maxIndex: baseMax } = config.baseGame.symbolDefinitions.baseSymbols;
26
+ const WILD = config.baseGame.symbolDefinitions.specialSymbols.WILD;
27
+ let rows, reels, minLength, maxLength;
28
+ if (spinType === bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN &&
29
+ spinTypeIndex !== undefined) {
30
+ const spinConfig = config.bonusGames.bonusGame2.config.spinTypes[spinTypeIndex];
31
+ rows = spinConfig.layout.rows;
32
+ reels = spinConfig.reelsOptionsWeights.length;
33
+ minLength = config.baseGame.baseGameConfig.winConfig.minLength;
34
+ maxLength = config.baseGame.baseGameConfig.winConfig.maxLength;
35
+ }
36
+ else {
37
+ rows = config.baseGame.baseGameConfig.layout.rows;
38
+ reels = config.baseGame.baseGameConfig.layout.reels;
39
+ minLength = config.baseGame.baseGameConfig.winConfig.minLength;
40
+ maxLength = config.baseGame.baseGameConfig.winConfig.maxLength;
41
+ }
42
+ const multipliers = new Map();
43
+ for (const symbolConfig of config.baseGame.symbolMultipliers) {
44
+ multipliers.set(symbolConfig.symbolId, symbolConfig.multipliers || {});
45
+ }
46
+ return {
47
+ baseMin,
48
+ baseMax,
49
+ WILD,
50
+ reels,
51
+ rows,
52
+ minLength,
53
+ maxLength,
54
+ multipliers,
55
+ };
56
+ }
57
+ static analyzeScreenSymbols(screen, configData) {
58
+ const { baseMin, baseMax, WILD, reels, rows } = configData;
59
+ const symbolsCount = Array.from({ length: baseMax - baseMin + 1 }, () => Array(reels).fill(0));
60
+ const symbolPositions = Array.from({ length: baseMax - baseMin + 1 }, () => Array.from({ length: reels }, () => Array(rows).fill(false)));
61
+ for (let reel = 0; reel < reels; reel++) {
62
+ for (let row = 0; row < rows; row++) {
63
+ const symbol = screen[reel][row];
64
+ if (symbol >= baseMin && symbol <= baseMax) {
65
+ const index = symbol - baseMin;
66
+ symbolsCount[index][reel]++;
67
+ symbolPositions[index][reel][row] = true;
68
+ }
69
+ else if (symbol === WILD) {
70
+ this.markWildPositions(baseMin, baseMax, reel, row, symbolsCount, symbolPositions);
71
+ }
72
+ }
73
+ }
74
+ return { symbolsCount, symbolPositions };
75
+ }
76
+ static markWildPositions(baseMin, baseMax, reel, row, symbolsCount, symbolPositions) {
77
+ for (let baseSymbol = baseMin; baseSymbol <= baseMax; baseSymbol++) {
78
+ const index = baseSymbol - baseMin;
79
+ symbolsCount[index][reel]++;
80
+ symbolPositions[index][reel][row] = true;
81
+ }
82
+ }
83
+ static findWinningLines({ symbolsCount, symbolPositions, configData, betStake, currentMultiplier, }) {
84
+ const { baseMin, baseMax, reels, rows, minLength, maxLength, multipliers } = configData;
85
+ let totalWin = 0;
86
+ const winningLines = [];
87
+ for (let symbol = baseMin; symbol <= baseMax; symbol++) {
88
+ const idx = symbol - baseMin;
89
+ let ways = 1;
90
+ let consecutiveReels = 0;
91
+ const positions = [];
92
+ for (let reel = 0; reel < reels; reel++) {
93
+ const countOnReel = symbolsCount[idx][reel];
94
+ if (countOnReel > 0) {
95
+ consecutiveReels++;
96
+ ways = number_helper_1.NumberHelper.safeMultiply(ways, countOnReel, 6);
97
+ for (let row = 0; row < rows; row++) {
98
+ if (symbolPositions[idx][reel][row])
99
+ positions.push([reel, row]);
100
+ }
101
+ }
102
+ else
103
+ break;
104
+ }
105
+ if (consecutiveReels >= minLength && consecutiveReels <= maxLength) {
106
+ const multiplier = multipliers.get(symbol)?.[`x${consecutiveReels}`] ?? 0;
107
+ if (multiplier > 0) {
108
+ let winAmount = ways;
109
+ winAmount = number_helper_1.NumberHelper.safeMultiply(winAmount, multiplier, 6);
110
+ winAmount = number_helper_1.NumberHelper.safeMultiply(winAmount, betStake, 6);
111
+ winAmount = number_helper_1.NumberHelper.safeMultiply(winAmount, currentMultiplier, 6);
112
+ winAmount = number_helper_1.NumberHelper.toFixedNumber(winAmount, 2);
113
+ totalWin = number_helper_1.NumberHelper.safeSum(totalWin, winAmount, 6);
114
+ winningLines.push({
115
+ symbol,
116
+ consecutiveReels,
117
+ ways,
118
+ multiplier,
119
+ win: winAmount,
120
+ positions,
121
+ });
122
+ }
123
+ }
124
+ }
125
+ totalWin = number_helper_1.NumberHelper.toFixedNumber(totalWin, 2);
126
+ return { totalWin, winningLines };
127
+ }
128
+ }
129
+ exports.BonnysFortuneWinCalculator = BonnysFortuneWinCalculator;
130
+ //# sourceMappingURL=bonnys-fortune.win-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonnys-fortune.win-calculator.js","sourceRoot":"","sources":["../../src/logic/bonnys-fortune.win-calculator.ts"],"names":[],"mappings":";;;AAAA,iEASgC;AAGhC,4DAAwD;AAExD,MAAa,0BAA0B;IAC9B,MAAM,CAAC,aAAa,CACzB,MAAkB,EAClB,MAA6C,EAC7C,QAAgB,EAChB,iBAAyB,EACzB,QAAkB,EAClB,aAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;YAChC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,oBAAoB,CACjE,MAAM,EACN,UAAU,CACX,CAAC;QAEF,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,YAAY;YACZ,eAAe;YACf,UAAU;YACV,QAAQ;YACR,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,QAAkB;QAC9C,OAAO,CACL,QAAQ,KAAK,+BAAQ,CAAC,cAAc;YACpC,QAAQ,KAAK,+BAAQ,CAAC,iBAAiB,CACxC,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,eAAe,CAC5B,MAA6C,EAC7C,QAAkB,EAClB,aAAsB;QAEtB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAC5C,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC;QAEnE,IAAI,IAAY,EAAE,KAAa,EAAE,SAAiB,EAAE,SAAiB,CAAC;QAEtE,IACE,QAAQ,KAAK,+BAAQ,CAAC,iBAAiB;YACvC,aAAa,KAAK,SAAS,EAC3B,CAAC;YACD,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/D,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;YAC9B,KAAK,GAAG,UAAU,CAAC,mBAAmB,CAAC,MAAM,CAAC;YAC9C,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC;YAC/D,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;YAClD,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;YACpD,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC;YAC/D,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC;QACjE,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkC,CAAC;QAC9D,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAC7D,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,OAAO;YACL,OAAO;YACP,OAAO;YACP,IAAI;YACJ,KAAK;YACL,IAAI;YACJ,SAAS;YACT,SAAS;YACT,WAAW;SACZ,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,oBAAoB,CACjC,MAAkB,EAClB,UAA+B;QAE/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QAE3D,MAAM,YAAY,GAAuB,KAAK,CAAC,IAAI,CACjD,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE,EACjC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3B,CAAC;QAEF,MAAM,eAAe,GAA0B,KAAK,CAAC,IAAI,CACvD,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE,EACjC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACnE,CAAC;QAEF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YACxC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC3C,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;oBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC3C,CAAC;qBAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,iBAAiB,CACpB,OAAO,EACP,OAAO,EACP,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,eAAe,CAChB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;IAC3C,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAC9B,OAAe,EACf,OAAe,EACf,IAAY,EACZ,GAAW,EACX,YAAgC,EAChC,eAAsC;QAEtC,KAAK,IAAI,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC;YACnC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,EAC9B,YAAY,EACZ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,iBAAiB,GACM;QACvB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GACxE,UAAU,CAAC;QAEb,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,YAAY,GAAc,EAAE,CAAC;QAEnC,KAAK,IAAI,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC;YAC7B,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,MAAM,SAAS,GAAuB,EAAE,CAAC;YAEzC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;gBACxC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBACpB,gBAAgB,EAAE,CAAC;oBACnB,IAAI,GAAG,4BAAY,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;oBACvD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;wBACpC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;4BAAE,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;oBACnE,CAAC;gBACH,CAAC;;oBAAM,MAAM;YACf,CAAC;YAED,IAAI,gBAAgB,IAAI,SAAS,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;gBACnE,MAAM,UAAU,GACd,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,SAAS,GAAG,IAAI,CAAC;oBACrB,SAAS,GAAG,4BAAY,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;oBAChE,SAAS,GAAG,4BAAY,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;oBAC9D,SAAS,GAAG,4BAAY,CAAC,YAAY,CACnC,SAAS,EACT,iBAAiB,EACjB,CAAC,CACF,CAAC;oBACF,SAAS,GAAG,4BAAY,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;oBAErD,QAAQ,GAAG,4BAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBAExD,YAAY,CAAC,IAAI,CAAC;wBAChB,MAAM;wBACN,gBAAgB;wBAChB,IAAI;wBACJ,UAAU;wBACV,GAAG,EAAE,SAAS;wBACd,SAAS;qBACV,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,QAAQ,GAAG,4BAAY,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEnD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACpC,CAAC;CACF;AAnMD,gEAmMC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WinEvaluationType = void 0;
4
+ var WinEvaluationType;
5
+ (function (WinEvaluationType) {
6
+ WinEvaluationType["WAYS_243"] = "WAYS_243";
7
+ WinEvaluationType["WAYS_1024"] = "WAYS_1024";
8
+ WinEvaluationType["WAYS_3125"] = "WAYS_3125";
9
+ WinEvaluationType["WAYS_CLUSTER"] = "WAYS_CLUSTER";
10
+ WinEvaluationType["PAYLINE"] = "PAYLINE";
11
+ })(WinEvaluationType || (exports.WinEvaluationType = WinEvaluationType = {}));
12
+ //# sourceMappingURL=game-logic-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-logic-config.interface.js","sourceRoot":"","sources":["../../src/logic/game-logic-config.interface.ts"],"names":[],"mappings":";;;AA+NA,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,0CAAqB,CAAA;IACrB,4CAAuB,CAAA;IACvB,4CAAuB,CAAA;IACvB,kDAA6B,CAAA;IAC7B,wCAAmB,CAAA;AACrB,CAAC,EANW,iBAAiB,iCAAjB,iBAAiB,QAM5B"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseGameHandler = void 0;
4
+ exports.getSpinTypeForBonus = getSpinTypeForBonus;
5
+ const bonnys_fortune_types_1 = require("../bonnys-fortune.types");
6
+ const bonnys_fortune_spin_generator_1 = require("../bonnys-fortune.spin-generator");
7
+ const bonnys_fortune_win_calculator_1 = require("../bonnys-fortune.win-calculator");
8
+ const number_helper_1 = require("../../helpers/number-helper");
9
+ const uuid_helper_1 = require("../../helpers/uuid-helper");
10
+ class BaseGameHandler {
11
+ constructor(rngService) {
12
+ this.rngService = rngService;
13
+ }
14
+ async handleSpin(params, publicState, privateState, config, reelStripsConfig, commandId) {
15
+ if (privateState.nextSpinType !== bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN) {
16
+ throw new Error(`Cannot execute base spin while a bonus spin (${privateState.nextSpinType}) is expected`);
17
+ }
18
+ let screen = await new bonnys_fortune_spin_generator_1.BonnysFortuneSpinGenerator(this.rngService).generateBaseScreen(config, reelStripsConfig, commandId, 'base_spin_screen');
19
+ screen = await new bonnys_fortune_spin_generator_1.BonnysFortuneSpinGenerator(this.rngService).applyBonusSymbols(screen, config, commandId, 'base_spin_bonus_symbols');
20
+ const updatedBonusMeters = this.updateBonusMeters(screen, privateState.bonusMetersByAmount[params.betAmount], config);
21
+ privateState.bonusMetersByAmount[params.betAmount] = updatedBonusMeters;
22
+ const scatterSymbolId = config.baseGame.symbolDefinitions.specialSymbols.SCATTER;
23
+ const betStake = number_helper_1.NumberHelper.safeDivide(params.betAmount, params.creditsPerLine === 10 ? params.creditsPerLine : 10, 3);
24
+ const triggeredBonus = this.findTriggeredBonus(updatedBonusMeters, betStake, screen, scatterSymbolId);
25
+ const nextSpinType = triggeredBonus
26
+ ? getSpinTypeForBonus(triggeredBonus.bonusType)
27
+ : bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN;
28
+ const winResult = bonnys_fortune_win_calculator_1.BonnysFortuneWinCalculator.calculateWins(screen, config, betStake, 1, bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN);
29
+ return {
30
+ result: {
31
+ spinType: bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN,
32
+ screen,
33
+ winResult,
34
+ playerWinning: number_helper_1.NumberHelper.toFixedNumber(winResult.totalWin, 2),
35
+ nextSpinType,
36
+ triggeredBonus,
37
+ },
38
+ publicState: {
39
+ currentBetAmount: params.betAmount,
40
+ bonusMeters: updatedBonusMeters,
41
+ },
42
+ privateState: {
43
+ ...privateState,
44
+ nextSpinType,
45
+ pendingBonuses: triggeredBonus ? [triggeredBonus] : [],
46
+ },
47
+ };
48
+ }
49
+ updateBonusMeters(screen, bonusMeters, config) {
50
+ const symbolsInScreen = screen.flat();
51
+ return Object.fromEntries(Object.entries(bonusMeters).map(([key, bonusMeter]) => {
52
+ const count = symbolsInScreen.filter((sym) => sym === bonusMeter.symbolId).length;
53
+ const newProgress = number_helper_1.NumberHelper.safeSum(bonusMeter.progress, count, 0);
54
+ const cfg = config?.baseGame.bonusGameMeters[key];
55
+ const percentageLevels = cfg?.percentageLevels ?? {};
56
+ const level = this.getMeterLevel(newProgress, bonusMeter.threshold, percentageLevels);
57
+ return [key, { ...bonusMeter, progress: newProgress, level }];
58
+ }));
59
+ }
60
+ findTriggeredBonus(bonusMeters, betStake, screen, scatterSymbolId) {
61
+ const triggeredPot = Object.entries(bonusMeters).find(([, bonusMeter]) => bonusMeter.progress >= bonusMeter.threshold);
62
+ if (triggeredPot) {
63
+ const [bonusType] = triggeredPot;
64
+ return {
65
+ bonusId: uuid_helper_1.UuidHelper.generateUuid(),
66
+ bonusType,
67
+ betAmount: number_helper_1.NumberHelper.toFixedNumber(betStake, 2),
68
+ };
69
+ }
70
+ if (screen && scatterSymbolId !== undefined) {
71
+ const flatScreen = screen.flat();
72
+ const scatterCount = flatScreen.filter((sym) => sym === scatterSymbolId).length;
73
+ if (scatterCount >= 3) {
74
+ return {
75
+ bonusId: uuid_helper_1.UuidHelper.generateUuid(),
76
+ bonusType: 'collectFeature',
77
+ betAmount: number_helper_1.NumberHelper.toFixedNumber(betStake, 2),
78
+ };
79
+ }
80
+ }
81
+ return undefined;
82
+ }
83
+ getMeterLevel(progress, threshold, percentageLevels) {
84
+ for (const [, range] of Object.entries(percentageLevels)) {
85
+ const minValue = number_helper_1.NumberHelper.safeMultiply(range.min, threshold, 4);
86
+ const maxValue = number_helper_1.NumberHelper.safeMultiply(range.max, threshold, 4);
87
+ if (progress >= minValue && progress < maxValue) {
88
+ return range.value;
89
+ }
90
+ }
91
+ return 5;
92
+ }
93
+ }
94
+ exports.BaseGameHandler = BaseGameHandler;
95
+ function getSpinTypeForBonus(bonusType) {
96
+ switch (bonusType) {
97
+ case 'bonusGame1':
98
+ return bonnys_fortune_types_1.SpinType.BONUS_GAME_1_SPIN;
99
+ case 'bonusGame2':
100
+ return bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN;
101
+ case 'bonusGame3':
102
+ return bonnys_fortune_types_1.SpinType.BONUS_GAME_3_SPIN;
103
+ case 'collectFeature':
104
+ return bonnys_fortune_types_1.SpinType.COLLECT_FEATURE_SPIN;
105
+ default:
106
+ return bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN;
107
+ }
108
+ }
109
+ //# sourceMappingURL=base-game.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-game.handler.js","sourceRoot":"","sources":["../../../src/logic/handlers/base-game.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollectFeatureBonusHandler = void 0;
4
+ const bonnys_fortune_types_1 = require("../bonnys-fortune.types");
5
+ const number_helper_1 = require("../../helpers/number-helper");
6
+ class CollectFeatureBonusHandler {
7
+ constructor(rngService) {
8
+ this.rngService = rngService;
9
+ }
10
+ async generateFullBonusRound(params, publicState, privateState, config, commandId) {
11
+ const betStake = this.getBetStake(params);
12
+ const scatterConfig = config.scatterGame.config;
13
+ const results = [];
14
+ const initialPublicState = { ...publicState };
15
+ const initialPrivateState = { ...privateState };
16
+ let spinsLeft = scatterConfig.scatterSpins;
17
+ let totalValues = 0;
18
+ let totalMultipliers = 1;
19
+ let totalWin = 0;
20
+ const checkpoints = await Promise.all(scatterConfig.scatterCheckpoints.map(async (cp, index) => {
21
+ const actionId = `checkpoint_${index}`;
22
+ const result = await this.rngService.getSingleNumber(0, 1, commandId, actionId);
23
+ return cp.spin - 1 + result.value;
24
+ }));
25
+ for (let spinIndex = 0; spinIndex < scatterConfig.scatterSpins; spinIndex++) {
26
+ const { result, updatedState, updatedPublicState, updatedPrivateState } = await this.executeSingleSpin(spinIndex, spinsLeft, totalValues, totalMultipliers, totalWin, betStake, scatterConfig, checkpoints, publicState, privateState, commandId);
27
+ results.push({
28
+ result,
29
+ publicState: updatedPublicState,
30
+ privateState: updatedPrivateState,
31
+ });
32
+ totalValues = updatedState.totalValues;
33
+ totalMultipliers = updatedState.totalMultipliers;
34
+ totalWin = updatedState.totalWin;
35
+ spinsLeft = updatedState.spinsLeft;
36
+ publicState = updatedPublicState;
37
+ privateState = updatedPrivateState;
38
+ if (spinsLeft <= 0)
39
+ break;
40
+ }
41
+ return {
42
+ results,
43
+ publicState: initialPublicState,
44
+ privateState: initialPrivateState,
45
+ };
46
+ }
47
+ async executeSingleSpin(spinIndex, spinsLeft, totalValues, totalMultipliers, totalWin, betStake, scatterConfig, checkpoints, publicState, privateState, commandId) {
48
+ const symbolCount = await this.weightedPick(scatterConfig.scatterSymbolSpins, commandId, `spin_${spinIndex}_symbol_count`);
49
+ const symbols = [];
50
+ let multiCount = 0;
51
+ let valueCount = 0;
52
+ for (let i = 0; i < symbolCount; i++) {
53
+ const symbol = await this.weightedPickSymbol(scatterConfig.scatterSymbols, commandId, `spin_${spinIndex}_symbol_${i}`);
54
+ symbols.push(symbol.symbolId);
55
+ if (symbol.symbolId.startsWith('CM'))
56
+ multiCount++;
57
+ else
58
+ valueCount++;
59
+ }
60
+ if (checkpoints.includes(spinsLeft)) {
61
+ const cpIndex = checkpoints.indexOf(spinsLeft);
62
+ const cp = scatterConfig.scatterCheckpoints[cpIndex];
63
+ if ((totalMultipliers < cp.multiMinValue && multiCount === 0) ||
64
+ (totalValues < cp.valueMinValue && valueCount === 0)) {
65
+ symbols[0] = 'CV1';
66
+ }
67
+ }
68
+ const slashedCount = Math.min(await this.weightedPick(scatterConfig.scatterSymbolSlash, commandId, `spin_${spinIndex}_slashed_count`), symbolCount);
69
+ const slashed = Array(symbolCount).fill(false);
70
+ for (let i = 0; i < slashedCount; i++)
71
+ slashed[i] = true;
72
+ let currentValues = 0;
73
+ let currentMultipliers = 0;
74
+ for (let i = 0; i < slashed.length; i++) {
75
+ if (slashed[i]) {
76
+ const symbol = scatterConfig.scatterSymbols.find((s) => s.symbolId === symbols[i]);
77
+ if (!symbol)
78
+ continue;
79
+ if (symbols[i].startsWith('CM'))
80
+ currentMultipliers = number_helper_1.NumberHelper.safeSum(currentMultipliers, symbol.value, 2);
81
+ else
82
+ currentValues = number_helper_1.NumberHelper.safeSum(currentValues, symbol.value, 2);
83
+ }
84
+ }
85
+ const newTotalValues = number_helper_1.NumberHelper.safeSum(totalValues, currentValues, 2);
86
+ const newTotalMultipliers = number_helper_1.NumberHelper.safeSum(totalMultipliers, currentMultipliers, 2);
87
+ const newTotalWin = number_helper_1.NumberHelper.safeMultiply(number_helper_1.NumberHelper.safeMultiply(newTotalValues, newTotalMultipliers, 2), betStake, 2);
88
+ const playerWinning = number_helper_1.NumberHelper.safeSum(newTotalWin, -totalWin, 2);
89
+ spinsLeft -= 1;
90
+ const result = {
91
+ spinIndex,
92
+ spinType: bonnys_fortune_types_1.SpinType.COLLECT_FEATURE_SPIN,
93
+ symbols,
94
+ slashed,
95
+ currentValues,
96
+ currentMultipliers,
97
+ totalValues: newTotalValues,
98
+ totalMultipliers: newTotalMultipliers,
99
+ playerWinning,
100
+ totalWin: newTotalWin,
101
+ spinsLeft,
102
+ nextSpinType: spinsLeft > 0 ? bonnys_fortune_types_1.SpinType.COLLECT_FEATURE_SPIN : bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN,
103
+ };
104
+ const updatedPublicState = {
105
+ ...publicState,
106
+ };
107
+ const updatedPrivateState = {
108
+ ...privateState,
109
+ nextSpinType: spinsLeft > 0 ? bonnys_fortune_types_1.SpinType.COLLECT_FEATURE_SPIN : bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN,
110
+ activeBonus: spinsLeft > 0 ? privateState.activeBonus : undefined,
111
+ };
112
+ return {
113
+ result,
114
+ updatedState: {
115
+ spinsLeft,
116
+ totalValues: newTotalValues,
117
+ totalMultipliers: newTotalMultipliers,
118
+ totalWin: newTotalWin,
119
+ },
120
+ updatedPublicState,
121
+ updatedPrivateState,
122
+ };
123
+ }
124
+ async weightedPick(items, commandId, actionId) {
125
+ const sum = items.reduce((acc, item) => number_helper_1.NumberHelper.safeSum(acc, item.weight, 2), 0);
126
+ let { value: draw } = await this.rngService.getSingleNumber(0, sum - 1, commandId, actionId);
127
+ for (const item of items) {
128
+ if (draw < item.weight) {
129
+ return item.count || items.indexOf(item) + 1;
130
+ }
131
+ draw -= item.weight;
132
+ }
133
+ return 1;
134
+ }
135
+ async weightedPickSymbol(symbols, commandId, actionId) {
136
+ const sum = symbols.reduce((acc, s) => number_helper_1.NumberHelper.safeSum(acc, s.weight, 2), 0);
137
+ const result = await this.rngService.getSingleNumber(0, sum - 1, commandId, actionId);
138
+ let drawValue = result.value;
139
+ for (const s of symbols) {
140
+ if (drawValue < s.weight)
141
+ return s;
142
+ drawValue -= s.weight;
143
+ }
144
+ return symbols[0];
145
+ }
146
+ getBetStake(params) {
147
+ return params.betAmount;
148
+ }
149
+ }
150
+ exports.CollectFeatureBonusHandler = CollectFeatureBonusHandler;
151
+ //# sourceMappingURL=collect-feature-bonus.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-feature-bonus.handler.js","sourceRoot":"","sources":["../../../src/logic/handlers/collect-feature-bonus.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FreeSpinsBonusHandler = void 0;
4
+ const bonnys_fortune_types_1 = require("../bonnys-fortune.types");
5
+ const bonnys_fortune_spin_generator_1 = require("../bonnys-fortune.spin-generator");
6
+ const bonnys_fortune_win_calculator_1 = require("../bonnys-fortune.win-calculator");
7
+ const number_helper_1 = require("../../helpers/number-helper");
8
+ class FreeSpinsBonusHandler {
9
+ constructor(rngService) {
10
+ this.rngService = rngService;
11
+ }
12
+ async generateFullBonusRound(params, publicState, privateState, config, reelStripsConfig, commandId) {
13
+ const betStake = this.getBetStake(params);
14
+ const spinGenerator = new bonnys_fortune_spin_generator_1.BonnysFortuneSpinGenerator(this.rngService);
15
+ const spinTypes = config.bonusGames.bonusGame2.config.spinTypes;
16
+ const weights = spinTypes.map((st) => st.weight);
17
+ const total = weights.reduce((a, b) => number_helper_1.NumberHelper.safeSum(a, b, 2), 0);
18
+ const result = await this.rngService.getSingleNumber(0, total - 1, commandId, 'free_spins_type_selection');
19
+ const rand = result.value;
20
+ let spinTypeIndex = 0;
21
+ let cumulative = 0;
22
+ for (let i = 0; i < weights.length; i++) {
23
+ cumulative += weights[i];
24
+ if (rand < cumulative) {
25
+ spinTypeIndex = i;
26
+ break;
27
+ }
28
+ }
29
+ const spinTypeConfig = spinTypes[spinTypeIndex];
30
+ const results = [];
31
+ let spinsLeft = spinTypeConfig.spins;
32
+ while (spinsLeft > 0) {
33
+ const screen = await spinGenerator.generateScreenWithLayout(reelStripsConfig, spinTypeConfig.layout, commandId, `free_spin_${spinsLeft}`);
34
+ const winResult = bonnys_fortune_win_calculator_1.BonnysFortuneWinCalculator.calculateWins(screen, config, number_helper_1.NumberHelper.toFixedNumber(betStake, 2), number_helper_1.NumberHelper.toFixedNumber(spinTypeConfig.multiplier, 2), bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN, spinTypeIndex);
35
+ results.push({
36
+ result: {
37
+ spinType: bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN,
38
+ screen,
39
+ winResult,
40
+ playerWinning: number_helper_1.NumberHelper.toFixedNumber(winResult.totalWin, 2),
41
+ nextSpinType: spinsLeft === 1
42
+ ? bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN
43
+ : bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN,
44
+ multiplier: number_helper_1.NumberHelper.toFixedNumber(spinTypeConfig.multiplier, 2),
45
+ },
46
+ publicState: publicState,
47
+ privateState: {
48
+ ...privateState,
49
+ nextSpinType: spinsLeft === 1
50
+ ? bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN
51
+ : bonnys_fortune_types_1.SpinType.BONUS_GAME_2_SPIN,
52
+ activeBonus: spinsLeft === 1 ? undefined : privateState.activeBonus,
53
+ },
54
+ });
55
+ spinsLeft--;
56
+ }
57
+ return {
58
+ results,
59
+ publicState,
60
+ privateState,
61
+ };
62
+ }
63
+ getBetStake(params) {
64
+ return params.betAmount;
65
+ }
66
+ }
67
+ exports.FreeSpinsBonusHandler = FreeSpinsBonusHandler;
68
+ //# sourceMappingURL=free-spins-bonus.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-spins-bonus.handler.js","sourceRoot":"","sources":["../../../src/logic/handlers/free-spins-bonus.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SteeringToTheFortuneBonusHandler = void 0;
4
+ const bonnys_fortune_types_1 = require("../bonnys-fortune.types");
5
+ const number_helper_1 = require("../../helpers/number-helper");
6
+ const uuid_helper_1 = require("../../helpers/uuid-helper");
7
+ const base_game_handler_1 = require("./base-game.handler");
8
+ class SteeringToTheFortuneBonusHandler {
9
+ constructor(rngService) {
10
+ this.rngService = rngService;
11
+ }
12
+ async generateFullBonusRound(params, publicState, privateState, config, commandId) {
13
+ const betStake = this.getBetStake(params);
14
+ const wheelResults = config.bonusGames.bonusGame3.config.wheelResults;
15
+ const selectedIndex = await this.weightedDraw(wheelResults.map((w) => w.weight), commandId, 'steering_fortune_wheel_selection');
16
+ const prize = wheelResults[selectedIndex];
17
+ let playerWinning = 0;
18
+ let nextSpinType = bonnys_fortune_types_1.SpinType.BASE_GAME_SPIN;
19
+ let triggeredBonus;
20
+ if (prize.type === bonnys_fortune_types_1.PrizeType.MULTIPLIER) {
21
+ playerWinning = number_helper_1.NumberHelper.safeMultiply(betStake, prize.value ?? 0, 2);
22
+ }
23
+ else if (prize.type === bonnys_fortune_types_1.PrizeType.BONUS) {
24
+ triggeredBonus = {
25
+ bonusId: uuid_helper_1.UuidHelper.generateUuid(),
26
+ bonusType: prize.bonusType ?? '',
27
+ betAmount: betStake,
28
+ };
29
+ nextSpinType = (0, base_game_handler_1.getSpinTypeForBonus)(prize.bonusType ?? '');
30
+ }
31
+ const results = [
32
+ {
33
+ result: {
34
+ spinType: bonnys_fortune_types_1.SpinType.BONUS_GAME_3_SPIN,
35
+ playerWinning,
36
+ nextSpinType,
37
+ prizeType: prize.type,
38
+ prizeValue: prize.type === bonnys_fortune_types_1.PrizeType.MULTIPLIER ? prize.value : prize.bonusType,
39
+ totalMultiplier: prize.type === bonnys_fortune_types_1.PrizeType.MULTIPLIER ? prize.value : 0,
40
+ triggeredBonus,
41
+ },
42
+ publicState,
43
+ privateState: {
44
+ ...privateState,
45
+ nextSpinType,
46
+ pendingBonuses: triggeredBonus ? [triggeredBonus] : [],
47
+ activeBonus: undefined,
48
+ },
49
+ },
50
+ ];
51
+ return {
52
+ results: results,
53
+ publicState,
54
+ privateState,
55
+ };
56
+ }
57
+ async weightedDraw(weights, commandId, actionId) {
58
+ const sum = weights.reduce((acc, w) => number_helper_1.NumberHelper.safeSum(acc, w, 2), 0);
59
+ const result = await this.rngService.getSingleNumber(0, sum - 1, commandId, actionId);
60
+ const draw = result.value;
61
+ let cumulative = 0;
62
+ for (let i = 0; i < weights.length; i++) {
63
+ cumulative = number_helper_1.NumberHelper.safeSum(cumulative, weights[i], 2);
64
+ if (draw < cumulative)
65
+ return i;
66
+ }
67
+ return weights.length - 1;
68
+ }
69
+ getBetStake(params) {
70
+ return params.betAmount;
71
+ }
72
+ }
73
+ exports.SteeringToTheFortuneBonusHandler = SteeringToTheFortuneBonusHandler;
74
+ //# sourceMappingURL=steering-to-the-fortune-bonus.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steering-to-the-fortune-bonus.handler.js","sourceRoot":"","sources":["../../../src/logic/handlers/steering-to-the-fortune-bonus.handler.ts"],"names":[],"mappings":"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"}