@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.
Files changed (71) hide show
  1. package/README.md +212 -0
  2. package/dist/__tests__/bonus-sequence.test.js +337 -0
  3. package/dist/__tests__/bonus-sequence.test.js.map +1 -0
  4. package/dist/__tests__/cherry-frequency.test.js +128 -0
  5. package/dist/__tests__/cherry-frequency.test.js.map +1 -0
  6. package/dist/__tests__/counter-manager.test.js +316 -0
  7. package/dist/__tests__/counter-manager.test.js.map +1 -0
  8. package/dist/__tests__/cpp-parity.test.js +368 -0
  9. package/dist/__tests__/cpp-parity.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/cpp-parity-vectors.json +438 -0
  11. package/dist/__tests__/happy-panda-engine.test.js +367 -0
  12. package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
  13. package/dist/__tests__/jackpot-manager.test.js +313 -0
  14. package/dist/__tests__/jackpot-manager.test.js.map +1 -0
  15. package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
  16. package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
  17. package/dist/__tests__/rtp-1million.test.js +156 -0
  18. package/dist/__tests__/rtp-1million.test.js.map +1 -0
  19. package/dist/__tests__/rtp-analysis.test.js +138 -0
  20. package/dist/__tests__/rtp-analysis.test.js.map +1 -0
  21. package/dist/__tests__/rtp-diagnostic.test.js +126 -0
  22. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  23. package/dist/__tests__/rtp-simulation.test.js +409 -0
  24. package/dist/__tests__/rtp-simulation.test.js.map +1 -0
  25. package/dist/__tests__/special-wins.test.js +179 -0
  26. package/dist/__tests__/special-wins.test.js.map +1 -0
  27. package/dist/__tests__/spin-generator.test.js +250 -0
  28. package/dist/__tests__/spin-generator.test.js.map +1 -0
  29. package/dist/__tests__/spin-handler.test.js +210 -0
  30. package/dist/__tests__/spin-handler.test.js.map +1 -0
  31. package/dist/__tests__/symbol-distribution.test.js +119 -0
  32. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  33. package/dist/__tests__/weighted-random.test.js +165 -0
  34. package/dist/__tests__/weighted-random.test.js.map +1 -0
  35. package/dist/__tests__/win-evaluator.test.js +254 -0
  36. package/dist/__tests__/win-evaluator.test.js.map +1 -0
  37. package/dist/config/happy-panda.config.js +714 -0
  38. package/dist/config/happy-panda.config.js.map +1 -0
  39. package/dist/config/index.js +21 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/domain/index.js +21 -0
  42. package/dist/domain/index.js.map +1 -0
  43. package/dist/domain/types.js +28 -0
  44. package/dist/domain/types.js.map +1 -0
  45. package/dist/engine/happy-panda-engine.js +197 -0
  46. package/dist/engine/happy-panda-engine.js.map +1 -0
  47. package/dist/engine/index.js +21 -0
  48. package/dist/engine/index.js.map +1 -0
  49. package/dist/index.js +34 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/logic/handlers/index.js +21 -0
  52. package/dist/logic/handlers/index.js.map +1 -0
  53. package/dist/logic/handlers/spin-handler.js +256 -0
  54. package/dist/logic/handlers/spin-handler.js.map +1 -0
  55. package/dist/logic/index.js +22 -0
  56. package/dist/logic/index.js.map +1 -0
  57. package/dist/logic/services/counter-manager.js +265 -0
  58. package/dist/logic/services/counter-manager.js.map +1 -0
  59. package/dist/logic/services/index.js +23 -0
  60. package/dist/logic/services/index.js.map +1 -0
  61. package/dist/logic/services/jackpot-manager.js +142 -0
  62. package/dist/logic/services/jackpot-manager.js.map +1 -0
  63. package/dist/logic/services/win-evaluator.js +470 -0
  64. package/dist/logic/services/win-evaluator.js.map +1 -0
  65. package/dist/rng/index.js +22 -0
  66. package/dist/rng/index.js.map +1 -0
  67. package/dist/rng/spin-generator.js +341 -0
  68. package/dist/rng/spin-generator.js.map +1 -0
  69. package/dist/rng/weighted-random.js +58 -0
  70. package/dist/rng/weighted-random.js.map +1 -0
  71. package/package.json +49 -0
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ /**
3
+ * Cherry Frequency Analysis Test
4
+ *
5
+ * Counts how many PAID_SPIN grids have 3x cherry lines to verify
6
+ * grid generation produces expected cherry frequency.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const happy_panda_config_1 = require("../config/happy-panda.config");
10
+ const spin_generator_1 = require("../rng/spin-generator");
11
+ const types_1 = require("../domain/types");
12
+ function createSimulationRng(seed = 12345) {
13
+ let state = seed;
14
+ function nextInt() {
15
+ state = (state * 1664525 + 1013904223) >>> 0;
16
+ return state;
17
+ }
18
+ return {
19
+ async random(max) {
20
+ return nextInt() % max;
21
+ },
22
+ async randomBatch(count, max) {
23
+ const results = [];
24
+ for (let i = 0; i < count; i++) {
25
+ results.push(nextInt() % max);
26
+ }
27
+ return results;
28
+ },
29
+ };
30
+ }
31
+ function countCherrySymbols(grid) {
32
+ let count = 0;
33
+ for (let reel = 0; reel < 3; reel++) {
34
+ for (let row = 0; row < 3; row++) {
35
+ if (happy_panda_config_1.CHERRY_SYMBOLS.includes(grid[reel][row])) {
36
+ count++;
37
+ }
38
+ }
39
+ }
40
+ return count;
41
+ }
42
+ function count3xCherryLines(grid) {
43
+ let count = 0;
44
+ // Only check first 8 lines
45
+ for (let lineIndex = 0; lineIndex < 8; lineIndex++) {
46
+ const lineShape = happy_panda_config_1.LINE_SHAPES[lineIndex];
47
+ const symbols = lineShape.map(([reel, row]) => grid[reel][row]);
48
+ // Check if all 3 symbols are cherries
49
+ const allCherry = symbols.every(s => happy_panda_config_1.CHERRY_SYMBOLS.includes(s));
50
+ if (allCherry) {
51
+ count++;
52
+ }
53
+ }
54
+ return count;
55
+ }
56
+ describe('Cherry Frequency Analysis', () => {
57
+ it('should count cherry appearances in PAID_SPIN grids', async () => {
58
+ const rng = createSimulationRng(12345);
59
+ const grids = 100000;
60
+ let totalCherries = 0;
61
+ let gridsWithCherry = 0;
62
+ let gridsWithThreeCherry = 0;
63
+ let gridsWith3xCherryLine = 0;
64
+ let total3xCherryLines = 0;
65
+ const cherryLineDistribution = {};
66
+ // Debug: Print first few grids to verify generation
67
+ console.log('\nFirst 5 grids:');
68
+ for (let debug = 0; debug < 5; debug++) {
69
+ const debugGrid = await (0, spin_generator_1.generateGrid)(happy_panda_config_1.SpinType.PAID_SPIN, types_1.GameDirection.SINGLE, rng);
70
+ console.log(`Grid ${debug}: ${JSON.stringify(debugGrid)}`);
71
+ console.log(` Cherry count: ${countCherrySymbols(debugGrid)}, 3x lines: ${count3xCherryLines(debugGrid)}`);
72
+ }
73
+ console.log('');
74
+ // Reset RNG for actual test
75
+ const rng2 = createSimulationRng(12345);
76
+ for (let i = 0; i < grids; i++) {
77
+ const grid = await (0, spin_generator_1.generateGrid)(happy_panda_config_1.SpinType.PAID_SPIN, types_1.GameDirection.SINGLE, rng2);
78
+ const cherryCount = countCherrySymbols(grid);
79
+ totalCherries += cherryCount;
80
+ if (cherryCount > 0)
81
+ gridsWithCherry++;
82
+ if (cherryCount >= 3)
83
+ gridsWithThreeCherry++;
84
+ const cherryLines = count3xCherryLines(grid);
85
+ total3xCherryLines += cherryLines;
86
+ if (cherryLines > 0) {
87
+ gridsWith3xCherryLine++;
88
+ cherryLineDistribution[cherryLines] = (cherryLineDistribution[cherryLines] || 0) + 1;
89
+ }
90
+ if (i > 0 && i % 25000 === 0) {
91
+ console.log(` ${i / 1000}k grids: ${gridsWith3xCherryLine} with 3x cherry lines (${(gridsWith3xCherryLine / i * 100).toFixed(3)}%)`);
92
+ }
93
+ }
94
+ console.log('\n========================================');
95
+ console.log('CHERRY FREQUENCY ANALYSIS');
96
+ console.log('========================================\n');
97
+ console.log(`Total grids generated: ${grids.toLocaleString()}`);
98
+ console.log(`Total cherries placed: ${totalCherries.toLocaleString()}`);
99
+ console.log(`Average cherries per grid: ${(totalCherries / grids).toFixed(3)}`);
100
+ console.log();
101
+ console.log(`Grids with at least 1 cherry: ${gridsWithCherry.toLocaleString()} (${(gridsWithCherry / grids * 100).toFixed(2)}%)`);
102
+ console.log(`Grids with at least 3 cherries: ${gridsWithThreeCherry.toLocaleString()} (${(gridsWithThreeCherry / grids * 100).toFixed(2)}%)`);
103
+ console.log();
104
+ console.log(`Grids with 3x cherry line: ${gridsWith3xCherryLine.toLocaleString()} (${(gridsWith3xCherryLine / grids * 100).toFixed(4)}%)`);
105
+ console.log(`Total 3x cherry lines: ${total3xCherryLines.toLocaleString()}`);
106
+ console.log(`Average 3x cherry lines per trigger: ${gridsWith3xCherryLine > 0 ? (total3xCherryLines / gridsWith3xCherryLine).toFixed(2) : 'N/A'}`);
107
+ console.log();
108
+ console.log('Distribution of 3x cherry lines per grid:');
109
+ for (const [count, freq] of Object.entries(cherryLineDistribution).sort((a, b) => Number(a[0]) - Number(b[0]))) {
110
+ console.log(` ${count} line(s): ${freq} grids`);
111
+ }
112
+ console.log();
113
+ // C++ reference: ~2,490 jackpot triggers per 1M spins
114
+ // But that's bonus SPINS, not trigger events
115
+ // If avg 2.66 lines per trigger, then ~936 trigger events per 1M
116
+ // So expected trigger rate: 0.0936% = 936/1,000,000
117
+ const expectedRate = 0.00094; // ~0.094% trigger rate
118
+ const actualRate = gridsWith3xCherryLine / grids;
119
+ const ratio = actualRate / expectedRate;
120
+ console.log('========================================');
121
+ console.log(`Expected trigger rate (from C++ ~936/1M): ${(expectedRate * 100).toFixed(4)}%`);
122
+ console.log(`Actual trigger rate: ${(actualRate * 100).toFixed(4)}%`);
123
+ console.log(`Ratio (actual/expected): ${ratio.toFixed(2)}x`);
124
+ console.log('========================================\n');
125
+ expect(true).toBe(true);
126
+ }, 120000);
127
+ });
128
+ //# sourceMappingURL=cherry-frequency.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cherry-frequency.test.js","sourceRoot":"","sources":["../../src/__tests__/cherry-frequency.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ /**
3
+ * Counter Manager Tests
4
+ *
5
+ * Tests for bonus counter logic against the C++ math model.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const counter_manager_1 = require("../logic/services/counter-manager");
9
+ const happy_panda_config_1 = require("../config/happy-panda.config");
10
+ const types_1 = require("../domain/types");
11
+ // Mock RNG for deterministic tests
12
+ const mockRng = {
13
+ async random(_max) {
14
+ return 0; // Always return first option for predictable tests
15
+ },
16
+ async randomBatch(count, _max) {
17
+ return Array(count).fill(0);
18
+ },
19
+ };
20
+ // Helper to create a mock line win
21
+ function createLineWin(symbol, matchLength, lineIndex = 0, payout = 10) {
22
+ return {
23
+ lineIndex,
24
+ symbol,
25
+ matchLength,
26
+ payout,
27
+ positions: [],
28
+ };
29
+ }
30
+ // Helper to create empty grid
31
+ function emptyGrid() {
32
+ return [
33
+ [happy_panda_config_1.Symbol.MELON, happy_panda_config_1.Symbol.PRUNE, happy_panda_config_1.Symbol.ORANGE],
34
+ [happy_panda_config_1.Symbol.BAR2, happy_panda_config_1.Symbol.BELL, happy_panda_config_1.Symbol.BAR1],
35
+ [happy_panda_config_1.Symbol.SEVEN, happy_panda_config_1.Symbol.BAR3, happy_panda_config_1.Symbol.MELON],
36
+ ];
37
+ }
38
+ describe('Counter Manager', () => {
39
+ describe('Initial State', () => {
40
+ it('should create initial counters with correct values', () => {
41
+ const counters = (0, counter_manager_1.createInitialCounters)();
42
+ expect(counters.jackpot).toBe(happy_panda_config_1.BONUS_JACKPOT.COUNTER_INIT);
43
+ expect(counters.bar1).toBe(happy_panda_config_1.BONUS_BAR1.COUNTER_INIT);
44
+ // Cherry and bell have ranges, check they're in valid range
45
+ expect([6, 9]).toContain(counters.cherry);
46
+ expect([3, 5]).toContain(counters.bell);
47
+ });
48
+ it('should create empty pending bonuses', () => {
49
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
50
+ expect(pending.jackpot).toBe(0);
51
+ expect(pending.cherry).toBe(0);
52
+ expect(pending.bell).toBe(0);
53
+ expect(pending.bar1).toBe(0);
54
+ expect(pending.respin).toBe(0);
55
+ });
56
+ });
57
+ describe('Jackpot Trigger (3x Cherry)', () => {
58
+ it('should trigger jackpot on 3x Cherry win (first 8 lines)', async () => {
59
+ const counters = { jackpot: 1, cherry: 9, bell: 5, bar1: 1 };
60
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
61
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.CHERRY, 3, 0)]; // Line 0 (first 8)
62
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 10, mockRng);
63
+ expect(result.triggeredJackpot).toBe(true);
64
+ expect(result.pendingBonuses.jackpot).toBe(1);
65
+ });
66
+ it('should NOT trigger jackpot on 3x Cherry win (lines 8-15)', async () => {
67
+ const counters = { jackpot: 1, cherry: 9, bell: 5, bar1: 1 };
68
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
69
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.CHERRY, 3, 10)]; // Line 10 (not first 8)
70
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.BOTH, happy_panda_config_1.SpinType.PAID_SPIN, 10, mockRng);
71
+ expect(result.triggeredJackpot).toBe(false);
72
+ expect(result.pendingBonuses.jackpot).toBe(0);
73
+ });
74
+ it('should trigger multiple jackpots for multiple 3x Cherry wins', async () => {
75
+ const counters = { jackpot: 1, cherry: 9, bell: 5, bar1: 1 };
76
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
77
+ const lineWins = [
78
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 3, 0),
79
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 3, 1),
80
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 3, 7),
81
+ ];
82
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 30, mockRng);
83
+ expect(result.triggeredJackpot).toBe(true);
84
+ expect(result.pendingBonuses.jackpot).toBe(3);
85
+ });
86
+ });
87
+ describe('Cherry Bonus Trigger (2x Cherry pairs)', () => {
88
+ it('should decrement cherry counter on 2x Cherry win', async () => {
89
+ const counters = { jackpot: 1, cherry: 5, bell: 5, bar1: 1 };
90
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
91
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 0)];
92
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 5, mockRng);
93
+ expect(result.counters.cherry).toBe(4); // Decremented by 1
94
+ expect(result.triggeredCherry).toBe(false);
95
+ });
96
+ it('should trigger cherry bonus when counter reaches 0', async () => {
97
+ const counters = { jackpot: 1, cherry: 1, bell: 5, bar1: 1 };
98
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
99
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 0)];
100
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 5, mockRng);
101
+ expect(result.triggeredCherry).toBe(true);
102
+ expect(result.pendingBonuses.cherry).toBe(1);
103
+ // Counter should be reset (mockRng returns 0 = first option = 6)
104
+ expect(result.counters.cherry).toBe(6);
105
+ });
106
+ it('should process multiple 2x Cherry pairs individually (C++ model)', async () => {
107
+ // With counter at 2 and 3 pairs, should trigger once and decrement twice more
108
+ const counters = { jackpot: 1, cherry: 2, bell: 5, bar1: 1 };
109
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
110
+ const lineWins = [
111
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 0), // Counter: 2->1
112
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 1), // Counter: 1->0 (trigger, reset to 6)
113
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 2), // Counter: 6->5
114
+ ];
115
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 15, mockRng);
116
+ expect(result.triggeredCherry).toBe(true);
117
+ expect(result.pendingBonuses.cherry).toBe(1);
118
+ expect(result.counters.cherry).toBe(5); // Reset to 6, then decremented to 5
119
+ });
120
+ it('should count cherry pairs on ALL lines (not just first 8)', async () => {
121
+ const counters = { jackpot: 1, cherry: 1, bell: 5, bar1: 1 };
122
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
123
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 12)]; // Line 12 (> 8)
124
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.BOTH, happy_panda_config_1.SpinType.PAID_SPIN, 5, mockRng);
125
+ expect(result.triggeredCherry).toBe(true);
126
+ expect(result.pendingBonuses.cherry).toBe(1);
127
+ });
128
+ });
129
+ describe('Bell Bonus Trigger (3x Bell)', () => {
130
+ it('should decrement bell counter on 3x Bell win (first 8 lines)', async () => {
131
+ const counters = { jackpot: 1, cherry: 9, bell: 3, bar1: 1 };
132
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
133
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.BELL, 3, 0)];
134
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 18, mockRng);
135
+ expect(result.counters.bell).toBe(2);
136
+ expect(result.triggeredBell).toBe(false);
137
+ });
138
+ it('should trigger bell bonus when counter reaches 0', async () => {
139
+ const counters = { jackpot: 1, cherry: 9, bell: 1, bar1: 1 };
140
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
141
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.BELL, 3, 0)];
142
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 18, mockRng);
143
+ expect(result.triggeredBell).toBe(true);
144
+ expect(result.pendingBonuses.bell).toBe(1);
145
+ // Counter reset (mockRng returns 0 = first option = 3)
146
+ expect(result.counters.bell).toBe(3);
147
+ });
148
+ it('should NOT count 3x Bell wins on lines 8-15', async () => {
149
+ const counters = { jackpot: 1, cherry: 9, bell: 1, bar1: 1 };
150
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
151
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.BELL, 3, 10)]; // Line 10 (not first 8)
152
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.BOTH, happy_panda_config_1.SpinType.PAID_SPIN, 18, mockRng);
153
+ expect(result.triggeredBell).toBe(false);
154
+ expect(result.counters.bell).toBe(1); // Not decremented
155
+ });
156
+ });
157
+ describe('Bar1 Bonus Trigger (3x Bar1)', () => {
158
+ it('should trigger bar1 bonus when counter reaches 0 (first 8 lines)', async () => {
159
+ const counters = { jackpot: 1, cherry: 9, bell: 5, bar1: 1 };
160
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
161
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.BAR1, 3, 0)];
162
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 30, mockRng);
163
+ expect(result.triggeredBar1).toBe(true);
164
+ expect(result.pendingBonuses.bar1).toBe(1);
165
+ expect(result.counters.bar1).toBe(happy_panda_config_1.BONUS_BAR1.COUNTER_INIT); // Reset
166
+ });
167
+ it('should NOT count 3x Bar1 wins on lines 8-15', async () => {
168
+ const counters = { jackpot: 1, cherry: 9, bell: 5, bar1: 1 };
169
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
170
+ const lineWins = [createLineWin(happy_panda_config_1.Symbol.BAR1, 3, 9)]; // Line 9 (not first 8)
171
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.BOTH, happy_panda_config_1.SpinType.PAID_SPIN, 30, mockRng);
172
+ expect(result.triggeredBar1).toBe(false);
173
+ expect(result.counters.bar1).toBe(1); // Not decremented
174
+ });
175
+ });
176
+ describe('Center Cherry Respin', () => {
177
+ it('should trigger 1 respin for center Cherry (no wins)', async () => {
178
+ const counters = (0, counter_manager_1.createInitialCounters)();
179
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
180
+ const grid = [
181
+ [happy_panda_config_1.Symbol.MELON, happy_panda_config_1.Symbol.PRUNE, happy_panda_config_1.Symbol.ORANGE],
182
+ [happy_panda_config_1.Symbol.BAR2, happy_panda_config_1.Symbol.CHERRY, happy_panda_config_1.Symbol.BAR1], // Cherry in center (1,1)
183
+ [happy_panda_config_1.Symbol.SEVEN, happy_panda_config_1.Symbol.BAR3, happy_panda_config_1.Symbol.MELON],
184
+ ];
185
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, [], // No line wins
186
+ grid, types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 0, // No win
187
+ mockRng);
188
+ expect(result.triggeredRespin).toBe(1);
189
+ expect(result.pendingBonuses.respin).toBe(1);
190
+ });
191
+ it('should trigger 2 respins for center Super Cherry (no wins)', async () => {
192
+ const counters = (0, counter_manager_1.createInitialCounters)();
193
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
194
+ const grid = [
195
+ [happy_panda_config_1.Symbol.MELON, happy_panda_config_1.Symbol.PRUNE, happy_panda_config_1.Symbol.ORANGE],
196
+ [happy_panda_config_1.Symbol.BAR2, happy_panda_config_1.Symbol.SUPER_CHERRY, happy_panda_config_1.Symbol.BAR1], // Super Cherry in center
197
+ [happy_panda_config_1.Symbol.SEVEN, happy_panda_config_1.Symbol.BAR3, happy_panda_config_1.Symbol.MELON],
198
+ ];
199
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, [], grid, types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 0, mockRng);
200
+ expect(result.triggeredRespin).toBe(2);
201
+ expect(result.pendingBonuses.respin).toBe(2);
202
+ });
203
+ it('should NOT trigger respin if there are wins', async () => {
204
+ const counters = (0, counter_manager_1.createInitialCounters)();
205
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
206
+ const grid = [
207
+ [happy_panda_config_1.Symbol.MELON, happy_panda_config_1.Symbol.PRUNE, happy_panda_config_1.Symbol.ORANGE],
208
+ [happy_panda_config_1.Symbol.BAR2, happy_panda_config_1.Symbol.CHERRY, happy_panda_config_1.Symbol.BAR1],
209
+ [happy_panda_config_1.Symbol.SEVEN, happy_panda_config_1.Symbol.BAR3, happy_panda_config_1.Symbol.MELON],
210
+ ];
211
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, [createLineWin(happy_panda_config_1.Symbol.MELON, 3, 0, 20)], // Has a win
212
+ grid, types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 20, // Win amount
213
+ mockRng);
214
+ expect(result.triggeredRespin).toBe(0);
215
+ });
216
+ it('should NOT trigger respin if multiple cherries on screen', async () => {
217
+ const counters = (0, counter_manager_1.createInitialCounters)();
218
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
219
+ const grid = [
220
+ [happy_panda_config_1.Symbol.CHERRY, happy_panda_config_1.Symbol.PRUNE, happy_panda_config_1.Symbol.ORANGE], // Cherry at (0,0)
221
+ [happy_panda_config_1.Symbol.BAR2, happy_panda_config_1.Symbol.CHERRY, happy_panda_config_1.Symbol.BAR1], // Cherry in center (1,1)
222
+ [happy_panda_config_1.Symbol.SEVEN, happy_panda_config_1.Symbol.BAR3, happy_panda_config_1.Symbol.MELON],
223
+ ];
224
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, [], grid, types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.PAID_SPIN, 0, mockRng);
225
+ expect(result.triggeredRespin).toBe(0); // Multiple cherries = no respin
226
+ });
227
+ it('should NOT trigger respin during respin spin type', async () => {
228
+ const counters = (0, counter_manager_1.createInitialCounters)();
229
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
230
+ const grid = [
231
+ [happy_panda_config_1.Symbol.MELON, happy_panda_config_1.Symbol.PRUNE, happy_panda_config_1.Symbol.ORANGE],
232
+ [happy_panda_config_1.Symbol.BAR2, happy_panda_config_1.Symbol.CHERRY, happy_panda_config_1.Symbol.BAR1],
233
+ [happy_panda_config_1.Symbol.SEVEN, happy_panda_config_1.Symbol.BAR3, happy_panda_config_1.Symbol.MELON],
234
+ ];
235
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, [], grid, types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.RESPIN_CHERRY, // Already a respin
236
+ 0, mockRng);
237
+ expect(result.triggeredRespin).toBe(0);
238
+ });
239
+ });
240
+ describe('Spin Type Restrictions', () => {
241
+ it('should NOT update counters during bonus spins', async () => {
242
+ const counters = { jackpot: 1, cherry: 1, bell: 1, bar1: 1 };
243
+ const pending = (0, counter_manager_1.createEmptyPendingBonuses)();
244
+ const lineWins = [
245
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 3, 0),
246
+ createLineWin(happy_panda_config_1.Symbol.CHERRY, 2, 1),
247
+ createLineWin(happy_panda_config_1.Symbol.BELL, 3, 2),
248
+ createLineWin(happy_panda_config_1.Symbol.BAR1, 3, 3),
249
+ ];
250
+ const result = await (0, counter_manager_1.updateCounters)(counters, pending, lineWins, emptyGrid(), types_1.GameDirection.SINGLE, happy_panda_config_1.SpinType.BONUS_JACKPOT, // Bonus spin
251
+ 100, mockRng);
252
+ // No triggers during bonus
253
+ expect(result.triggeredJackpot).toBe(false);
254
+ expect(result.triggeredCherry).toBe(false);
255
+ expect(result.triggeredBell).toBe(false);
256
+ expect(result.triggeredBar1).toBe(false);
257
+ // Counters unchanged
258
+ expect(result.counters).toEqual(counters);
259
+ });
260
+ });
261
+ describe('Bonus Priority', () => {
262
+ it('should return bonuses in priority order: Jackpot > Cherry > Bell > Bar1 > Respin', () => {
263
+ const pending = {
264
+ jackpot: 1,
265
+ cherry: 1,
266
+ bell: 1,
267
+ bar1: 1,
268
+ respin: 1,
269
+ };
270
+ expect((0, counter_manager_1.getNextBonusType)(pending)).toBe('jackpot');
271
+ pending.jackpot = 0;
272
+ expect((0, counter_manager_1.getNextBonusType)(pending)).toBe('cherry');
273
+ pending.cherry = 0;
274
+ expect((0, counter_manager_1.getNextBonusType)(pending)).toBe('bell');
275
+ pending.bell = 0;
276
+ expect((0, counter_manager_1.getNextBonusType)(pending)).toBe('bar1');
277
+ pending.bar1 = 0;
278
+ expect((0, counter_manager_1.getNextBonusType)(pending)).toBe('respin');
279
+ pending.respin = 0;
280
+ expect((0, counter_manager_1.getNextBonusType)(pending)).toBeNull();
281
+ });
282
+ });
283
+ describe('Bonus Consumption', () => {
284
+ it('should consume jackpot bonus correctly', () => {
285
+ const pending = { jackpot: 2, cherry: 0, bell: 0, bar1: 0, respin: 0 };
286
+ const { pending: newPending, spins } = (0, counter_manager_1.consumeBonus)(pending, 'jackpot');
287
+ expect(newPending.jackpot).toBe(1);
288
+ expect(spins).toBe(happy_panda_config_1.BONUS_JACKPOT.SPINS);
289
+ });
290
+ it('should consume cherry bonus correctly', () => {
291
+ const pending = { jackpot: 0, cherry: 1, bell: 0, bar1: 0, respin: 0 };
292
+ const { pending: newPending, spins } = (0, counter_manager_1.consumeBonus)(pending, 'cherry');
293
+ expect(newPending.cherry).toBe(0);
294
+ expect(spins).toBe(happy_panda_config_1.BONUS_CHERRY.SPINS);
295
+ });
296
+ it('should consume respin bonus (all at once)', () => {
297
+ const pending = { jackpot: 0, cherry: 0, bell: 0, bar1: 0, respin: 2 };
298
+ const { pending: newPending, spins } = (0, counter_manager_1.consumeBonus)(pending, 'respin');
299
+ expect(newPending.respin).toBe(0); // All consumed
300
+ expect(spins).toBe(2); // Both respins
301
+ });
302
+ });
303
+ describe('hasPendingBonus', () => {
304
+ it('should return true if any bonus is pending', () => {
305
+ expect((0, counter_manager_1.hasPendingBonus)({ jackpot: 1, cherry: 0, bell: 0, bar1: 0, respin: 0 })).toBe(true);
306
+ expect((0, counter_manager_1.hasPendingBonus)({ jackpot: 0, cherry: 1, bell: 0, bar1: 0, respin: 0 })).toBe(true);
307
+ expect((0, counter_manager_1.hasPendingBonus)({ jackpot: 0, cherry: 0, bell: 1, bar1: 0, respin: 0 })).toBe(true);
308
+ expect((0, counter_manager_1.hasPendingBonus)({ jackpot: 0, cherry: 0, bell: 0, bar1: 1, respin: 0 })).toBe(true);
309
+ expect((0, counter_manager_1.hasPendingBonus)({ jackpot: 0, cherry: 0, bell: 0, bar1: 0, respin: 1 })).toBe(true);
310
+ });
311
+ it('should return false if no bonus is pending', () => {
312
+ expect((0, counter_manager_1.hasPendingBonus)({ jackpot: 0, cherry: 0, bell: 0, bar1: 0, respin: 0 })).toBe(false);
313
+ });
314
+ });
315
+ });
316
+ //# sourceMappingURL=counter-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/counter-manager.test.ts"],"names":[],"mappings":"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"}