@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,457 @@
1
+ {
2
+ "description": "Test vectors for win evaluation matching C++ CherryMaster_A_2 math model (xlsx-derived values).",
3
+ "version": "3.0.0",
4
+ "generatedFrom": "CherryMaster_A_2.cpp and xlsx (exact C++ values)",
5
+ "testCases": [
6
+ {
7
+ "id": "paid-spin-no-win-001",
8
+ "description": "Basic paid spin with no wins",
9
+ "input": {
10
+ "spinType": 0,
11
+ "gameDirection": 0,
12
+ "betStake": 1,
13
+ "betGame": 8,
14
+ "rngSequence": [45, 67, 23, 89, 12, 56, 78, 34, 90, 11, 22, 33]
15
+ },
16
+ "expected": {
17
+ "grid": [
18
+ [7, 5, 8],
19
+ [8, 6, 7],
20
+ [5, 7, 6]
21
+ ],
22
+ "gridSymbols": ["PRUNE", "MELON", "ORANGE", "ORANGE", "BELL", "PRUNE", "MELON", "PRUNE", "BELL"],
23
+ "totalPayout": 0,
24
+ "hasWallWin": false,
25
+ "hasScatterWin": false,
26
+ "lineWinCount": 0
27
+ }
28
+ },
29
+ {
30
+ "id": "paid-spin-cherry-x1-002",
31
+ "description": "Paid spin with single cherry on line",
32
+ "input": {
33
+ "spinType": 0,
34
+ "gameDirection": 0,
35
+ "betStake": 1,
36
+ "betGame": 8,
37
+ "rngSequence": [95, 67, 23, 89, 12, 56, 78, 34, 90, 11, 22, 33]
38
+ },
39
+ "expected": {
40
+ "grid": [
41
+ [9, 5, 8],
42
+ [8, 6, 7],
43
+ [5, 7, 6]
44
+ ],
45
+ "gridSymbols": ["CHERRY", "MELON", "ORANGE", "ORANGE", "BELL", "PRUNE", "MELON", "PRUNE", "BELL"],
46
+ "totalPayout": 2,
47
+ "hasWallWin": false,
48
+ "hasScatterWin": false,
49
+ "lineWinCount": 1,
50
+ "lineWins": [
51
+ {
52
+ "lineIndex": 0,
53
+ "symbol": 9,
54
+ "matchLength": 1,
55
+ "payout": 2
56
+ }
57
+ ]
58
+ }
59
+ },
60
+ {
61
+ "id": "paid-spin-bar3-line-003",
62
+ "description": "Paid spin with 3x BAR3 on line",
63
+ "input": {
64
+ "spinType": 0,
65
+ "gameDirection": 0,
66
+ "betStake": 1,
67
+ "betGame": 8,
68
+ "forcedGrid": [
69
+ [2, 5, 8],
70
+ [2, 6, 7],
71
+ [2, 7, 6]
72
+ ]
73
+ },
74
+ "expected": {
75
+ "grid": [
76
+ [2, 5, 8],
77
+ [2, 6, 7],
78
+ [2, 7, 6]
79
+ ],
80
+ "totalPayout": 80,
81
+ "hasWallWin": false,
82
+ "hasScatterWin": false,
83
+ "lineWinCount": 1,
84
+ "lineWins": [
85
+ {
86
+ "lineIndex": 0,
87
+ "symbol": 2,
88
+ "matchLength": 3,
89
+ "payout": 80
90
+ }
91
+ ]
92
+ }
93
+ },
94
+ {
95
+ "id": "wall-win-bar3-004",
96
+ "description": "Full screen BAR3 wall win",
97
+ "input": {
98
+ "spinType": 0,
99
+ "gameDirection": 0,
100
+ "betStake": 1,
101
+ "betGame": 8,
102
+ "forcedGrid": [
103
+ [2, 2, 2],
104
+ [2, 2, 2],
105
+ [2, 2, 2]
106
+ ]
107
+ },
108
+ "expected": {
109
+ "grid": [
110
+ [2, 2, 2],
111
+ [2, 2, 2],
112
+ [2, 2, 2]
113
+ ],
114
+ "totalPayout": 4640,
115
+ "hasWallWin": true,
116
+ "wallWinType": 2,
117
+ "wallPayout": 4000,
118
+ "hasScatterWin": false,
119
+ "lineWinCount": 8,
120
+ "comment": "C++ pays both wall AND line wins: wall (500×8=4000) + lines (80×8=640) = 4640"
121
+ }
122
+ },
123
+ {
124
+ "id": "wall-win-cherry-mix-005",
125
+ "description": "Cherry wall win with mixed CH/CH_S",
126
+ "input": {
127
+ "spinType": 0,
128
+ "gameDirection": 0,
129
+ "betStake": 1,
130
+ "betGame": 8,
131
+ "forcedGrid": [
132
+ [9, 10, 9],
133
+ [10, 9, 10],
134
+ [9, 9, 10]
135
+ ]
136
+ },
137
+ "expected": {
138
+ "grid": [
139
+ [9, 10, 9],
140
+ [10, 9, 10],
141
+ [9, 9, 10]
142
+ ],
143
+ "totalPayout": 3200,
144
+ "hasWallWin": true,
145
+ "wallWinType": 9,
146
+ "wallPayout": 3200,
147
+ "hasScatterWin": false,
148
+ "lineWinCount": 0,
149
+ "comment": "Cherry wall = 400 × 8 = 3200"
150
+ }
151
+ },
152
+ {
153
+ "id": "scatter-win-3x-seven-006",
154
+ "description": "3x Seven scatter win + line win (C++ pays both)",
155
+ "input": {
156
+ "spinType": 0,
157
+ "gameDirection": 0,
158
+ "betStake": 1,
159
+ "betGame": 8,
160
+ "forcedGrid": [
161
+ [1, 5, 8],
162
+ [6, 1, 7],
163
+ [5, 7, 1]
164
+ ]
165
+ },
166
+ "expected": {
167
+ "grid": [
168
+ [1, 5, 8],
169
+ [6, 1, 7],
170
+ [5, 7, 1]
171
+ ],
172
+ "totalPayout": 140,
173
+ "hasWallWin": false,
174
+ "hasScatterWin": true,
175
+ "scatterSymbol": 1,
176
+ "scatterCount": 3,
177
+ "scatterPayout": 40,
178
+ "lineWinCount": 1,
179
+ "lineWins": [
180
+ {
181
+ "lineIndex": 6,
182
+ "symbol": 1,
183
+ "matchLength": 3,
184
+ "payout": 100
185
+ }
186
+ ],
187
+ "comment": "C++ pays BOTH: 3x Seven line (100) + 3x Seven scatter (40) = 140"
188
+ }
189
+ },
190
+ {
191
+ "id": "scatter-win-3x-super-seven-doubled-007",
192
+ "description": "3x Super Seven scatter + line win (C++ pays both)",
193
+ "input": {
194
+ "spinType": 0,
195
+ "gameDirection": 0,
196
+ "betStake": 1,
197
+ "betGame": 8,
198
+ "forcedGrid": [
199
+ [0, 5, 8],
200
+ [6, 0, 7],
201
+ [5, 7, 0]
202
+ ]
203
+ },
204
+ "expected": {
205
+ "grid": [
206
+ [0, 5, 8],
207
+ [6, 0, 7],
208
+ [5, 7, 0]
209
+ ],
210
+ "totalPayout": 230,
211
+ "hasWallWin": false,
212
+ "hasScatterWin": true,
213
+ "scatterSymbol": 0,
214
+ "scatterCount": 3,
215
+ "scatterPayout": 80,
216
+ "isSuperSevenOnly": true,
217
+ "lineWinCount": 1,
218
+ "lineWins": [
219
+ {
220
+ "lineIndex": 6,
221
+ "symbol": 0,
222
+ "matchLength": 3,
223
+ "payout": 150
224
+ }
225
+ ],
226
+ "comment": "C++ pays BOTH: 3x Super Seven line (150) + scatter doubled (80) = 230"
227
+ }
228
+ },
229
+ {
230
+ "id": "any-bar-wall-008",
231
+ "description": "Any Bar wall win (mixed BAR3/BAR2/BAR1)",
232
+ "input": {
233
+ "spinType": 0,
234
+ "gameDirection": 0,
235
+ "betStake": 1,
236
+ "betGame": 8,
237
+ "forcedGrid": [
238
+ [2, 3, 4],
239
+ [4, 2, 3],
240
+ [3, 4, 2]
241
+ ]
242
+ },
243
+ "expected": {
244
+ "grid": [
245
+ [2, 3, 4],
246
+ [4, 2, 3],
247
+ [3, 4, 2]
248
+ ],
249
+ "totalPayout": 400,
250
+ "hasWallWin": true,
251
+ "wallWinType": 10,
252
+ "wallPayout": 400,
253
+ "hasScatterWin": false,
254
+ "lineWinCount": 0,
255
+ "comment": "Any Bar wall = 50 × 8 = 400"
256
+ }
257
+ },
258
+ {
259
+ "id": "fruit-wall-009",
260
+ "description": "All Fruits wall win",
261
+ "input": {
262
+ "spinType": 0,
263
+ "gameDirection": 0,
264
+ "betStake": 1,
265
+ "betGame": 8,
266
+ "forcedGrid": [
267
+ [5, 7, 8],
268
+ [9, 10, 5],
269
+ [7, 8, 9]
270
+ ]
271
+ },
272
+ "expected": {
273
+ "grid": [
274
+ [5, 7, 8],
275
+ [9, 10, 5],
276
+ [7, 8, 9]
277
+ ],
278
+ "totalPayout": 120,
279
+ "hasWallWin": true,
280
+ "wallWinType": 11,
281
+ "wallPayout": 120,
282
+ "hasScatterWin": false,
283
+ "lineWinCount": 0,
284
+ "comment": "All Fruits wall = 15 × 8 = 120"
285
+ }
286
+ },
287
+ {
288
+ "id": "bar-mix-line-010",
289
+ "description": "Any Bar line win (BAR3+BAR2+BAR1)",
290
+ "input": {
291
+ "spinType": 0,
292
+ "gameDirection": 0,
293
+ "betStake": 1,
294
+ "betGame": 8,
295
+ "forcedGrid": [
296
+ [2, 5, 8],
297
+ [3, 6, 7],
298
+ [4, 7, 6]
299
+ ]
300
+ },
301
+ "expected": {
302
+ "grid": [
303
+ [2, 5, 8],
304
+ [3, 6, 7],
305
+ [4, 7, 6]
306
+ ],
307
+ "totalPayout": 10,
308
+ "hasWallWin": false,
309
+ "hasScatterWin": false,
310
+ "lineWinCount": 1,
311
+ "lineWins": [
312
+ {
313
+ "lineIndex": 0,
314
+ "symbol": 25,
315
+ "matchLength": 3,
316
+ "payout": 10
317
+ }
318
+ ],
319
+ "comment": "Symbol 25 = BAR_ANY for mixed bar line (10 × 1 = 10)"
320
+ }
321
+ },
322
+ {
323
+ "id": "16-line-mode-011",
324
+ "description": "16-line mode with both direction wins",
325
+ "input": {
326
+ "spinType": 0,
327
+ "gameDirection": 1,
328
+ "betStake": 1,
329
+ "betGame": 16,
330
+ "forcedGrid": [
331
+ [6, 5, 8],
332
+ [6, 6, 7],
333
+ [6, 7, 6]
334
+ ]
335
+ },
336
+ "expected": {
337
+ "grid": [
338
+ [6, 5, 8],
339
+ [6, 6, 7],
340
+ [6, 7, 6]
341
+ ],
342
+ "totalPayout": 72,
343
+ "hasWallWin": false,
344
+ "hasScatterWin": false,
345
+ "lineWinCount": 4,
346
+ "comment": "Bell on line 0 (top row), line 6 (diagonal), line 8 (reverse top row), line 14 (reverse diagonal) = 4 x 18 = 72"
347
+ }
348
+ },
349
+ {
350
+ "id": "bonus-bell-scatter-012",
351
+ "description": "Bell Bonus with bell scatter wins",
352
+ "input": {
353
+ "spinType": 3,
354
+ "gameDirection": 0,
355
+ "betStake": 1,
356
+ "betGame": 8,
357
+ "forcedGrid": [
358
+ [6, 5, 6],
359
+ [7, 6, 7],
360
+ [6, 7, 6]
361
+ ]
362
+ },
363
+ "expected": {
364
+ "grid": [
365
+ [6, 5, 6],
366
+ [7, 6, 7],
367
+ [6, 7, 6]
368
+ ],
369
+ "hasWallWin": false,
370
+ "hasScatterWin": false,
371
+ "specialWinCount": 1,
372
+ "specialWins": [
373
+ {
374
+ "winType": 14,
375
+ "count": 5,
376
+ "payout": 50
377
+ }
378
+ ],
379
+ "comment": "Bell Bonus: each bell pays as scatter (5 bells × 10 × 1 = 50)"
380
+ }
381
+ },
382
+ {
383
+ "id": "bonus-bar1-super-bar-013",
384
+ "description": "Bar1 Bonus with super bar scatter wins",
385
+ "input": {
386
+ "spinType": 4,
387
+ "gameDirection": 0,
388
+ "betStake": 1,
389
+ "betGame": 8,
390
+ "forcedGrid": [
391
+ [11, 5, 11],
392
+ [7, 11, 7],
393
+ [5, 7, 11]
394
+ ]
395
+ },
396
+ "expected": {
397
+ "grid": [
398
+ [11, 5, 11],
399
+ [7, 11, 7],
400
+ [5, 7, 11]
401
+ ],
402
+ "hasWallWin": false,
403
+ "hasScatterWin": false,
404
+ "specialWinCount": 1,
405
+ "specialWins": [
406
+ {
407
+ "winType": 15,
408
+ "count": 4,
409
+ "payout": 40
410
+ }
411
+ ],
412
+ "comment": "Bar1 Bonus: each super bar pays as scatter (4 × 10 × 1 = 40)"
413
+ }
414
+ }
415
+ ],
416
+ "multiplierTests": {
417
+ "description": "Verify multiplier values match C++ xlsx-derived values exactly",
418
+ "lineMultipliers": {
419
+ "SUPER_SEVEN_x3": 150,
420
+ "SEVEN_x3": 100,
421
+ "BAR3_x3": 80,
422
+ "BAR2_x3": 50,
423
+ "BAR1_x3": 30,
424
+ "MELON_x3": 20,
425
+ "BELL_x3": 18,
426
+ "PRUNE_x3": 14,
427
+ "ORANGE_x3": 10,
428
+ "CHERRY_x1": 2,
429
+ "CHERRY_x2": 5,
430
+ "CHERRY_x3": 10,
431
+ "ANY_BAR_x3": 10
432
+ },
433
+ "wallMultipliers": {
434
+ "BAR3": 500,
435
+ "BAR2": 400,
436
+ "BAR1": 300,
437
+ "MELON": 300,
438
+ "BELL": 200,
439
+ "PRUNE": 100,
440
+ "ORANGE": 50,
441
+ "CHERRY": 400,
442
+ "ANY_BAR": 50,
443
+ "ALL_FRUITS": 15,
444
+ "ALL_COLORS": 50
445
+ },
446
+ "scatterMultipliers": {
447
+ "SEVEN_x9": 1000,
448
+ "SEVEN_x8": 400,
449
+ "SEVEN_x7": 200,
450
+ "SEVEN_x6": 100,
451
+ "SEVEN_x5": 50,
452
+ "SEVEN_x4": 20,
453
+ "SEVEN_x3": 5,
454
+ "SEVEN_x2": 2
455
+ }
456
+ }
457
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * GDD Validation Test - 1000 Paid Spins
3
+ *
4
+ * Validates that after the Symbol/ScreenWinType rename, all responses
5
+ * still match GDD expectations:
6
+ * - Response shapes match SpinResponse interface
7
+ * - All symbols are from the renamed GDD enum
8
+ * - Bonus triggers use correct GDD SpinType strings
9
+ * - Win evaluations are structurally correct
10
+ * - State transitions are valid
11
+ * - RTP is within a plausible range for 1000 spins
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=gdd-validation-1000.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gdd-validation-1000.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gdd-validation-1000.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}