@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,721 @@
1
+ "use strict";
2
+ /**
3
+ * Happy Panda Game Engine Configuration
4
+ *
5
+ * Extracted from CherryMaster_A_2.cpp math model.
6
+ * 3x3 slot with 8/16 bidirectional paylines.
7
+ *
8
+ * Game Modes:
9
+ * - gameDirection=0: 8 lines, single direction, min bet = 8
10
+ * - gameDirection=1: 16 lines, both directions, min bet = 16
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.FRUIT_STYLE_SYMBOLS = exports.BAR_MIX_SYMBOLS = exports.BAR_STYLE_SYMBOLS = exports.CENTER_BAMBOO_RESPIN_LIMITATION_WEIGHTS = exports.CENTER_BAMBOO_RESPIN_WEIGHTS = exports.CENTER_BAMBOO_RESPIN_SYMBOLS = exports.FIREWORKS_BONUS_3X3_SYMBOL_WEIGHTS = exports.FIREWORKS_BONUS_3X3_WEIGHTS = exports.FIREWORKS_BONUS_LIMITATION_WEIGHTS = exports.FIREWORKS_BONUS_WEIGHTS = exports.FIREWORKS_BONUS_SYMBOLS = exports.CAMERA_BONUS_3X3_SYMBOL_WEIGHTS = exports.CAMERA_BONUS_3X3_WEIGHTS = exports.CAMERA_BONUS_LIMITATION_WEIGHTS = exports.CAMERA_BONUS_WEIGHTS = exports.CAMERA_BONUS_SYMBOLS = exports.BAMBOO_TWINS_3X3_SYMBOL_WEIGHTS = exports.BAMBOO_TWINS_3X3_WEIGHTS = exports.BAMBOO_TWINS_LIMITATION_WEIGHTS = exports.BAMBOO_TWINS_WEIGHTS = exports.BAMBOO_TWINS_SYMBOLS = exports.BAMBOO_TRIPLETS_3X3_SYMBOL_WEIGHTS = exports.BAMBOO_TRIPLETS_3X3_WEIGHTS = exports.BAMBOO_TRIPLETS_LIMITATION_WEIGHTS = exports.BAMBOO_TRIPLETS_WEIGHTS = exports.BAMBOO_TRIPLETS_SYMBOLS = exports.BASE_GAME_SPIN_3X3_SYMBOL_WEIGHTS = exports.BASE_GAME_SPIN_3X3_WEIGHTS = exports.BASE_GAME_SPIN_LIMITATION_WEIGHTS = exports.LIMITATION_TIERS = exports.BASE_GAME_SPIN_SYMBOLS = exports.BASE_GAME_SPIN_WEIGHTS = exports.RESPIN_CENTER_BAMBOO = exports.BONUS_FIREWORKS = exports.BONUS_CAMERA = exports.BONUS_BAMBOO_TWINS = exports.POOL_JACKPOT = exports.BONUS_BAMBOO_TRIPLETS = exports.SPECIAL_WIN_MULTIPLIERS = exports.GOLDEN_PANDA_MULTIPLIER = exports.PANDA_MIN_COUNT = exports.PANDA_SCATTER_MULTIPLIERS = exports.WALL_MULTIPLIERS = exports.LINES_PER_DIRECTION = exports.LINE_SHAPES = exports.LINE_MULTIPLIERS = exports.GRID = exports.ScreenWinType = exports.SpinType = exports.Symbol = void 0;
14
+ exports.BAMBOO_SYMBOLS = exports.PANDA_SYMBOLS = exports.BADGE_SYMBOLS = void 0;
15
+ // =============================================================================
16
+ // SYMBOL DEFINITIONS
17
+ // =============================================================================
18
+ var Symbol;
19
+ (function (Symbol) {
20
+ Symbol[Symbol["NONE"] = -1] = "NONE";
21
+ // High-Value Symbols (H1-H3)
22
+ Symbol[Symbol["GOLDEN_PANDA"] = 0] = "GOLDEN_PANDA";
23
+ Symbol[Symbol["RED_PANDA"] = 1] = "RED_PANDA";
24
+ Symbol[Symbol["SLOT_MACHINE"] = 2] = "SLOT_MACHINE";
25
+ // Medium-Value Symbols (M1-M3)
26
+ Symbol[Symbol["CITY"] = 3] = "CITY";
27
+ Symbol[Symbol["FIREWORKS_ROCKETS"] = 4] = "FIREWORKS_ROCKETS";
28
+ Symbol[Symbol["BACKPACK"] = 5] = "BACKPACK";
29
+ // Low-Value Symbols (L1-L5)
30
+ Symbol[Symbol["CAMERA"] = 6] = "CAMERA";
31
+ Symbol[Symbol["FOOD_BOWL"] = 7] = "FOOD_BOWL";
32
+ Symbol[Symbol["CUP"] = 8] = "CUP";
33
+ Symbol[Symbol["BAMBOO"] = 9] = "BAMBOO";
34
+ Symbol[Symbol["GOLDEN_BAMBOO"] = 10] = "GOLDEN_BAMBOO";
35
+ // Special Symbols
36
+ Symbol[Symbol["HAT"] = 11] = "HAT";
37
+ Symbol[Symbol["BAR_MIX"] = 25] = "BAR_MIX";
38
+ // Dancing Panda Picture Pieces (9-piece image for Bamboo Triplets Bonus)
39
+ Symbol[Symbol["PANDA_PIECE_00"] = 12] = "PANDA_PIECE_00";
40
+ Symbol[Symbol["PANDA_PIECE_01"] = 13] = "PANDA_PIECE_01";
41
+ Symbol[Symbol["PANDA_PIECE_02"] = 14] = "PANDA_PIECE_02";
42
+ Symbol[Symbol["PANDA_PIECE_10"] = 15] = "PANDA_PIECE_10";
43
+ Symbol[Symbol["PANDA_PIECE_11"] = 16] = "PANDA_PIECE_11";
44
+ Symbol[Symbol["PANDA_PIECE_12"] = 17] = "PANDA_PIECE_12";
45
+ Symbol[Symbol["PANDA_PIECE_20"] = 18] = "PANDA_PIECE_20";
46
+ Symbol[Symbol["PANDA_PIECE_21"] = 19] = "PANDA_PIECE_21";
47
+ Symbol[Symbol["PANDA_PIECE_22"] = 20] = "PANDA_PIECE_22";
48
+ // Panda Badges (bonus indicators)
49
+ Symbol[Symbol["BADGE_YELLOW"] = 21] = "BADGE_YELLOW";
50
+ Symbol[Symbol["BADGE_RED"] = 22] = "BADGE_RED";
51
+ Symbol[Symbol["BADGE_GREEN"] = 23] = "BADGE_GREEN";
52
+ Symbol[Symbol["BADGE_BLUE"] = 24] = "BADGE_BLUE";
53
+ })(Symbol || (exports.Symbol = Symbol = {}));
54
+ var SpinType;
55
+ (function (SpinType) {
56
+ SpinType["BASE_GAME_SPIN"] = "BASE_GAME_SPIN";
57
+ SpinType["BONUS_BAMBOO_TRIPLETS"] = "BONUS_BAMBOO_TRIPLETS";
58
+ SpinType["BONUS_BAMBOO_TWINS"] = "BONUS_BAMBOO_TWINS";
59
+ SpinType["BONUS_CAMERA"] = "BONUS_CAMERA";
60
+ SpinType["BONUS_FIREWORKS"] = "BONUS_FIREWORKS";
61
+ SpinType["RESPIN_CENTER_BAMBOO"] = "RESPIN_CENTER_BAMBOO";
62
+ })(SpinType || (exports.SpinType = SpinType = {}));
63
+ var ScreenWinType;
64
+ (function (ScreenWinType) {
65
+ ScreenWinType[ScreenWinType["NOTHING"] = -1] = "NOTHING";
66
+ // Scatter wins (2-9 Panda symbols)
67
+ ScreenWinType[ScreenWinType["SCREEN_GOLDEN_PANDA"] = 0] = "SCREEN_GOLDEN_PANDA";
68
+ ScreenWinType[ScreenWinType["SCREEN_RED_PANDA"] = 1] = "SCREEN_RED_PANDA";
69
+ // Wall wins (3x3 full screen)
70
+ ScreenWinType[ScreenWinType["SCREEN_SLOT_MACHINE"] = 2] = "SCREEN_SLOT_MACHINE";
71
+ ScreenWinType[ScreenWinType["SCREEN_CITY"] = 3] = "SCREEN_CITY";
72
+ ScreenWinType[ScreenWinType["SCREEN_FIREWORKS_ROCKETS"] = 4] = "SCREEN_FIREWORKS_ROCKETS";
73
+ ScreenWinType[ScreenWinType["SCREEN_BACKPACK"] = 5] = "SCREEN_BACKPACK";
74
+ ScreenWinType[ScreenWinType["SCREEN_CAMERA"] = 6] = "SCREEN_CAMERA";
75
+ ScreenWinType[ScreenWinType["SCREEN_FOOD_BOWL"] = 7] = "SCREEN_FOOD_BOWL";
76
+ ScreenWinType[ScreenWinType["SCREEN_CUP"] = 8] = "SCREEN_CUP";
77
+ ScreenWinType[ScreenWinType["SCREEN_BAMBOO"] = 9] = "SCREEN_BAMBOO";
78
+ ScreenWinType[ScreenWinType["SCREEN_BAR_MIX"] = 10] = "SCREEN_BAR_MIX";
79
+ ScreenWinType[ScreenWinType["SCREEN_FRUIT_MIX"] = 11] = "SCREEN_FRUIT_MIX";
80
+ ScreenWinType[ScreenWinType["SCREEN_BADGE_MIX"] = 12] = "SCREEN_BADGE_MIX";
81
+ // Special wins
82
+ ScreenWinType[ScreenWinType["SCREEN_PANDA_PIECES"] = 13] = "SCREEN_PANDA_PIECES";
83
+ ScreenWinType[ScreenWinType["SCREEN_CAMERA_SCATTER"] = 14] = "SCREEN_CAMERA_SCATTER";
84
+ ScreenWinType[ScreenWinType["SCREEN_HAT_SCATTER"] = 15] = "SCREEN_HAT_SCATTER";
85
+ })(ScreenWinType || (exports.ScreenWinType = ScreenWinType = {}));
86
+ // =============================================================================
87
+ // GRID CONFIGURATION
88
+ // =============================================================================
89
+ exports.GRID = {
90
+ REELS: 3,
91
+ ROWS: 3,
92
+ POSITIONS: 9,
93
+ };
94
+ // =============================================================================
95
+ // LINE CONFIGURATION
96
+ // =============================================================================
97
+ /**
98
+ * Line pay table: [symbol][matchCount] = multiplier
99
+ * matchCount: 0=x1, 1=x2, 2=x3
100
+ * Values are multiplied by line bet
101
+ */
102
+ exports.LINE_MULTIPLIERS = [
103
+ // x1, x2, x3 - exact xlsx values (LinesMulti)
104
+ [0, 0, 150], // H1 - Golden Panda
105
+ [0, 0, 100], // H2 - Red Panda
106
+ [0, 0, 80], // H3 - Slot Machine
107
+ [0, 0, 50], // M1 - City
108
+ [0, 0, 30], // M2 - Fireworks Rockets
109
+ [0, 0, 20], // M3 - Backpack
110
+ [0, 0, 18], // L1 - Camera
111
+ [0, 0, 14], // L2 - Food Bowl
112
+ [0, 0, 10], // L3 - Cup
113
+ [2, 5, 10], // L4 - Bamboo (pays for 1, 2, or 3 - unique!)
114
+ [0, 0, 10], // Bar Mix (mixed Slot Machine/City/Fireworks)
115
+ ];
116
+ /**
117
+ * 16 payline definitions: [lineIdx][positionIdx] = [reel, row]
118
+ * Lines 0-7: forward direction
119
+ * Lines 8-15: reverse direction (for 16-line mode)
120
+ */
121
+ exports.LINE_SHAPES = [
122
+ // Forward direction (8 lines)
123
+ [[0, 0], [1, 0], [2, 0]], // Line 0: Top row
124
+ [[0, 1], [1, 1], [2, 1]], // Line 1: Middle row
125
+ [[0, 2], [1, 2], [2, 2]], // Line 2: Bottom row
126
+ [[0, 0], [0, 1], [0, 2]], // Line 3: Left column
127
+ [[1, 0], [1, 1], [1, 2]], // Line 4: Center column
128
+ [[2, 0], [2, 1], [2, 2]], // Line 5: Right column
129
+ [[0, 0], [1, 1], [2, 2]], // Line 6: Diagonal TL-BR
130
+ [[0, 2], [1, 1], [2, 0]], // Line 7: Diagonal BL-TR
131
+ // Reverse direction (8 lines)
132
+ [[2, 0], [1, 0], [0, 0]], // Line 8: Top row reversed
133
+ [[2, 1], [1, 1], [0, 1]], // Line 9: Middle row reversed
134
+ [[2, 2], [1, 2], [0, 2]], // Line 10: Bottom row reversed
135
+ [[0, 2], [0, 1], [0, 0]], // Line 11: Left column reversed
136
+ [[1, 2], [1, 1], [1, 0]], // Line 12: Center column reversed
137
+ [[2, 2], [2, 1], [2, 0]], // Line 13: Right column reversed
138
+ [[2, 2], [1, 1], [0, 0]], // Line 14: Diagonal BR-TL
139
+ [[2, 0], [1, 1], [0, 2]], // Line 15: Diagonal TR-BL
140
+ ];
141
+ exports.LINES_PER_DIRECTION = [8, 16];
142
+ // =============================================================================
143
+ // WALL (3x3) WINS
144
+ // =============================================================================
145
+ /**
146
+ * Wall win multipliers: [wallType] = multiplier x bet_game
147
+ * Order matches ScreenMulti in C++ EXACTLY
148
+ */
149
+ exports.WALL_MULTIPLIERS = [
150
+ 500, // H3 - Slot Machine - exact xlsx value (ScreenMulti)
151
+ 400, // M1 - City
152
+ 300, // M2 - Fireworks Rockets
153
+ 300, // M3 - Backpack
154
+ 200, // L1 - Camera
155
+ 100, // L2 - Food Bowl
156
+ 50, // L3 - Cup
157
+ 400, // L4 - Bamboo
158
+ 50, // Bar Mix (mixed Slot Machine/City/Fireworks)
159
+ 15, // Fruit Mix (all fruit-style symbols)
160
+ 50, // Badge Mix (all badge symbols)
161
+ ];
162
+ // =============================================================================
163
+ // PANDA SCATTER WINS
164
+ // =============================================================================
165
+ /**
166
+ * Red Panda/Golden Panda scatter pay table: [count-2] = multiplier x bet_game
167
+ * Pays for 2-9 matching Panda symbols
168
+ * Matches SevenSuperMulti in C++ EXACTLY
169
+ */
170
+ exports.PANDA_SCATTER_MULTIPLIERS = [
171
+ 1000, // x9 - exact xlsx value (SevenSuperMulti)
172
+ 400, // x8
173
+ 200, // x7
174
+ 100, // x6
175
+ 50, // x5
176
+ 20, // x4
177
+ 5, // x3
178
+ 2, // x2
179
+ ];
180
+ exports.PANDA_MIN_COUNT = 2;
181
+ exports.GOLDEN_PANDA_MULTIPLIER = 2; // Double win if all Golden Pandas
182
+ // =============================================================================
183
+ // SPECIAL WINS (Bonus-specific)
184
+ // =============================================================================
185
+ /**
186
+ * Special win multipliers: [gameDirection][type] = multiplier x line
187
+ * type: 0=panda pieces, 1=camera scatter, 2=hat scatter
188
+ * Matches SpecialWins in C++ EXACTLY
189
+ */
190
+ exports.SPECIAL_WIN_MULTIPLIERS = [
191
+ [100, 10, 10], // 8 lines - C++ SpecialWins[0]
192
+ [200, 20, 20], // 16 lines - C++ SpecialWins[1]
193
+ ];
194
+ // =============================================================================
195
+ // BAMBOO TRIPLETS BONUS CONFIGURATION (GDD: Jackpot Bonus)
196
+ // =============================================================================
197
+ exports.BONUS_BAMBOO_TRIPLETS = {
198
+ /** Initial jackpot value: multiplier x bet_game */
199
+ INIT: 100,
200
+ /** Maximum jackpot value: multiplier x bet_game */
201
+ MAX: 1000,
202
+ /** Probability weights to increment jackpot on losing spin: [gameDir][yes,no] */
203
+ INCREMENT_WEIGHTS: [
204
+ [3, 10], // 8 lines: 3/13 chance to increase
205
+ [3, 10], // 16 lines: 3/13 chance to increase
206
+ ],
207
+ /** Increment amount: [gameDir] x bet_stake */
208
+ INCREMENT_VALUE: [1, 2],
209
+ /** Counter starts at (always 1 - triggers on 3x bamboo line) */
210
+ COUNTER_INIT: 1,
211
+ /** Free spins awarded per bonus occurrence */
212
+ SPINS: 3,
213
+ /** Additional win on jackpot: multiplier x bet_game */
214
+ ADD_WIN: 5,
215
+ };
216
+ // =============================================================================
217
+ // POOL JACKPOT CONFIGURATION
218
+ // =============================================================================
219
+ exports.POOL_JACKPOT = {
220
+ /** Initial pool value */
221
+ INIT: 0,
222
+ /** Maximum pool value: multiplier x bet_game */
223
+ MAX: 250,
224
+ /** Increment values: [gameDir][superSeven, seven] x bet_line */
225
+ INCREMENT: [
226
+ [10, 5], // 8 lines
227
+ [10, 5], // 16 lines
228
+ ],
229
+ };
230
+ // =============================================================================
231
+ // BAMBOO TWINS BONUS CONFIGURATION (GDD: Bamboo Twins Bonus)
232
+ // =============================================================================
233
+ exports.BONUS_BAMBOO_TWINS = {
234
+ /** Counter initial values (randomly chosen) */
235
+ COUNTER_INIT: [6, 9],
236
+ /** Weights for choosing initial counter: [gameDir][weight_for_6, weight_for_9] */
237
+ COUNTER_INIT_WEIGHTS: [
238
+ [5, 5], // 8 lines: 50/50
239
+ [5, 5], // 16 lines: 50/50
240
+ ],
241
+ /** Free spins awarded */
242
+ SPINS: 1,
243
+ };
244
+ // =============================================================================
245
+ // CAMERA BONUS CONFIGURATION (GDD: Camera Bonus)
246
+ // =============================================================================
247
+ exports.BONUS_CAMERA = {
248
+ /** Counter initial values (randomly chosen) */
249
+ COUNTER_INIT: [3, 5],
250
+ /** Weights for choosing initial counter: [gameDir][weight_for_3, weight_for_5] */
251
+ COUNTER_INIT_WEIGHTS: [
252
+ [5, 5], // 8 lines: 50/50
253
+ [5, 5], // 16 lines: 50/50
254
+ ],
255
+ /** Free spins awarded */
256
+ SPINS: 5,
257
+ };
258
+ // =============================================================================
259
+ // FIREWORKS BONUS CONFIGURATION (GDD: Fireworks Bonus)
260
+ // =============================================================================
261
+ exports.BONUS_FIREWORKS = {
262
+ /** Counter starts at (always 1) */
263
+ COUNTER_INIT: 1,
264
+ /** Free spins awarded */
265
+ SPINS: 7,
266
+ };
267
+ // =============================================================================
268
+ // CENTER BAMBOO RESPIN CONFIGURATION (GDD: Center Bamboo Respins)
269
+ // =============================================================================
270
+ exports.RESPIN_CENTER_BAMBOO = {
271
+ /** Spins awarded: [Bamboo, Golden Bamboo] */
272
+ SPINS: [1, 2],
273
+ };
274
+ // =============================================================================
275
+ // BASE GAME SPIN SYMBOL WEIGHTS
276
+ // =============================================================================
277
+ /**
278
+ * Symbol weights for base game spins: [gameDirection][position][symbol]
279
+ * Position order: (0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)
280
+ * Symbol order: GoldenPanda, RedPanda, SlotMachine, City, FireworksRockets, Backpack, Camera, FoodBowl, Cup, Bamboo, GoldenBamboo
281
+ */
282
+ exports.BASE_GAME_SPIN_WEIGHTS = [
283
+ // gameDirection == 0 (8 lines)
284
+ [
285
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 4, 0], // (0,0)
286
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 0], // (0,1)
287
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 5, 0], // (0,2)
288
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 4], // (1,0)
289
+ [1, 5, 3, 6, 10, 26, 2, 16, 36, 3, 2], // (1,1) center
290
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 4], // (1,2)
291
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 6, 0], // (2,0)
292
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 0], // (2,1)
293
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 4, 0], // (2,2)
294
+ ],
295
+ // gameDirection == 1 (16 lines)
296
+ [
297
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 4, 0], // (0,0)
298
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 0], // (0,1)
299
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 4, 0], // (0,2)
300
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 4], // (1,0)
301
+ [1, 5, 3, 6, 10, 26, 2, 16, 36, 4, 1], // (1,1) center
302
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 4], // (1,2)
303
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 5, 0], // (2,0)
304
+ [1, 2, 3, 6, 3, 6, 35, 35, 5, 1, 0], // (2,1)
305
+ [1, 3, 3, 6, 10, 26, 2, 16, 36, 4, 0], // (2,2)
306
+ ],
307
+ ];
308
+ /**
309
+ * Active symbol indices for base game spins
310
+ */
311
+ exports.BASE_GAME_SPIN_SYMBOLS = [
312
+ Symbol.GOLDEN_PANDA,
313
+ Symbol.RED_PANDA,
314
+ Symbol.SLOT_MACHINE,
315
+ Symbol.CITY,
316
+ Symbol.FIREWORKS_ROCKETS,
317
+ Symbol.BACKPACK,
318
+ Symbol.CAMERA,
319
+ Symbol.FOOD_BOWL,
320
+ Symbol.CUP,
321
+ Symbol.BAMBOO,
322
+ Symbol.GOLDEN_BAMBOO,
323
+ ];
324
+ // =============================================================================
325
+ // SYMBOL LIMITATION SYSTEM
326
+ // =============================================================================
327
+ /**
328
+ * Limitation tiers: maximum symbols of same type allowed
329
+ */
330
+ exports.LIMITATION_TIERS = [2, 4, 7, 9];
331
+ /**
332
+ * Limitation weights for base game spins: [gameDirection][symbol][tier]
333
+ * Tier order: max2, max4, max7, max9
334
+ */
335
+ exports.BASE_GAME_SPIN_LIMITATION_WEIGHTS = [
336
+ // gameDirection == 0 (8 lines)
337
+ [
338
+ [9, 2, 1, 1], // Golden Panda
339
+ [8, 3, 1, 1], // Red Panda
340
+ [8, 1, 1, 1], // Slot Machine
341
+ [8, 1, 1, 1], // City
342
+ [8, 2, 1, 1], // Fireworks Rockets
343
+ [7, 3, 1, 1], // Backpack
344
+ [5, 3, 1, 1], // Camera
345
+ [6, 2, 1, 1], // Food Bowl
346
+ [5, 2, 1, 1], // Cup
347
+ [5, 1, 1, 1], // Bamboo
348
+ [5, 1, 0, 0], // Golden Bamboo (max 4 only)
349
+ ],
350
+ // gameDirection == 1 (16 lines)
351
+ [
352
+ [9, 2, 1, 1], // Golden Panda
353
+ [8, 3, 1, 1], // Red Panda
354
+ [8, 1, 1, 1], // Slot Machine
355
+ [8, 1, 1, 1], // City
356
+ [8, 2, 1, 1], // Fireworks Rockets
357
+ [7, 3, 1, 1], // Backpack
358
+ [5, 3, 1, 1], // Camera
359
+ [6, 2, 1, 1], // Food Bowl
360
+ [5, 2, 1, 1], // Cup
361
+ [5, 1, 1, 1], // Bamboo
362
+ [5, 1, 0, 0], // Golden Bamboo (max 4 only)
363
+ ],
364
+ ];
365
+ // =============================================================================
366
+ // 3x3 WIN PROBABILITY
367
+ // =============================================================================
368
+ /**
369
+ * Probability weights for 3x3 wall wins: [gameDirection][yes, no]
370
+ */
371
+ exports.BASE_GAME_SPIN_3X3_WEIGHTS = [
372
+ [3, 193], // 8 lines: 3/196 chance
373
+ [3, 198], // 16 lines: 3/201 chance
374
+ ];
375
+ /**
376
+ * Weights for which symbol creates 3x3 win
377
+ * Order: GoldenPanda, RedPanda, SlotMachine, City, FireworksRockets, Backpack, Camera, FoodBowl, Cup, Bamboo, GoldenBamboo
378
+ */
379
+ exports.BASE_GAME_SPIN_3X3_SYMBOL_WEIGHTS = [
380
+ 1, 1, 3, 4, 1, 8, 1, 20, 24, 1, 0,
381
+ ];
382
+ // =============================================================================
383
+ // BAMBOO TRIPLETS BONUS WEIGHTS (GDD: Jackpot Bonus)
384
+ // =============================================================================
385
+ exports.BAMBOO_TRIPLETS_SYMBOLS = [
386
+ Symbol.GOLDEN_PANDA,
387
+ Symbol.RED_PANDA,
388
+ Symbol.SLOT_MACHINE,
389
+ Symbol.CITY,
390
+ Symbol.FIREWORKS_ROCKETS,
391
+ Symbol.PANDA_PIECE_00, // Panda pieces (all 9 use same weight)
392
+ Symbol.BADGE_YELLOW,
393
+ ];
394
+ exports.BAMBOO_TRIPLETS_WEIGHTS = [
395
+ // gameDirection == 0
396
+ [
397
+ [5, 5, 1, 1, 1, 95, 35], // All 9 positions same
398
+ [5, 5, 1, 1, 1, 95, 35],
399
+ [5, 5, 1, 1, 1, 95, 35],
400
+ [5, 5, 1, 1, 1, 95, 35],
401
+ [5, 5, 1, 1, 1, 95, 35],
402
+ [5, 5, 1, 1, 1, 95, 35],
403
+ [5, 5, 1, 1, 1, 95, 35],
404
+ [5, 5, 1, 1, 1, 95, 35],
405
+ [5, 5, 1, 1, 1, 95, 35],
406
+ ],
407
+ // gameDirection == 1
408
+ [
409
+ [5, 5, 1, 1, 1, 95, 35],
410
+ [5, 5, 1, 1, 1, 95, 35],
411
+ [5, 5, 1, 1, 1, 95, 35],
412
+ [5, 5, 1, 1, 1, 95, 35],
413
+ [5, 5, 1, 1, 1, 95, 35],
414
+ [5, 5, 1, 1, 1, 95, 35],
415
+ [5, 5, 1, 1, 1, 95, 35],
416
+ [5, 5, 1, 1, 1, 95, 35],
417
+ [5, 5, 1, 1, 1, 95, 35],
418
+ ],
419
+ ];
420
+ exports.BAMBOO_TRIPLETS_LIMITATION_WEIGHTS = [
421
+ // gameDirection == 0
422
+ [
423
+ [5, 1, 1, 9], // Golden Panda
424
+ [5, 1, 1, 9], // Red Panda
425
+ [5, 1, 1, 0], // Slot Machine
426
+ [5, 1, 1, 0], // City
427
+ [5, 1, 1, 0], // Fireworks Rockets
428
+ [0, 0, 0, 5], // Panda Piece (max 9 only)
429
+ [5, 5, 5, 5], // Badge Yellow
430
+ ],
431
+ // gameDirection == 1
432
+ [
433
+ [5, 1, 1, 9], // Golden Panda
434
+ [5, 1, 1, 9], // Red Panda
435
+ [5, 1, 1, 0], // Slot Machine
436
+ [5, 1, 1, 0], // City
437
+ [5, 1, 1, 0], // Fireworks Rockets
438
+ [0, 0, 0, 5], // Panda Piece
439
+ [5, 5, 5, 5], // Badge Yellow
440
+ ],
441
+ ];
442
+ // C++ BonusJackpot3x3 EXACTLY - 25% 3x3 rate
443
+ exports.BAMBOO_TRIPLETS_3X3_WEIGHTS = [
444
+ [3, 9], // 8 lines - C++ BonusJackpot3x3[0] = 25%
445
+ [3, 9], // 16 lines - C++ BonusJackpot3x3[1] = 25%
446
+ ];
447
+ exports.BAMBOO_TRIPLETS_3X3_SYMBOL_WEIGHTS = [0, 0, 0, 0, 0, 8, 6];
448
+ // =============================================================================
449
+ // BAMBOO TWINS BONUS WEIGHTS (GDD: Bamboo Twins Bonus)
450
+ // =============================================================================
451
+ exports.BAMBOO_TWINS_SYMBOLS = [
452
+ Symbol.GOLDEN_PANDA,
453
+ Symbol.RED_PANDA,
454
+ Symbol.SLOT_MACHINE,
455
+ Symbol.CITY,
456
+ Symbol.FIREWORKS_ROCKETS,
457
+ Symbol.BAMBOO,
458
+ Symbol.BADGE_RED,
459
+ ];
460
+ exports.BAMBOO_TWINS_WEIGHTS = [
461
+ // gameDirection == 0
462
+ [
463
+ [3, 5, 5, 5, 5, 5, 5], // (0,0)
464
+ [3, 5, 5, 5, 5, 5, 5], // (0,1)
465
+ [3, 5, 5, 5, 5, 5, 5], // (0,2)
466
+ [4, 5, 5, 5, 5, 5, 5], // (1,0)
467
+ [3, 5, 5, 5, 5, 5, 5], // (1,1)
468
+ [4, 5, 5, 5, 5, 5, 5], // (1,2)
469
+ [3, 5, 5, 5, 5, 5, 5], // (2,0)
470
+ [3, 5, 5, 5, 5, 5, 5], // (2,1)
471
+ [3, 5, 5, 5, 5, 5, 5], // (2,2)
472
+ ],
473
+ // gameDirection == 1
474
+ [
475
+ [3, 5, 5, 5, 5, 5, 5],
476
+ [3, 5, 5, 5, 5, 5, 5],
477
+ [3, 5, 5, 5, 5, 5, 5],
478
+ [4, 5, 5, 5, 5, 5, 5],
479
+ [3, 5, 5, 5, 5, 5, 5],
480
+ [4, 5, 5, 5, 5, 5, 5],
481
+ [3, 5, 5, 5, 5, 5, 5],
482
+ [3, 5, 5, 5, 5, 5, 5],
483
+ [3, 5, 5, 5, 5, 5, 5],
484
+ ],
485
+ ];
486
+ exports.BAMBOO_TWINS_LIMITATION_WEIGHTS = [
487
+ // gameDirection == 0
488
+ [
489
+ [5, 1, 1, 2], // Golden Panda
490
+ [5, 1, 1, 2], // Red Panda
491
+ [5, 2, 1, 1], // Slot Machine
492
+ [5, 2, 1, 1], // City
493
+ [5, 2, 1, 1], // Fireworks Rockets
494
+ [5, 2, 1, 1], // Bamboo
495
+ [5, 5, 9, 9], // Badge Red
496
+ ],
497
+ // gameDirection == 1
498
+ [
499
+ [5, 1, 1, 2], // Golden Panda
500
+ [5, 1, 1, 2], // Red Panda
501
+ [5, 2, 1, 1], // Slot Machine
502
+ [5, 2, 1, 1], // City
503
+ [5, 2, 1, 1], // Fireworks Rockets
504
+ [5, 2, 1, 1], // Bamboo
505
+ [5, 5, 9, 9], // Badge Red
506
+ ],
507
+ ];
508
+ // C++ BonusCherry3x3 EXACTLY - 10% 3x3 rate
509
+ exports.BAMBOO_TWINS_3X3_WEIGHTS = [
510
+ [1, 9], // 8 lines - C++ BonusCherry3x3[0] = 10%
511
+ [1, 9], // 16 lines - C++ BonusCherry3x3[1] = 10%
512
+ ];
513
+ exports.BAMBOO_TWINS_3X3_SYMBOL_WEIGHTS = [0, 0, 0, 0, 0, 7, 6];
514
+ // =============================================================================
515
+ // CAMERA BONUS WEIGHTS (GDD: Camera Bonus)
516
+ // =============================================================================
517
+ exports.CAMERA_BONUS_SYMBOLS = [
518
+ Symbol.GOLDEN_PANDA,
519
+ Symbol.RED_PANDA,
520
+ Symbol.SLOT_MACHINE,
521
+ Symbol.CITY,
522
+ Symbol.FIREWORKS_ROCKETS,
523
+ Symbol.CAMERA,
524
+ Symbol.BADGE_GREEN,
525
+ ];
526
+ exports.CAMERA_BONUS_WEIGHTS = [
527
+ // gameDirection == 0
528
+ [
529
+ [5, 7, 2, 2, 2, 15, 9], // All positions same
530
+ [5, 7, 2, 2, 2, 15, 9],
531
+ [5, 7, 2, 2, 2, 15, 9],
532
+ [5, 7, 2, 2, 2, 15, 9],
533
+ [5, 7, 2, 2, 2, 15, 9],
534
+ [5, 7, 2, 2, 2, 15, 9],
535
+ [5, 7, 2, 2, 2, 15, 9],
536
+ [5, 7, 2, 2, 2, 15, 9],
537
+ [5, 7, 2, 2, 2, 15, 9],
538
+ ],
539
+ // gameDirection == 1
540
+ [
541
+ [5, 7, 2, 2, 2, 15, 9],
542
+ [5, 7, 2, 2, 2, 15, 9],
543
+ [5, 7, 2, 2, 2, 15, 9],
544
+ [5, 7, 2, 2, 2, 15, 9],
545
+ [5, 7, 2, 2, 2, 15, 9],
546
+ [5, 7, 2, 2, 2, 15, 9],
547
+ [5, 7, 2, 2, 2, 15, 9],
548
+ [5, 7, 2, 2, 2, 15, 9],
549
+ [5, 7, 2, 2, 2, 15, 9],
550
+ ],
551
+ ];
552
+ exports.CAMERA_BONUS_LIMITATION_WEIGHTS = [
553
+ // gameDirection == 0
554
+ [
555
+ [3, 1, 1, 1], // Golden Panda
556
+ [3, 1, 1, 1], // Red Panda
557
+ [2, 1, 1, 1], // Slot Machine
558
+ [2, 1, 1, 1], // City
559
+ [2, 1, 1, 1], // Fireworks Rockets
560
+ [0, 0, 5, 5], // Camera (min 7 symbols)
561
+ [0, 0, 5, 5], // Badge Green
562
+ ],
563
+ // gameDirection == 1
564
+ [
565
+ [3, 1, 1, 1], // Golden Panda
566
+ [3, 1, 1, 1], // Red Panda
567
+ [2, 1, 1, 1], // Slot Machine
568
+ [2, 1, 1, 1], // City
569
+ [2, 1, 1, 1], // Fireworks Rockets
570
+ [0, 0, 5, 5], // Camera
571
+ [0, 0, 5, 5], // Badge Green
572
+ ],
573
+ ];
574
+ // C++ BonusBell3x3 EXACTLY - 18.2% 3x3 rate
575
+ exports.CAMERA_BONUS_3X3_WEIGHTS = [
576
+ [2, 9], // 8 lines - C++ BonusBell3x3[0] = 18.2%
577
+ [2, 9], // 16 lines - C++ BonusBell3x3[1] = 18.2%
578
+ ];
579
+ exports.CAMERA_BONUS_3X3_SYMBOL_WEIGHTS = [0, 0, 0, 0, 0, 7, 6];
580
+ // =============================================================================
581
+ // FIREWORKS BONUS WEIGHTS (GDD: Fireworks Bonus)
582
+ // =============================================================================
583
+ exports.FIREWORKS_BONUS_SYMBOLS = [
584
+ Symbol.GOLDEN_PANDA,
585
+ Symbol.RED_PANDA,
586
+ Symbol.SLOT_MACHINE,
587
+ Symbol.CITY,
588
+ Symbol.FIREWORKS_ROCKETS,
589
+ Symbol.HAT,
590
+ Symbol.BADGE_BLUE,
591
+ ];
592
+ exports.FIREWORKS_BONUS_WEIGHTS = [
593
+ // gameDirection == 0
594
+ [
595
+ [2, 3, 2, 2, 3, 12, 15], // (0,0)
596
+ [2, 3, 2, 2, 3, 12, 15], // (0,1)
597
+ [2, 3, 2, 2, 3, 12, 15], // (0,2)
598
+ [2, 4, 2, 3, 4, 15, 19], // (1,0)
599
+ [2, 5, 2, 3, 3, 15, 19], // (1,1)
600
+ [2, 4, 2, 3, 4, 15, 19], // (1,2)
601
+ [2, 3, 2, 2, 3, 12, 15], // (2,0)
602
+ [2, 3, 2, 2, 3, 12, 15], // (2,1)
603
+ [2, 3, 2, 2, 3, 12, 15], // (2,2)
604
+ ],
605
+ // gameDirection == 1
606
+ [
607
+ [2, 3, 2, 2, 3, 12, 15],
608
+ [2, 3, 2, 2, 3, 12, 15],
609
+ [2, 3, 2, 2, 3, 12, 15],
610
+ [2, 4, 2, 3, 4, 15, 19],
611
+ [2, 5, 2, 3, 3, 15, 19],
612
+ [2, 4, 2, 3, 4, 15, 19],
613
+ [2, 3, 2, 2, 3, 12, 15],
614
+ [2, 3, 2, 2, 3, 12, 15],
615
+ [2, 3, 2, 2, 3, 12, 15],
616
+ ],
617
+ ];
618
+ exports.FIREWORKS_BONUS_LIMITATION_WEIGHTS = [
619
+ // gameDirection == 0
620
+ [
621
+ [2, 1, 1, 1], // Golden Panda
622
+ [2, 1, 1, 1], // Red Panda
623
+ [2, 1, 1, 1], // Slot Machine
624
+ [2, 1, 1, 1], // City
625
+ [2, 1, 1, 1], // Fireworks Rockets
626
+ [15, 10, 3, 1], // Hat (heavily weighted to max 2)
627
+ [1, 1, 5, 5], // Badge Blue
628
+ ],
629
+ // gameDirection == 1
630
+ [
631
+ [2, 1, 1, 1], // Golden Panda
632
+ [2, 1, 1, 1], // Red Panda
633
+ [2, 1, 1, 1], // Slot Machine
634
+ [2, 1, 1, 1], // City
635
+ [2, 1, 1, 1], // Fireworks Rockets
636
+ [15, 10, 3, 1], // Hat
637
+ [1, 1, 5, 5], // Badge Blue
638
+ ],
639
+ ];
640
+ // C++ BonusBar13x3 EXACTLY - 10% 3x3 rate
641
+ exports.FIREWORKS_BONUS_3X3_WEIGHTS = [
642
+ [1, 9], // 8 lines - C++ BonusBar13x3[0] = 10%
643
+ [1, 9], // 16 lines - C++ BonusBar13x3[1] = 10%
644
+ ];
645
+ exports.FIREWORKS_BONUS_3X3_SYMBOL_WEIGHTS = [0, 0, 0, 0, 0, 3, 6];
646
+ // =============================================================================
647
+ // CENTER BAMBOO RESPIN WEIGHTS (GDD: Center Bamboo Respins)
648
+ // =============================================================================
649
+ exports.CENTER_BAMBOO_RESPIN_SYMBOLS = exports.BASE_GAME_SPIN_SYMBOLS;
650
+ exports.CENTER_BAMBOO_RESPIN_WEIGHTS = [
651
+ // gameDirection == 0
652
+ [
653
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0], // (0,0)
654
+ [1, 2, 3, 6, 5, 6, 25, 25, 25, 19, 0], // (0,1)
655
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0], // (0,2)
656
+ [1, 2, 3, 6, 3, 6, 25, 25, 25, 9, 9], // (1,0)
657
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 9, 9], // (1,1) center - bamboo stays
658
+ [1, 2, 3, 6, 3, 6, 25, 25, 25, 9, 9], // (1,2)
659
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0], // (2,0)
660
+ [1, 2, 3, 6, 3, 6, 25, 25, 25, 19, 0], // (2,1)
661
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0], // (2,2)
662
+ ],
663
+ // gameDirection == 1
664
+ [
665
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0],
666
+ [1, 2, 3, 6, 5, 6, 25, 25, 25, 19, 0],
667
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0],
668
+ [1, 2, 3, 6, 3, 6, 25, 25, 25, 9, 9],
669
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 9, 9],
670
+ [1, 2, 3, 6, 3, 6, 25, 25, 25, 9, 9],
671
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0],
672
+ [1, 2, 3, 6, 3, 6, 25, 25, 25, 19, 0],
673
+ [1, 3, 3, 6, 10, 25, 6, 25, 25, 19, 0],
674
+ ],
675
+ ];
676
+ exports.CENTER_BAMBOO_RESPIN_LIMITATION_WEIGHTS = [
677
+ // gameDirection == 0
678
+ [
679
+ [9, 2, 1, 1], // Golden Panda
680
+ [8, 3, 1, 1], // Red Panda
681
+ [8, 1, 1, 1], // Slot Machine
682
+ [8, 1, 1, 1], // City
683
+ [8, 2, 1, 1], // Fireworks Rockets
684
+ [7, 3, 1, 1], // Backpack
685
+ [5, 3, 1, 1], // Camera
686
+ [6, 2, 1, 1], // Food Bowl
687
+ [5, 2, 1, 1], // Cup
688
+ [5, 1, 1, 1], // Bamboo
689
+ [5, 1, 0, 0], // Golden Bamboo
690
+ ],
691
+ // gameDirection == 1
692
+ [
693
+ [9, 2, 1, 1], // Golden Panda
694
+ [8, 3, 1, 1], // Red Panda
695
+ [8, 1, 1, 1], // Slot Machine
696
+ [8, 1, 1, 1], // City
697
+ [8, 2, 1, 1], // Fireworks Rockets
698
+ [7, 3, 1, 1], // Backpack
699
+ [5, 3, 1, 1], // Camera
700
+ [6, 2, 1, 1], // Food Bowl
701
+ [5, 2, 1, 1], // Cup
702
+ [5, 1, 1, 1], // Bamboo
703
+ [5, 1, 0, 0], // Golden Bamboo
704
+ ],
705
+ ];
706
+ // =============================================================================
707
+ // SYMBOL GROUPS (for mixed wins)
708
+ // =============================================================================
709
+ /** H3 + M1 + M2 symbols for bar-style mix wins */
710
+ exports.BAR_STYLE_SYMBOLS = [Symbol.SLOT_MACHINE, Symbol.CITY, Symbol.FIREWORKS_ROCKETS];
711
+ /** Bar-style symbols including HAT - for bar mix wins (per C++ math model line 1229) */
712
+ exports.BAR_MIX_SYMBOLS = [Symbol.SLOT_MACHINE, Symbol.CITY, Symbol.FIREWORKS_ROCKETS, Symbol.HAT];
713
+ /** Fruit-style symbols: M3, L1, L3, L4, L5 */
714
+ exports.FRUIT_STYLE_SYMBOLS = [Symbol.BACKPACK, Symbol.FOOD_BOWL, Symbol.CUP, Symbol.BAMBOO, Symbol.GOLDEN_BAMBOO];
715
+ /** Badge symbols for bonus indicators */
716
+ exports.BADGE_SYMBOLS = [Symbol.BADGE_YELLOW, Symbol.BADGE_RED, Symbol.BADGE_GREEN, Symbol.BADGE_BLUE];
717
+ /** Panda symbols (H1 + H2) for scatter wins */
718
+ exports.PANDA_SYMBOLS = [Symbol.GOLDEN_PANDA, Symbol.RED_PANDA];
719
+ /** Bamboo symbols (L4 + L5) */
720
+ exports.BAMBOO_SYMBOLS = [Symbol.BAMBOO, Symbol.GOLDEN_BAMBOO];
721
+ //# sourceMappingURL=happy-panda.config.js.map