@omnitronix/happy-panda-game-engine 0.0.1
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/README.md +212 -0
- package/dist/__tests__/bonus-sequence.test.js +337 -0
- package/dist/__tests__/bonus-sequence.test.js.map +1 -0
- package/dist/__tests__/cherry-frequency.test.js +128 -0
- package/dist/__tests__/cherry-frequency.test.js.map +1 -0
- package/dist/__tests__/counter-manager.test.js +316 -0
- package/dist/__tests__/counter-manager.test.js.map +1 -0
- package/dist/__tests__/cpp-parity.test.js +368 -0
- package/dist/__tests__/cpp-parity.test.js.map +1 -0
- package/dist/__tests__/fixtures/cpp-parity-vectors.json +438 -0
- package/dist/__tests__/happy-panda-engine.test.js +367 -0
- package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
- package/dist/__tests__/jackpot-manager.test.js +313 -0
- package/dist/__tests__/jackpot-manager.test.js.map +1 -0
- package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
- package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
- package/dist/__tests__/rtp-1million.test.js +156 -0
- package/dist/__tests__/rtp-1million.test.js.map +1 -0
- package/dist/__tests__/rtp-analysis.test.js +138 -0
- package/dist/__tests__/rtp-analysis.test.js.map +1 -0
- package/dist/__tests__/rtp-diagnostic.test.js +126 -0
- package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
- package/dist/__tests__/rtp-simulation.test.js +409 -0
- package/dist/__tests__/rtp-simulation.test.js.map +1 -0
- package/dist/__tests__/special-wins.test.js +179 -0
- package/dist/__tests__/special-wins.test.js.map +1 -0
- package/dist/__tests__/spin-generator.test.js +250 -0
- package/dist/__tests__/spin-generator.test.js.map +1 -0
- package/dist/__tests__/spin-handler.test.js +210 -0
- package/dist/__tests__/spin-handler.test.js.map +1 -0
- package/dist/__tests__/symbol-distribution.test.js +119 -0
- package/dist/__tests__/symbol-distribution.test.js.map +1 -0
- package/dist/__tests__/weighted-random.test.js +165 -0
- package/dist/__tests__/weighted-random.test.js.map +1 -0
- package/dist/__tests__/win-evaluator.test.js +254 -0
- package/dist/__tests__/win-evaluator.test.js.map +1 -0
- package/dist/config/happy-panda.config.js +714 -0
- package/dist/config/happy-panda.config.js.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/domain/index.js +21 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/types.js +28 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/engine/happy-panda-engine.js +197 -0
- package/dist/engine/happy-panda-engine.js.map +1 -0
- package/dist/engine/index.js +21 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logic/handlers/index.js +21 -0
- package/dist/logic/handlers/index.js.map +1 -0
- package/dist/logic/handlers/spin-handler.js +256 -0
- package/dist/logic/handlers/spin-handler.js.map +1 -0
- package/dist/logic/index.js +22 -0
- package/dist/logic/index.js.map +1 -0
- package/dist/logic/services/counter-manager.js +265 -0
- package/dist/logic/services/counter-manager.js.map +1 -0
- package/dist/logic/services/index.js +23 -0
- package/dist/logic/services/index.js.map +1 -0
- package/dist/logic/services/jackpot-manager.js +142 -0
- package/dist/logic/services/jackpot-manager.js.map +1 -0
- package/dist/logic/services/win-evaluator.js +470 -0
- package/dist/logic/services/win-evaluator.js.map +1 -0
- package/dist/rng/index.js +22 -0
- package/dist/rng/index.js.map +1 -0
- package/dist/rng/spin-generator.js +341 -0
- package/dist/rng/spin-generator.js.map +1 -0
- package/dist/rng/weighted-random.js +58 -0
- package/dist/rng/weighted-random.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Jackpot Manager Service
|
|
4
|
+
*
|
|
5
|
+
* Manages progressive jackpot and pool jackpot values.
|
|
6
|
+
*
|
|
7
|
+
* Progressive Jackpot (Bonus Jackpot):
|
|
8
|
+
* - Starts at 100 x bet_game
|
|
9
|
+
* - On losing paid spins: 3/13 chance to increase by 1-2 x bet_stake
|
|
10
|
+
* - Max: 1000 x bet_game
|
|
11
|
+
* - Paid when Jackpot Bonus triggered
|
|
12
|
+
*
|
|
13
|
+
* Pool Jackpot:
|
|
14
|
+
* - Starts at 0
|
|
15
|
+
* - Increases when Seven/Super Seven in center with no wins
|
|
16
|
+
* - Max: 250 x bet_game
|
|
17
|
+
* - Paid when Bell Bonus triggered
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.createInitialJackpots = createInitialJackpots;
|
|
21
|
+
exports.updateProgressiveJackpot = updateProgressiveJackpot;
|
|
22
|
+
exports.payProgressiveJackpot = payProgressiveJackpot;
|
|
23
|
+
exports.updatePoolJackpot = updatePoolJackpot;
|
|
24
|
+
exports.payPoolJackpot = payPoolJackpot;
|
|
25
|
+
exports.updateJackpots = updateJackpots;
|
|
26
|
+
const happy_panda_config_1 = require("../../config/happy-panda.config");
|
|
27
|
+
const weighted_random_1 = require("../../rng/weighted-random");
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// JACKPOT INITIALIZATION
|
|
30
|
+
// =============================================================================
|
|
31
|
+
/**
|
|
32
|
+
* Create initial jackpot state.
|
|
33
|
+
*/
|
|
34
|
+
function createInitialJackpots(betGame) {
|
|
35
|
+
return {
|
|
36
|
+
bonusJackpotValue: happy_panda_config_1.BONUS_JACKPOT.INIT * betGame,
|
|
37
|
+
poolJackpotValue: happy_panda_config_1.POOL_JACKPOT.INIT * betGame,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// =============================================================================
|
|
41
|
+
// PROGRESSIVE JACKPOT
|
|
42
|
+
// =============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Update progressive jackpot value on losing paid spin.
|
|
45
|
+
* 3/13 probability to increase.
|
|
46
|
+
*/
|
|
47
|
+
async function updateProgressiveJackpot(currentValue, gameDirection, betGame, betStake, spinType, totalWin, rng) {
|
|
48
|
+
// Only on paid spins with no win
|
|
49
|
+
if (spinType !== happy_panda_config_1.SpinType.PAID_SPIN || totalWin > 0) {
|
|
50
|
+
return currentValue;
|
|
51
|
+
}
|
|
52
|
+
// Check if should increase (3/13 probability)
|
|
53
|
+
const [yesWeight, noWeight] = happy_panda_config_1.BONUS_JACKPOT.INCREMENT_WEIGHTS[gameDirection];
|
|
54
|
+
const shouldIncrease = await (0, weighted_random_1.weightedBoolean)(yesWeight, noWeight, rng);
|
|
55
|
+
if (!shouldIncrease) {
|
|
56
|
+
return currentValue;
|
|
57
|
+
}
|
|
58
|
+
// Increase by increment value
|
|
59
|
+
const increment = happy_panda_config_1.BONUS_JACKPOT.INCREMENT_VALUE[gameDirection] * betStake;
|
|
60
|
+
let newValue = currentValue + increment;
|
|
61
|
+
// Cap at maximum
|
|
62
|
+
const maxValue = happy_panda_config_1.BONUS_JACKPOT.MAX * betGame;
|
|
63
|
+
if (newValue > maxValue) {
|
|
64
|
+
newValue = maxValue;
|
|
65
|
+
}
|
|
66
|
+
return newValue;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Pay out progressive jackpot and reset.
|
|
70
|
+
*/
|
|
71
|
+
function payProgressiveJackpot(currentValue, betGame) {
|
|
72
|
+
const payout = currentValue;
|
|
73
|
+
const newValue = happy_panda_config_1.BONUS_JACKPOT.INIT * betGame;
|
|
74
|
+
return { payout, newValue };
|
|
75
|
+
}
|
|
76
|
+
// =============================================================================
|
|
77
|
+
// POOL JACKPOT
|
|
78
|
+
// =============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Update pool jackpot value.
|
|
81
|
+
* Increases when Seven/Super Seven in center position with no wins.
|
|
82
|
+
* IMPORTANT: Must be the ONLY Seven on the entire screen (per C++ math model).
|
|
83
|
+
*/
|
|
84
|
+
function updatePoolJackpot(currentValue, grid, gameDirection, betGame, betStake, spinType, totalWin) {
|
|
85
|
+
// Only on paid spins with no win
|
|
86
|
+
if (spinType !== happy_panda_config_1.SpinType.PAID_SPIN || totalWin > 0) {
|
|
87
|
+
return currentValue;
|
|
88
|
+
}
|
|
89
|
+
// Check center position (1,1)
|
|
90
|
+
const centerSymbol = grid[1][1];
|
|
91
|
+
if (!happy_panda_config_1.SEVEN_SYMBOLS.includes(centerSymbol)) {
|
|
92
|
+
return currentValue;
|
|
93
|
+
}
|
|
94
|
+
// Count ALL Sevens on the screen - must be exactly 1
|
|
95
|
+
let sevenCount = 0;
|
|
96
|
+
for (let reel = 0; reel < 3; reel++) {
|
|
97
|
+
for (let row = 0; row < 3; row++) {
|
|
98
|
+
if (happy_panda_config_1.SEVEN_SYMBOLS.includes(grid[reel][row])) {
|
|
99
|
+
sevenCount++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (sevenCount !== 1) {
|
|
104
|
+
return currentValue; // Only single Seven can trigger pool increment
|
|
105
|
+
}
|
|
106
|
+
// Determine increment based on symbol
|
|
107
|
+
const incrementIdx = centerSymbol === happy_panda_config_1.Symbol.SUPER_SEVEN ? 0 : 1;
|
|
108
|
+
const increment = happy_panda_config_1.POOL_JACKPOT.INCREMENT[gameDirection][incrementIdx] * betStake;
|
|
109
|
+
let newValue = currentValue + increment;
|
|
110
|
+
// Cap at maximum
|
|
111
|
+
const maxValue = happy_panda_config_1.POOL_JACKPOT.MAX * betGame;
|
|
112
|
+
if (newValue > maxValue) {
|
|
113
|
+
newValue = maxValue;
|
|
114
|
+
}
|
|
115
|
+
return newValue;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Pay out pool jackpot and reset.
|
|
119
|
+
*/
|
|
120
|
+
function payPoolJackpot(currentValue, betGame) {
|
|
121
|
+
const payout = currentValue;
|
|
122
|
+
const newValue = happy_panda_config_1.POOL_JACKPOT.INIT * betGame;
|
|
123
|
+
return { payout, newValue };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Update both jackpot values after a spin.
|
|
127
|
+
*/
|
|
128
|
+
async function updateJackpots(currentJackpots, grid, gameDirection, betGame, betStake, spinType, totalWin, rng) {
|
|
129
|
+
const oldProgressiveValue = currentJackpots.bonusJackpotValue;
|
|
130
|
+
const oldPoolValue = currentJackpots.poolJackpotValue;
|
|
131
|
+
const newProgressiveValue = await updateProgressiveJackpot(oldProgressiveValue, gameDirection, betGame, betStake, spinType, totalWin, rng);
|
|
132
|
+
const newPoolValue = updatePoolJackpot(oldPoolValue, grid, gameDirection, betGame, betStake, spinType, totalWin);
|
|
133
|
+
return {
|
|
134
|
+
jackpots: {
|
|
135
|
+
bonusJackpotValue: newProgressiveValue,
|
|
136
|
+
poolJackpotValue: newPoolValue,
|
|
137
|
+
},
|
|
138
|
+
progressiveJackpotIncreased: newProgressiveValue > oldProgressiveValue,
|
|
139
|
+
poolJackpotIncreased: newPoolValue > oldPoolValue,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=jackpot-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jackpot-manager.js","sourceRoot":"","sources":["../../../src/logic/services/jackpot-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Win Evaluator Service
|
|
4
|
+
*
|
|
5
|
+
* Evaluates wins on a 3x3 grid with correct priority:
|
|
6
|
+
* 1. Wall wins (3x3) - suppress line wins
|
|
7
|
+
* 2. Scatter wins (Seven/Super Seven) - suppress line wins
|
|
8
|
+
* 3. Line wins (only if no wall or scatter)
|
|
9
|
+
* 4. Special wins (bonus-specific)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.evaluateWallWin = evaluateWallWin;
|
|
13
|
+
exports.evaluateScatterWins = evaluateScatterWins;
|
|
14
|
+
exports.evaluateLineWins = evaluateLineWins;
|
|
15
|
+
exports.evaluateCherryPieceWins = evaluateCherryPieceWins;
|
|
16
|
+
exports.evaluateBellScatterWins = evaluateBellScatterWins;
|
|
17
|
+
exports.evaluateSuperBarScatterWins = evaluateSuperBarScatterWins;
|
|
18
|
+
exports.evaluateSpin = evaluateSpin;
|
|
19
|
+
const happy_panda_config_1 = require("../../config/happy-panda.config");
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// HELPER FUNCTIONS
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/** Get symbol at position */
|
|
24
|
+
function getSymbol(grid, reel, row) {
|
|
25
|
+
return grid[reel][row];
|
|
26
|
+
}
|
|
27
|
+
/** Get all positions where a symbol appears */
|
|
28
|
+
function findSymbolPositions(grid, symbol) {
|
|
29
|
+
const positions = [];
|
|
30
|
+
for (let reel = 0; reel < happy_panda_config_1.GRID.REELS; reel++) {
|
|
31
|
+
for (let row = 0; row < happy_panda_config_1.GRID.ROWS; row++) {
|
|
32
|
+
if (grid[reel][row] === symbol) {
|
|
33
|
+
positions.push({ reel, row });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return positions;
|
|
38
|
+
}
|
|
39
|
+
/** Count symbol occurrences */
|
|
40
|
+
function countSymbol(grid, symbol) {
|
|
41
|
+
return findSymbolPositions(grid, symbol).length;
|
|
42
|
+
}
|
|
43
|
+
/** Count symbols in a group */
|
|
44
|
+
function countSymbolGroup(grid, symbols) {
|
|
45
|
+
let count = 0;
|
|
46
|
+
for (let reel = 0; reel < happy_panda_config_1.GRID.REELS; reel++) {
|
|
47
|
+
for (let row = 0; row < happy_panda_config_1.GRID.ROWS; row++) {
|
|
48
|
+
if (symbols.includes(grid[reel][row])) {
|
|
49
|
+
count++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return count;
|
|
54
|
+
}
|
|
55
|
+
/** Get all 9 positions */
|
|
56
|
+
function getAllPositions() {
|
|
57
|
+
const positions = [];
|
|
58
|
+
for (let reel = 0; reel < happy_panda_config_1.GRID.REELS; reel++) {
|
|
59
|
+
for (let row = 0; row < happy_panda_config_1.GRID.ROWS; row++) {
|
|
60
|
+
positions.push({ reel, row });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return positions;
|
|
64
|
+
}
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// WALL WIN EVALUATION
|
|
67
|
+
// =============================================================================
|
|
68
|
+
/** Wall win symbols in order of evaluation */
|
|
69
|
+
const WALL_SYMBOLS = [
|
|
70
|
+
happy_panda_config_1.Symbol.BAR3,
|
|
71
|
+
happy_panda_config_1.Symbol.BAR2,
|
|
72
|
+
happy_panda_config_1.Symbol.BAR1,
|
|
73
|
+
happy_panda_config_1.Symbol.MELON,
|
|
74
|
+
happy_panda_config_1.Symbol.BELL,
|
|
75
|
+
happy_panda_config_1.Symbol.PRUNE,
|
|
76
|
+
happy_panda_config_1.Symbol.ORANGE,
|
|
77
|
+
happy_panda_config_1.Symbol.CHERRY, // Includes Super Cherry in the mix
|
|
78
|
+
];
|
|
79
|
+
/**
|
|
80
|
+
* Evaluate wall (3x3) wins.
|
|
81
|
+
* Wall wins require all 9 positions to be the same symbol or valid mix.
|
|
82
|
+
*/
|
|
83
|
+
function evaluateWallWin(grid, betGame) {
|
|
84
|
+
// Check single-symbol walls
|
|
85
|
+
for (let i = 0; i < WALL_SYMBOLS.length; i++) {
|
|
86
|
+
const symbol = WALL_SYMBOLS[i];
|
|
87
|
+
let count;
|
|
88
|
+
if (symbol === happy_panda_config_1.Symbol.CHERRY) {
|
|
89
|
+
// Cherry wall includes Super Cherry
|
|
90
|
+
count = countSymbolGroup(grid, happy_panda_config_1.CHERRY_SYMBOLS);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
count = countSymbol(grid, symbol);
|
|
94
|
+
}
|
|
95
|
+
if (count === 9) {
|
|
96
|
+
// Wall type index mapping to WALL_MULTIPLIERS
|
|
97
|
+
let wallTypeIdx;
|
|
98
|
+
switch (symbol) {
|
|
99
|
+
case happy_panda_config_1.Symbol.BAR3:
|
|
100
|
+
wallTypeIdx = 0;
|
|
101
|
+
break;
|
|
102
|
+
case happy_panda_config_1.Symbol.BAR2:
|
|
103
|
+
wallTypeIdx = 1;
|
|
104
|
+
break;
|
|
105
|
+
case happy_panda_config_1.Symbol.BAR1:
|
|
106
|
+
wallTypeIdx = 2;
|
|
107
|
+
break;
|
|
108
|
+
case happy_panda_config_1.Symbol.MELON:
|
|
109
|
+
wallTypeIdx = 3;
|
|
110
|
+
break;
|
|
111
|
+
case happy_panda_config_1.Symbol.BELL:
|
|
112
|
+
wallTypeIdx = 4;
|
|
113
|
+
break;
|
|
114
|
+
case happy_panda_config_1.Symbol.PRUNE:
|
|
115
|
+
wallTypeIdx = 5;
|
|
116
|
+
break;
|
|
117
|
+
case happy_panda_config_1.Symbol.ORANGE:
|
|
118
|
+
wallTypeIdx = 6;
|
|
119
|
+
break;
|
|
120
|
+
case happy_panda_config_1.Symbol.CHERRY:
|
|
121
|
+
wallTypeIdx = 7;
|
|
122
|
+
break;
|
|
123
|
+
default: continue;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
wallType: happy_panda_config_1.ScreenWinType.SCREEN_BAR3 + wallTypeIdx,
|
|
127
|
+
payout: happy_panda_config_1.WALL_MULTIPLIERS[wallTypeIdx] * betGame,
|
|
128
|
+
positions: getAllPositions(),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Check Any Bar wall (mix of BAR3, BAR2, BAR1, SUPER_BAR per C++ math model)
|
|
133
|
+
const barCount = countSymbolGroup(grid, happy_panda_config_1.BAR_MIX_SYMBOLS);
|
|
134
|
+
if (barCount === 9) {
|
|
135
|
+
return {
|
|
136
|
+
wallType: happy_panda_config_1.ScreenWinType.SCREEN_BAR_ANY,
|
|
137
|
+
payout: happy_panda_config_1.WALL_MULTIPLIERS[8] * betGame, // Any Bar = 50x
|
|
138
|
+
positions: getAllPositions(),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Check All Fruits wall (Melon, Prune, Orange, Cherry, Super Cherry)
|
|
142
|
+
const fruitCount = countSymbolGroup(grid, happy_panda_config_1.FRUIT_SYMBOLS);
|
|
143
|
+
if (fruitCount === 9) {
|
|
144
|
+
return {
|
|
145
|
+
wallType: happy_panda_config_1.ScreenWinType.SCREEN_FRUIT_ANY,
|
|
146
|
+
payout: happy_panda_config_1.WALL_MULTIPLIERS[9] * betGame, // All Fruits = 15x
|
|
147
|
+
positions: getAllPositions(),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// Check All Colors wall (bonus only)
|
|
151
|
+
const colorCount = countSymbolGroup(grid, happy_panda_config_1.COLOR_SYMBOLS);
|
|
152
|
+
if (colorCount === 9) {
|
|
153
|
+
return {
|
|
154
|
+
wallType: happy_panda_config_1.ScreenWinType.SCREEN_COLOR_ANY,
|
|
155
|
+
payout: happy_panda_config_1.WALL_MULTIPLIERS[10] * betGame, // All Colors = 50x
|
|
156
|
+
positions: getAllPositions(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
// =============================================================================
|
|
162
|
+
// SCATTER WIN EVALUATION
|
|
163
|
+
// =============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Evaluate Seven/Super Seven scatter wins.
|
|
166
|
+
* C++ can award TWO scatter wins:
|
|
167
|
+
* 1. Super Seven only scatter (if SEV_S >= 2, doubled if no regular Sevens)
|
|
168
|
+
* 2. Total count scatter (if total >= 2 AND at least 1 regular Seven)
|
|
169
|
+
* Plus +bet_game bonus if exactly 1 Super Seven
|
|
170
|
+
*/
|
|
171
|
+
function evaluateScatterWins(grid, betGame) {
|
|
172
|
+
const wins = [];
|
|
173
|
+
const superSevenCount = countSymbol(grid, happy_panda_config_1.Symbol.SUPER_SEVEN);
|
|
174
|
+
const sevenCount = countSymbol(grid, happy_panda_config_1.Symbol.SEVEN);
|
|
175
|
+
const totalCount = superSevenCount + sevenCount;
|
|
176
|
+
const superSevenPositions = findSymbolPositions(grid, happy_panda_config_1.Symbol.SUPER_SEVEN);
|
|
177
|
+
const sevenPositions = findSymbolPositions(grid, happy_panda_config_1.Symbol.SEVEN);
|
|
178
|
+
const allPositions = [...superSevenPositions, ...sevenPositions];
|
|
179
|
+
// First check: Super Seven only scatter (C++ lines 119-136)
|
|
180
|
+
if (superSevenCount >= happy_panda_config_1.SEVEN_MIN_COUNT) {
|
|
181
|
+
const multiplierIdx = 9 - superSevenCount;
|
|
182
|
+
if (multiplierIdx >= 0 && multiplierIdx < happy_panda_config_1.SEVEN_SCATTER_MULTIPLIERS.length) {
|
|
183
|
+
let payout = happy_panda_config_1.SEVEN_SCATTER_MULTIPLIERS[multiplierIdx] * betGame;
|
|
184
|
+
// Double if NO regular Sevens (C++ lines 130-133)
|
|
185
|
+
if (sevenCount === 0) {
|
|
186
|
+
payout *= happy_panda_config_1.SUPER_SEVEN_MULTIPLIER;
|
|
187
|
+
}
|
|
188
|
+
wins.push({
|
|
189
|
+
symbol: happy_panda_config_1.Symbol.SUPER_SEVEN,
|
|
190
|
+
count: superSevenCount,
|
|
191
|
+
payout,
|
|
192
|
+
positions: superSevenPositions,
|
|
193
|
+
isSuperSevenOnly: sevenCount === 0,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Second check: Total count scatter (C++ lines 139-157)
|
|
198
|
+
// Only if there's at least 1 regular Seven
|
|
199
|
+
if (totalCount >= happy_panda_config_1.SEVEN_MIN_COUNT && sevenCount > 0) {
|
|
200
|
+
const multiplierIdx = 9 - totalCount;
|
|
201
|
+
if (multiplierIdx >= 0 && multiplierIdx < happy_panda_config_1.SEVEN_SCATTER_MULTIPLIERS.length) {
|
|
202
|
+
let payout = happy_panda_config_1.SEVEN_SCATTER_MULTIPLIERS[multiplierIdx] * betGame;
|
|
203
|
+
// Add bet_game bonus if exactly 1 Super Seven (C++ lines 151-154)
|
|
204
|
+
if (superSevenCount === 1) {
|
|
205
|
+
payout += betGame;
|
|
206
|
+
}
|
|
207
|
+
wins.push({
|
|
208
|
+
symbol: happy_panda_config_1.Symbol.SEVEN,
|
|
209
|
+
count: totalCount,
|
|
210
|
+
payout,
|
|
211
|
+
positions: allPositions,
|
|
212
|
+
isSuperSevenOnly: false,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return wins;
|
|
217
|
+
}
|
|
218
|
+
// =============================================================================
|
|
219
|
+
// LINE WIN EVALUATION
|
|
220
|
+
// =============================================================================
|
|
221
|
+
/**
|
|
222
|
+
* Check if symbols on a line match for a win.
|
|
223
|
+
* Returns match info or null if no match.
|
|
224
|
+
*/
|
|
225
|
+
function evaluateLine(grid, lineIndex, betStake) {
|
|
226
|
+
const lineShape = happy_panda_config_1.LINE_SHAPES[lineIndex];
|
|
227
|
+
const positions = lineShape.map(([reel, row]) => ({ reel, row }));
|
|
228
|
+
const symbols = positions.map(p => getSymbol(grid, p.reel, p.row));
|
|
229
|
+
// Check for 3-of-a-kind first
|
|
230
|
+
const firstSymbol = symbols[0];
|
|
231
|
+
// Cherry special case: pays for 1, 2, or 3
|
|
232
|
+
if (happy_panda_config_1.CHERRY_SYMBOLS.includes(firstSymbol)) {
|
|
233
|
+
return evaluateCherryLine(symbols, positions, lineIndex, betStake);
|
|
234
|
+
}
|
|
235
|
+
// Standard 3-of-a-kind
|
|
236
|
+
const allSame = symbols.every(s => s === firstSymbol);
|
|
237
|
+
if (allSame && firstSymbol >= happy_panda_config_1.Symbol.SUPER_SEVEN && firstSymbol <= happy_panda_config_1.Symbol.ORANGE) {
|
|
238
|
+
const multiplier = happy_panda_config_1.LINE_MULTIPLIERS[firstSymbol][2]; // x3 column
|
|
239
|
+
if (multiplier > 0) {
|
|
240
|
+
return {
|
|
241
|
+
lineIndex,
|
|
242
|
+
symbol: firstSymbol,
|
|
243
|
+
matchLength: 3,
|
|
244
|
+
payout: multiplier * betStake,
|
|
245
|
+
positions,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Check Any Bar mix (BAR3, BAR2, BAR1, SUPER_BAR per C++ math model)
|
|
250
|
+
const allBars = symbols.every(s => happy_panda_config_1.BAR_MIX_SYMBOLS.includes(s));
|
|
251
|
+
if (allBars) {
|
|
252
|
+
const multiplier = happy_panda_config_1.LINE_MULTIPLIERS[10][2]; // Any Bar x3 = 10
|
|
253
|
+
return {
|
|
254
|
+
lineIndex,
|
|
255
|
+
symbol: happy_panda_config_1.Symbol.BAR_ANY, // Use BAR_ANY to distinguish from pure BAR1 (for bonus triggers)
|
|
256
|
+
matchLength: 3,
|
|
257
|
+
payout: multiplier * betStake,
|
|
258
|
+
positions,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Evaluate cherry line win.
|
|
265
|
+
* Cherry pays for 1, 2, or 3 matches (including Super Cherry mix).
|
|
266
|
+
*/
|
|
267
|
+
function evaluateCherryLine(symbols, positions, lineIndex, betStake) {
|
|
268
|
+
let matchLength = 0;
|
|
269
|
+
const winPositions = [];
|
|
270
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
271
|
+
if (happy_panda_config_1.CHERRY_SYMBOLS.includes(symbols[i])) {
|
|
272
|
+
matchLength++;
|
|
273
|
+
winPositions.push(positions[i]);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
break; // Cherry must be consecutive from start
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (matchLength === 0) {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
// Cherry multiplier: x1=2, x2=5, x3=10
|
|
283
|
+
const multiplier = happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.CHERRY][matchLength - 1];
|
|
284
|
+
if (multiplier === 0) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
lineIndex,
|
|
289
|
+
symbol: happy_panda_config_1.Symbol.CHERRY,
|
|
290
|
+
matchLength,
|
|
291
|
+
payout: multiplier * betStake,
|
|
292
|
+
positions: winPositions,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Evaluate all line wins.
|
|
297
|
+
*/
|
|
298
|
+
function evaluateLineWins(grid, gameDirection, betStake) {
|
|
299
|
+
const lineCount = happy_panda_config_1.LINES_PER_DIRECTION[gameDirection];
|
|
300
|
+
const wins = [];
|
|
301
|
+
for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) {
|
|
302
|
+
const win = evaluateLine(grid, lineIndex, betStake);
|
|
303
|
+
if (win) {
|
|
304
|
+
wins.push(win);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return wins;
|
|
308
|
+
}
|
|
309
|
+
// =============================================================================
|
|
310
|
+
// SPECIAL WIN EVALUATION (Bonus-specific)
|
|
311
|
+
// =============================================================================
|
|
312
|
+
/**
|
|
313
|
+
* Evaluate cherry piece line wins (Jackpot Bonus).
|
|
314
|
+
* Cherry pieces on lines pay special multiplier.
|
|
315
|
+
*/
|
|
316
|
+
function evaluateCherryPieceWins(grid, gameDirection, betStake) {
|
|
317
|
+
const cherryPieces = [
|
|
318
|
+
happy_panda_config_1.Symbol.CHERRY_00, happy_panda_config_1.Symbol.CHERRY_01, happy_panda_config_1.Symbol.CHERRY_02,
|
|
319
|
+
happy_panda_config_1.Symbol.CHERRY_10, happy_panda_config_1.Symbol.CHERRY_11, happy_panda_config_1.Symbol.CHERRY_12,
|
|
320
|
+
happy_panda_config_1.Symbol.CHERRY_20, happy_panda_config_1.Symbol.CHERRY_21, happy_panda_config_1.Symbol.CHERRY_22,
|
|
321
|
+
];
|
|
322
|
+
// Only check first 8 lines for cherry pieces
|
|
323
|
+
const wins = [];
|
|
324
|
+
let totalLinesWithPieces = 0;
|
|
325
|
+
for (let lineIndex = 0; lineIndex < 8; lineIndex++) {
|
|
326
|
+
const lineShape = happy_panda_config_1.LINE_SHAPES[lineIndex];
|
|
327
|
+
const symbols = lineShape.map(([reel, row]) => grid[reel][row]);
|
|
328
|
+
const allPieces = symbols.every(s => cherryPieces.includes(s));
|
|
329
|
+
if (allPieces) {
|
|
330
|
+
totalLinesWithPieces++;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (totalLinesWithPieces > 0) {
|
|
334
|
+
const multiplier = happy_panda_config_1.SPECIAL_WIN_MULTIPLIERS[gameDirection][0];
|
|
335
|
+
// C++ lines 1520-1545: Per-line payment - each winning line adds to screen_win_sum
|
|
336
|
+
// C++ lines 1956-1957: Cherry pieces are position-specific (CH_00 + reel*3 + row)
|
|
337
|
+
// With position-specific cherries, only geometrically valid lines win (~2.66 avg per spin)
|
|
338
|
+
wins.push({
|
|
339
|
+
winType: happy_panda_config_1.ScreenWinType.SCREEN_CHERRY_PIECES,
|
|
340
|
+
count: totalLinesWithPieces,
|
|
341
|
+
payout: totalLinesWithPieces * multiplier * betStake, // Per-line payout
|
|
342
|
+
positions: getAllPositions(),
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return wins;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Evaluate bell scatter wins (Bell Bonus).
|
|
349
|
+
* Each bell pays as scatter during bonus.
|
|
350
|
+
*/
|
|
351
|
+
function evaluateBellScatterWins(grid, gameDirection, betStake) {
|
|
352
|
+
const bellCount = countSymbol(grid, happy_panda_config_1.Symbol.BELL);
|
|
353
|
+
if (bellCount === 0) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
const multiplier = happy_panda_config_1.SPECIAL_WIN_MULTIPLIERS[gameDirection][1];
|
|
357
|
+
return {
|
|
358
|
+
winType: happy_panda_config_1.ScreenWinType.SCREEN_BELL_SCATTER,
|
|
359
|
+
count: bellCount,
|
|
360
|
+
payout: bellCount * multiplier * betStake,
|
|
361
|
+
positions: findSymbolPositions(grid, happy_panda_config_1.Symbol.BELL),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Evaluate super bar scatter wins (Bar1 Bonus).
|
|
366
|
+
* Each super bar pays as scatter during bonus.
|
|
367
|
+
*/
|
|
368
|
+
function evaluateSuperBarScatterWins(grid, gameDirection, betStake) {
|
|
369
|
+
const superBarCount = countSymbol(grid, happy_panda_config_1.Symbol.SUPER_BAR);
|
|
370
|
+
if (superBarCount === 0) {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
const multiplier = happy_panda_config_1.SPECIAL_WIN_MULTIPLIERS[gameDirection][2];
|
|
374
|
+
return {
|
|
375
|
+
winType: happy_panda_config_1.ScreenWinType.SCREEN_SUPER_BAR,
|
|
376
|
+
count: superBarCount,
|
|
377
|
+
payout: superBarCount * multiplier * betStake,
|
|
378
|
+
positions: findSymbolPositions(grid, happy_panda_config_1.Symbol.SUPER_BAR),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
// =============================================================================
|
|
382
|
+
// MAIN EVALUATION FUNCTION
|
|
383
|
+
// =============================================================================
|
|
384
|
+
/**
|
|
385
|
+
* Evaluate all wins for a spin.
|
|
386
|
+
* Implements correct priority: Wall > Scatter > Lines
|
|
387
|
+
*/
|
|
388
|
+
function evaluateSpin(grid, gameDirection, betStake, betGame, spinType) {
|
|
389
|
+
const result = {
|
|
390
|
+
lineWins: [],
|
|
391
|
+
wallWin: null,
|
|
392
|
+
scatterWins: [],
|
|
393
|
+
specialWins: [],
|
|
394
|
+
totalPayout: 0,
|
|
395
|
+
};
|
|
396
|
+
// C++ simulation loop (lines 2731-2735, 2762-2766) shows:
|
|
397
|
+
// LineWinsCalculating() -> player_current_win += line_wins_sum
|
|
398
|
+
// ScreenWinsCalculating() -> player_current_win += screen_win_sum
|
|
399
|
+
// BOTH are added independently - NO suppression in the simulation!
|
|
400
|
+
//
|
|
401
|
+
// However, C++ header line 116-117 states:
|
|
402
|
+
// "- line wins are suppress (not added) in case of 3x3 wins"
|
|
403
|
+
// This may refer to UI display, not actual math calculation.
|
|
404
|
+
//
|
|
405
|
+
// Screen wins priority: Wall wins suppress scatter wins (not line wins)
|
|
406
|
+
// C++ line 1436: if(screen_win_sum==0) checks for scatter
|
|
407
|
+
// Step 1: Check wall wins (3x3)
|
|
408
|
+
// C++ ScreenWinsCalculating(): BONUS_JACKPOT and RESPIN_CHERRY skip standard screen wins
|
|
409
|
+
// BONUS_JACKPOT has its own special cherry piece evaluation
|
|
410
|
+
// RESPIN_CHERRY has no screen evaluation
|
|
411
|
+
// Other modes (PAID_SPIN, BONUS_CHERRY, BONUS_BELL, BONUS_BAR1) use standard wall/scatter
|
|
412
|
+
const skipScreenWins = spinType === happy_panda_config_1.SpinType.BONUS_JACKPOT || spinType === happy_panda_config_1.SpinType.RESPIN_CHERRY;
|
|
413
|
+
let wallWin = null;
|
|
414
|
+
if (!skipScreenWins) {
|
|
415
|
+
wallWin = evaluateWallWin(grid, betGame);
|
|
416
|
+
if (wallWin) {
|
|
417
|
+
result.wallWin = wallWin;
|
|
418
|
+
result.totalPayout += wallWin.payout;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// Step 2: Check scatter wins (Seven/Super Seven)
|
|
422
|
+
// ONLY if no wall win (C++ line 1436: if screen_win_sum==0)
|
|
423
|
+
// C++ can award up to 2 scatter wins (SEV_S only + total mix)
|
|
424
|
+
// Note: BONUS_JACKPOT and RESPIN_CHERRY skip scatter evaluation
|
|
425
|
+
if (!wallWin && !skipScreenWins) {
|
|
426
|
+
const scatterWins = evaluateScatterWins(grid, betGame);
|
|
427
|
+
if (scatterWins.length > 0) {
|
|
428
|
+
result.scatterWins = scatterWins;
|
|
429
|
+
result.totalPayout += scatterWins.reduce((sum, w) => sum + w.payout, 0);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// Step 3: Line wins
|
|
433
|
+
// C++ header states: "line wins are suppress (not added) in case of 3x3 wins"
|
|
434
|
+
// For PAID_SPIN: Suppress line wins when there's a wall win (brings RTP to ~63.5% matching C++)
|
|
435
|
+
// For BONUS modes: C++ simulation shows both are paid (lines 2762-2766), but bonus symbols
|
|
436
|
+
// rarely form standard line wins anyway (cherry pieces, colors are not line win symbols)
|
|
437
|
+
const shouldSuppressLines = wallWin && spinType === happy_panda_config_1.SpinType.PAID_SPIN;
|
|
438
|
+
if (!shouldSuppressLines) {
|
|
439
|
+
const lineWins = evaluateLineWins(grid, gameDirection, betStake);
|
|
440
|
+
result.lineWins = lineWins;
|
|
441
|
+
result.totalPayout += lineWins.reduce((sum, w) => sum + w.payout, 0);
|
|
442
|
+
}
|
|
443
|
+
// Step 4: Special wins (bonus-specific)
|
|
444
|
+
switch (spinType) {
|
|
445
|
+
case happy_panda_config_1.SpinType.BONUS_JACKPOT: {
|
|
446
|
+
const cherryWins = evaluateCherryPieceWins(grid, gameDirection, betStake);
|
|
447
|
+
result.specialWins.push(...cherryWins);
|
|
448
|
+
result.totalPayout += cherryWins.reduce((sum, w) => sum + w.payout, 0);
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
case happy_panda_config_1.SpinType.BONUS_BELL: {
|
|
452
|
+
const bellWin = evaluateBellScatterWins(grid, gameDirection, betStake);
|
|
453
|
+
if (bellWin) {
|
|
454
|
+
result.specialWins.push(bellWin);
|
|
455
|
+
result.totalPayout += bellWin.payout;
|
|
456
|
+
}
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
case happy_panda_config_1.SpinType.BONUS_BAR1: {
|
|
460
|
+
const barWin = evaluateSuperBarScatterWins(grid, gameDirection, betStake);
|
|
461
|
+
if (barWin) {
|
|
462
|
+
result.specialWins.push(barWin);
|
|
463
|
+
result.totalPayout += barWin.payout;
|
|
464
|
+
}
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return result;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=win-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"win-evaluator.js","sourceRoot":"","sources":["../../../src/logic/services/win-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* RNG module exports
|
|
19
|
+
*/
|
|
20
|
+
__exportStar(require("./weighted-random"), exports);
|
|
21
|
+
__exportStar(require("./spin-generator"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rng/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,oDAAkC;AAClC,mDAAiC"}
|