@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.
- package/dist/__tests__/bonnys-fortune-v1.game-engine.test.d.ts +1 -0
- package/dist/bonnys-fortune-v1.game-engine.d.ts +32 -0
- package/dist/bonnys-fortune-v1.game-engine.js +3 -8
- package/dist/bonnys-fortune-v1.game-engine.js.map +1 -1
- package/dist/config/game-logic-config/file-system.game-logic-config-loader.d.ts +4 -0
- package/dist/config/game-logic-config/game-logic-config-loader.d.ts +3 -0
- package/dist/config/game-logic-config/game-logic-config.d.ts +2 -0
- package/dist/config/reel-strips-config/file-system.reel-strips-config-loader.d.ts +4 -0
- package/dist/config/reel-strips-config/reel-strip-option.dto.d.ts +4 -0
- package/dist/config/reel-strips-config/reel-strips-config-loader.d.ts +3 -0
- package/dist/config/reel-strips-config/reel-strips-config.dto.d.ts +5 -0
- package/dist/config/reel-strips-config/reel.dto.d.ts +5 -0
- package/dist/domain/game-round.types.d.ts +9 -0
- package/dist/domain/mappers/reel-strips-config.mapper.d.ts +4 -0
- package/dist/domain/reel-strip-option.d.ts +7 -0
- package/dist/domain/reel-strips-config.d.ts +9 -0
- package/dist/domain/reel.d.ts +8 -0
- package/dist/domain/types/cheat-trigger-bonus-command.d.ts +5 -0
- package/dist/domain/types/cheat-trigger-bonus-request.dto.d.ts +5 -0
- package/dist/domain/types/cheat-update-bonus-meter-progress-command.d.ts +5 -0
- package/dist/domain/types/cheat-update-bonus-meter-progress-request.dto.d.ts +5 -0
- package/dist/domain/types/game-spin-command.d.ts +8 -0
- package/dist/domain/types/game-spin-input.dto.d.ts +8 -0
- package/dist/domain/types/game-spin-output.dto.d.ts +119 -0
- package/dist/domain/types/game-symbols.response.dto.d.ts +10 -0
- package/dist/domain/types/reel-strip-option.dto.d.ts +4 -0
- package/dist/domain/types/reel-strips-config.dto.d.ts +5 -0
- package/dist/domain/types/reel.dto.d.ts +5 -0
- package/dist/domain/types/start-bonus-round-command.d.ts +8 -0
- package/dist/domain/types/start-bonus-round-input.dto.d.ts +10 -0
- package/dist/game-engine.interface.d.ts +41 -0
- package/dist/helpers/generate-hash.d.ts +1 -0
- package/dist/helpers/number-helper.d.ts +23 -0
- package/dist/helpers/optional-boolean-mapper.d.ts +1 -0
- package/dist/helpers/uuid-helper.d.ts +3 -0
- package/dist/helpers/validation-helper.d.ts +14 -0
- package/dist/index.d.ts +2 -0
- package/dist/logger/logger.d.ts +22 -0
- package/dist/logic/bonnys-fortune.game-logic.d.ts +32 -0
- package/dist/logic/bonnys-fortune.game-logic.js +13 -7
- package/dist/logic/bonnys-fortune.game-logic.js.map +1 -1
- package/dist/logic/bonnys-fortune.spin-generator.d.ts +19 -0
- package/dist/logic/bonnys-fortune.types.d.ts +170 -0
- package/dist/logic/bonnys-fortune.win-calculator.d.ts +10 -0
- package/dist/logic/game-logic-config.interface.d.ts +178 -0
- package/dist/logic/handlers/base-game.handler.d.ts +15 -0
- package/dist/logic/handlers/base-game.handler.js +5 -1
- package/dist/logic/handlers/base-game.handler.js.map +1 -1
- package/dist/logic/handlers/collect-feature-bonus.handler.d.ts +13 -0
- package/dist/logic/handlers/free-spins-bonus.handler.d.ts +11 -0
- package/dist/logic/handlers/steering-to-the-fortune-bonus.handler.d.ts +11 -0
- package/dist/logic/handlers/treasure-hunt-bonus.handler.d.ts +15 -0
- package/dist/rng/DummyRngClient.d.ts +18 -0
- package/dist/rng/DummyRngClient.js +1 -8
- package/dist/rng/DummyRngClient.js.map +1 -1
- package/dist/rng/rng-client.factory.d.ts +7 -0
- package/dist/rng/rng-client.factory.js +2 -1
- package/dist/rng/rng-client.factory.js.map +1 -1
- package/dist/rng/rng-client.interface.d.ts +16 -0
- package/dist/rng/rng-service.d.ts +26 -0
- package/dist/validation/abstract-game-logic-config.validator.d.ts +4 -0
- package/dist/validation/bonnys-fortune/bonnys-fortune-config.dto.d.ts +129 -0
- package/dist/validation/bonnys-fortune/bonnys-fortune-config.validator.d.ts +5 -0
- package/dist/validation/custom-decorators/IsNestedIntArray.d.ts +2 -0
- package/dist/validation/game-logic-config-validation.service.d.ts +8 -0
- package/dist/validation/reel-strips-config-validation.service.d.ts +5 -0
- package/package.json +4 -3
- package/src/__tests__/bonnys-fortune-v1.game-engine.test.ts +80 -0
- package/src/bonnys-fortune-v1.game-engine.ts +285 -0
- package/src/config/game-logic-config/file-system.game-logic-config-loader.ts +27 -0
- package/src/config/game-logic-config/game-logic-config-loader.ts +3 -0
- package/src/config/game-logic-config/game-logic-config.ts +380 -0
- package/src/config/reel-strips-config/file-system.reel-strips-config-loader.ts +43 -0
- package/src/config/reel-strips-config/reel-strip-option.dto.ts +13 -0
- package/src/config/reel-strips-config/reel-strips-config-loader.ts +9 -0
- package/src/config/reel-strips-config/reel-strips-config.dto.ts +16 -0
- package/src/config/reel-strips-config/reel.dto.ts +16 -0
- package/src/config/reel-strips-config/reels-BASE.csv +52 -0
- package/src/config/reel-strips-config/reels-BONUS.csv +52 -0
- package/src/domain/game-round.types.ts +10 -0
- package/src/domain/mappers/reel-strips-config.mapper.ts +16 -0
- package/src/domain/reel-strip-option.ts +15 -0
- package/src/domain/reel-strips-config.ts +21 -0
- package/src/domain/reel.ts +17 -0
- package/src/domain/types/cheat-trigger-bonus-command.ts +5 -0
- package/src/domain/types/cheat-trigger-bonus-request.dto.ts +5 -0
- package/src/domain/types/cheat-update-bonus-meter-progress-command.ts +6 -0
- package/src/domain/types/cheat-update-bonus-meter-progress-request.dto.ts +5 -0
- package/src/domain/types/game-spin-command.ts +8 -0
- package/src/domain/types/game-spin-input.dto.ts +8 -0
- package/src/domain/types/game-spin-output.dto.ts +142 -0
- package/src/domain/types/game-symbols.response.dto.ts +11 -0
- package/src/domain/types/reel-strip-option.dto.ts +13 -0
- package/src/domain/types/reel-strips-config.dto.ts +15 -0
- package/src/domain/types/reel.dto.ts +15 -0
- package/src/domain/types/start-bonus-round-command.ts +8 -0
- package/src/domain/types/start-bonus-round-input.dto.ts +10 -0
- package/src/game-engine.interface.ts +59 -0
- package/src/helpers/generate-hash.ts +5 -0
- package/src/helpers/number-helper.ts +41 -0
- package/src/helpers/optional-boolean-mapper.ts +5 -0
- package/src/helpers/uuid-helper.ts +7 -0
- package/src/helpers/validation-helper.ts +27 -0
- package/src/index.ts +3 -0
- package/src/logger/logger.ts +178 -0
- package/src/logic/bonnys-fortune.game-logic.ts +490 -0
- package/src/logic/bonnys-fortune.spin-generator.ts +277 -0
- package/src/logic/bonnys-fortune.types.ts +223 -0
- package/src/logic/bonnys-fortune.win-calculator.ts +210 -0
- package/src/logic/game-logic-config.interface.ts +174 -0
- package/src/logic/handlers/base-game.handler.ts +221 -0
- package/src/logic/handlers/collect-feature-bonus.handler.ts +301 -0
- package/src/logic/handlers/free-spins-bonus.handler.ts +119 -0
- package/src/logic/handlers/steering-to-the-fortune-bonus.handler.ts +118 -0
- package/src/logic/handlers/treasure-hunt-bonus.handler.ts +232 -0
- package/src/rng/DummyRngClient.ts +108 -0
- package/src/rng/rng-client.factory.ts +27 -0
- package/src/rng/rng-client.interface.ts +38 -0
- package/src/rng/rng-service.ts +130 -0
- package/src/validation/abstract-game-logic-config.validator.ts +20 -0
- package/src/validation/bonnys-fortune/bonnys-fortune-config.dto.ts +371 -0
- package/src/validation/bonnys-fortune/bonnys-fortune-config.validator.ts +8 -0
- package/src/validation/custom-decorators/IsNestedIntArray.ts +29 -0
- package/src/validation/game-logic-config-validation.service.ts +28 -0
- package/src/validation/reel-strips-config-validation.service.ts +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
-
|
|
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":";;;
|
|
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 { 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,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,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,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,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
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
|
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
|
-
|
|
139
|
-
...
|
|
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
|
|
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
|
-
...
|
|
200
|
+
...bonusMetersForBetAmount,
|
|
195
201
|
[params.bonusType]: updatedMeter,
|
|
196
202
|
};
|
|
197
203
|
publicState = {
|