@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,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bonnys_fortune_v1_game_engine_1 = require("../bonnys-fortune-v1.game-engine");
4
+ const game_spin_output_dto_1 = require("../domain/types/game-spin-output.dto");
5
+ describe('BonnysFortuneV1GameEngine', () => {
6
+ let gameEngine;
7
+ beforeEach(() => {
8
+ gameEngine = new bonnys_fortune_v1_game_engine_1.BonnysFortuneV1GameEngine();
9
+ });
10
+ it('should initialize the game engine and return info', async () => {
11
+ const info = gameEngine.getGameEngineInfo();
12
+ expect(info.gameCode).toBe('bonnys-fortune');
13
+ expect(info.version).toBe('1.0.0');
14
+ expect(info.rtp).toBe(96);
15
+ expect(info.gameType).toBe('slot');
16
+ });
17
+ it('should process a spin command successfully', async () => {
18
+ const initialPublicState = {
19
+ currentBetAmount: 1,
20
+ bonusMeters: {},
21
+ };
22
+ const initialPrivateState = {
23
+ nextSpinType: game_spin_output_dto_1.SpinType.BASE_GAME_SPIN,
24
+ pendingBonuses: [],
25
+ bonusMetersByAmount: {
26
+ 1: {
27
+ bonusGame1: {
28
+ symbolName: 'H1',
29
+ symbolId: 0,
30
+ threshold: 25,
31
+ progress: 0,
32
+ level: 1,
33
+ },
34
+ bonusGame2: {
35
+ symbolName: 'H2',
36
+ symbolId: 1,
37
+ threshold: 25,
38
+ progress: 0,
39
+ level: 1,
40
+ },
41
+ bonusGame3: {
42
+ symbolName: 'H3',
43
+ symbolId: 2,
44
+ threshold: 25,
45
+ progress: 0,
46
+ level: 1,
47
+ },
48
+ },
49
+ },
50
+ };
51
+ const spinCommand = {
52
+ id: 'test-command-123',
53
+ type: 'SPIN',
54
+ payload: {
55
+ sessionId: 'test-session-123',
56
+ betAmount: 1,
57
+ gameCode: 'bonnys-fortune',
58
+ gameVersion: '1.0.0',
59
+ lines: 10,
60
+ creditsPerLine: 1,
61
+ },
62
+ };
63
+ const result = await gameEngine.processCommand(initialPublicState, initialPrivateState, spinCommand);
64
+ expect(result).toBeDefined();
65
+ expect(result.success).toBe(true);
66
+ expect(result.outcome).toBeDefined();
67
+ expect(result.publicState).toBeDefined();
68
+ expect(result.privateState).toBeDefined();
69
+ });
70
+ });
71
+ //# sourceMappingURL=bonnys-fortune-v1.game-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonnys-fortune-v1.game-engine.test.js","sourceRoot":"","sources":["../../src/__tests__/bonnys-fortune-v1.game-engine.test.ts"],"names":[],"mappings":";;AAAA,oFAA6E;AAE7E,+EAAgE;AAEhE,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,UAAqC,CAAC;IAE1C,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,IAAI,yDAAyB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAI,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,kBAAkB,GAAG;YACzB,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,MAAM,mBAAmB,GAAG;YAC1B,YAAY,EAAE,+BAAQ,CAAC,cAAc;YACrC,cAAc,EAAE,EAAE;YAClB,mBAAmB,EAAE;gBACnB,CAAC,EAAE;oBACD,UAAU,EAAE;wBACV,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,CAAC;wBACX,SAAS,EAAE,EAAE;wBACb,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,CAAC;qBACT;oBACD,UAAU,EAAE;wBACV,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,CAAC;wBACX,SAAS,EAAE,EAAE;wBACb,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,CAAC;qBACT;oBACD,UAAU,EAAE;wBACV,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,CAAC;wBACX,SAAS,EAAE,EAAE;wBACb,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,CAAC;qBACT;iBACF;aACF;SACF,CAAC;QAEF,MAAM,WAAW,GAAG;YAClB,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,gBAAgB;gBAC1B,WAAW,EAAE,OAAO;gBACpB,KAAK,EAAE,EAAE;gBACT,cAAc,EAAE,CAAC;aACC;SACrB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,CACZ,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BonnysFortuneV1GameEngine = void 0;
4
+ const bonnys_fortune_game_logic_1 = require("./logic/bonnys-fortune.game-logic");
5
+ const bonnys_fortune_config_validator_1 = require("./validation/bonnys-fortune/bonnys-fortune-config.validator");
6
+ const file_system_game_logic_config_loader_1 = require("./config/game-logic-config/file-system.game-logic-config-loader");
7
+ const file_system_reel_strips_config_loader_1 = require("./config/reel-strips-config/file-system.reel-strips-config-loader");
8
+ const game_logic_config_validation_service_1 = require("./validation/game-logic-config-validation.service");
9
+ const game_round_types_1 = require("./domain/game-round.types");
10
+ const logger_1 = require("./logger/logger");
11
+ const reel_strips_config_mapper_1 = require("./domain/mappers/reel-strips-config.mapper");
12
+ const reel_strips_config_validation_service_1 = require("./validation/reel-strips-config-validation.service");
13
+ const rng_client_factory_1 = require("./rng/rng-client.factory");
14
+ const rng_service_1 = require("./rng/rng-service");
15
+ class BonnysFortuneV1GameEngine {
16
+ constructor() {
17
+ this.gameCode = 'bonnys-fortune';
18
+ this.version = '1.0.0';
19
+ this.rtp = 96;
20
+ this.gameType = 'slot';
21
+ this.logger = new logger_1.Logger('BonnysFortuneV1Engine');
22
+ this.configOutPort = new file_system_game_logic_config_loader_1.FileSystemGameLogicConfigLoader();
23
+ this.reelsOutPort = new file_system_reel_strips_config_loader_1.FileSystemReelStripsConfigLoader();
24
+ const rngClient = rng_client_factory_1.RngClientFactory.create();
25
+ this.rngService = new rng_service_1.RngService(rngClient);
26
+ this.configValidator = new game_logic_config_validation_service_1.GameLogicConfigValidationService();
27
+ this.reelsValidator = new reel_strips_config_validation_service_1.ReelStripsConfigValidationService();
28
+ this.reelMapper = new reel_strips_config_mapper_1.ReelStripsConfigMapper();
29
+ this.gameLogic = new bonnys_fortune_game_logic_1.BonnysFortuneGameLogic(this.rngService);
30
+ this.preload();
31
+ }
32
+ getGameEngineInfo() {
33
+ return {
34
+ gameCode: this.gameCode,
35
+ version: this.version,
36
+ rtp: this.rtp,
37
+ gameType: this.gameType,
38
+ };
39
+ }
40
+ async preload() {
41
+ this.logger.log('Preloading Bonnys Fortune engine');
42
+ this.configValidator.register(this.gameCode, new bonnys_fortune_config_validator_1.BonnysFortuneGameLogicConfigValidator());
43
+ const rawConfig = await this.configOutPort.loadConfig(this.gameCode, this.version);
44
+ if (!rawConfig) {
45
+ throw new Error('Bonnys Fortune game logic config not found');
46
+ }
47
+ await this.configValidator.validate(this.gameCode, rawConfig);
48
+ const reelsCount = rawConfig.baseGame.baseGameConfig.layout.reels;
49
+ const optionsCount = rawConfig.baseGame.paidSpinsConfig.reelsOptions.numberOfOptions;
50
+ const rawBaseGameReels = await this.reelsOutPort.loadConfig(this.gameCode, this.version, game_round_types_1.GameRoundType.BASE, reelsCount, optionsCount);
51
+ await this.reelsValidator.validate(rawBaseGameReels);
52
+ const rawBonusGame2Reels = await this.reelsOutPort.loadConfig(this.gameCode, this.version, game_round_types_1.GameRoundType.BONUS, reelsCount, optionsCount);
53
+ await this.reelsValidator.validate(rawBonusGame2Reels);
54
+ this.config = rawConfig;
55
+ this.reels = new Map([
56
+ [game_round_types_1.GameRoundType.BASE, this.reelMapper.mapRawToDomain(rawBaseGameReels)],
57
+ [game_round_types_1.GameRoundType.BONUS, this.reelMapper.mapRawToDomain(rawBonusGame2Reels)],
58
+ ]);
59
+ }
60
+ async processCommand(publicState, privateState, command) {
61
+ this.logger.log(`Processing command ${command.type}`);
62
+ this.rngService.registerCommand(command.id);
63
+ switch (command.type) {
64
+ case 'INIT_SESSION_STATE': {
65
+ const baseReels = this.reels.get(game_round_types_1.GameRoundType.BASE);
66
+ if (!baseReels) {
67
+ throw new Error('Base game reels not found');
68
+ }
69
+ const result = await this.gameLogic.initSessionState(this.config, baseReels, command.payload, command.id);
70
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
71
+ this.rngService.removeCommand(command.id);
72
+ return {
73
+ success: true,
74
+ publicState: result.publicState,
75
+ privateState: result.privateState,
76
+ outcome: result,
77
+ message: 'Session state initialized',
78
+ rngOutcome,
79
+ };
80
+ }
81
+ case 'SPIN': {
82
+ const params = command.payload;
83
+ const baseReels = this.reels.get(game_round_types_1.GameRoundType.BASE);
84
+ if (!baseReels) {
85
+ throw new Error('Base game reels not found');
86
+ }
87
+ const outcome = await this.gameLogic.spin(params, publicState, privateState, this.config, baseReels, command.id);
88
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
89
+ this.rngService.removeCommand(command.id);
90
+ return {
91
+ success: true,
92
+ publicState: outcome.publicState,
93
+ privateState: outcome.privateState,
94
+ outcome,
95
+ message: 'Spin completed',
96
+ rngOutcome,
97
+ };
98
+ }
99
+ case 'START_BONUS_ROUND': {
100
+ const params = command.payload;
101
+ const bonusReels = this.reels.get(game_round_types_1.GameRoundType.BONUS);
102
+ if (!bonusReels) {
103
+ throw new Error('Bonus game reels not found');
104
+ }
105
+ const outcome = await this.gameLogic.startBonusRound(params, publicState, privateState, this.config, bonusReels, command.id);
106
+ if (!outcome) {
107
+ throw new Error('Bonus round outcome not found');
108
+ }
109
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
110
+ this.rngService.removeCommand(command.id);
111
+ return {
112
+ success: true,
113
+ publicState: outcome.publicState,
114
+ privateState: outcome.privateState,
115
+ outcome,
116
+ message: 'Bonus round started',
117
+ rngOutcome,
118
+ };
119
+ }
120
+ case 'CHEAT_TRIGGER_BONUS': {
121
+ const params = command.payload;
122
+ const result = await this.gameLogic.cheatTriggerBonus(publicState, privateState, params);
123
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
124
+ this.rngService.removeCommand(command.id);
125
+ return {
126
+ success: true,
127
+ publicState: result.publicState,
128
+ privateState: result.privateState,
129
+ outcome: result.outcome,
130
+ message: 'Bonus triggered',
131
+ rngOutcome,
132
+ };
133
+ }
134
+ case 'CHEAT_UPDATE_BONUS_METER_PROGRESS': {
135
+ const params = command.payload;
136
+ const result = this.gameLogic.cheatUpdateBonusMeterProgress(publicState, privateState, params, this.config);
137
+ const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
138
+ this.rngService.removeCommand(command.id);
139
+ return {
140
+ success: true,
141
+ publicState: result.publicState,
142
+ privateState: result.privateState,
143
+ outcome: result.outcome,
144
+ message: 'Bonus meter progress updated',
145
+ rngOutcome,
146
+ };
147
+ }
148
+ case 'GET_SYMBOLS': {
149
+ this.rngService.removeCommand(command.id);
150
+ return {
151
+ success: true,
152
+ publicState,
153
+ privateState,
154
+ outcome: this.gameLogic.getSymbols(this.config),
155
+ message: 'Symbols retrieved',
156
+ rngOutcome: undefined,
157
+ };
158
+ }
159
+ default: {
160
+ return {
161
+ success: false,
162
+ publicState: publicState,
163
+ privateState: privateState,
164
+ outcome: null,
165
+ message: 'Command not found',
166
+ rngOutcome: undefined,
167
+ };
168
+ }
169
+ }
170
+ }
171
+ }
172
+ exports.BonnysFortuneV1GameEngine = BonnysFortuneV1GameEngine;
173
+ //# sourceMappingURL=bonnys-fortune-v1.game-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonnys-fortune-v1.game-engine.js","sourceRoot":"","sources":["../src/bonnys-fortune-v1.game-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileSystemGameLogicConfigLoader = void 0;
37
+ const path = __importStar(require("path"));
38
+ class FileSystemGameLogicConfigLoader {
39
+ async loadConfig(gameId, variantId) {
40
+ try {
41
+ const configPath = path.resolve(__dirname, `./game-logic-config.js`);
42
+ const configModule = await Promise.resolve(`${configPath}`).then(s => __importStar(require(s)));
43
+ const config = configModule.gameLogicConfig;
44
+ if (!config) {
45
+ console.warn(`Config object 'gameConfig' missing in ${configPath}`);
46
+ return null;
47
+ }
48
+ return config;
49
+ }
50
+ catch (error) {
51
+ console.warn(`Failed to load config for ${gameId}/${variantId}:`, error);
52
+ return null;
53
+ }
54
+ }
55
+ }
56
+ exports.FileSystemGameLogicConfigLoader = FileSystemGameLogicConfigLoader;
57
+ //# sourceMappingURL=file-system.game-logic-config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.game-logic-config-loader.js","sourceRoot":"","sources":["../../../src/config/game-logic-config/file-system.game-logic-config-loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAG7B,MAAa,+BAA+B;IACnC,KAAK,CAAC,UAAU,CACrB,MAAc,EACd,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;YAErE,MAAM,YAAY,GAAG,yBAAa,UAAU,uCAAC,CAAC;YAE9C,MAAM,MAAM,GAAM,YAAY,CAAC,eAAe,CAAC;YAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,IAAI,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAvBD,0EAuBC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=game-logic-config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-logic-config-loader.js","sourceRoot":"","sources":["../../../src/config/game-logic-config/game-logic-config-loader.ts"],"names":[],"mappings":""}