@firestone-hs/simulate-bgs-battle 1.1.487 → 1.1.488

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 (273) hide show
  1. package/dist/bgs-player-entity.d.ts +2 -1
  2. package/dist/bgs-player-entity.js.map +1 -1
  3. package/dist/cards/card.interface.d.ts +12 -0
  4. package/dist/cards/card.interface.js +3 -0
  5. package/dist/cards/card.interface.js.map +1 -0
  6. package/dist/cards/cards-data.js +6 -0
  7. package/dist/cards/cards-data.js.map +1 -1
  8. package/dist/cards/impl/anomaly/anomalous-twin.d.ts +8 -0
  9. package/dist/cards/impl/anomaly/anomalous-twin.js +24 -0
  10. package/dist/cards/impl/anomaly/anomalous-twin.js.map +1 -0
  11. package/dist/cards/impl/anomaly/blessed-or-blighted.d.ts +5 -0
  12. package/dist/cards/impl/anomaly/blessed-or-blighted.js +16 -0
  13. package/dist/cards/impl/anomaly/blessed-or-blighted.js.map +1 -0
  14. package/dist/cards/impl/hero-power/aim-high.d.ts +5 -0
  15. package/dist/cards/impl/hero-power/aim-high.js +18 -0
  16. package/dist/cards/impl/hero-power/aim-high.js.map +1 -0
  17. package/dist/cards/impl/hero-power/aim-left.d.ts +5 -0
  18. package/dist/cards/impl/hero-power/aim-left.js +16 -0
  19. package/dist/cards/impl/hero-power/aim-left.js.map +1 -0
  20. package/dist/cards/impl/hero-power/aim-low.d.ts +5 -0
  21. package/dist/cards/impl/hero-power/aim-low.js +18 -0
  22. package/dist/cards/impl/hero-power/aim-low.js.map +1 -0
  23. package/dist/cards/impl/hero-power/aim-right.d.ts +5 -0
  24. package/dist/cards/impl/hero-power/aim-right.js +16 -0
  25. package/dist/cards/impl/hero-power/aim-right.js.map +1 -0
  26. package/dist/cards/impl/hero-power/all-will-burn.d.ts +5 -0
  27. package/dist/cards/impl/hero-power/all-will-burn.js +18 -0
  28. package/dist/cards/impl/hero-power/all-will-burn.js.map +1 -0
  29. package/dist/cards/impl/hero-power/earth-invocation.d.ts +5 -0
  30. package/dist/cards/impl/hero-power/earth-invocation.js +13 -0
  31. package/dist/cards/impl/hero-power/earth-invocation.js.map +1 -0
  32. package/dist/cards/impl/hero-power/embrace-your-rage.d.ts +8 -0
  33. package/dist/cards/impl/hero-power/embrace-your-rage.js +26 -0
  34. package/dist/cards/impl/hero-power/embrace-your-rage.js.map +1 -0
  35. package/dist/cards/impl/hero-power/fire-invocation.d.ts +5 -0
  36. package/dist/cards/impl/hero-power/fire-invocation.js +13 -0
  37. package/dist/cards/impl/hero-power/fire-invocation.js.map +1 -0
  38. package/dist/cards/impl/hero-power/fragrant-phylactery.d.ts +8 -0
  39. package/dist/cards/impl/hero-power/fragrant-phylactery.js +25 -0
  40. package/dist/cards/impl/hero-power/fragrant-phylactery.js.map +1 -0
  41. package/dist/cards/impl/hero-power/glorious-gloop.d.ts +5 -0
  42. package/dist/cards/impl/hero-power/glorious-gloop.js +40 -0
  43. package/dist/cards/impl/hero-power/glorious-gloop.js.map +1 -0
  44. package/dist/cards/impl/hero-power/lightning-invocation.d.ts +5 -0
  45. package/dist/cards/impl/hero-power/lightning-invocation.js +13 -0
  46. package/dist/cards/impl/hero-power/lightning-invocation.js.map +1 -0
  47. package/dist/cards/impl/hero-power/rapid-reanimation.d.ts +8 -0
  48. package/dist/cards/impl/hero-power/rapid-reanimation.js +29 -0
  49. package/dist/cards/impl/hero-power/rapid-reanimation.js.map +1 -0
  50. package/dist/cards/impl/hero-power/reborn-rites.d.ts +5 -0
  51. package/dist/cards/impl/hero-power/reborn-rites.js +18 -0
  52. package/dist/cards/impl/hero-power/reborn-rites.js.map +1 -0
  53. package/dist/cards/impl/hero-power/swatting-insects.d.ts +5 -0
  54. package/dist/cards/impl/hero-power/swatting-insects.js +21 -0
  55. package/dist/cards/impl/hero-power/swatting-insects.js.map +1 -0
  56. package/dist/cards/impl/hero-power/tentacular.d.ts +8 -0
  57. package/dist/cards/impl/hero-power/tentacular.js +10 -0
  58. package/dist/cards/impl/hero-power/tentacular.js.map +1 -0
  59. package/dist/cards/impl/hero-power/water-invocation.d.ts +5 -0
  60. package/dist/cards/impl/hero-power/water-invocation.js +13 -0
  61. package/dist/cards/impl/hero-power/water-invocation.js.map +1 -0
  62. package/dist/cards/impl/hero-power/wax-warband.d.ts +5 -0
  63. package/dist/cards/impl/hero-power/wax-warband.js +56 -0
  64. package/dist/cards/impl/hero-power/wax-warband.js.map +1 -0
  65. package/dist/cards/impl/minion/amber-guardian.d.ts +5 -0
  66. package/dist/cards/impl/minion/amber-guardian.js +31 -0
  67. package/dist/cards/impl/minion/amber-guardian.js.map +1 -0
  68. package/dist/cards/impl/minion/audacious-anchor.d.ts +5 -0
  69. package/dist/cards/impl/minion/audacious-anchor.js +25 -0
  70. package/dist/cards/impl/minion/audacious-anchor.js.map +1 -0
  71. package/dist/cards/impl/minion/carbonic-copy.d.ts +5 -0
  72. package/dist/cards/impl/minion/carbonic-copy.js +24 -0
  73. package/dist/cards/impl/minion/carbonic-copy.js.map +1 -0
  74. package/dist/cards/impl/minion/choral-mrrrglr.d.ts +5 -0
  75. package/dist/cards/impl/minion/choral-mrrrglr.js +14 -0
  76. package/dist/cards/impl/minion/choral-mrrrglr.js.map +1 -0
  77. package/dist/cards/impl/minion/corrupted-myrmidon.d.ts +5 -0
  78. package/dist/cards/impl/minion/corrupted-myrmidon.js +13 -0
  79. package/dist/cards/impl/minion/corrupted-myrmidon.js.map +1 -0
  80. package/dist/cards/impl/minion/crabby.d.ts +5 -0
  81. package/dist/cards/impl/minion/crabby.js +18 -0
  82. package/dist/cards/impl/minion/crabby.js.map +1 -0
  83. package/dist/cards/impl/minion/diremuck-forager.d.ts +5 -0
  84. package/dist/cards/impl/minion/diremuck-forager.js +32 -0
  85. package/dist/cards/impl/minion/diremuck-forager.js.map +1 -0
  86. package/dist/cards/impl/minion/elder-taggawag.d.ts +5 -0
  87. package/dist/cards/impl/minion/elder-taggawag.js +19 -0
  88. package/dist/cards/impl/minion/elder-taggawag.js.map +1 -0
  89. package/dist/cards/impl/minion/hawkstrider-herald.d.ts +5 -0
  90. package/dist/cards/impl/minion/hawkstrider-herald.js +27 -0
  91. package/dist/cards/impl/minion/hawkstrider-herald.js.map +1 -0
  92. package/dist/cards/impl/minion/hoarding-hatespawn.d.ts +5 -0
  93. package/dist/cards/impl/minion/hoarding-hatespawn.js +22 -0
  94. package/dist/cards/impl/minion/hoarding-hatespawn.js.map +1 -0
  95. package/dist/cards/impl/minion/humming-bird.d.ts +5 -0
  96. package/dist/cards/impl/minion/humming-bird.js +15 -0
  97. package/dist/cards/impl/minion/humming-bird.js.map +1 -0
  98. package/dist/cards/impl/minion/interrogator-whitemane.d.ts +5 -0
  99. package/dist/cards/impl/minion/interrogator-whitemane.js +33 -0
  100. package/dist/cards/impl/minion/interrogator-whitemane.js.map +1 -0
  101. package/dist/cards/impl/minion/irate-rooster.d.ts +5 -0
  102. package/dist/cards/impl/minion/irate-rooster.js +20 -0
  103. package/dist/cards/impl/minion/irate-rooster.js.map +1 -0
  104. package/dist/cards/impl/minion/mantid-queen.d.ts +5 -0
  105. package/dist/cards/impl/minion/mantid-queen.js +52 -0
  106. package/dist/cards/impl/minion/mantid-queen.js.map +1 -0
  107. package/dist/cards/impl/minion/misfit-dragonling.d.ts +5 -0
  108. package/dist/cards/impl/minion/misfit-dragonling.js +15 -0
  109. package/dist/cards/impl/minion/misfit-dragonling.js.map +1 -0
  110. package/dist/cards/impl/minion/piloted-whirl-o-tron.d.ts +5 -0
  111. package/dist/cards/impl/minion/piloted-whirl-o-tron.js +13 -0
  112. package/dist/cards/impl/minion/piloted-whirl-o-tron.js.map +1 -0
  113. package/dist/cards/impl/minion/prized-promo-drake.d.ts +5 -0
  114. package/dist/cards/impl/minion/prized-promo-drake.js +22 -0
  115. package/dist/cards/impl/minion/prized-promo-drake.js.map +1 -0
  116. package/dist/cards/impl/minion/red-whelp.d.ts +5 -0
  117. package/dist/cards/impl/minion/red-whelp.js +17 -0
  118. package/dist/cards/impl/minion/red-whelp.js.map +1 -0
  119. package/dist/cards/impl/minion/sanctum-rester.d.ts +5 -0
  120. package/dist/cards/impl/minion/sanctum-rester.js +20 -0
  121. package/dist/cards/impl/minion/sanctum-rester.js.map +1 -0
  122. package/dist/cards/impl/minion/sandy.d.ts +5 -0
  123. package/dist/cards/impl/minion/sandy.js +23 -0
  124. package/dist/cards/impl/minion/sandy.js.map +1 -0
  125. package/dist/cards/impl/minion/sky-pirate-flagbearer.d.ts +5 -0
  126. package/dist/cards/impl/minion/sky-pirate-flagbearer.js +24 -0
  127. package/dist/cards/impl/minion/sky-pirate-flagbearer.js.map +1 -0
  128. package/dist/cards/impl/minion/soulsplitter.d.ts +5 -0
  129. package/dist/cards/impl/minion/soulsplitter.js +23 -0
  130. package/dist/cards/impl/minion/soulsplitter.js.map +1 -0
  131. package/dist/cards/impl/minion/sun-screener.d.ts +5 -0
  132. package/dist/cards/impl/minion/sun-screener.js +15 -0
  133. package/dist/cards/impl/minion/sun-screener.js.map +1 -0
  134. package/dist/cards/impl/minion/the-uninvited-guest.d.ts +5 -0
  135. package/dist/cards/impl/minion/the-uninvited-guest.js +24 -0
  136. package/dist/cards/impl/minion/the-uninvited-guest.js.map +1 -0
  137. package/dist/cards/impl/minion/thousandth-paper-drake.d.ts +5 -0
  138. package/dist/cards/impl/minion/thousandth-paper-drake.js +24 -0
  139. package/dist/cards/impl/minion/thousandth-paper-drake.js.map +1 -0
  140. package/dist/cards/impl/minion/vaelastrasz.d.ts +5 -0
  141. package/dist/cards/impl/minion/vaelastrasz.js +17 -0
  142. package/dist/cards/impl/minion/vaelastrasz.js.map +1 -0
  143. package/dist/cards/impl/minion/yulon-fortune-granter.d.ts +5 -0
  144. package/dist/cards/impl/minion/yulon-fortune-granter.js +26 -0
  145. package/dist/cards/impl/minion/yulon-fortune-granter.js.map +1 -0
  146. package/dist/cards/impl/quest-reward/evil-twin.d.ts +5 -0
  147. package/dist/cards/impl/quest-reward/evil-twin.js +32 -0
  148. package/dist/cards/impl/quest-reward/evil-twin.js.map +1 -0
  149. package/dist/cards/impl/quest-reward/staff-of-origination.d.ts +5 -0
  150. package/dist/cards/impl/quest-reward/staff-of-origination.js +14 -0
  151. package/dist/cards/impl/quest-reward/staff-of-origination.js.map +1 -0
  152. package/dist/cards/impl/quest-reward/stolen-gold.d.ts +5 -0
  153. package/dist/cards/impl/quest-reward/stolen-gold.js +16 -0
  154. package/dist/cards/impl/quest-reward/stolen-gold.js.map +1 -0
  155. package/dist/cards/impl/trinket/artisanal-urn.d.ts +5 -0
  156. package/dist/cards/impl/trinket/artisanal-urn.js +13 -0
  157. package/dist/cards/impl/trinket/artisanal-urn.js.map +1 -0
  158. package/dist/cards/impl/trinket/automaton-portrait.d.ts +5 -0
  159. package/dist/cards/impl/trinket/automaton-portrait.js +15 -0
  160. package/dist/cards/impl/trinket/automaton-portrait.js.map +1 -0
  161. package/dist/cards/impl/trinket/bronze-timepiece.d.ts +5 -0
  162. package/dist/cards/impl/trinket/bronze-timepiece.js +17 -0
  163. package/dist/cards/impl/trinket/bronze-timepiece.js.map +1 -0
  164. package/dist/cards/impl/trinket/emerald-dreamcatcher.d.ts +5 -0
  165. package/dist/cards/impl/trinket/emerald-dreamcatcher.js +18 -0
  166. package/dist/cards/impl/trinket/emerald-dreamcatcher.js.map +1 -0
  167. package/dist/cards/impl/trinket/eternal-portrait.d.ts +5 -0
  168. package/dist/cards/impl/trinket/eternal-portrait.js +19 -0
  169. package/dist/cards/impl/trinket/eternal-portrait.js.map +1 -0
  170. package/dist/cards/impl/trinket/fishy-sticker.d.ts +5 -0
  171. package/dist/cards/impl/trinket/fishy-sticker.js +28 -0
  172. package/dist/cards/impl/trinket/fishy-sticker.js.map +1 -0
  173. package/dist/cards/impl/trinket/hoggy-bank.d.ts +5 -0
  174. package/dist/cards/impl/trinket/hoggy-bank.js +23 -0
  175. package/dist/cards/impl/trinket/hoggy-bank.js.map +1 -0
  176. package/dist/cards/impl/trinket/holly-mallet.d.ts +5 -0
  177. package/dist/cards/impl/trinket/holly-mallet.js +18 -0
  178. package/dist/cards/impl/trinket/holly-mallet.js.map +1 -0
  179. package/dist/cards/impl/trinket/ironforge-anvil.d.ts +5 -0
  180. package/dist/cards/impl/trinket/ironforge-anvil.js +23 -0
  181. package/dist/cards/impl/trinket/ironforge-anvil.js.map +1 -0
  182. package/dist/cards/impl/trinket/jarred-frostling.d.ts +5 -0
  183. package/dist/cards/impl/trinket/jarred-frostling.js +27 -0
  184. package/dist/cards/impl/trinket/jarred-frostling.js.map +1 -0
  185. package/dist/cards/impl/trinket/karazhan-chess-set.d.ts +5 -0
  186. package/dist/cards/impl/trinket/karazhan-chess-set.js +40 -0
  187. package/dist/cards/impl/trinket/karazhan-chess-set.js.map +1 -0
  188. package/dist/cards/impl/trinket/rivendare-portrait.d.ts +5 -0
  189. package/dist/cards/impl/trinket/rivendare-portrait.js +21 -0
  190. package/dist/cards/impl/trinket/rivendare-portrait.js.map +1 -0
  191. package/dist/cards/impl/trinket/rusty-trident.d.ts +5 -0
  192. package/dist/cards/impl/trinket/rusty-trident.js +23 -0
  193. package/dist/cards/impl/trinket/rusty-trident.js.map +1 -0
  194. package/dist/cards/impl/trinket/ship-in-a-bottle.d.ts +5 -0
  195. package/dist/cards/impl/trinket/ship-in-a-bottle.js +20 -0
  196. package/dist/cards/impl/trinket/ship-in-a-bottle.js.map +1 -0
  197. package/dist/cards/impl/trinket/summoning-sphere.d.ts +5 -0
  198. package/dist/cards/impl/trinket/summoning-sphere.js +31 -0
  199. package/dist/cards/impl/trinket/summoning-sphere.js.map +1 -0
  200. package/dist/cards/impl/trinket/tinyfin-onesie.d.ts +5 -0
  201. package/dist/cards/impl/trinket/tinyfin-onesie.js +15 -0
  202. package/dist/cards/impl/trinket/tinyfin-onesie.js.map +1 -0
  203. package/dist/cards/impl/trinket/training-certificate.d.ts +5 -0
  204. package/dist/cards/impl/trinket/training-certificate.js +21 -0
  205. package/dist/cards/impl/trinket/training-certificate.js.map +1 -0
  206. package/dist/cards/impl/trinket/valorous-medaillion.d.ts +5 -0
  207. package/dist/cards/impl/trinket/valorous-medaillion.js +12 -0
  208. package/dist/cards/impl/trinket/valorous-medaillion.js.map +1 -0
  209. package/dist/simulation/add-minion-to-board.js +18 -23
  210. package/dist/simulation/add-minion-to-board.js.map +1 -1
  211. package/dist/simulation/auras.js +0 -2
  212. package/dist/simulation/auras.js.map +1 -1
  213. package/dist/simulation/avenge.js +24 -4
  214. package/dist/simulation/avenge.js.map +1 -1
  215. package/dist/simulation/battlecries.js +9 -0
  216. package/dist/simulation/battlecries.js.map +1 -1
  217. package/dist/simulation/blood-gems.js +8 -0
  218. package/dist/simulation/blood-gems.js.map +1 -1
  219. package/dist/simulation/deathrattle-effects.js +7 -1
  220. package/dist/simulation/deathrattle-effects.js.map +1 -1
  221. package/dist/simulation/deathrattle-on-trigger.js +5 -0
  222. package/dist/simulation/deathrattle-on-trigger.js.map +1 -1
  223. package/dist/simulation/discover.js +6 -0
  224. package/dist/simulation/discover.js.map +1 -1
  225. package/dist/simulation/magnetize.js +2 -1
  226. package/dist/simulation/magnetize.js.map +1 -1
  227. package/dist/simulation/remove-minion-from-board.js +0 -10
  228. package/dist/simulation/remove-minion-from-board.js.map +1 -1
  229. package/dist/simulation/simulator.js +1 -1
  230. package/dist/simulation/simulator.js.map +1 -1
  231. package/dist/simulation/start-of-combat/phases.d.ts +1 -0
  232. package/dist/simulation/start-of-combat/phases.js +3 -0
  233. package/dist/simulation/start-of-combat/phases.js.map +1 -0
  234. package/dist/simulation/start-of-combat/soc-action-processor.d.ts +4 -0
  235. package/dist/simulation/start-of-combat/soc-action-processor.js +286 -0
  236. package/dist/simulation/start-of-combat/soc-action-processor.js.map +1 -0
  237. package/dist/simulation/start-of-combat/soc-anomalies.d.ts +4 -0
  238. package/dist/simulation/start-of-combat/soc-anomalies.js +39 -0
  239. package/dist/simulation/start-of-combat/soc-anomalies.js.map +1 -0
  240. package/dist/simulation/start-of-combat/soc-hero-power.d.ts +5 -0
  241. package/dist/simulation/start-of-combat/soc-hero-power.js +77 -0
  242. package/dist/simulation/start-of-combat/soc-hero-power.js.map +1 -0
  243. package/dist/simulation/start-of-combat/soc-illidan-hero-power.d.ts +4 -0
  244. package/dist/simulation/start-of-combat/soc-illidan-hero-power.js +55 -0
  245. package/dist/simulation/start-of-combat/soc-illidan-hero-power.js.map +1 -0
  246. package/dist/simulation/start-of-combat/soc-minion.d.ts +6 -0
  247. package/dist/simulation/start-of-combat/soc-minion.js +68 -0
  248. package/dist/simulation/start-of-combat/soc-minion.js.map +1 -0
  249. package/dist/simulation/start-of-combat/soc-pre-combat-hero-power.d.ts +4 -0
  250. package/dist/simulation/start-of-combat/soc-pre-combat-hero-power.js +72 -0
  251. package/dist/simulation/start-of-combat/soc-pre-combat-hero-power.js.map +1 -0
  252. package/dist/simulation/start-of-combat/soc-quest-reward.d.ts +4 -0
  253. package/dist/simulation/start-of-combat/soc-quest-reward.js +60 -0
  254. package/dist/simulation/start-of-combat/soc-quest-reward.js.map +1 -0
  255. package/dist/simulation/start-of-combat/soc-secret.d.ts +4 -0
  256. package/dist/simulation/start-of-combat/soc-secret.js +54 -0
  257. package/dist/simulation/start-of-combat/soc-secret.js.map +1 -0
  258. package/dist/simulation/start-of-combat/soc-trinket.d.ts +4 -0
  259. package/dist/simulation/start-of-combat/soc-trinket.js +60 -0
  260. package/dist/simulation/start-of-combat/soc-trinket.js.map +1 -0
  261. package/dist/simulation/start-of-combat/start-of-combat-input.d.ts +14 -0
  262. package/dist/simulation/start-of-combat/start-of-combat-input.js +3 -0
  263. package/dist/simulation/start-of-combat/start-of-combat-input.js.map +1 -0
  264. package/dist/simulation/start-of-combat/start-of-combat.d.ts +4 -0
  265. package/dist/simulation/start-of-combat/start-of-combat.js +68 -0
  266. package/dist/simulation/start-of-combat/start-of-combat.js.map +1 -0
  267. package/dist/temp-card-ids.d.ts +2 -0
  268. package/dist/temp-card-ids.js +3 -0
  269. package/dist/temp-card-ids.js.map +1 -0
  270. package/package.json +3 -3
  271. package/dist/simulation/start-of-combat.d.ts +0 -8
  272. package/dist/simulation/start-of-combat.js +0 -1187
  273. package/dist/simulation/start-of-combat.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleStartOfCombatAnomalies = void 0;
4
+ const summon_when_space_1 = require("../summon-when-space");
5
+ const soc_action_processor_1 = require("./soc-action-processor");
6
+ const handleStartOfCombatAnomalies = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
7
+ currentAttacker = handleStartOfCombatAnomaliesForPlayer({
8
+ playerEntity,
9
+ playerBoard,
10
+ opponentEntity,
11
+ opponentBoard,
12
+ currentAttacker,
13
+ gameState,
14
+ playerIsFriendly: true,
15
+ });
16
+ currentAttacker = handleStartOfCombatAnomaliesForPlayer({
17
+ opponentEntity,
18
+ opponentBoard,
19
+ playerEntity,
20
+ playerBoard,
21
+ currentAttacker,
22
+ gameState,
23
+ playerIsFriendly: false,
24
+ });
25
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
26
+ return currentAttacker;
27
+ };
28
+ exports.handleStartOfCombatAnomalies = handleStartOfCombatAnomalies;
29
+ const handleStartOfCombatAnomaliesForPlayer = (input) => {
30
+ var _a;
31
+ if (!((_a = input.gameState.anomalies) === null || _a === void 0 ? void 0 : _a.length) || input.playerEntity.startOfCombatDone) {
32
+ return input.currentAttacker;
33
+ }
34
+ for (const anomaly of input.gameState.anomalies) {
35
+ (0, soc_action_processor_1.performStartOfCombatAction)(anomaly, null, input);
36
+ }
37
+ return input.currentAttacker;
38
+ };
39
+ //# sourceMappingURL=soc-anomalies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-anomalies.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-anomalies.ts"],"names":[],"mappings":";;;AAGA,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,4BAA4B,GAAG,CAC3C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,eAAe,GAAG,qCAAqC,CAAC;QACvD,YAAY;QACZ,WAAW;QACX,cAAc;QACd,aAAa;QACb,eAAe;QACf,SAAS;QACT,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,eAAe,GAAG,qCAAqC,CAAC;QACvD,cAAc;QACd,aAAa;QACb,YAAY;QACZ,WAAW;QACX,eAAe;QACf,SAAS;QACT,gBAAgB,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AA5BW,QAAA,4BAA4B,gCA4BvC;AAEF,MAAM,qCAAqC,GAAG,CAAC,KAAe,EAAU,EAAE;;IACzE,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,CAAC,SAAS,0CAAE,MAAM,CAAA,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE;QAC/E,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE;QAChD,IAAA,iDAA0B,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACjD;IAED,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatAnomalies = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tcurrentAttacker = handleStartOfCombatAnomaliesForPlayer({\r\n\t\tplayerEntity,\r\n\t\tplayerBoard,\r\n\t\topponentEntity,\r\n\t\topponentBoard,\r\n\t\tcurrentAttacker,\r\n\t\tgameState,\r\n\t\tplayerIsFriendly: true,\r\n\t});\r\n\tcurrentAttacker = handleStartOfCombatAnomaliesForPlayer({\r\n\t\topponentEntity,\r\n\t\topponentBoard,\r\n\t\tplayerEntity,\r\n\t\tplayerBoard,\r\n\t\tcurrentAttacker,\r\n\t\tgameState,\r\n\t\tplayerIsFriendly: false,\r\n\t});\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handleStartOfCombatAnomaliesForPlayer = (input: SoCInput): number => {\r\n\tif (!input.gameState.anomalies?.length || input.playerEntity.startOfCombatDone) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tfor (const anomaly of input.gameState.anomalies) {\r\n\t\tperformStartOfCombatAction(anomaly, null, input);\r\n\t}\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
@@ -0,0 +1,5 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ export declare const handleStartOfCombatHeroPowers: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
5
+ export declare const getHeroPowerForHero: (heroCardId: string) => string;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getHeroPowerForHero = exports.handleStartOfCombatHeroPowers = void 0;
4
+ const attack_1 = require("../attack");
5
+ const summon_when_space_1 = require("../summon-when-space");
6
+ const soc_action_processor_1 = require("./soc-action-processor");
7
+ const handleStartOfCombatHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
8
+ if (Math.random() < 0.5) {
9
+ currentAttacker = handlePlayerStartOfCombatHeroPowers({
10
+ playerEntity,
11
+ playerBoard,
12
+ opponentEntity,
13
+ opponentBoard,
14
+ currentAttacker,
15
+ playerIsFriendly: true,
16
+ gameState,
17
+ });
18
+ currentAttacker = handlePlayerStartOfCombatHeroPowers({
19
+ opponentEntity,
20
+ opponentBoard,
21
+ playerEntity,
22
+ playerBoard,
23
+ currentAttacker,
24
+ playerIsFriendly: false,
25
+ gameState,
26
+ });
27
+ }
28
+ else {
29
+ currentAttacker = handlePlayerStartOfCombatHeroPowers({
30
+ opponentEntity,
31
+ opponentBoard,
32
+ playerEntity,
33
+ playerBoard,
34
+ currentAttacker,
35
+ playerIsFriendly: false,
36
+ gameState,
37
+ });
38
+ currentAttacker = handlePlayerStartOfCombatHeroPowers({
39
+ playerEntity,
40
+ playerBoard,
41
+ opponentEntity,
42
+ opponentBoard,
43
+ currentAttacker,
44
+ playerIsFriendly: true,
45
+ gameState,
46
+ });
47
+ }
48
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
49
+ return currentAttacker;
50
+ };
51
+ exports.handleStartOfCombatHeroPowers = handleStartOfCombatHeroPowers;
52
+ const handlePlayerStartOfCombatHeroPowers = (input) => {
53
+ if (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {
54
+ return input.currentAttacker;
55
+ }
56
+ const playerHeroPowerId = input.playerEntity.heroPowerId || (0, exports.getHeroPowerForHero)(input.playerEntity.cardId);
57
+ (0, soc_action_processor_1.performStartOfCombatAction)(playerHeroPowerId, null, input);
58
+ (0, attack_1.processMinionDeath)(input.playerBoard, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
59
+ return input.currentAttacker;
60
+ };
61
+ const getHeroPowerForHero = (heroCardId) => {
62
+ switch (heroCardId) {
63
+ case "TB_BaconShop_HERO_08":
64
+ return "TB_BaconShop_HP_069";
65
+ case "TB_BaconShop_HERO_22":
66
+ return "TB_BaconShop_HP_024";
67
+ case "BG25_HERO_100":
68
+ return "TB_BaconShop_HP_018";
69
+ case "TB_BaconShop_HERO_52":
70
+ return "TB_BaconShop_HP_061";
71
+ case "BG25_HERO_103":
72
+ return "BG25_HERO_103p";
73
+ }
74
+ return null;
75
+ };
76
+ exports.getHeroPowerForHero = getHeroPowerForHero;
77
+ //# sourceMappingURL=soc-hero-power.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-hero-power.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-hero-power.ts"],"names":[],"mappings":";;;AAGA,sCAA+C;AAE/C,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,6BAA6B,GAAG,CAC5C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IAGX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,mCAAmC,CAAC;YACrD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,mCAAmC,CAAC;YACrD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,mCAAmC,CAAC;YACrD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,mCAAmC,CAAC;YACrD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;KACH;IACD,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAnDW,QAAA,6BAA6B,iCAmDxC;AAEF,MAAM,mCAAmC,GAAG,CAAC,KAAe,EAAU,EAAE;IACvE,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;QAC3E,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,IAAI,IAAA,2BAAmB,EAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3G,IAAA,iDAA0B,EAAC,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAA,2BAAkB,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;IACF,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC;AAEK,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAU,EAAE;IACjE,QAAQ,UAAU,EAAE;QACnB;YACC,6BAAuB;QACxB;YACC,6BAA2B;QAC5B;YACC,6BAA0B;QAC3B;YACC,6BAA2B;QAC5B;YACC,wBAA+C;KAChD;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// Apparently it's a toin coss about whether to handle Illidan first or Al'Akir first\r\n\t// Auras are only relevant for Illidan, and already applied there\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePlayerStartOfCombatHeroPowers = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tconst playerHeroPowerId = input.playerEntity.heroPowerId || getHeroPowerForHero(input.playerEntity.cardId);\r\n\tperformStartOfCombatAction(playerHeroPowerId, null, input);\r\n\tprocessMinionDeath(\r\n\t\tinput.playerBoard,\r\n\t\tinput.playerEntity,\r\n\t\tinput.opponentBoard,\r\n\t\tinput.opponentEntity,\r\n\t\tinput.gameState,\r\n\t);\r\n\treturn input.currentAttacker;\r\n};\r\n\r\nexport const getHeroPowerForHero = (heroCardId: string): string => {\r\n\tswitch (heroCardId) {\r\n\t\tcase CardIds.IllidanStormrage_TB_BaconShop_HERO_08:\r\n\t\t\treturn CardIds.Wingmen;\r\n\t\tcase CardIds.TheLichKing_TB_BaconShop_HERO_22:\r\n\t\t\treturn CardIds.RebornRites;\r\n\t\tcase CardIds.ProfessorPutricide_BG25_HERO_100:\r\n\t\t\treturn CardIds.RagePotion;\r\n\t\tcase CardIds.Deathwing_TB_BaconShop_HERO_52:\r\n\t\t\treturn CardIds.AllWillBurn;\r\n\t\tcase CardIds.TeronGorefiend_BG25_HERO_103:\r\n\t\t\treturn CardIds.TeronGorefiend_RapidReanimation;\r\n\t}\r\n\treturn null;\r\n};\r\n"]}
@@ -0,0 +1,4 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ export declare const handleIllidanHeroPowers: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleIllidanHeroPowers = void 0;
4
+ const attack_1 = require("../attack");
5
+ const stats_1 = require("../stats");
6
+ const summon_when_space_1 = require("../summon-when-space");
7
+ const soc_hero_power_1 = require("./soc-hero-power");
8
+ const handleIllidanHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
9
+ if (Math.random() < 0.5) {
10
+ currentAttacker = handlePlayerIllidanHeroPowers(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, true, gameState);
11
+ currentAttacker = handlePlayerIllidanHeroPowers(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, false, gameState);
12
+ }
13
+ else {
14
+ currentAttacker = handlePlayerIllidanHeroPowers(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, false, gameState);
15
+ currentAttacker = handlePlayerIllidanHeroPowers(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, true, gameState);
16
+ }
17
+ (0, attack_1.processMinionDeath)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
18
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
19
+ return currentAttacker;
20
+ };
21
+ exports.handleIllidanHeroPowers = handleIllidanHeroPowers;
22
+ const handlePlayerIllidanHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, friendly, gameState) => {
23
+ if (playerEntity.hpLeft <= 0) {
24
+ return currentAttacker;
25
+ }
26
+ const playerHeroPowerId = playerEntity.heroPowerId || (0, soc_hero_power_1.getHeroPowerForHero)(playerEntity.cardId);
27
+ if (playerHeroPowerId === "TB_BaconShop_HP_069" && playerBoard.length > 0) {
28
+ handleIllidanForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, currentAttacker);
29
+ currentAttacker = friendly ? 1 : 0;
30
+ }
31
+ return currentAttacker;
32
+ };
33
+ const handleIllidanForPlayer = (playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, currentAttacker) => {
34
+ if (playerEntity.startOfCombatDone) {
35
+ return;
36
+ }
37
+ const minionsAtStart = playerBoard.length;
38
+ const firstAttacker = playerBoard[0];
39
+ const secondAttacker = minionsAtStart > 1 ? playerBoard[playerBoard.length - 1] : null;
40
+ (0, stats_1.modifyStats)(firstAttacker, 2, 1, playerBoard, playerEntity, gameState);
41
+ gameState.spectator.registerPowerTarget(firstAttacker, firstAttacker, playerBoard, playerEntity, opponentEntity);
42
+ if (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {
43
+ (0, stats_1.modifyStats)(secondAttacker, 2, 1, playerBoard, playerEntity, gameState);
44
+ gameState.spectator.registerPowerTarget(secondAttacker, secondAttacker, playerBoard, playerEntity, opponentEntity);
45
+ }
46
+ firstAttacker.attackImmediately = true;
47
+ (0, attack_1.simulateAttack)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
48
+ firstAttacker.hasAttacked = 0;
49
+ if (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {
50
+ secondAttacker.attackImmediately = true;
51
+ (0, attack_1.simulateAttack)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
52
+ secondAttacker.hasAttacked = 0;
53
+ }
54
+ };
55
+ //# sourceMappingURL=soc-illidan-hero-power.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-illidan-hero-power.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-illidan-hero-power.ts"],"names":[],"mappings":";;;AAGA,sCAA+D;AAE/D,oCAAuC;AACvC,4DAA8D;AAC9D,qDAAuD;AAEhD,MAAM,uBAAuB,GAAG,CACtC,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IAIX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,6BAA6B,CAC9C,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,IAAI,EACJ,SAAS,CACT,CAAC;QACF,eAAe,GAAG,6BAA6B,CAC9C,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,KAAK,EACL,SAAS,CACT,CAAC;KACF;SAAM;QACN,eAAe,GAAG,6BAA6B,CAC9C,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,KAAK,EACL,SAAS,CACT,CAAC;QACF,eAAe,GAAG,6BAA6B,CAC9C,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,IAAI,EACJ,SAAS,CACT,CAAC;KACF;IACD,IAAA,2BAAkB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IACxF,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AArDW,QAAA,uBAAuB,2BAqDlC;AAEF,MAAM,6BAA6B,GAAG,CACrC,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,QAAiB,EACjB,SAAwB,EACf,EAAE;IACX,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;QAC7B,OAAO,eAAe,CAAC;KACvB;IACD,MAAM,iBAAiB,GAAG,YAAY,CAAC,WAAW,IAAI,IAAA,oCAAmB,EAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/F,IAAI,iBAAiB,0BAAoB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAGpE,sBAAsB,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC7G,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC;IACD,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAGF,MAAM,sBAAsB,GAAG,CAC9B,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACxB,eAAuB,EAChB,EAAE;IACT,IAAI,YAAY,CAAC,iBAAiB,EAAE;QACnC,OAAO;KACP;IAGD,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IAC1C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAGvF,IAAA,mBAAW,EAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IACvE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IACjH,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;QACpF,IAAA,mBAAW,EAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACxE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CACtC,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,CACd,CAAC;KACF;IAGD,aAAa,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACvC,IAAA,uBAAc,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAEpF,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;QACpF,cAAc,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACxC,IAAA,uBAAc,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QACpF,cAAc,CAAC,WAAW,GAAG,CAAC,CAAC;KAC/B;AAOF,CAAC,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath, simulateAttack } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { modifyStats } from '../stats';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { getHeroPowerForHero } from './soc-hero-power';\r\n\r\nexport const handleIllidanHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('current attacker before', currentAttacker);\r\n\t// Apparently it's a toin coss about whether to handle Illidan first or Al'Akir first\r\n\t// Auras are only relevant for Illidan, and already applied there\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\ttrue,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tfalse,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t} else {\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tfalse,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\ttrue,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\tprocessMinionDeath(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePlayerIllidanHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tfriendly: boolean,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (playerEntity.hpLeft <= 0) {\r\n\t\treturn currentAttacker;\r\n\t}\r\n\tconst playerHeroPowerId = playerEntity.heroPowerId || getHeroPowerForHero(playerEntity.cardId);\r\n\tif (playerHeroPowerId === CardIds.Wingmen && playerBoard.length > 0) {\r\n\t\t// After Illidan triggers, it's always the other opponent's turn\r\n\t\t// https://x.com/LoewenMitchell/status/1752714583360639131?s=20\r\n\t\thandleIllidanForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, currentAttacker);\r\n\t\tcurrentAttacker = friendly ? 1 : 0;\r\n\t}\r\n\treturn currentAttacker;\r\n};\r\n\r\n// TODO: not exactly correct, because of \"attack immediately\", but it's close enough\r\nconst handleIllidanForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcurrentAttacker: number,\r\n): void => {\r\n\tif (playerEntity.startOfCombatDone) {\r\n\t\treturn;\r\n\t}\r\n\t// Otherwise, if the first minion dies on the attack, and the board has only 2 minions, we\r\n\t// miss the second one\r\n\tconst minionsAtStart = playerBoard.length;\r\n\tconst firstAttacker = playerBoard[0];\r\n\tconst secondAttacker = minionsAtStart > 1 ? playerBoard[playerBoard.length - 1] : null;\r\n\r\n\t// Stats updates\r\n\tmodifyStats(firstAttacker, 2, 1, playerBoard, playerEntity, gameState);\r\n\tgameState.spectator.registerPowerTarget(firstAttacker, firstAttacker, playerBoard, playerEntity, opponentEntity);\r\n\tif (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {\r\n\t\tmodifyStats(secondAttacker, 2, 1, playerBoard, playerEntity, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\tsecondAttacker,\r\n\t\t\tsecondAttacker,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentEntity,\r\n\t\t);\r\n\t}\r\n\r\n\t// Attacks\r\n\tfirstAttacker.attackImmediately = true;\r\n\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t// See http://replays.firestoneapp.com/?reviewId=f16b7a49-c2a2-4ac5-a9eb-a75f83246f70&turn=6&action=8\r\n\tfirstAttacker.hasAttacked = 0;\r\n\tif (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {\r\n\t\tsecondAttacker.attackImmediately = true;\r\n\t\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t\tsecondAttacker.hasAttacked = 0;\r\n\t}\r\n\r\n\t// // See http://replays.firestoneapp.com/?reviewId=7e9ec42c-a8f6-43d2-9f39-cc486dfa2395&turn=6&action=5\r\n\t// if (firstAttacker.definitelyDead || firstAttacker.health <= 0) {\r\n\t// \tcurrentAttacker = (currentAttacker + 1) % 2;\r\n\t// }\r\n\t// return currentAttacker;\r\n};\r\n"]}
@@ -0,0 +1,6 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ import { SoCInput } from './start-of-combat-input';
5
+ export declare const handleStartOfCombatMinions: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, playerBoardBefore: BoardEntity[], opponentBoardBefore: BoardEntity[], gameState: FullGameState) => number;
6
+ export declare const performStartOfCombatMinionsForPlayer: (minion: BoardEntity, input: SoCInput) => boolean;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.performStartOfCombatMinionsForPlayer = exports.handleStartOfCombatMinions = void 0;
4
+ const attack_1 = require("../attack");
5
+ const soc_action_processor_1 = require("./soc-action-processor");
6
+ const handleStartOfCombatMinions = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, playerBoardBefore, opponentBoardBefore, gameState) => {
7
+ let attackerForStart = Math.random() < 0.5 ? 0 : 1;
8
+ const playerAttackers = [...playerBoard];
9
+ const opponentAttackers = [...opponentBoard];
10
+ while (playerAttackers.length > 0 || opponentAttackers.length > 0) {
11
+ let shouldUpdateNextPlayer = false;
12
+ if (attackerForStart === 0 && playerAttackers.length > 0) {
13
+ const attacker = playerAttackers.splice(0, 1)[0];
14
+ if (attacker.health <= 0 || attacker.definitelyDead) {
15
+ continue;
16
+ }
17
+ shouldUpdateNextPlayer = (0, exports.performStartOfCombatMinionsForPlayer)(attacker, {
18
+ playerBoard,
19
+ playerEntity,
20
+ opponentBoard,
21
+ opponentEntity,
22
+ playerBoardBefore,
23
+ opponentBoardBefore,
24
+ playerIsFriendly: true,
25
+ currentAttacker: 0,
26
+ gameState,
27
+ });
28
+ }
29
+ else if (attackerForStart === 0 && playerAttackers.length === 0) {
30
+ shouldUpdateNextPlayer = true;
31
+ }
32
+ else if (attackerForStart === 1 && opponentAttackers.length > 0) {
33
+ const attacker = opponentAttackers.splice(0, 1)[0];
34
+ if (attacker.health <= 0 || attacker.definitelyDead) {
35
+ continue;
36
+ }
37
+ shouldUpdateNextPlayer = (0, exports.performStartOfCombatMinionsForPlayer)(attacker, {
38
+ opponentBoard,
39
+ opponentEntity,
40
+ playerBoard,
41
+ playerEntity,
42
+ opponentBoardBefore,
43
+ playerBoardBefore,
44
+ playerIsFriendly: false,
45
+ currentAttacker: 0,
46
+ gameState,
47
+ });
48
+ }
49
+ else if (attackerForStart === 1 && opponentAttackers.length === 0) {
50
+ shouldUpdateNextPlayer = true;
51
+ }
52
+ if (shouldUpdateNextPlayer) {
53
+ attackerForStart = (attackerForStart + 1) % 2;
54
+ }
55
+ }
56
+ return currentAttacker;
57
+ };
58
+ exports.handleStartOfCombatMinions = handleStartOfCombatMinions;
59
+ const performStartOfCombatMinionsForPlayer = (minion, input) => {
60
+ if (input.playerEntity.startOfCombatDone) {
61
+ return false;
62
+ }
63
+ const hasProcessed = (0, soc_action_processor_1.performStartOfCombatAction)(minion.cardId, minion, input);
64
+ (0, attack_1.processMinionDeath)(input.playerBoard, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
65
+ return hasProcessed;
66
+ };
67
+ exports.performStartOfCombatMinionsForPlayer = performStartOfCombatMinionsForPlayer;
68
+ //# sourceMappingURL=soc-minion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-minion.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-minion.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatMinions = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tplayerBoardBefore: BoardEntity[],\r\n\topponentBoardBefore: BoardEntity[],\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tlet attackerForStart = Math.random() < 0.5 ? 0 : 1;\r\n\tconst playerAttackers = [...playerBoard];\r\n\tconst opponentAttackers = [...opponentBoard];\r\n\r\n\twhile (playerAttackers.length > 0 || opponentAttackers.length > 0) {\r\n\t\tlet shouldUpdateNextPlayer = false;\r\n\t\tif (attackerForStart === 0 && playerAttackers.length > 0) {\r\n\t\t\tconst attacker = playerAttackers.splice(0, 1)[0];\r\n\t\t\tif (attacker.health <= 0 || attacker.definitelyDead) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tshouldUpdateNextPlayer = performStartOfCombatMinionsForPlayer(attacker, {\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tplayerBoardBefore,\r\n\t\t\t\topponentBoardBefore,\r\n\t\t\t\tplayerIsFriendly: true,\r\n\t\t\t\tcurrentAttacker: 0,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t} else if (attackerForStart === 0 && playerAttackers.length === 0) {\r\n\t\t\tshouldUpdateNextPlayer = true;\r\n\t\t} else if (attackerForStart === 1 && opponentAttackers.length > 0) {\r\n\t\t\tconst attacker = opponentAttackers.splice(0, 1)[0];\r\n\t\t\tif (attacker.health <= 0 || attacker.definitelyDead) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tshouldUpdateNextPlayer = performStartOfCombatMinionsForPlayer(attacker, {\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoardBefore,\r\n\t\t\t\tplayerBoardBefore,\r\n\t\t\t\tplayerIsFriendly: false,\r\n\t\t\t\tcurrentAttacker: 0,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t} else if (attackerForStart === 1 && opponentAttackers.length === 0) {\r\n\t\t\tshouldUpdateNextPlayer = true;\r\n\t\t}\r\n\r\n\t\tif (shouldUpdateNextPlayer) {\r\n\t\t\tattackerForStart = (attackerForStart + 1) % 2;\r\n\t\t}\r\n\t}\r\n\treturn currentAttacker;\r\n};\r\n\r\n// Apparently, the board composition used for start of combat minion effects (like Red Whelp, and I assume it works the\r\n// same way for others like Prized Promo Drake or Mantid Queen) is the one that is used before Illidan's effect is handled.\r\n// Since this also runs before HP start of combat, we probably also use the state as it was before HP were triggered, like\r\n// Tamsin's Phylactery.\r\nexport const performStartOfCombatMinionsForPlayer = (minion: BoardEntity, input: SoCInput): boolean => {\r\n\tif (input.playerEntity.startOfCombatDone) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst hasProcessed = performStartOfCombatAction(minion.cardId, minion, input);\r\n\r\n\tprocessMinionDeath(\r\n\t\tinput.playerBoard,\r\n\t\tinput.playerEntity,\r\n\t\tinput.opponentBoard,\r\n\t\tinput.opponentEntity,\r\n\t\tinput.gameState,\r\n\t);\r\n\treturn hasProcessed;\r\n};\r\n"]}
@@ -0,0 +1,4 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ export declare const handlePreCombatHeroPowers: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handlePreCombatHeroPowers = void 0;
4
+ const attack_1 = require("../attack");
5
+ const summon_when_space_1 = require("../summon-when-space");
6
+ const soc_action_processor_1 = require("./soc-action-processor");
7
+ const soc_hero_power_1 = require("./soc-hero-power");
8
+ const handlePreCombatHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
9
+ if (Math.random() < 0.5) {
10
+ currentAttacker = handlePreCombatHeroPowersForPlayer({
11
+ playerEntity,
12
+ playerBoard,
13
+ opponentEntity,
14
+ opponentBoard,
15
+ currentAttacker,
16
+ playerIsFriendly: true,
17
+ gameState,
18
+ });
19
+ currentAttacker = handlePreCombatHeroPowersForPlayer({
20
+ opponentEntity,
21
+ opponentBoard,
22
+ playerEntity,
23
+ playerBoard,
24
+ currentAttacker,
25
+ playerIsFriendly: false,
26
+ gameState,
27
+ });
28
+ }
29
+ else {
30
+ currentAttacker = handlePreCombatHeroPowersForPlayer({
31
+ opponentEntity,
32
+ opponentBoard,
33
+ playerEntity,
34
+ playerBoard,
35
+ currentAttacker,
36
+ playerIsFriendly: false,
37
+ gameState,
38
+ });
39
+ currentAttacker = handlePreCombatHeroPowersForPlayer({
40
+ playerEntity,
41
+ playerBoard,
42
+ opponentEntity,
43
+ opponentBoard,
44
+ currentAttacker,
45
+ playerIsFriendly: true,
46
+ gameState,
47
+ });
48
+ }
49
+ const initialPlayerBoardSize = playerBoard.length;
50
+ const initialOpponentBoardSize = opponentBoard.length;
51
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
52
+ if (playerBoard.length !== initialPlayerBoardSize || opponentBoard.length !== initialOpponentBoardSize) {
53
+ currentAttacker =
54
+ playerBoard.length > opponentBoard.length
55
+ ? 0
56
+ : opponentBoard.length > playerBoard.length
57
+ ? 1
58
+ : Math.round(Math.random());
59
+ }
60
+ return currentAttacker;
61
+ };
62
+ exports.handlePreCombatHeroPowers = handlePreCombatHeroPowers;
63
+ const handlePreCombatHeroPowersForPlayer = (input) => {
64
+ if (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {
65
+ return input.currentAttacker;
66
+ }
67
+ const playerHeroPowerId = input.playerEntity.heroPowerId || (0, soc_hero_power_1.getHeroPowerForHero)(input.playerEntity.cardId);
68
+ (0, soc_action_processor_1.performStartOfCombatAction)(playerHeroPowerId, null, input);
69
+ (0, attack_1.processMinionDeath)(input.playerBoard, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
70
+ return input.currentAttacker;
71
+ };
72
+ //# sourceMappingURL=soc-pre-combat-hero-power.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-pre-combat-hero-power.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-pre-combat-hero-power.ts"],"names":[],"mappings":";;;AAEA,sCAA+C;AAE/C,4DAA8D;AAC9D,iEAAoE;AACpE,qDAAuD;AAGhD,MAAM,yBAAyB,GAAG,CACxC,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,kCAAkC,CAAC;YACpD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,kCAAkC,CAAC;YACpD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;KACH;IACD,MAAM,sBAAsB,GAAG,WAAW,CAAC,MAAM,CAAC;IAClD,MAAM,wBAAwB,GAAG,aAAa,CAAC,MAAM,CAAC;IAGtD,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAE5F,IAAI,WAAW,CAAC,MAAM,KAAK,sBAAsB,IAAI,aAAa,CAAC,MAAM,KAAK,wBAAwB,EAAE;QACvG,eAAe;YACd,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;gBACxC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;oBAC3C,CAAC,CAAC,CAAC;oBACH,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KAC9B;IACD,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AA9DW,QAAA,yBAAyB,6BA8DpC;AAEF,MAAM,kCAAkC,GAAG,CAAC,KAAe,EAAU,EAAE;IACtE,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;QAC3E,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,IAAI,IAAA,oCAAmB,EAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3G,IAAA,iDAA0B,EAAC,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAA,2BAAkB,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;IAEF,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { getHeroPowerForHero } from './soc-hero-power';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handlePreCombatHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\tconst initialPlayerBoardSize = playerBoard.length;\r\n\tconst initialOpponentBoardSize = opponentBoard.length;\r\n\t// Ozumat's Tentaclecan cause the first player to be recomputed\r\n\t// https://replays.firestoneapp.com/?reviewId=f15c90de-8b3c-4017-960d-365fe09eb7ab&turn=5&action=1\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\r\n\tif (playerBoard.length !== initialPlayerBoardSize || opponentBoard.length !== initialOpponentBoardSize) {\r\n\t\tcurrentAttacker =\r\n\t\t\tplayerBoard.length > opponentBoard.length\r\n\t\t\t\t? 0\r\n\t\t\t\t: opponentBoard.length > playerBoard.length\r\n\t\t\t\t? 1\r\n\t\t\t\t: Math.round(Math.random());\r\n\t}\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePreCombatHeroPowersForPlayer = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tconst playerHeroPowerId = input.playerEntity.heroPowerId || getHeroPowerForHero(input.playerEntity.cardId);\r\n\tperformStartOfCombatAction(playerHeroPowerId, null, input);\r\n\tprocessMinionDeath(\r\n\t\tinput.playerBoard,\r\n\t\tinput.playerEntity,\r\n\t\tinput.opponentBoard,\r\n\t\tinput.opponentEntity,\r\n\t\tinput.gameState,\r\n\t);\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
@@ -0,0 +1,4 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ export declare const handleStartOfCombatQuestRewards: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleStartOfCombatQuestRewards = void 0;
4
+ const summon_when_space_1 = require("../summon-when-space");
5
+ const soc_action_processor_1 = require("./soc-action-processor");
6
+ const handleStartOfCombatQuestRewards = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
7
+ if (Math.random() < 0.5) {
8
+ currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
9
+ playerEntity,
10
+ playerBoard,
11
+ opponentEntity,
12
+ opponentBoard,
13
+ currentAttacker,
14
+ gameState,
15
+ playerIsFriendly: true,
16
+ });
17
+ currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
18
+ opponentEntity,
19
+ opponentBoard,
20
+ playerEntity,
21
+ playerBoard,
22
+ currentAttacker,
23
+ gameState,
24
+ playerIsFriendly: false,
25
+ });
26
+ }
27
+ else {
28
+ currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
29
+ opponentEntity,
30
+ opponentBoard,
31
+ playerEntity,
32
+ playerBoard,
33
+ currentAttacker,
34
+ gameState,
35
+ playerIsFriendly: false,
36
+ });
37
+ currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
38
+ playerEntity,
39
+ playerBoard,
40
+ opponentEntity,
41
+ opponentBoard,
42
+ currentAttacker,
43
+ gameState,
44
+ playerIsFriendly: true,
45
+ });
46
+ }
47
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
48
+ return currentAttacker;
49
+ };
50
+ exports.handleStartOfCombatQuestRewards = handleStartOfCombatQuestRewards;
51
+ const handleStartOfCombatQuestRewardsForPlayer = (input) => {
52
+ if (input.playerEntity.startOfCombatDone) {
53
+ return input.currentAttacker;
54
+ }
55
+ for (const reward of input.playerEntity.questRewards) {
56
+ (0, soc_action_processor_1.performStartOfCombatAction)(reward, null, input);
57
+ }
58
+ return input.currentAttacker;
59
+ };
60
+ //# sourceMappingURL=soc-quest-reward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-quest-reward.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-quest-reward.ts"],"names":[],"mappings":";;;AAGA,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,+BAA+B,GAAG,CAC9C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,eAAe,GAAG,wCAAwC,CAAC;YAC1D,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,wCAAwC,CAAC;YAC1D,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,CAAC,CAAC;KACH;IAED,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAlDW,QAAA,+BAA+B,mCAkD1C;AAEF,MAAM,wCAAwC,GAAG,CAAC,KAAe,EAAU,EAAE;IAC5E,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACzC,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE;QACrD,IAAA,iDAA0B,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KAChD;IAED,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatQuestRewards = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t});\r\n\t}\r\n\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handleStartOfCombatQuestRewardsForPlayer = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tfor (const reward of input.playerEntity.questRewards) {\r\n\t\tperformStartOfCombatAction(reward, null, input);\r\n\t}\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
@@ -0,0 +1,4 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ export declare const handleStartOfCombatSecrets: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleStartOfCombatSecrets = void 0;
4
+ const utils_1 = require("../../services/utils");
5
+ const utils_2 = require("../../utils");
6
+ const deathrattle_spawns_1 = require("../deathrattle-spawns");
7
+ const spawns_1 = require("../spawns");
8
+ const summon_when_space_1 = require("../summon-when-space");
9
+ const handleStartOfCombatSecrets = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
10
+ if (Math.random() < 0.5) {
11
+ currentAttacker = handleStartOfCombatSecretsForPlayer(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState, true);
12
+ currentAttacker = handleStartOfCombatSecretsForPlayer(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, gameState, false);
13
+ }
14
+ else {
15
+ currentAttacker = handleStartOfCombatSecretsForPlayer(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, gameState, false);
16
+ currentAttacker = handleStartOfCombatSecretsForPlayer(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState, true);
17
+ }
18
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
19
+ return currentAttacker;
20
+ };
21
+ exports.handleStartOfCombatSecrets = handleStartOfCombatSecrets;
22
+ const handleStartOfCombatSecretsForPlayer = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState, playerIsFriendly) => {
23
+ var _a;
24
+ if (playerEntity.startOfCombatDone) {
25
+ return currentAttacker;
26
+ }
27
+ for (const secret of (_a = playerEntity.secrets) !== null && _a !== void 0 ? _a : []) {
28
+ switch (secret.cardId) {
29
+ case "BG28_573":
30
+ if (!!opponentBoard.length) {
31
+ const target = (0, utils_1.pickRandom)(opponentBoard);
32
+ target.health = 1;
33
+ target.maxHealth = 1;
34
+ gameState.spectator.registerPowerTarget(playerEntity, target, opponentBoard, null, null);
35
+ }
36
+ break;
37
+ case "BG28_603":
38
+ secret.scriptDataNum1 = 1;
39
+ break;
40
+ case "BG28_519":
41
+ (0, utils_2.addStatsToBoard)(secret, playerBoard, playerEntity, 2, 1, gameState);
42
+ break;
43
+ case "BG28_641":
44
+ if (playerBoard.length < 7) {
45
+ const newMinions = (0, deathrattle_spawns_1.spawnEntities)("BG28_641t", 1, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState.allCards, gameState.cardsData, gameState.sharedState, gameState.spectator, playerEntity.friendly, true, false, false);
46
+ newMinions[0].attackImmediately = true;
47
+ (0, spawns_1.performEntitySpawns)(newMinions, playerBoard, playerEntity, null, 0, opponentBoard, opponentEntity, gameState);
48
+ }
49
+ break;
50
+ }
51
+ }
52
+ return currentAttacker;
53
+ };
54
+ //# sourceMappingURL=soc-secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soc-secret.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-secret.ts"],"names":[],"mappings":";;;AAGA,gDAAkD;AAClD,uCAA8C;AAC9C,8DAAsD;AAEtD,sCAAgD;AAChD,4DAA8D;AAEvD,MAAM,0BAA0B,GAAG,CACzC,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,mCAAmC,CACpD,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACT,IAAI,CACJ,CAAC;QACF,eAAe,GAAG,mCAAmC,CACpD,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,SAAS,EACT,KAAK,CACL,CAAC;KACF;SAAM;QACN,eAAe,GAAG,mCAAmC,CACpD,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,SAAS,EACT,KAAK,CACL,CAAC;QACF,eAAe,GAAG,mCAAmC,CACpD,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACT,IAAI,CACJ,CAAC;KACF;IACD,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAjDW,QAAA,0BAA0B,8BAiDrC;AAEF,MAAM,mCAAmC,GAAG,CAC3C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACxB,gBAAyB,EAChB,EAAE;;IACX,IAAI,YAAY,CAAC,iBAAiB,EAAE;QACnC,OAAO,eAAe,CAAC;KACvB;IACD,KAAK,MAAM,MAAM,IAAI,MAAA,YAAY,CAAC,OAAO,mCAAI,EAAE,EAAE;QAChD,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB;gBACC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE;oBAC3B,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,aAAa,CAAC,CAAC;oBACzC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAClB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;oBACrB,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBACzF;gBACD,MAAM;YACP;gBACC,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;gBAC1B,MAAM;YACP;gBACC,IAAA,uBAAe,EAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;gBACpE,MAAM;YACP;gBACC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,MAAM,UAAU,GAAG,IAAA,kCAAa,eAE/B,CAAC,EACD,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,WAAW,EACrB,SAAS,CAAC,SAAS,EACnB,YAAY,CAAC,QAAQ,EACrB,IAAI,EACJ,KAAK,EACL,KAAK,CACL,CAAC;oBACF,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBACvC,IAAA,4BAAmB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,IAAI,EACJ,CAAC,EACD,aAAa,EACb,cAAc,EACd,SAAS,CACT,CAAC;iBACF;gBACD,MAAM;SACP;KACD;IAED,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { pickRandom } from '../../services/utils';\r\nimport { addStatsToBoard } from '../../utils';\r\nimport { spawnEntities } from '../deathrattle-spawns';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { performEntitySpawns } from '../spawns';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\n\r\nexport const handleStartOfCombatSecrets = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t} else {\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t}\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handleStartOfCombatSecretsForPlayer = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n\tplayerIsFriendly: boolean,\r\n): number => {\r\n\tif (playerEntity.startOfCombatDone) {\r\n\t\treturn currentAttacker;\r\n\t}\r\n\tfor (const secret of playerEntity.secrets ?? []) {\r\n\t\tswitch (secret.cardId) {\r\n\t\t\tcase CardIds.UpperHand_BG28_573:\r\n\t\t\t\tif (!!opponentBoard.length) {\r\n\t\t\t\t\tconst target = pickRandom(opponentBoard);\r\n\t\t\t\t\ttarget.health = 1;\r\n\t\t\t\t\ttarget.maxHealth = 1;\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(playerEntity, target, opponentBoard, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.BoonOfBeetles_BG28_603:\r\n\t\t\t\tsecret.scriptDataNum1 = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FleetingVigor_BG28_519:\r\n\t\t\t\taddStatsToBoard(secret, playerBoard, playerEntity, 2, 1, gameState);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.ToxicTumbleweed_BG28_641:\r\n\t\t\t\tif (playerBoard.length < 7) {\r\n\t\t\t\t\tconst newMinions = spawnEntities(\r\n\t\t\t\t\t\tCardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n\t\t\t\t\t\t1,\r\n\t\t\t\t\t\tplayerBoard,\r\n\t\t\t\t\t\tplayerEntity,\r\n\t\t\t\t\t\topponentBoard,\r\n\t\t\t\t\t\topponentEntity,\r\n\t\t\t\t\t\tgameState.allCards,\r\n\t\t\t\t\t\tgameState.cardsData,\r\n\t\t\t\t\t\tgameState.sharedState,\r\n\t\t\t\t\t\tgameState.spectator,\r\n\t\t\t\t\t\tplayerEntity.friendly,\r\n\t\t\t\t\t\ttrue,\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tnewMinions[0].attackImmediately = true;\r\n\t\t\t\t\tperformEntitySpawns(\r\n\t\t\t\t\t\tnewMinions,\r\n\t\t\t\t\t\tplayerBoard,\r\n\t\t\t\t\t\tplayerEntity,\r\n\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\topponentBoard,\r\n\t\t\t\t\t\topponentEntity,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn currentAttacker;\r\n};\r\n"]}
@@ -0,0 +1,4 @@
1
+ import { BgsPlayerEntity } from '../../bgs-player-entity';
2
+ import { BoardEntity } from '../../board-entity';
3
+ import { FullGameState } from '../internal-game-state';
4
+ export declare const handleStartOfCombatTrinkets: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleStartOfCombatTrinkets = void 0;
4
+ const summon_when_space_1 = require("../summon-when-space");
5
+ const soc_action_processor_1 = require("./soc-action-processor");
6
+ const handleStartOfCombatTrinkets = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
7
+ if (Math.random() < 0.5) {
8
+ currentAttacker = handleStartOfCombatTrinketsForPlayer({
9
+ playerEntity,
10
+ playerBoard,
11
+ opponentEntity,
12
+ opponentBoard,
13
+ currentAttacker,
14
+ gameState,
15
+ playerIsFriendly: true,
16
+ });
17
+ currentAttacker = handleStartOfCombatTrinketsForPlayer({
18
+ opponentEntity,
19
+ opponentBoard,
20
+ playerEntity,
21
+ playerBoard,
22
+ currentAttacker,
23
+ gameState,
24
+ playerIsFriendly: false,
25
+ });
26
+ }
27
+ else {
28
+ currentAttacker = handleStartOfCombatTrinketsForPlayer({
29
+ opponentEntity,
30
+ opponentBoard,
31
+ playerEntity,
32
+ playerBoard,
33
+ currentAttacker,
34
+ gameState,
35
+ playerIsFriendly: false,
36
+ });
37
+ currentAttacker = handleStartOfCombatTrinketsForPlayer({
38
+ playerEntity,
39
+ playerBoard,
40
+ opponentEntity,
41
+ opponentBoard,
42
+ currentAttacker,
43
+ gameState,
44
+ playerIsFriendly: true,
45
+ });
46
+ }
47
+ (0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
48
+ return currentAttacker;
49
+ };
50
+ exports.handleStartOfCombatTrinkets = handleStartOfCombatTrinkets;
51
+ const handleStartOfCombatTrinketsForPlayer = (input) => {
52
+ if (input.playerEntity.startOfCombatDone) {
53
+ return input.currentAttacker;
54
+ }
55
+ for (const trinket of input.playerEntity.trinkets) {
56
+ (0, soc_action_processor_1.performStartOfCombatAction)(trinket.cardId, trinket, input);
57
+ }
58
+ return input.currentAttacker;
59
+ };
60
+ //# sourceMappingURL=soc-trinket.js.map