@omnitronix/happy-panda-game-engine 0.5.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 (207) hide show
  1. package/README.md +732 -0
  2. package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
  3. package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
  4. package/dist/__tests__/bonus-sequence.test.js +381 -0
  5. package/dist/__tests__/bonus-sequence.test.js.map +1 -0
  6. package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
  7. package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
  8. package/dist/__tests__/cherry-frequency.test.js +128 -0
  9. package/dist/__tests__/cherry-frequency.test.js.map +1 -0
  10. package/dist/__tests__/comprehensive.test.d.ts +16 -0
  11. package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
  12. package/dist/__tests__/comprehensive.test.js +491 -0
  13. package/dist/__tests__/comprehensive.test.js.map +1 -0
  14. package/dist/__tests__/counter-manager.test.d.ts +7 -0
  15. package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
  16. package/dist/__tests__/counter-manager.test.js +317 -0
  17. package/dist/__tests__/counter-manager.test.js.map +1 -0
  18. package/dist/__tests__/coverage-boost.test.d.ts +13 -0
  19. package/dist/__tests__/coverage-boost.test.d.ts.map +1 -0
  20. package/dist/__tests__/coverage-boost.test.js +606 -0
  21. package/dist/__tests__/coverage-boost.test.js.map +1 -0
  22. package/dist/__tests__/cpp-parity.test.d.ts +39 -0
  23. package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
  24. package/dist/__tests__/cpp-parity.test.js +392 -0
  25. package/dist/__tests__/cpp-parity.test.js.map +1 -0
  26. package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
  27. package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
  28. package/dist/__tests__/debug-trigger-bonus.test.js +359 -0
  29. package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
  30. package/dist/__tests__/fixtures/cpp-parity-vectors.json +457 -0
  31. package/dist/__tests__/gdd-validation-1000.test.d.ts +14 -0
  32. package/dist/__tests__/gdd-validation-1000.test.d.ts.map +1 -0
  33. package/dist/__tests__/gdd-validation-1000.test.js +418 -0
  34. package/dist/__tests__/gdd-validation-1000.test.js.map +1 -0
  35. package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
  36. package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
  37. package/dist/__tests__/happy-panda-engine.test.js +414 -0
  38. package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
  39. package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
  40. package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
  41. package/dist/__tests__/jackpot-manager.test.js +313 -0
  42. package/dist/__tests__/jackpot-manager.test.js.map +1 -0
  43. package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
  44. package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
  45. package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
  46. package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
  47. package/dist/__tests__/rng-gli19-compliance.test.d.ts +21 -0
  48. package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -0
  49. package/dist/__tests__/rng-gli19-compliance.test.js +480 -0
  50. package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
  51. package/dist/__tests__/rng-seed-security.test.d.ts +19 -0
  52. package/dist/__tests__/rng-seed-security.test.d.ts.map +1 -0
  53. package/dist/__tests__/rng-seed-security.test.js +518 -0
  54. package/dist/__tests__/rng-seed-security.test.js.map +1 -0
  55. package/dist/__tests__/rng-seed-type.test.d.ts +16 -0
  56. package/dist/__tests__/rng-seed-type.test.d.ts.map +1 -0
  57. package/dist/__tests__/rng-seed-type.test.js +285 -0
  58. package/dist/__tests__/rng-seed-type.test.js.map +1 -0
  59. package/dist/__tests__/rng-stress-boundary.test.d.ts +15 -0
  60. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +1 -0
  61. package/dist/__tests__/rng-stress-boundary.test.js +590 -0
  62. package/dist/__tests__/rng-stress-boundary.test.js.map +1 -0
  63. package/dist/__tests__/rtp-1million.test.d.ts +8 -0
  64. package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
  65. package/dist/__tests__/rtp-1million.test.js +156 -0
  66. package/dist/__tests__/rtp-1million.test.js.map +1 -0
  67. package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
  68. package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
  69. package/dist/__tests__/rtp-analysis.test.js +138 -0
  70. package/dist/__tests__/rtp-analysis.test.js.map +1 -0
  71. package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
  72. package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
  73. package/dist/__tests__/rtp-diagnostic.test.js +141 -0
  74. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  75. package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
  76. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
  77. package/dist/__tests__/rtp-simulation.test.js +411 -0
  78. package/dist/__tests__/rtp-simulation.test.js.map +1 -0
  79. package/dist/__tests__/special-wins.test.d.ts +7 -0
  80. package/dist/__tests__/special-wins.test.d.ts.map +1 -0
  81. package/dist/__tests__/special-wins.test.js +179 -0
  82. package/dist/__tests__/special-wins.test.js.map +1 -0
  83. package/dist/__tests__/spin-generator.test.d.ts +7 -0
  84. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  85. package/dist/__tests__/spin-generator.test.js +297 -0
  86. package/dist/__tests__/spin-generator.test.js.map +1 -0
  87. package/dist/__tests__/spin-handler.test.d.ts +7 -0
  88. package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
  89. package/dist/__tests__/spin-handler.test.js +210 -0
  90. package/dist/__tests__/spin-handler.test.js.map +1 -0
  91. package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
  92. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  93. package/dist/__tests__/symbol-distribution.test.js +119 -0
  94. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  95. package/dist/__tests__/test-protocol-10000-spin.test.d.ts +14 -0
  96. package/dist/__tests__/test-protocol-10000-spin.test.d.ts.map +1 -0
  97. package/dist/__tests__/test-protocol-10000-spin.test.js +359 -0
  98. package/dist/__tests__/test-protocol-10000-spin.test.js.map +1 -0
  99. package/dist/__tests__/weighted-random.test.d.ts +7 -0
  100. package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
  101. package/dist/__tests__/weighted-random.test.js +165 -0
  102. package/dist/__tests__/weighted-random.test.js.map +1 -0
  103. package/dist/__tests__/win-evaluator.test.d.ts +7 -0
  104. package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
  105. package/dist/__tests__/win-evaluator.test.js +264 -0
  106. package/dist/__tests__/win-evaluator.test.js.map +1 -0
  107. package/dist/config/happy-panda.config.d.ts +217 -0
  108. package/dist/config/happy-panda.config.d.ts.map +1 -0
  109. package/dist/config/happy-panda.config.js +721 -0
  110. package/dist/config/happy-panda.config.js.map +1 -0
  111. package/dist/config/index.d.ts +5 -0
  112. package/dist/config/index.d.ts.map +1 -0
  113. package/dist/config/index.js +21 -0
  114. package/dist/config/index.js.map +1 -0
  115. package/dist/debug/debug-command-definitions.d.ts +38 -0
  116. package/dist/debug/debug-command-definitions.d.ts.map +1 -0
  117. package/dist/debug/debug-command-definitions.js +80 -0
  118. package/dist/debug/debug-command-definitions.js.map +1 -0
  119. package/dist/domain/debug-trigger-bonus-command.d.ts +17 -0
  120. package/dist/domain/debug-trigger-bonus-command.d.ts.map +1 -0
  121. package/dist/domain/debug-trigger-bonus-command.js +3 -0
  122. package/dist/domain/debug-trigger-bonus-command.js.map +1 -0
  123. package/dist/domain/index.d.ts +5 -0
  124. package/dist/domain/index.d.ts.map +1 -0
  125. package/dist/domain/index.js +21 -0
  126. package/dist/domain/index.js.map +1 -0
  127. package/dist/domain/types.d.ts +228 -0
  128. package/dist/domain/types.d.ts.map +1 -0
  129. package/dist/domain/types.js +30 -0
  130. package/dist/domain/types.js.map +1 -0
  131. package/dist/engine/happy-panda-engine.d.ts +64 -0
  132. package/dist/engine/happy-panda-engine.d.ts.map +1 -0
  133. package/dist/engine/happy-panda-engine.js +324 -0
  134. package/dist/engine/happy-panda-engine.js.map +1 -0
  135. package/dist/engine/index.d.ts +5 -0
  136. package/dist/engine/index.d.ts.map +1 -0
  137. package/dist/engine/index.js +21 -0
  138. package/dist/engine/index.js.map +1 -0
  139. package/dist/game-engine.interface.d.ts +19 -0
  140. package/dist/game-engine.interface.d.ts.map +1 -0
  141. package/dist/game-engine.interface.js +9 -0
  142. package/dist/game-engine.interface.js.map +1 -0
  143. package/dist/happy-panda-v1.game-engine.d.ts +60 -0
  144. package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
  145. package/dist/happy-panda-v1.game-engine.js +524 -0
  146. package/dist/happy-panda-v1.game-engine.js.map +1 -0
  147. package/dist/index.d.ts +22 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +59 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logic/handlers/index.d.ts +5 -0
  152. package/dist/logic/handlers/index.d.ts.map +1 -0
  153. package/dist/logic/handlers/index.js +21 -0
  154. package/dist/logic/handlers/index.js.map +1 -0
  155. package/dist/logic/handlers/spin-handler.d.ts +58 -0
  156. package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
  157. package/dist/logic/handlers/spin-handler.js +265 -0
  158. package/dist/logic/handlers/spin-handler.js.map +1 -0
  159. package/dist/logic/index.d.ts +6 -0
  160. package/dist/logic/index.d.ts.map +1 -0
  161. package/dist/logic/index.js +22 -0
  162. package/dist/logic/index.js.map +1 -0
  163. package/dist/logic/services/counter-manager.d.ts +60 -0
  164. package/dist/logic/services/counter-manager.d.ts.map +1 -0
  165. package/dist/logic/services/counter-manager.js +268 -0
  166. package/dist/logic/services/counter-manager.js.map +1 -0
  167. package/dist/logic/services/index.d.ts +7 -0
  168. package/dist/logic/services/index.d.ts.map +1 -0
  169. package/dist/logic/services/index.js +23 -0
  170. package/dist/logic/services/index.js.map +1 -0
  171. package/dist/logic/services/jackpot-manager.d.ts +59 -0
  172. package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
  173. package/dist/logic/services/jackpot-manager.js +142 -0
  174. package/dist/logic/services/jackpot-manager.js.map +1 -0
  175. package/dist/logic/services/win-evaluator.d.ts +51 -0
  176. package/dist/logic/services/win-evaluator.d.ts.map +1 -0
  177. package/dist/logic/services/win-evaluator.js +463 -0
  178. package/dist/logic/services/win-evaluator.js.map +1 -0
  179. package/dist/rng/dummy-rng-client.d.ts +39 -0
  180. package/dist/rng/dummy-rng-client.d.ts.map +1 -0
  181. package/dist/rng/dummy-rng-client.js +77 -0
  182. package/dist/rng/dummy-rng-client.js.map +1 -0
  183. package/dist/rng/index.d.ts +10 -0
  184. package/dist/rng/index.d.ts.map +1 -0
  185. package/dist/rng/index.js +27 -0
  186. package/dist/rng/index.js.map +1 -0
  187. package/dist/rng/rng-client.factory.d.ts +33 -0
  188. package/dist/rng/rng-client.factory.d.ts.map +1 -0
  189. package/dist/rng/rng-client.factory.js +57 -0
  190. package/dist/rng/rng-client.factory.js.map +1 -0
  191. package/dist/rng/rng-client.interface.d.ts +51 -0
  192. package/dist/rng/rng-client.interface.d.ts.map +1 -0
  193. package/dist/rng/rng-client.interface.js +9 -0
  194. package/dist/rng/rng-client.interface.js.map +1 -0
  195. package/dist/rng/rng-service.d.ts +93 -0
  196. package/dist/rng/rng-service.d.ts.map +1 -0
  197. package/dist/rng/rng-service.js +124 -0
  198. package/dist/rng/rng-service.js.map +1 -0
  199. package/dist/rng/spin-generator.d.ts +32 -0
  200. package/dist/rng/spin-generator.d.ts.map +1 -0
  201. package/dist/rng/spin-generator.js +338 -0
  202. package/dist/rng/spin-generator.js.map +1 -0
  203. package/dist/rng/weighted-random.d.ts +30 -0
  204. package/dist/rng/weighted-random.d.ts.map +1 -0
  205. package/dist/rng/weighted-random.js +58 -0
  206. package/dist/rng/weighted-random.js.map +1 -0
  207. package/package.json +59 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * C++ Parity Tests
3
+ *
4
+ * Validates that the TypeScript implementation produces identical results
5
+ * to the C++ math model (CherryMaster_A_2.cpp).
6
+ *
7
+ * ## How This Works
8
+ *
9
+ * 1. Test vectors contain known inputs and expected outputs from C++
10
+ * 2. We run our TypeScript code with identical inputs
11
+ * 3. We compare outputs to verify parity
12
+ *
13
+ * ## Test Vector Format
14
+ *
15
+ * Each test case has:
16
+ * - input: spinType, gameDirection, betStake, betGame, and either:
17
+ * - rngSequence: deterministic RNG values
18
+ * - forcedGrid: bypass RNG and use this grid directly
19
+ * - expected: the C++ model's output for these inputs
20
+ *
21
+ * ## Generating Test Vectors
22
+ *
23
+ * To add new test vectors:
24
+ * 1. Run the C++ model with known inputs
25
+ * 2. Capture the output (grid, wins, payouts)
26
+ * 3. Add to cpp-parity-vectors.json
27
+ *
28
+ * ## Why This Matters
29
+ *
30
+ * The C++ model is the source of truth for:
31
+ * - Win evaluation logic
32
+ * - Payout calculations
33
+ * - Symbol priorities
34
+ * - Bonus mechanics
35
+ *
36
+ * Any divergence from C++ is a bug that must be fixed.
37
+ */
38
+ export {};
39
+ //# sourceMappingURL=cpp-parity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpp-parity.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cpp-parity.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG"}
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+ /**
3
+ * C++ Parity Tests
4
+ *
5
+ * Validates that the TypeScript implementation produces identical results
6
+ * to the C++ math model (CherryMaster_A_2.cpp).
7
+ *
8
+ * ## How This Works
9
+ *
10
+ * 1. Test vectors contain known inputs and expected outputs from C++
11
+ * 2. We run our TypeScript code with identical inputs
12
+ * 3. We compare outputs to verify parity
13
+ *
14
+ * ## Test Vector Format
15
+ *
16
+ * Each test case has:
17
+ * - input: spinType, gameDirection, betStake, betGame, and either:
18
+ * - rngSequence: deterministic RNG values
19
+ * - forcedGrid: bypass RNG and use this grid directly
20
+ * - expected: the C++ model's output for these inputs
21
+ *
22
+ * ## Generating Test Vectors
23
+ *
24
+ * To add new test vectors:
25
+ * 1. Run the C++ model with known inputs
26
+ * 2. Capture the output (grid, wins, payouts)
27
+ * 3. Add to cpp-parity-vectors.json
28
+ *
29
+ * ## Why This Matters
30
+ *
31
+ * The C++ model is the source of truth for:
32
+ * - Win evaluation logic
33
+ * - Payout calculations
34
+ * - Symbol priorities
35
+ * - Bonus mechanics
36
+ *
37
+ * Any divergence from C++ is a bug that must be fixed.
38
+ */
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ const win_evaluator_1 = require("../logic/services/win-evaluator");
44
+ const happy_panda_config_1 = require("../config/happy-panda.config");
45
+ const types_1 = require("../domain/types");
46
+ // Load test vectors
47
+ const cpp_parity_vectors_json_1 = __importDefault(require("./fixtures/cpp-parity-vectors.json"));
48
+ // =============================================================================
49
+ // HELPERS
50
+ // =============================================================================
51
+ // Convert numeric spinType from test vectors to string SpinType
52
+ function numericToSpinType(numeric) {
53
+ const mapping = {
54
+ 0: happy_panda_config_1.SpinType.BASE_GAME_SPIN,
55
+ 1: happy_panda_config_1.SpinType.BONUS_BAMBOO_TRIPLETS,
56
+ 2: happy_panda_config_1.SpinType.BONUS_BAMBOO_TWINS,
57
+ 3: happy_panda_config_1.SpinType.BONUS_CAMERA,
58
+ 4: happy_panda_config_1.SpinType.BONUS_FIREWORKS,
59
+ 5: happy_panda_config_1.SpinType.RESPIN_CENTER_BAMBOO,
60
+ };
61
+ return mapping[numeric] ?? happy_panda_config_1.SpinType.BASE_GAME_SPIN;
62
+ }
63
+ // =============================================================================
64
+ // PARITY TESTS
65
+ // =============================================================================
66
+ describe('C++ Parity Tests', () => {
67
+ describe('Win Evaluation Parity', () => {
68
+ const testCases = cpp_parity_vectors_json_1.default.testCases;
69
+ testCases.forEach((testCase) => {
70
+ it(`${testCase.id}: ${testCase.description}`, () => {
71
+ const { input, expected } = testCase;
72
+ // Use forced grid if provided, otherwise skip RNG-dependent tests
73
+ if (!input.forcedGrid) {
74
+ // RNG-dependent tests require the spin generator
75
+ // Skip for now - these would need mock RNG integration
76
+ console.log(` Skipping RNG-dependent test: ${testCase.id}`);
77
+ return;
78
+ }
79
+ const grid = input.forcedGrid;
80
+ const gameDirection = input.gameDirection;
81
+ const spinType = numericToSpinType(input.spinType);
82
+ // Run our evaluation
83
+ const result = (0, win_evaluator_1.evaluateSpin)(grid, gameDirection, input.betStake, input.betGame, spinType);
84
+ // Verify grid matches (for forced grids, should be identical)
85
+ expect(result).toBeDefined();
86
+ // Verify wall win
87
+ if (expected.hasWallWin) {
88
+ expect(result.wallWin).not.toBeNull();
89
+ if (expected.wallWinType !== undefined) {
90
+ expect(result.wallWin.wallType).toBe(expected.wallWinType);
91
+ }
92
+ if (expected.wallPayout !== undefined) {
93
+ expect(result.wallWin.payout).toBe(expected.wallPayout);
94
+ }
95
+ }
96
+ else {
97
+ expect(result.wallWin).toBeNull();
98
+ }
99
+ // Verify scatter wins (now an array - C++ can award up to 2)
100
+ if (expected.hasScatterWin) {
101
+ expect(result.scatterWins.length).toBeGreaterThan(0);
102
+ // Check total scatter payout
103
+ const totalScatterPayout = result.scatterWins.reduce((sum, w) => sum + w.payout, 0);
104
+ if (expected.scatterPayout !== undefined) {
105
+ expect(totalScatterPayout).toBe(expected.scatterPayout);
106
+ }
107
+ // Check first scatter for backward compatibility
108
+ if (expected.scatterSymbol !== undefined) {
109
+ expect(result.scatterWins[0].symbol).toBe(expected.scatterSymbol);
110
+ }
111
+ if (expected.scatterCount !== undefined) {
112
+ expect(result.scatterWins[0].count).toBe(expected.scatterCount);
113
+ }
114
+ if (expected.isSuperSevenOnly !== undefined) {
115
+ expect(result.scatterWins[0].isSuperSevenOnly).toBe(expected.isSuperSevenOnly);
116
+ }
117
+ }
118
+ else {
119
+ expect(result.scatterWins.length).toBe(0);
120
+ }
121
+ // Verify line wins
122
+ if (expected.lineWinCount !== undefined) {
123
+ expect(result.lineWins.length).toBe(expected.lineWinCount);
124
+ }
125
+ if (expected.lineWins) {
126
+ expected.lineWins.forEach((expectedWin, idx) => {
127
+ const actualWin = result.lineWins[idx];
128
+ expect(actualWin).toBeDefined();
129
+ expect(actualWin.lineIndex).toBe(expectedWin.lineIndex);
130
+ expect(actualWin.symbol).toBe(expectedWin.symbol);
131
+ expect(actualWin.matchLength).toBe(expectedWin.matchLength);
132
+ expect(actualWin.payout).toBe(expectedWin.payout);
133
+ });
134
+ }
135
+ // Verify special wins (bonus-specific)
136
+ if (expected.specialWinCount !== undefined) {
137
+ expect(result.specialWins.length).toBe(expected.specialWinCount);
138
+ }
139
+ if (expected.specialWins) {
140
+ expected.specialWins.forEach((expectedWin, idx) => {
141
+ const actualWin = result.specialWins[idx];
142
+ expect(actualWin).toBeDefined();
143
+ expect(actualWin.winType).toBe(expectedWin.winType);
144
+ expect(actualWin.count).toBe(expectedWin.count);
145
+ expect(actualWin.payout).toBe(expectedWin.payout);
146
+ });
147
+ }
148
+ // Verify total payout
149
+ if (expected.totalPayout !== undefined) {
150
+ expect(result.totalPayout).toBe(expected.totalPayout);
151
+ }
152
+ });
153
+ });
154
+ });
155
+ describe('Multiplier Parity', () => {
156
+ const multipliers = cpp_parity_vectors_json_1.default.multiplierTests;
157
+ describe('Line Multipliers', () => {
158
+ it('should match C++ line multipliers for 3-of-a-kind', () => {
159
+ // LINE_MULTIPLIERS[symbol][matchCount-1]
160
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.GOLDEN_PANDA][2]).toBe(multipliers.lineMultipliers.SUPER_SEVEN_x3);
161
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.RED_PANDA][2]).toBe(multipliers.lineMultipliers.SEVEN_x3);
162
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.SLOT_MACHINE][2]).toBe(multipliers.lineMultipliers.BAR3_x3);
163
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.CITY][2]).toBe(multipliers.lineMultipliers.BAR2_x3);
164
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.FIREWORKS_ROCKETS][2]).toBe(multipliers.lineMultipliers.BAR1_x3);
165
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.BACKPACK][2]).toBe(multipliers.lineMultipliers.MELON_x3);
166
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.CAMERA][2]).toBe(multipliers.lineMultipliers.BELL_x3);
167
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.FOOD_BOWL][2]).toBe(multipliers.lineMultipliers.PRUNE_x3);
168
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.CUP][2]).toBe(multipliers.lineMultipliers.ORANGE_x3);
169
+ });
170
+ it('should match C++ cherry multipliers for 1, 2, 3 matches', () => {
171
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.BAMBOO][0]).toBe(multipliers.lineMultipliers.CHERRY_x1);
172
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.BAMBOO][1]).toBe(multipliers.lineMultipliers.CHERRY_x2);
173
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[happy_panda_config_1.Symbol.BAMBOO][2]).toBe(multipliers.lineMultipliers.CHERRY_x3);
174
+ });
175
+ it('should match C++ Any Bar line multiplier', () => {
176
+ // Index 10 is Any Bar mix
177
+ expect(happy_panda_config_1.LINE_MULTIPLIERS[10][2]).toBe(multipliers.lineMultipliers.ANY_BAR_x3);
178
+ });
179
+ });
180
+ describe('Wall Multipliers', () => {
181
+ it('should match C++ wall multipliers', () => {
182
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[0]).toBe(multipliers.wallMultipliers.BAR3);
183
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[1]).toBe(multipliers.wallMultipliers.BAR2);
184
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[2]).toBe(multipliers.wallMultipliers.BAR1);
185
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[3]).toBe(multipliers.wallMultipliers.MELON);
186
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[4]).toBe(multipliers.wallMultipliers.BELL);
187
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[5]).toBe(multipliers.wallMultipliers.PRUNE);
188
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[6]).toBe(multipliers.wallMultipliers.ORANGE);
189
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[7]).toBe(multipliers.wallMultipliers.CHERRY);
190
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[8]).toBe(multipliers.wallMultipliers.ANY_BAR);
191
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[9]).toBe(multipliers.wallMultipliers.ALL_FRUITS);
192
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[10]).toBe(multipliers.wallMultipliers.ALL_COLORS);
193
+ });
194
+ });
195
+ describe('Scatter Multipliers', () => {
196
+ it('should match C++ seven scatter multipliers', () => {
197
+ // PANDA_SCATTER_MULTIPLIERS[9-count]
198
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[0]).toBe(multipliers.scatterMultipliers.SEVEN_x9);
199
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[1]).toBe(multipliers.scatterMultipliers.SEVEN_x8);
200
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[2]).toBe(multipliers.scatterMultipliers.SEVEN_x7);
201
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[3]).toBe(multipliers.scatterMultipliers.SEVEN_x6);
202
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[4]).toBe(multipliers.scatterMultipliers.SEVEN_x5);
203
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[5]).toBe(multipliers.scatterMultipliers.SEVEN_x4);
204
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[6]).toBe(multipliers.scatterMultipliers.SEVEN_x3);
205
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[7]).toBe(multipliers.scatterMultipliers.SEVEN_x2);
206
+ });
207
+ });
208
+ });
209
+ describe('Win Priority Parity', () => {
210
+ it('should pay BOTH wall AND line wins independently (C++ lines 2731-2735)', () => {
211
+ // C++ adds LineWinsCalculating() and ScreenWinsCalculating() results independently
212
+ // to player_current_win. Line wins are NEVER suppressed by wall wins.
213
+ const wallGrid = [
214
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE],
215
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE],
216
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE],
217
+ ];
218
+ const result = (0, win_evaluator_1.evaluateSpin)(wallGrid, types_1.GameDirection.SINGLE, 1, 8, happy_panda_config_1.SpinType.BASE_GAME_SPIN);
219
+ // Wall win should be present
220
+ expect(result.wallWin).not.toBeNull();
221
+ // Line wins should ALSO be present (all 8 lines win with 3x SLOT_MACHINE)
222
+ expect(result.lineWins.length).toBe(8);
223
+ const lineWinTotal = result.lineWins.reduce((sum, w) => sum + w.payout, 0);
224
+ expect(lineWinTotal).toBe(80 * 8); // 8 lines × 80 × 1 (bet_stake)
225
+ // Total = wall (500×8=4000) + lines (80×8=640) = 4640
226
+ expect(result.totalPayout).toBe(4640);
227
+ });
228
+ it('should pay BOTH scatter AND line wins (C++ behavior)', () => {
229
+ // 3x Seven in diagonal - C++ pays BOTH line wins AND scatter wins
230
+ // Per C++ simulation (lines 2731-2735): line_wins_sum and screen_win_sum are both added
231
+ const scatterGrid = [
232
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE],
233
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.SLOT_MACHINE],
234
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.RED_PANDA],
235
+ ];
236
+ const result = (0, win_evaluator_1.evaluateSpin)(scatterGrid, types_1.GameDirection.SINGLE, 1, 8, happy_panda_config_1.SpinType.BASE_GAME_SPIN);
237
+ // Scatter win should be present (3x Seven)
238
+ expect(result.scatterWins.length).toBeGreaterThan(0);
239
+ expect(result.scatterWins[0].count).toBe(3);
240
+ // Line win should ALSO be present (3x Seven on diagonal)
241
+ expect(result.lineWins.length).toBe(1);
242
+ expect(result.lineWins[0].payout).toBe(100); // 3x Seven = 100 × bet_stake
243
+ // Total = line win (100) + scatter win (40) = 140
244
+ expect(result.totalPayout).toBe(140);
245
+ });
246
+ });
247
+ describe('Symbol Group Parity', () => {
248
+ it('should correctly identify cherry group (CH + CH_S)', () => {
249
+ // Mixed Cherry/Super Cherry wall
250
+ const cherryWallGrid = [
251
+ [happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.GOLDEN_BAMBOO, happy_panda_config_1.Symbol.BAMBOO],
252
+ [happy_panda_config_1.Symbol.GOLDEN_BAMBOO, happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.GOLDEN_BAMBOO],
253
+ [happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.GOLDEN_BAMBOO],
254
+ ];
255
+ const result = (0, win_evaluator_1.evaluateWallWin)(cherryWallGrid, 8);
256
+ expect(result).not.toBeNull();
257
+ expect(result.wallType).toBe(happy_panda_config_1.ScreenWinType.SCREEN_BAMBOO);
258
+ });
259
+ it('should correctly identify bar group (BAR3 + BAR2 + BAR1)', () => {
260
+ // Mixed bar wall
261
+ const barMixGrid = [
262
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.CITY, happy_panda_config_1.Symbol.FIREWORKS_ROCKETS],
263
+ [happy_panda_config_1.Symbol.FIREWORKS_ROCKETS, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.CITY],
264
+ [happy_panda_config_1.Symbol.CITY, happy_panda_config_1.Symbol.FIREWORKS_ROCKETS, happy_panda_config_1.Symbol.SLOT_MACHINE],
265
+ ];
266
+ const result = (0, win_evaluator_1.evaluateWallWin)(barMixGrid, 8);
267
+ expect(result).not.toBeNull();
268
+ expect(result.wallType).toBe(happy_panda_config_1.ScreenWinType.SCREEN_BAR_MIX);
269
+ });
270
+ it('should correctly identify fruit group', () => {
271
+ // All fruits wall
272
+ const fruitGrid = [
273
+ [happy_panda_config_1.Symbol.BACKPACK, happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CUP],
274
+ [happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.GOLDEN_BAMBOO, happy_panda_config_1.Symbol.BACKPACK],
275
+ [happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CUP, happy_panda_config_1.Symbol.BAMBOO],
276
+ ];
277
+ const result = (0, win_evaluator_1.evaluateWallWin)(fruitGrid, 8);
278
+ expect(result).not.toBeNull();
279
+ expect(result.wallType).toBe(happy_panda_config_1.ScreenWinType.SCREEN_FRUIT_MIX);
280
+ });
281
+ it('should correctly identify seven group (SEVEN + SUPER_SEVEN)', () => {
282
+ // Mixed Seven scatter
283
+ const sevenGrid = [
284
+ [happy_panda_config_1.Symbol.GOLDEN_PANDA, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.BACKPACK],
285
+ [happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.CUP],
286
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CITY],
287
+ ];
288
+ const results = (0, win_evaluator_1.evaluateScatterWins)(sevenGrid, 8);
289
+ // With 2 Super Sevens + 1 regular Seven:
290
+ // - Super Seven scatter (2 count) with SEV > 0 so NOT doubled
291
+ // - Total scatter (3 count) with exactly 1 Super Seven NOT true
292
+ expect(results.length).toBeGreaterThan(0);
293
+ // First win should be Super Seven scatter (2 count, not doubled because SEV > 0)
294
+ // Then total scatter (3 count)
295
+ const totalPayout = results.reduce((s, w) => s + w.payout, 0);
296
+ expect(totalPayout).toBeGreaterThan(0);
297
+ });
298
+ });
299
+ describe('Edge Cases from C++ Model', () => {
300
+ it('should handle exactly 2 sevens (minimum scatter)', () => {
301
+ const grid = [
302
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.BACKPACK],
303
+ [happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.CUP],
304
+ [happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CITY],
305
+ ];
306
+ const results = (0, win_evaluator_1.evaluateScatterWins)(grid, 8);
307
+ expect(results.length).toBe(1);
308
+ expect(results[0].count).toBe(2);
309
+ expect(results[0].payout).toBe(2 * 8); // x2 = 2x bet_game (per PANDA_SCATTER_MULTIPLIERS[7])
310
+ });
311
+ it('should handle 1 seven (no scatter)', () => {
312
+ const grid = [
313
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.BACKPACK],
314
+ [happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CUP],
315
+ [happy_panda_config_1.Symbol.BAMBOO, happy_panda_config_1.Symbol.CITY, happy_panda_config_1.Symbol.FIREWORKS_ROCKETS],
316
+ ];
317
+ const results = (0, win_evaluator_1.evaluateScatterWins)(grid, 8);
318
+ expect(results.length).toBe(0);
319
+ });
320
+ it('should handle full screen of sevens (9 = max scatter)', () => {
321
+ const grid = [
322
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.RED_PANDA],
323
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.RED_PANDA],
324
+ [happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.RED_PANDA, happy_panda_config_1.Symbol.RED_PANDA],
325
+ ];
326
+ // This is both a scatter AND could be a wall, but scatter is evaluated first
327
+ // Actually per C++ model: wall is checked first, then scatter
328
+ // Full screen seven = wall win takes precedence? Let's check our impl
329
+ const wallResult = (0, win_evaluator_1.evaluateWallWin)(grid, 8);
330
+ // Seven is NOT in WALL_SYMBOLS, so no wall win
331
+ expect(wallResult).toBeNull();
332
+ const scatterResults = (0, win_evaluator_1.evaluateScatterWins)(grid, 8);
333
+ expect(scatterResults.length).toBe(1);
334
+ expect(scatterResults[0].count).toBe(9);
335
+ expect(scatterResults[0].payout).toBe(1000 * 8); // x9 = 1000x bet_game (per PANDA_SCATTER_MULTIPLIERS[0])
336
+ });
337
+ it('should handle bet stake scaling correctly', () => {
338
+ // Same grid, different bet stakes
339
+ const grid = [
340
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.BACKPACK, happy_panda_config_1.Symbol.BAMBOO],
341
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.FOOD_BOWL, happy_panda_config_1.Symbol.CUP],
342
+ [happy_panda_config_1.Symbol.SLOT_MACHINE, happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CITY],
343
+ ];
344
+ const result1 = (0, win_evaluator_1.evaluateLineWins)(grid, types_1.GameDirection.SINGLE, 1);
345
+ const result5 = (0, win_evaluator_1.evaluateLineWins)(grid, types_1.GameDirection.SINGLE, 5);
346
+ // Line wins should scale with bet stake
347
+ const bar3Win1 = result1.find(w => w.symbol === happy_panda_config_1.Symbol.SLOT_MACHINE);
348
+ const bar3Win5 = result5.find(w => w.symbol === happy_panda_config_1.Symbol.SLOT_MACHINE);
349
+ expect(bar3Win1).toBeDefined();
350
+ expect(bar3Win5).toBeDefined();
351
+ expect(bar3Win5.payout).toBe(bar3Win1.payout * 5);
352
+ });
353
+ it('should handle bet game scaling correctly for wall wins', () => {
354
+ const grid = [
355
+ [happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CAMERA],
356
+ [happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CAMERA],
357
+ [happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CAMERA, happy_panda_config_1.Symbol.CAMERA],
358
+ ];
359
+ const result8 = (0, win_evaluator_1.evaluateWallWin)(grid, 8);
360
+ const result16 = (0, win_evaluator_1.evaluateWallWin)(grid, 16);
361
+ expect(result8).not.toBeNull();
362
+ expect(result16).not.toBeNull();
363
+ expect(result16.payout).toBe(result8.payout * 2);
364
+ });
365
+ });
366
+ });
367
+ describe('C++ Config Verification', () => {
368
+ describe('Multiplier Values from xlsx', () => {
369
+ it('should have C++ 3x3 bonus rates (intentionally high for bonus excitement)', () => {
370
+ // C++ DESIGN: Bonus spins have HIGH 3x3 rates (10-25%)
371
+ // This is intentional - bonuses are rare so high rates within bonus are fine
372
+ const paidSpinRate = 3 / 196; // ~1.53%
373
+ // Paid spin rate should be low (~1.5%)
374
+ expect(paidSpinRate).toBeLessThan(0.02);
375
+ expect(paidSpinRate).toBeGreaterThan(0.01);
376
+ });
377
+ it('should have C++ wall multipliers (high values are correct)', () => {
378
+ // These are the CORRECT C++ values from xlsx
379
+ // Wall wins are RARE (require 9 matching symbols) so multipliers are high
380
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[0]).toBe(500); // BAR3 = 500x
381
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[1]).toBe(400); // BAR2 = 400x
382
+ expect(happy_panda_config_1.WALL_MULTIPLIERS[7]).toBe(400); // Cherry = 400x
383
+ });
384
+ it('should have C++ scatter multipliers (high values are correct)', () => {
385
+ // These are the CORRECT C++ values from xlsx
386
+ // Scatter wins are RARE (require multiple 7s) so multipliers are high
387
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[0]).toBe(1000); // x9 = 1000x
388
+ expect(happy_panda_config_1.PANDA_SCATTER_MULTIPLIERS[1]).toBe(400); // x8 = 400x
389
+ });
390
+ });
391
+ });
392
+ //# sourceMappingURL=cpp-parity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpp-parity.test.js","sourceRoot":"","sources":["../../src/__tests__/cpp-parity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * DEBUG_TRIGGER_BONUS Command Tests (GLI-19 compliant)
3
+ *
4
+ * Tests for the debug command that allows triggering bonus rounds for dev/testing.
5
+ * This command is used by dev-tools to test bonus flows without waiting for natural triggers.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=debug-trigger-bonus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-trigger-bonus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/debug-trigger-bonus.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}