@omnitronix/bonnys-fortune-game-engine 1.1.2 → 1.2.0-beta.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 (125) hide show
  1. package/dist/__tests__/bonnys-fortune-v1.game-engine.test.d.ts +1 -0
  2. package/dist/bonnys-fortune-v1.game-engine.d.ts +32 -0
  3. package/dist/bonnys-fortune-v1.game-engine.js +3 -8
  4. package/dist/bonnys-fortune-v1.game-engine.js.map +1 -1
  5. package/dist/config/game-logic-config/file-system.game-logic-config-loader.d.ts +4 -0
  6. package/dist/config/game-logic-config/game-logic-config-loader.d.ts +3 -0
  7. package/dist/config/game-logic-config/game-logic-config.d.ts +2 -0
  8. package/dist/config/reel-strips-config/file-system.reel-strips-config-loader.d.ts +4 -0
  9. package/dist/config/reel-strips-config/reel-strip-option.dto.d.ts +4 -0
  10. package/dist/config/reel-strips-config/reel-strips-config-loader.d.ts +3 -0
  11. package/dist/config/reel-strips-config/reel-strips-config.dto.d.ts +5 -0
  12. package/dist/config/reel-strips-config/reel.dto.d.ts +5 -0
  13. package/dist/domain/game-round.types.d.ts +9 -0
  14. package/dist/domain/mappers/reel-strips-config.mapper.d.ts +4 -0
  15. package/dist/domain/reel-strip-option.d.ts +7 -0
  16. package/dist/domain/reel-strips-config.d.ts +9 -0
  17. package/dist/domain/reel.d.ts +8 -0
  18. package/dist/domain/types/cheat-trigger-bonus-command.d.ts +5 -0
  19. package/dist/domain/types/cheat-trigger-bonus-request.dto.d.ts +5 -0
  20. package/dist/domain/types/cheat-update-bonus-meter-progress-command.d.ts +5 -0
  21. package/dist/domain/types/cheat-update-bonus-meter-progress-request.dto.d.ts +5 -0
  22. package/dist/domain/types/game-spin-command.d.ts +8 -0
  23. package/dist/domain/types/game-spin-input.dto.d.ts +8 -0
  24. package/dist/domain/types/game-spin-output.dto.d.ts +119 -0
  25. package/dist/domain/types/game-symbols.response.dto.d.ts +10 -0
  26. package/dist/domain/types/reel-strip-option.dto.d.ts +4 -0
  27. package/dist/domain/types/reel-strips-config.dto.d.ts +5 -0
  28. package/dist/domain/types/reel.dto.d.ts +5 -0
  29. package/dist/domain/types/start-bonus-round-command.d.ts +8 -0
  30. package/dist/domain/types/start-bonus-round-input.dto.d.ts +10 -0
  31. package/dist/game-engine.interface.d.ts +41 -0
  32. package/dist/helpers/generate-hash.d.ts +1 -0
  33. package/dist/helpers/number-helper.d.ts +23 -0
  34. package/dist/helpers/optional-boolean-mapper.d.ts +1 -0
  35. package/dist/helpers/uuid-helper.d.ts +3 -0
  36. package/dist/helpers/validation-helper.d.ts +14 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/logger/logger.d.ts +22 -0
  39. package/dist/logic/bonnys-fortune.game-logic.d.ts +32 -0
  40. package/dist/logic/bonnys-fortune.game-logic.js +13 -7
  41. package/dist/logic/bonnys-fortune.game-logic.js.map +1 -1
  42. package/dist/logic/bonnys-fortune.spin-generator.d.ts +19 -0
  43. package/dist/logic/bonnys-fortune.types.d.ts +170 -0
  44. package/dist/logic/bonnys-fortune.win-calculator.d.ts +10 -0
  45. package/dist/logic/game-logic-config.interface.d.ts +178 -0
  46. package/dist/logic/handlers/base-game.handler.d.ts +15 -0
  47. package/dist/logic/handlers/base-game.handler.js +5 -1
  48. package/dist/logic/handlers/base-game.handler.js.map +1 -1
  49. package/dist/logic/handlers/collect-feature-bonus.handler.d.ts +13 -0
  50. package/dist/logic/handlers/free-spins-bonus.handler.d.ts +11 -0
  51. package/dist/logic/handlers/steering-to-the-fortune-bonus.handler.d.ts +11 -0
  52. package/dist/logic/handlers/treasure-hunt-bonus.handler.d.ts +15 -0
  53. package/dist/rng/DummyRngClient.d.ts +18 -0
  54. package/dist/rng/DummyRngClient.js +1 -8
  55. package/dist/rng/DummyRngClient.js.map +1 -1
  56. package/dist/rng/rng-client.factory.d.ts +7 -0
  57. package/dist/rng/rng-client.factory.js +2 -1
  58. package/dist/rng/rng-client.factory.js.map +1 -1
  59. package/dist/rng/rng-client.interface.d.ts +16 -0
  60. package/dist/rng/rng-service.d.ts +26 -0
  61. package/dist/validation/abstract-game-logic-config.validator.d.ts +4 -0
  62. package/dist/validation/bonnys-fortune/bonnys-fortune-config.dto.d.ts +129 -0
  63. package/dist/validation/bonnys-fortune/bonnys-fortune-config.validator.d.ts +5 -0
  64. package/dist/validation/custom-decorators/IsNestedIntArray.d.ts +2 -0
  65. package/dist/validation/game-logic-config-validation.service.d.ts +8 -0
  66. package/dist/validation/reel-strips-config-validation.service.d.ts +5 -0
  67. package/package.json +4 -3
  68. package/src/__tests__/bonnys-fortune-v1.game-engine.test.ts +80 -0
  69. package/src/bonnys-fortune-v1.game-engine.ts +285 -0
  70. package/src/config/game-logic-config/file-system.game-logic-config-loader.ts +27 -0
  71. package/src/config/game-logic-config/game-logic-config-loader.ts +3 -0
  72. package/src/config/game-logic-config/game-logic-config.ts +380 -0
  73. package/src/config/reel-strips-config/file-system.reel-strips-config-loader.ts +43 -0
  74. package/src/config/reel-strips-config/reel-strip-option.dto.ts +13 -0
  75. package/src/config/reel-strips-config/reel-strips-config-loader.ts +9 -0
  76. package/src/config/reel-strips-config/reel-strips-config.dto.ts +16 -0
  77. package/src/config/reel-strips-config/reel.dto.ts +16 -0
  78. package/src/config/reel-strips-config/reels-BASE.csv +52 -0
  79. package/src/config/reel-strips-config/reels-BONUS.csv +52 -0
  80. package/src/domain/game-round.types.ts +10 -0
  81. package/src/domain/mappers/reel-strips-config.mapper.ts +16 -0
  82. package/src/domain/reel-strip-option.ts +15 -0
  83. package/src/domain/reel-strips-config.ts +21 -0
  84. package/src/domain/reel.ts +17 -0
  85. package/src/domain/types/cheat-trigger-bonus-command.ts +5 -0
  86. package/src/domain/types/cheat-trigger-bonus-request.dto.ts +5 -0
  87. package/src/domain/types/cheat-update-bonus-meter-progress-command.ts +6 -0
  88. package/src/domain/types/cheat-update-bonus-meter-progress-request.dto.ts +5 -0
  89. package/src/domain/types/game-spin-command.ts +8 -0
  90. package/src/domain/types/game-spin-input.dto.ts +8 -0
  91. package/src/domain/types/game-spin-output.dto.ts +142 -0
  92. package/src/domain/types/game-symbols.response.dto.ts +11 -0
  93. package/src/domain/types/reel-strip-option.dto.ts +13 -0
  94. package/src/domain/types/reel-strips-config.dto.ts +15 -0
  95. package/src/domain/types/reel.dto.ts +15 -0
  96. package/src/domain/types/start-bonus-round-command.ts +8 -0
  97. package/src/domain/types/start-bonus-round-input.dto.ts +10 -0
  98. package/src/game-engine.interface.ts +59 -0
  99. package/src/helpers/generate-hash.ts +5 -0
  100. package/src/helpers/number-helper.ts +41 -0
  101. package/src/helpers/optional-boolean-mapper.ts +5 -0
  102. package/src/helpers/uuid-helper.ts +7 -0
  103. package/src/helpers/validation-helper.ts +27 -0
  104. package/src/index.ts +3 -0
  105. package/src/logger/logger.ts +178 -0
  106. package/src/logic/bonnys-fortune.game-logic.ts +490 -0
  107. package/src/logic/bonnys-fortune.spin-generator.ts +277 -0
  108. package/src/logic/bonnys-fortune.types.ts +223 -0
  109. package/src/logic/bonnys-fortune.win-calculator.ts +210 -0
  110. package/src/logic/game-logic-config.interface.ts +174 -0
  111. package/src/logic/handlers/base-game.handler.ts +221 -0
  112. package/src/logic/handlers/collect-feature-bonus.handler.ts +301 -0
  113. package/src/logic/handlers/free-spins-bonus.handler.ts +119 -0
  114. package/src/logic/handlers/steering-to-the-fortune-bonus.handler.ts +118 -0
  115. package/src/logic/handlers/treasure-hunt-bonus.handler.ts +232 -0
  116. package/src/rng/DummyRngClient.ts +108 -0
  117. package/src/rng/rng-client.factory.ts +27 -0
  118. package/src/rng/rng-client.interface.ts +38 -0
  119. package/src/rng/rng-service.ts +130 -0
  120. package/src/validation/abstract-game-logic-config.validator.ts +20 -0
  121. package/src/validation/bonnys-fortune/bonnys-fortune-config.dto.ts +371 -0
  122. package/src/validation/bonnys-fortune/bonnys-fortune-config.validator.ts +8 -0
  123. package/src/validation/custom-decorators/IsNestedIntArray.ts +29 -0
  124. package/src/validation/game-logic-config-validation.service.ts +28 -0
  125. package/src/validation/reel-strips-config-validation.service.ts +29 -0
@@ -0,0 +1,32 @@
1
+ import { BonnysFortunePrivateState, BonnysFortunePublicState } from './logic/bonnys-fortune.types';
2
+ import { CommandProcessingResult, GameActionCommand, GameEngine, GameEngineConfig, GameEngineInfo } from './game-engine.interface';
3
+ import { BonnysFortuneGameLogic } from './logic/bonnys-fortune.game-logic';
4
+ import { GameLogicConfigLoader } from './config/game-logic-config/game-logic-config-loader';
5
+ import { GameLogicConfigValidationService } from './validation/game-logic-config-validation.service';
6
+ import { Logger } from './logger/logger';
7
+ import { ReelStripsConfigLoader } from './config/reel-strips-config/reel-strips-config-loader';
8
+ import { ReelStripsConfigMapper } from './domain/mappers/reel-strips-config.mapper';
9
+ import { ReelStripsConfigValidationService } from './validation/reel-strips-config-validation.service';
10
+ import { RngService } from './rng/rng-service';
11
+ export declare class BonnysFortuneV1GameEngine implements GameEngine<BonnysFortunePublicState, BonnysFortunePrivateState, any> {
12
+ private readonly gameCode;
13
+ private readonly version;
14
+ private readonly rtp;
15
+ private readonly gameType;
16
+ private readonly gameName;
17
+ private readonly provider;
18
+ private config;
19
+ private reels;
20
+ readonly configOutPort: GameLogicConfigLoader;
21
+ readonly reelsOutPort: ReelStripsConfigLoader;
22
+ readonly configValidator: GameLogicConfigValidationService;
23
+ readonly reelsValidator: ReelStripsConfigValidationService;
24
+ readonly reelMapper: ReelStripsConfigMapper;
25
+ readonly gameLogic: BonnysFortuneGameLogic;
26
+ readonly rngService: RngService;
27
+ readonly logger: Logger;
28
+ constructor(config?: GameEngineConfig);
29
+ getGameEngineInfo(): GameEngineInfo;
30
+ private preload;
31
+ processCommand(publicState: BonnysFortunePublicState, privateState: BonnysFortunePrivateState, command: GameActionCommand): Promise<CommandProcessingResult<BonnysFortunePublicState, BonnysFortunePrivateState, any>>;
32
+ }
@@ -13,7 +13,7 @@ const reel_strips_config_validation_service_1 = require("./validation/reel-strip
13
13
  const rng_client_factory_1 = require("./rng/rng-client.factory");
14
14
  const rng_service_1 = require("./rng/rng-service");
15
15
  class BonnysFortuneV1GameEngine {
16
- constructor() {
16
+ constructor(config = {}) {
17
17
  this.gameCode = 'bonnys-fortune';
18
18
  this.version = '1.0.0';
19
19
  this.rtp = 96;
@@ -23,7 +23,7 @@ class BonnysFortuneV1GameEngine {
23
23
  this.logger = new logger_1.Logger('BonnysFortuneV1Engine');
24
24
  this.configOutPort = new file_system_game_logic_config_loader_1.FileSystemGameLogicConfigLoader();
25
25
  this.reelsOutPort = new file_system_reel_strips_config_loader_1.FileSystemReelStripsConfigLoader();
26
- const rngClient = rng_client_factory_1.RngClientFactory.create();
26
+ const rngClient = rng_client_factory_1.RngClientFactory.create({ metrics: config.metrics });
27
27
  this.rngService = new rng_service_1.RngService(rngClient);
28
28
  this.configValidator = new game_logic_config_validation_service_1.GameLogicConfigValidationService();
29
29
  this.reelsValidator = new reel_strips_config_validation_service_1.ReelStripsConfigValidationService();
@@ -70,12 +70,7 @@ class BonnysFortuneV1GameEngine {
70
70
  if (!baseReels) {
71
71
  throw new Error('Base game reels not found');
72
72
  }
73
- // Ensure gameConfig has required fields with defaults
74
- const gameConfig = {
75
- betAmountThresholds: command.payload?.betAmountThresholds ?? [0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100],
76
- defaultBetAmount: command.payload?.defaultBetAmount ?? command.payload?.betStake ?? 1,
77
- };
78
- const result = await this.gameLogic.initSessionState(this.config, baseReels, gameConfig, command.id);
73
+ const result = await this.gameLogic.initSessionState(this.config, baseReels, command.payload, command.id);
79
74
  const rngOutcome = this.rngService.getRngOutcomeForCommand(command.id);
80
75
  this.rngService.removeCommand(command.id);
81
76
  return {
@@ -1 +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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"}
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,4 @@
1
+ import { GameLogicConfigLoader } from './game-logic-config-loader';
2
+ export declare class FileSystemGameLogicConfigLoader implements GameLogicConfigLoader {
3
+ loadConfig<T>(gameId: string, variantId: string): Promise<T | null>;
4
+ }
@@ -0,0 +1,3 @@
1
+ export interface GameLogicConfigLoader {
2
+ loadConfig<T>(gameId: string, variantId: string): Promise<T | null>;
3
+ }
@@ -0,0 +1,2 @@
1
+ import { BonnysFortuneGameLogicConfigInterface } from '../../logic/game-logic-config.interface';
2
+ export declare const gameLogicConfig: BonnysFortuneGameLogicConfigInterface;
@@ -0,0 +1,4 @@
1
+ import { ReelStripsConfigLoader } from './reel-strips-config-loader';
2
+ export declare class FileSystemReelStripsConfigLoader implements ReelStripsConfigLoader {
3
+ loadConfig(gameId: string, variantId: string, reelSetName: string, reelsCount: number, optionsCount: number): Promise<number[][][]>;
4
+ }
@@ -0,0 +1,4 @@
1
+ export declare class ReelStripOptionDto {
2
+ symbols: number[];
3
+ constructor(symbols: number[]);
4
+ }
@@ -0,0 +1,3 @@
1
+ export interface ReelStripsConfigLoader {
2
+ loadConfig(gameId: string, variantId: string, reelSetName: string, reelsCount: number, optionsCount: number): Promise<number[][][]>;
3
+ }
@@ -0,0 +1,5 @@
1
+ import { ReelDto } from './reel.dto';
2
+ export declare class ReelStripsConfigDto {
3
+ reels: ReelDto[];
4
+ constructor(reels: ReelDto[]);
5
+ }
@@ -0,0 +1,5 @@
1
+ import { ReelStripOptionDto } from './reel-strip-option.dto';
2
+ export declare class ReelDto {
3
+ options: ReelStripOptionDto[];
4
+ constructor(options: ReelStripOptionDto[]);
5
+ }
@@ -0,0 +1,9 @@
1
+ export declare enum GameRoundType {
2
+ BASE = "BASE",
3
+ BONUS = "BONUS"
4
+ }
5
+ export type BonusProgress = {
6
+ completed: number;
7
+ remaining: number;
8
+ total: number;
9
+ };
@@ -0,0 +1,4 @@
1
+ import { ReelStripsConfig } from '../reel-strips-config';
2
+ export declare class ReelStripsConfigMapper {
3
+ mapRawToDomain(rawReels: number[][][]): ReelStripsConfig;
4
+ }
@@ -0,0 +1,7 @@
1
+ export declare class ReelStripOption {
2
+ readonly symbols: number[];
3
+ constructor(symbols: number[]);
4
+ getSymbols(): number[];
5
+ get length(): number;
6
+ getSymbolAt(position: number): number;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { Reel } from './reel';
2
+ export declare class ReelStripsConfig {
3
+ readonly reels: Reel[];
4
+ constructor(reels: Reel[]);
5
+ getReels(): Reel[];
6
+ getReel(index: number): Reel;
7
+ get reelsCount(): number;
8
+ get optionsCount(): number;
9
+ }
@@ -0,0 +1,8 @@
1
+ import { ReelStripOption } from './reel-strip-option';
2
+ export declare class Reel {
3
+ readonly options: ReelStripOption[];
4
+ constructor(options: ReelStripOption[]);
5
+ getOptions(): ReelStripOption[];
6
+ getOption(index: number): ReelStripOption;
7
+ get numberOfOptions(): number;
8
+ }
@@ -0,0 +1,5 @@
1
+ export type CheatTriggerBonusCommand = {
2
+ sessionId: string;
3
+ bonusType: string;
4
+ betAmount: number;
5
+ };
@@ -0,0 +1,5 @@
1
+ export interface CheatTriggerBonusRequestDto {
2
+ sessionId: string;
3
+ bonusType: string;
4
+ betAmount: number;
5
+ }
@@ -0,0 +1,5 @@
1
+ export type CheatUpdateBonusMeterProgressCommand = {
2
+ sessionId: string;
3
+ bonusType: string;
4
+ progress: number;
5
+ };
@@ -0,0 +1,5 @@
1
+ export interface CheatUpdateBonusMeterProgressRequestDto {
2
+ sessionId: string;
3
+ bonusType: string;
4
+ progress: number;
5
+ }
@@ -0,0 +1,8 @@
1
+ export type GameSpinCommand = {
2
+ sessionId: string;
3
+ betAmount: number;
4
+ gameCode: string;
5
+ gameVersion: string;
6
+ lines?: number;
7
+ creditsPerLine?: number;
8
+ };
@@ -0,0 +1,8 @@
1
+ export interface GameSpinInputDto {
2
+ sessionId: string;
3
+ betAmount: number;
4
+ gameCode: string;
5
+ gameVersion: string;
6
+ lines?: number;
7
+ creditsPerLine?: number;
8
+ }
@@ -0,0 +1,119 @@
1
+ export declare enum SpinType {
2
+ BASE_GAME_SPIN = "BASE_GAME_SPIN",
3
+ BONUS_GAME_1_SPIN = "BONUS_GAME_1_SPIN",
4
+ BONUS_GAME_2_SPIN = "BONUS_GAME_2_SPIN",
5
+ BONUS_GAME_3_SPIN = "BONUS_GAME_3_SPIN",
6
+ COLLECT_FEATURE_SPIN = "COLLECT_FEATURE_SPIN"
7
+ }
8
+ export declare enum PrizeType {
9
+ MULTIPLIER = "MULTIPLIER",
10
+ BONUS = "BONUS"
11
+ }
12
+ /** Triggered bonus */
13
+ export interface TriggeredBonusDto {
14
+ bonusId: string;
15
+ bonusType: string;
16
+ betAmount: number;
17
+ }
18
+ /** Winning line */
19
+ export interface WinningLineDto {
20
+ win: number;
21
+ ways: number;
22
+ symbol: number;
23
+ positions: number[][];
24
+ multiplier: number;
25
+ consecutiveReels: number;
26
+ }
27
+ /** Win result */
28
+ export interface WinResultDto {
29
+ totalWin: number;
30
+ winningLines: WinningLineDto[];
31
+ }
32
+ /** Bonus meter */
33
+ export interface BonusMeterDto {
34
+ progress: number;
35
+ symbolId: number;
36
+ threshold: number;
37
+ symbolName: string;
38
+ }
39
+ /** Public state */
40
+ export interface PublicStateDto {
41
+ bonusMeters: Record<string, BonusMeterDto>;
42
+ }
43
+ /** Base Game Spin */
44
+ export interface BaseGameSpinResultDto {
45
+ spinType: SpinType;
46
+ screen: number[][];
47
+ winResult: WinResultDto;
48
+ playerWinning: number;
49
+ nextSpinType: SpinType;
50
+ triggeredBonus?: TriggeredBonusDto;
51
+ }
52
+ /** Treasure Hunt (Bonus Game 1) */
53
+ export interface TreasureHuntSpinResultDto {
54
+ spinType: SpinType;
55
+ selection: string;
56
+ multiplier: number;
57
+ multiplierCounts: Record<string, number>;
58
+ winningMultiplier: number | null;
59
+ winningCount: number;
60
+ totalMultiplier: number;
61
+ }
62
+ /** Free Spin (Bonus Game 2) */
63
+ export interface FreeSpinResultDto {
64
+ spinType: SpinType;
65
+ screen: number[][];
66
+ playerWinning: number;
67
+ nextSpinType: SpinType;
68
+ multiplier: number;
69
+ }
70
+ /** Steering to the Fortune (Bonus Game 3) */
71
+ export interface SteeringToTheFortuneResultDto {
72
+ spinType: SpinType;
73
+ playerWinning: number;
74
+ nextSpinType: SpinType;
75
+ prizeType: PrizeType;
76
+ prizeValue?: number | string;
77
+ totalMultiplier: number;
78
+ triggeredBonus?: TriggeredBonusDto;
79
+ }
80
+ /** Collect Feature Spin */
81
+ export interface CollectFeatureSpinResultDto {
82
+ spinIndex?: number;
83
+ spinType: SpinType;
84
+ symbols?: string[];
85
+ slashed?: boolean[];
86
+ currentValues?: number;
87
+ currentMultipliers?: number;
88
+ totalValues?: number;
89
+ totalMultipliers?: number;
90
+ playerWinning: number;
91
+ totalWin?: number;
92
+ spinsLeft?: number;
93
+ nextSpinType: SpinType;
94
+ }
95
+ export interface BaseGameSpinResultWrapperDto {
96
+ result: BaseGameSpinResultDto;
97
+ }
98
+ export interface FreeSpinResultWrapperDto {
99
+ result: FreeSpinResultDto;
100
+ }
101
+ export interface TreasureHuntSpinResultWrapperDto {
102
+ result: TreasureHuntSpinResultDto;
103
+ }
104
+ export interface SteeringToTheFortuneResultWrapperDto {
105
+ result: SteeringToTheFortuneResultDto;
106
+ }
107
+ export interface CollectFeatureSpinResultWrapperDto {
108
+ result: CollectFeatureSpinResultDto;
109
+ }
110
+ /** Game Spin Output DTO */
111
+ export interface GameSpinOutputDto {
112
+ sessionId: string;
113
+ balance: number;
114
+ betAmount: number;
115
+ balanceBeforeSpin: number;
116
+ outcome: BaseGameSpinResultWrapperDto;
117
+ publicState: PublicStateDto;
118
+ lastSpin: BaseGameSpinResultWrapperDto | FreeSpinResultWrapperDto | TreasureHuntSpinResultWrapperDto | SteeringToTheFortuneResultWrapperDto | CollectFeatureSpinResultWrapperDto | null;
119
+ }
@@ -0,0 +1,10 @@
1
+ export interface GameSymbol {
2
+ symbolId: number;
3
+ name: string;
4
+ multipliers: Record<'x3' | 'x4' | 'x5', number>;
5
+ isWild: boolean;
6
+ isScatter: boolean;
7
+ }
8
+ export declare class GameSymbolsResponseDto {
9
+ symbols: GameSymbol[];
10
+ }
@@ -0,0 +1,4 @@
1
+ export declare class ReelStripOptionDto {
2
+ symbols: number[];
3
+ constructor(symbols: number[]);
4
+ }
@@ -0,0 +1,5 @@
1
+ import { ReelDto } from './reel.dto';
2
+ export declare class ReelStripsConfigDto {
3
+ reels: ReelDto[];
4
+ constructor(reels: ReelDto[]);
5
+ }
@@ -0,0 +1,5 @@
1
+ import { ReelStripOptionDto } from './reel-strip-option.dto';
2
+ export declare class ReelDto {
3
+ options: ReelStripOptionDto[];
4
+ constructor(options: ReelStripOptionDto[]);
5
+ }
@@ -0,0 +1,8 @@
1
+ export type StartBonusRoundCommand = {
2
+ sessionId: string;
3
+ bonusId: string;
4
+ bonusType: string;
5
+ betAmount: number;
6
+ gameCode: string;
7
+ gameVersion: string;
8
+ };
@@ -0,0 +1,10 @@
1
+ export interface StartBonusRoundInputDto {
2
+ sessionId: string;
3
+ bonusType: string;
4
+ betAmount: number;
5
+ gameCode: string;
6
+ gameVersion: string;
7
+ lines?: number;
8
+ creditsPerLine?: number;
9
+ bonusId: string;
10
+ }
@@ -0,0 +1,41 @@
1
+ import { RngClientConfig } from '@omnitronix/rng-client-core';
2
+ export type GameEngineMetricsHandlers = RngClientConfig['metrics']['handlers'];
3
+ export interface GameEngineConfig {
4
+ metrics?: {
5
+ handlers: GameEngineMetricsHandlers;
6
+ };
7
+ }
8
+ export interface GameEngineInfo {
9
+ gameCode: string;
10
+ version: string;
11
+ rtp: number;
12
+ gameType: string;
13
+ gameName: string;
14
+ provider: string;
15
+ }
16
+ export interface RngOutcomeRecord {
17
+ result: number;
18
+ seed: number;
19
+ min: number;
20
+ max: number;
21
+ }
22
+ export type RngOutcome = {
23
+ [actionId: string]: RngOutcomeRecord;
24
+ };
25
+ export interface CommandProcessingResult<TPublicState = any, TPrivateState = any, TOutcome = any> {
26
+ success: boolean;
27
+ publicState: TPublicState;
28
+ privateState: TPrivateState;
29
+ outcome?: TOutcome;
30
+ message?: string;
31
+ rngOutcome?: RngOutcome;
32
+ }
33
+ export interface GameActionCommand<TPayload = any> {
34
+ id: string;
35
+ type: string;
36
+ payload?: TPayload;
37
+ }
38
+ export interface GameEngine<TPublicState = any, TPrivateState = any, TOutcome = any> {
39
+ processCommand(publicState: TPublicState, privateState: TPrivateState, command: GameActionCommand): Promise<CommandProcessingResult<TPublicState, TPrivateState, TOutcome>>;
40
+ getGameEngineInfo(): GameEngineInfo;
41
+ }
@@ -0,0 +1 @@
1
+ export declare const generateHash: (input: string) => string;
@@ -0,0 +1,23 @@
1
+ export declare class NumberHelper {
2
+ /**
3
+ * Safely formats a number to the specified decimal places,
4
+ * minimizing floating-point issues.
5
+ */
6
+ static toFixedNumber(value: number, decimals: number): number;
7
+ /**
8
+ * Safely adds two numbers and formats result.
9
+ */
10
+ static safeSum(a: number, b: number, decimals: number): number;
11
+ /**
12
+ * Safely multiplies two numbers and formats result.
13
+ */
14
+ static safeMultiply(a: number, b: number, decimals: number): number;
15
+ /**
16
+ * Clamps a number between min and max.
17
+ */
18
+ static clamp(value: number, min: number, max: number): number;
19
+ /**
20
+ * Safely divides two numbers.
21
+ */
22
+ static safeDivide(a: number, b: number, decimals: number): number;
23
+ }
@@ -0,0 +1 @@
1
+ export declare const optionalBooleanMapper: Map<string, boolean>;
@@ -0,0 +1,3 @@
1
+ export declare class UuidHelper {
2
+ static generateUuid(): string;
3
+ }
@@ -0,0 +1,14 @@
1
+ import { ValidationError } from 'class-validator';
2
+ export declare class ValidationHelper {
3
+ static readonly validationOptions: {
4
+ whitelist: boolean;
5
+ forbidNonWhitelisted: boolean;
6
+ };
7
+ static readonly validationOptionsWithoutForbidden: {
8
+ whitelist: boolean;
9
+ forbidNonWhitelisted: boolean;
10
+ };
11
+ static validate<T extends object>(dto: T): Promise<ValidationError[]>;
12
+ static validateWithoutForbidden<T extends object>(dto: T): Promise<ValidationError[]>;
13
+ static isPlainObject(value: unknown): value is Record<string, any>;
14
+ }
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ export { BonnysFortuneV1GameEngine } from './bonnys-fortune-v1.game-engine';
@@ -0,0 +1,22 @@
1
+ type LogFormat = 'json' | 'pretty';
2
+ export declare class Logger {
3
+ private readonly logger;
4
+ private context;
5
+ constructor(context: string, logFormat?: LogFormat);
6
+ private detectLogFormat;
7
+ private createWinstonLogger;
8
+ private getLogFormat;
9
+ private selectFormat;
10
+ private getJsonFormat;
11
+ private getPrettyFormat;
12
+ private safeStringify;
13
+ private getTransports;
14
+ log(message: any, { level, ...rest }?: {
15
+ level?: string;
16
+ } & Record<string, any>): void;
17
+ error(message: any, ...optionalParams: any[]): void;
18
+ warn(message: any, ...optionalParams: any[]): void;
19
+ debug(message: any, ...optionalParams: any[]): void;
20
+ verbose(message: any, ...optionalParams: any[]): void;
21
+ }
22
+ export {};
@@ -0,0 +1,32 @@
1
+ import { BonnysFortuneBaseGameSpinResult, BonnysFortunePrivateState, BonnysFortunePublicState, CheatTriggerBonusResult, CheatUpdateBonusMeterProgressResult, GetSymbolsResult, SpinResultResponse, StartBonusRoundResult } from './bonnys-fortune.types';
2
+ import { BonnysFortuneGameLogicConfigInterface, BonnysFortuneSessionStateInterface } from './game-logic-config.interface';
3
+ import { CheatTriggerBonusRequestDto } from '../domain/types/cheat-trigger-bonus-request.dto';
4
+ import { CheatUpdateBonusMeterProgressRequestDto } from '../domain/types/cheat-update-bonus-meter-progress-request.dto';
5
+ import { GameActionCommand } from '../game-engine.interface';
6
+ import { GameSpinInputDto } from '../domain/types/game-spin-input.dto';
7
+ import { ReelStripsConfig } from '../domain/reel-strips-config';
8
+ import { RngService } from '../rng/rng-service';
9
+ import { StartBonusRoundInputDto } from '../domain/types/start-bonus-round-input.dto';
10
+ export declare class BonnysFortuneGameLogic {
11
+ private readonly rngService;
12
+ constructor(rngService: RngService);
13
+ initSessionState(gameLogicConfig: BonnysFortuneGameLogicConfigInterface, reelStripsConfig: ReelStripsConfig, gameConfig: {
14
+ betAmountThresholds: number[];
15
+ defaultBetAmount: number;
16
+ }, commandId: string): Promise<BonnysFortuneSessionStateInterface>;
17
+ spin(params: GameSpinInputDto, publicState: BonnysFortunePublicState, privateState: BonnysFortunePrivateState, gameLogicConfig: BonnysFortuneGameLogicConfigInterface, reelStripsConfig: ReelStripsConfig, commandId: string): Promise<SpinResultResponse<BonnysFortuneBaseGameSpinResult>>;
18
+ startBonusRound(params: StartBonusRoundInputDto, publicState: BonnysFortunePublicState, privateState: BonnysFortunePrivateState, gameLogicConfig: BonnysFortuneGameLogicConfigInterface, reelStripsConfig: ReelStripsConfig, commandId: string): Promise<StartBonusRoundResult>;
19
+ private drawBonusMeters;
20
+ updateSessionState(publicState: BonnysFortunePublicState, privateState: BonnysFortunePrivateState, gameLogicConfig: BonnysFortuneGameLogicConfigInterface, command: GameActionCommand<{
21
+ bonusMeters: {
22
+ redraw: string[];
23
+ };
24
+ }>): Promise<BonnysFortuneSessionStateInterface>;
25
+ cheatTriggerBonus(publicState: BonnysFortunePublicState, privateState: BonnysFortunePrivateState, params: CheatTriggerBonusRequestDto): CheatTriggerBonusResult;
26
+ cheatUpdateBonusMeterProgress(publicState: BonnysFortunePublicState, privateState: BonnysFortunePrivateState, params: CheatUpdateBonusMeterProgressRequestDto, gameLogicConfig: BonnysFortuneGameLogicConfigInterface): CheatUpdateBonusMeterProgressResult;
27
+ getSymbols(gameLogicConfig: BonnysFortuneGameLogicConfigInterface): GetSymbolsResult;
28
+ private shouldRedrawMeter;
29
+ private requiresMeterUpdate;
30
+ private getMeterLevel;
31
+ private randomThreshold;
32
+ }
@@ -129,24 +129,26 @@ class BonnysFortuneGameLogic {
129
129
  return { publicState, privateState };
130
130
  }
131
131
  const betAmount = publicState.currentBetAmount;
132
- const bonusMeters = { ...privateState.bonusMetersByAmount[betAmount] };
132
+ const bonusMetersForBetAmount = privateState.bonusMetersByAmount[betAmount];
133
+ if (!bonusMetersForBetAmount) {
134
+ throw new Error(`Bet amount ${betAmount} is not in allowed thresholds`);
135
+ }
133
136
  for (const key of command.payload?.bonusMeters.redraw ?? []) {
134
137
  const cfg = gameLogicConfig.baseGame.bonusGameMeters[key];
135
138
  const { value: threshold } = await this.randomThreshold(cfg.min, cfg.max, command.id, `bonus_meter_redraw_${key}`);
136
139
  const progress = 0;
137
140
  const level = this.getMeterLevel(progress, threshold, cfg.percentageLevels);
138
- bonusMeters[key] = {
139
- ...bonusMeters[key],
141
+ bonusMetersForBetAmount[key] = {
142
+ ...bonusMetersForBetAmount[key],
140
143
  threshold,
141
144
  progress,
142
145
  level,
143
146
  };
144
147
  }
145
- privateState.bonusMetersByAmount[betAmount] = bonusMeters;
146
148
  return {
147
149
  publicState: {
148
150
  ...publicState,
149
- bonusMeters,
151
+ bonusMeters: bonusMetersForBetAmount,
150
152
  },
151
153
  privateState,
152
154
  };
@@ -176,7 +178,11 @@ class BonnysFortuneGameLogic {
176
178
  }
177
179
  cheatUpdateBonusMeterProgress(publicState, privateState, params, gameLogicConfig) {
178
180
  const betAmount = publicState.currentBetAmount;
179
- const currentPrivateMeter = privateState.bonusMetersByAmount[betAmount][params.bonusType];
181
+ const bonusMetersForBetAmount = privateState.bonusMetersByAmount[betAmount];
182
+ if (!bonusMetersForBetAmount) {
183
+ throw new Error(`Bet amount ${betAmount} is not in allowed thresholds`);
184
+ }
185
+ const currentPrivateMeter = bonusMetersForBetAmount[params.bonusType];
180
186
  if (!currentPrivateMeter) {
181
187
  throw new Error(`Bonus meter ${params.bonusType} not found for bet amount ${betAmount}`);
182
188
  }
@@ -191,7 +197,7 @@ class BonnysFortuneGameLogic {
191
197
  level: newLevel,
192
198
  };
193
199
  privateState.bonusMetersByAmount[betAmount] = {
194
- ...privateState.bonusMetersByAmount[betAmount],
200
+ ...bonusMetersForBetAmount,
195
201
  [params.bonusType]: updatedMeter,
196
202
  };
197
203
  publicState = {