@firestone-hs/simulate-bgs-battle 1.1.617 → 1.1.619

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 (159) hide show
  1. package/dist/cards/card.interface.d.ts +10 -3
  2. package/dist/cards/card.interface.js +5 -3
  3. package/dist/cards/card.interface.js.map +1 -1
  4. package/dist/cards/impl/minion/admiral-eliza-goreblade.d.ts +2 -2
  5. package/dist/cards/impl/minion/admiral-eliza-goreblade.js +1 -1
  6. package/dist/cards/impl/minion/admiral-eliza-goreblade.js.map +1 -1
  7. package/dist/cards/impl/minion/arcane-cannoneer.d.ts +2 -2
  8. package/dist/cards/impl/minion/arcane-cannoneer.js +1 -4
  9. package/dist/cards/impl/minion/arcane-cannoneer.js.map +1 -1
  10. package/dist/cards/impl/minion/battlecruiser.d.ts +2 -2
  11. package/dist/cards/impl/minion/battlecruiser.js +1 -4
  12. package/dist/cards/impl/minion/battlecruiser.js.map +1 -1
  13. package/dist/cards/impl/minion/bigwig-bandit.d.ts +2 -2
  14. package/dist/cards/impl/minion/bigwig-bandit.js +1 -4
  15. package/dist/cards/impl/minion/bigwig-bandit.js.map +1 -1
  16. package/dist/cards/impl/minion/bile-spitter.d.ts +2 -2
  17. package/dist/cards/impl/minion/bile-spitter.js +1 -4
  18. package/dist/cards/impl/minion/bile-spitter.js.map +1 -1
  19. package/dist/cards/impl/minion/bloodsnout-warlord.d.ts +2 -2
  20. package/dist/cards/impl/minion/bloodsnout-warlord.js +1 -1
  21. package/dist/cards/impl/minion/bloodsnout-warlord.js.map +1 -1
  22. package/dist/cards/impl/minion/blue-whelp.d.ts +2 -2
  23. package/dist/cards/impl/minion/blue-whelp.js +1 -4
  24. package/dist/cards/impl/minion/blue-whelp.js.map +1 -1
  25. package/dist/cards/impl/minion/bonker.d.ts +2 -2
  26. package/dist/cards/impl/minion/bonker.js +1 -4
  27. package/dist/cards/impl/minion/bonker.js.map +1 -1
  28. package/dist/cards/impl/minion/campfire-shadow.d.ts +2 -2
  29. package/dist/cards/impl/minion/campfire-shadow.js +1 -4
  30. package/dist/cards/impl/minion/campfire-shadow.js.map +1 -1
  31. package/dist/cards/impl/minion/charmwing.d.ts +2 -2
  32. package/dist/cards/impl/minion/charmwing.js +1 -4
  33. package/dist/cards/impl/minion/charmwing.js.map +1 -1
  34. package/dist/cards/impl/minion/choral-mrrrglr.js +4 -6
  35. package/dist/cards/impl/minion/choral-mrrrglr.js.map +1 -1
  36. package/dist/cards/impl/minion/colossus.d.ts +2 -2
  37. package/dist/cards/impl/minion/colossus.js +1 -4
  38. package/dist/cards/impl/minion/colossus.js.map +1 -1
  39. package/dist/cards/impl/minion/exceptionnal-caretaker.d.ts +2 -2
  40. package/dist/cards/impl/minion/exceptionnal-caretaker.js +1 -4
  41. package/dist/cards/impl/minion/exceptionnal-caretaker.js.map +1 -1
  42. package/dist/cards/impl/minion/flotsam-flinger.d.ts +4 -2
  43. package/dist/cards/impl/minion/flotsam-flinger.js +0 -10
  44. package/dist/cards/impl/minion/flotsam-flinger.js.map +1 -1
  45. package/dist/cards/impl/minion/friendly-geist.js +1 -1
  46. package/dist/cards/impl/minion/friendly-geist.js.map +1 -1
  47. package/dist/cards/impl/minion/geared-guard.d.ts +2 -2
  48. package/dist/cards/impl/minion/geared-guard.js +1 -4
  49. package/dist/cards/impl/minion/geared-guard.js.map +1 -1
  50. package/dist/cards/impl/minion/gem-smuggler.js +2 -2
  51. package/dist/cards/impl/minion/gem-smuggler.js.map +1 -1
  52. package/dist/cards/impl/minion/gleaming-trader.js +2 -2
  53. package/dist/cards/impl/minion/gleaming-trader.js.map +1 -1
  54. package/dist/cards/impl/minion/goldrinn-the-great-wolf.js +1 -1
  55. package/dist/cards/impl/minion/goldrinn-the-great-wolf.js.map +1 -1
  56. package/dist/cards/impl/minion/greedy-snaketongue.d.ts +2 -2
  57. package/dist/cards/impl/minion/greedy-snaketongue.js +1 -4
  58. package/dist/cards/impl/minion/greedy-snaketongue.js.map +1 -1
  59. package/dist/cards/impl/minion/greenskeeper.d.ts +2 -2
  60. package/dist/cards/impl/minion/greenskeeper.js +1 -4
  61. package/dist/cards/impl/minion/greenskeeper.js.map +1 -1
  62. package/dist/cards/impl/minion/holo-rover.d.ts +2 -2
  63. package/dist/cards/impl/minion/holo-rover.js +1 -4
  64. package/dist/cards/impl/minion/holo-rover.js.map +1 -1
  65. package/dist/cards/impl/minion/hydralisk.d.ts +2 -2
  66. package/dist/cards/impl/minion/hydralisk.js +1 -4
  67. package/dist/cards/impl/minion/hydralisk.js.map +1 -1
  68. package/dist/cards/impl/minion/monstrous-macaw.d.ts +2 -2
  69. package/dist/cards/impl/minion/monstrous-macaw.js +1 -4
  70. package/dist/cards/impl/minion/monstrous-macaw.js.map +1 -1
  71. package/dist/cards/impl/minion/neon-agent.d.ts +2 -2
  72. package/dist/cards/impl/minion/neon-agent.js +1 -4
  73. package/dist/cards/impl/minion/neon-agent.js.map +1 -1
  74. package/dist/cards/impl/minion/niuzao.d.ts +2 -2
  75. package/dist/cards/impl/minion/niuzao.js +1 -4
  76. package/dist/cards/impl/minion/niuzao.js.map +1 -1
  77. package/dist/cards/impl/minion/noisul-of-the-many-faces.js +1 -1
  78. package/dist/cards/impl/minion/noisul-of-the-many-faces.js.map +1 -1
  79. package/dist/cards/impl/minion/primeval-monstrosity.d.ts +2 -2
  80. package/dist/cards/impl/minion/primeval-monstrosity.js +1 -1
  81. package/dist/cards/impl/minion/primeval-monstrosity.js.map +1 -1
  82. package/dist/cards/impl/minion/prodigious-tusker.d.ts +2 -2
  83. package/dist/cards/impl/minion/prodigious-tusker.js +1 -1
  84. package/dist/cards/impl/minion/prodigious-tusker.js.map +1 -1
  85. package/dist/cards/impl/minion/raptor-elder.js +2 -2
  86. package/dist/cards/impl/minion/raptor-elder.js.map +1 -1
  87. package/dist/cards/impl/minion/razorfen-vineweaver.d.ts +2 -2
  88. package/dist/cards/impl/minion/razorfen-vineweaver.js +1 -4
  89. package/dist/cards/impl/minion/razorfen-vineweaver.js.map +1 -1
  90. package/dist/cards/impl/minion/ripsnarl-captain.d.ts +2 -2
  91. package/dist/cards/impl/minion/ripsnarl-captain.js +1 -1
  92. package/dist/cards/impl/minion/ripsnarl-captain.js.map +1 -1
  93. package/dist/cards/impl/minion/roadboar.d.ts +2 -2
  94. package/dist/cards/impl/minion/roadboar.js +1 -4
  95. package/dist/cards/impl/minion/roadboar.js.map +1 -1
  96. package/dist/cards/impl/minion/sanguine-refiner.d.ts +2 -2
  97. package/dist/cards/impl/minion/sanguine-refiner.js +1 -4
  98. package/dist/cards/impl/minion/sanguine-refiner.js.map +1 -1
  99. package/dist/cards/impl/minion/silent-enforcer.js +1 -1
  100. package/dist/cards/impl/minion/silent-enforcer.js.map +1 -1
  101. package/dist/cards/impl/minion/sinodorei-straight-shot.d.ts +2 -2
  102. package/dist/cards/impl/minion/sinodorei-straight-shot.js +1 -4
  103. package/dist/cards/impl/minion/sinodorei-straight-shot.js.map +1 -1
  104. package/dist/cards/impl/minion/sleepy-supporter.d.ts +2 -2
  105. package/dist/cards/impl/minion/sleepy-supporter.js +1 -4
  106. package/dist/cards/impl/minion/sleepy-supporter.js.map +1 -1
  107. package/dist/cards/impl/minion/stomping-stegodon-enchantment.d.ts +2 -2
  108. package/dist/cards/impl/minion/stomping-stegodon-enchantment.js +3 -5
  109. package/dist/cards/impl/minion/stomping-stegodon-enchantment.js.map +1 -1
  110. package/dist/cards/impl/minion/stomping-stegodon.d.ts +4 -2
  111. package/dist/cards/impl/minion/stomping-stegodon.js +5 -6
  112. package/dist/cards/impl/minion/stomping-stegodon.js.map +1 -1
  113. package/dist/cards/impl/minion/transmuted-bramblewitch.d.ts +2 -2
  114. package/dist/cards/impl/minion/transmuted-bramblewitch.js +1 -4
  115. package/dist/cards/impl/minion/transmuted-bramblewitch.js.map +1 -1
  116. package/dist/cards/impl/minion/tusked-camper.d.ts +2 -2
  117. package/dist/cards/impl/minion/tusked-camper.js +1 -4
  118. package/dist/cards/impl/minion/tusked-camper.js.map +1 -1
  119. package/dist/cards/impl/minion/twilight-watcher.d.ts +2 -2
  120. package/dist/cards/impl/minion/twilight-watcher.js +2 -2
  121. package/dist/cards/impl/minion/twilight-watcher.js.map +1 -1
  122. package/dist/cards/impl/minion/vengeful-protector.d.ts +2 -2
  123. package/dist/cards/impl/minion/vengeful-protector.js +1 -4
  124. package/dist/cards/impl/minion/vengeful-protector.js.map +1 -1
  125. package/dist/cards/impl/minion/void-ray.d.ts +2 -2
  126. package/dist/cards/impl/minion/void-ray.js +1 -1
  127. package/dist/cards/impl/minion/void-ray.js.map +1 -1
  128. package/dist/cards/impl/minion/whirring-protector-enchantment.d.ts +2 -2
  129. package/dist/cards/impl/minion/whirring-protector-enchantment.js +1 -4
  130. package/dist/cards/impl/minion/whirring-protector-enchantment.js.map +1 -1
  131. package/dist/cards/impl/minion/whirring-protector.d.ts +2 -2
  132. package/dist/cards/impl/minion/whirring-protector.js +1 -4
  133. package/dist/cards/impl/minion/whirring-protector.js.map +1 -1
  134. package/dist/cards/impl/minion/yrel.d.ts +2 -2
  135. package/dist/cards/impl/minion/yrel.js +1 -4
  136. package/dist/cards/impl/minion/yrel.js.map +1 -1
  137. package/dist/cards/impl/trinket/all-purpose-kibble.d.ts +2 -2
  138. package/dist/cards/impl/trinket/all-purpose-kibble.js +1 -1
  139. package/dist/cards/impl/trinket/all-purpose-kibble.js.map +1 -1
  140. package/dist/cards/impl/trinket/eternal-portrait.d.ts +1 -1
  141. package/dist/cards/impl/trinket/eternal-portrait.js +1 -1
  142. package/dist/cards/impl/trinket/eternal-portrait.js.map +1 -1
  143. package/dist/cards/impl/trinket/faerie-dragon-scale.d.ts +2 -2
  144. package/dist/cards/impl/trinket/faerie-dragon-scale.js +1 -1
  145. package/dist/cards/impl/trinket/faerie-dragon-scale.js.map +1 -1
  146. package/dist/cards/impl/trinket/unholy-sanctum.js +3 -0
  147. package/dist/cards/impl/trinket/unholy-sanctum.js.map +1 -1
  148. package/dist/simulation/add-minion-to-board.js +1 -1
  149. package/dist/simulation/add-minion-to-board.js.map +1 -1
  150. package/dist/simulation/battlecries.js +1 -2
  151. package/dist/simulation/battlecries.js.map +1 -1
  152. package/dist/simulation/deathrattle-spawns.js +11 -3
  153. package/dist/simulation/deathrattle-spawns.js.map +1 -1
  154. package/dist/simulation/on-attack.d.ts +0 -1
  155. package/dist/simulation/on-attack.js +120 -90
  156. package/dist/simulation/on-attack.js.map +1 -1
  157. package/dist/simulation/reborn.js +1 -1
  158. package/dist/simulation/reborn.js.map +1 -1
  159. package/package.json +1 -1
@@ -14,15 +14,46 @@ const applyOnAttackEffects = (attacker, attackingBoard, attackingBoardHero, defe
14
14
  var _a, _b, _c;
15
15
  let damageDoneByAttacker = 0;
16
16
  let damageDoneByDefender = 0;
17
- const rallyLoops = 1 +
18
- ((_b = (_a = attackingBoardHero.questRewardEntities) === null || _a === void 0 ? void 0 : _a.filter((r) => r.cardId === "BG33_Reward_021").length) !== null && _b !== void 0 ? _b : 0);
19
- for (let i = 0; i < rallyLoops; i++) {
20
- for (const trinket of (_c = attackingBoardHero.trinkets) !== null && _c !== void 0 ? _c : []) {
21
- const onAttackImpl = _card_mappings_1.cardMappings[trinket.cardId];
22
- if ((0, card_interface_1.hasOnAttack)(onAttackImpl)) {
23
- const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(trinket, {
17
+ for (const trinket of (_a = attackingBoardHero.trinkets) !== null && _a !== void 0 ? _a : []) {
18
+ const onAttackImpl = _card_mappings_1.cardMappings[trinket.cardId];
19
+ if ((0, card_interface_1.hasOnWheneverAnotherMinionAttacks)(onAttackImpl)) {
20
+ const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(trinket, {
21
+ attacker: attacker,
22
+ attackingHero: attackingBoardHero,
23
+ attackingBoard: attackingBoard,
24
+ defendingEntity: defendingEntity,
25
+ defendingHero: defendingBoardHero,
26
+ defendingBoard: defendingBoard,
27
+ gameState,
28
+ playerIsFriendly: attackingBoardHero.friendly,
29
+ });
30
+ damageDoneByAttacker += dmgDoneByAttacker;
31
+ damageDoneByDefender += dmgDoneByDefender;
32
+ }
33
+ }
34
+ const attackingBoardOtherEntities = attackingBoard.filter((e) => e !== attacker);
35
+ for (const boardEntity of attackingBoardOtherEntities) {
36
+ const onAttackImpl = _card_mappings_1.cardMappings[boardEntity.cardId];
37
+ if ((0, card_interface_1.hasOnWheneverAnotherMinionAttacks)(onAttackImpl)) {
38
+ const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(boardEntity, {
39
+ attacker: attacker,
40
+ attackingHero: attackingBoardHero,
41
+ attackingBoard: attackingBoard,
42
+ defendingEntity: defendingEntity,
43
+ defendingHero: defendingBoardHero,
44
+ defendingBoard: defendingBoard,
45
+ gameState,
46
+ playerIsFriendly: attackingBoardHero.friendly,
47
+ });
48
+ damageDoneByAttacker += dmgDoneByAttacker;
49
+ damageDoneByDefender += dmgDoneByDefender;
50
+ }
51
+ const enchantments = boardEntity.enchantments;
52
+ for (const enchantment of enchantments) {
53
+ const onAttackImpl = _card_mappings_1.cardMappings[enchantment.cardId];
54
+ if ((0, card_interface_1.hasOnWheneverAnotherMinionAttacks)(onAttackImpl)) {
55
+ const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(enchantment, {
24
56
  attacker: attacker,
25
- isSelfAttacking: false,
26
57
  attackingHero: attackingBoardHero,
27
58
  attackingBoard: attackingBoard,
28
59
  defendingEntity: defendingEntity,
@@ -35,12 +66,31 @@ const applyOnAttackEffects = (attacker, attackingBoard, attackingBoardHero, defe
35
66
  damageDoneByDefender += dmgDoneByDefender;
36
67
  }
37
68
  }
38
- for (const boardEntity of attackingBoard) {
39
- const onAttackImpl = _card_mappings_1.cardMappings[boardEntity.cardId];
40
- if ((0, card_interface_1.hasOnAttack)(onAttackImpl)) {
41
- const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(boardEntity, {
69
+ }
70
+ const rallyLoops = 1 +
71
+ ((_c = (_b = attackingBoardHero.questRewardEntities) === null || _b === void 0 ? void 0 : _b.filter((r) => r.cardId === "BG33_Reward_021").length) !== null && _c !== void 0 ? _c : 0);
72
+ for (let i = 0; i < rallyLoops; i++) {
73
+ const onAttackImpl = _card_mappings_1.cardMappings[attacker.cardId];
74
+ if ((0, card_interface_1.hasRally)(onAttackImpl)) {
75
+ const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(attacker, {
76
+ attacker: attacker,
77
+ attackingHero: attackingBoardHero,
78
+ attackingBoard: attackingBoard,
79
+ defendingEntity: defendingEntity,
80
+ defendingHero: defendingBoardHero,
81
+ defendingBoard: defendingBoard,
82
+ gameState,
83
+ playerIsFriendly: attackingBoardHero.friendly,
84
+ });
85
+ damageDoneByAttacker += dmgDoneByAttacker;
86
+ damageDoneByDefender += dmgDoneByDefender;
87
+ }
88
+ const enchantments = attacker.enchantments;
89
+ for (const enchantment of enchantments) {
90
+ const onAttackImpl = _card_mappings_1.cardMappings[enchantment.cardId];
91
+ if ((0, card_interface_1.hasRally)(onAttackImpl)) {
92
+ const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(enchantment, {
42
93
  attacker: attacker,
43
- isSelfAttacking: attacker === boardEntity,
44
94
  attackingHero: attackingBoardHero,
45
95
  attackingBoard: attackingBoard,
46
96
  defendingEntity: defendingEntity,
@@ -52,87 +102,67 @@ const applyOnAttackEffects = (attacker, attackingBoard, attackingBoardHero, defe
52
102
  damageDoneByAttacker += dmgDoneByAttacker;
53
103
  damageDoneByDefender += dmgDoneByDefender;
54
104
  }
55
- const enchantments = boardEntity.enchantments;
56
- for (const enchantment of enchantments) {
57
- const onAttackImpl = _card_mappings_1.cardMappings[enchantment.cardId];
58
- if ((0, card_interface_1.hasOnAttack)(onAttackImpl)) {
59
- const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(enchantment, {
60
- attacker: attacker,
61
- isSelfAttacking: attacker === boardEntity,
62
- attackingHero: attackingBoardHero,
63
- attackingBoard: attackingBoard,
64
- defendingEntity: defendingEntity,
65
- defendingHero: defendingBoardHero,
66
- defendingBoard: defendingBoard,
67
- gameState,
68
- playerIsFriendly: attackingBoardHero.friendly,
69
- });
70
- damageDoneByAttacker += dmgDoneByAttacker;
71
- damageDoneByDefender += dmgDoneByDefender;
72
- }
73
- }
74
- }
75
- if (attacker.cardId === "BG27_017" ||
76
- attacker.cardId === "BG27_017_G") {
77
- const neighbours = (0, attack_1.getNeighbours)(defendingBoard, defendingEntity);
78
- const targets = attacker.cardId === "BG27_017_G" ? neighbours : [(0, utils_1.pickRandom)(neighbours)];
79
- [defendingEntity, ...targets].forEach((target) => {
80
- gameState.spectator.registerPowerTarget(attacker, target, defendingBoard, attackingBoardHero, defendingBoardHero);
81
- (0, attack_1.dealDamageToMinion)(target, defendingBoard, defendingBoardHero, attacker, attacker.attack, attackingBoard, attackingBoardHero, gameState);
82
- });
83
- }
84
- if ((0, utils_2.hasCorrectTribe)(attacker, attackingBoardHero, reference_data_1.Race.DRAGON, gameState.anomalies, gameState.allCards)) {
85
- attackingBoard
86
- .filter((e) => e.cardId === "BG29_816" || e.cardId === "BG29_816_G")
87
- .forEach((rallier) => {
88
- if (rallier !== attacker) {
89
- const stats = rallier.cardId === "BG29_816_G" ? 2 : 1;
90
- (0, stats_1.modifyStats)(attacker, rallier, 3 * stats, 1 * stats, attackingBoard, attackingBoardHero, gameState);
91
- }
92
- });
93
105
  }
94
- if (attacker.cardId === "BG29_888" || attacker.cardId === "BG29_888_G") {
95
- const multiplier = attacker.cardId === "BG29_888_G" ? 2 : 1;
96
- (0, stats_1.modifyStats)(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);
97
- }
98
- else if (attacker.cardId === "BG24_708" ||
99
- attacker.cardId === "BG24_708_G") {
100
- attackingBoard
101
- .filter((e) => (0, utils_2.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.PIRATE, gameState.anomalies, gameState.allCards))
102
- .forEach((e) => {
103
- (0, stats_1.modifyStats)(e, attacker, attacker.cardId === "BG24_708_G" ? 4 : 2, attacker.cardId === "BG24_708_G" ? 4 : 2, attackingBoard, attackingBoardHero, gameState);
104
- });
105
- }
106
- else if (attacker.cardId === "BG28_635" ||
107
- attacker.cardId === "BG28_635_G") {
108
- const numberOfCardsToAdd = attacker.cardId === "BG28_635_G" ? 2 : 1;
109
- const cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);
110
- (0, cards_in_hand_1.addCardsInHand)(attackingBoardHero, attackingBoard, cardsToAdd, gameState);
111
- }
112
- else if (attacker.cardId === "BG29_809" || attacker.cardId === "BG29_809_G") {
113
- const loops = attacker.cardId === "BG29_809_G" ? 2 : 1;
114
- for (let i = 0; i < loops; i++) {
115
- for (const entity of [...attackingBoard]) {
116
- if (entity.entityId === attacker.entityId) {
117
- continue;
118
- }
119
- const isSameSide = entity.friendly === attacker.friendly;
120
- const board = isSameSide ? attackingBoard : defendingBoard;
121
- const hero = isSameSide ? attackingBoardHero : defendingBoardHero;
122
- (0, attack_1.dealDamageToMinion)(entity, board, hero, attacker, 1, isSameSide ? defendingBoard : attackingBoard, isSameSide ? defendingBoardHero : attackingBoardHero, gameState);
106
+ }
107
+ if (attacker.cardId === "BG27_017" ||
108
+ attacker.cardId === "BG27_017_G") {
109
+ const neighbours = (0, attack_1.getNeighbours)(defendingBoard, defendingEntity);
110
+ const targets = attacker.cardId === "BG27_017_G" ? neighbours : [(0, utils_1.pickRandom)(neighbours)];
111
+ [defendingEntity, ...targets].forEach((target) => {
112
+ gameState.spectator.registerPowerTarget(attacker, target, defendingBoard, attackingBoardHero, defendingBoardHero);
113
+ (0, attack_1.dealDamageToMinion)(target, defendingBoard, defendingBoardHero, attacker, attacker.attack, attackingBoard, attackingBoardHero, gameState);
114
+ });
115
+ }
116
+ if ((0, utils_2.hasCorrectTribe)(attacker, attackingBoardHero, reference_data_1.Race.DRAGON, gameState.anomalies, gameState.allCards)) {
117
+ attackingBoard
118
+ .filter((e) => e.cardId === "BG29_816" || e.cardId === "BG29_816_G")
119
+ .forEach((rallier) => {
120
+ if (rallier !== attacker) {
121
+ const stats = rallier.cardId === "BG29_816_G" ? 2 : 1;
122
+ (0, stats_1.modifyStats)(attacker, rallier, 3 * stats, 1 * stats, attackingBoard, attackingBoardHero, gameState);
123
+ }
124
+ });
125
+ }
126
+ if (attacker.cardId === "BG29_888" || attacker.cardId === "BG29_888_G") {
127
+ const multiplier = attacker.cardId === "BG29_888_G" ? 2 : 1;
128
+ (0, stats_1.modifyStats)(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);
129
+ }
130
+ else if (attacker.cardId === "BG24_708" ||
131
+ attacker.cardId === "BG24_708_G") {
132
+ attackingBoard
133
+ .filter((e) => (0, utils_2.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.PIRATE, gameState.anomalies, gameState.allCards))
134
+ .forEach((e) => {
135
+ (0, stats_1.modifyStats)(e, attacker, attacker.cardId === "BG24_708_G" ? 4 : 2, attacker.cardId === "BG24_708_G" ? 4 : 2, attackingBoard, attackingBoardHero, gameState);
136
+ });
137
+ }
138
+ else if (attacker.cardId === "BG28_635" ||
139
+ attacker.cardId === "BG28_635_G") {
140
+ const numberOfCardsToAdd = attacker.cardId === "BG28_635_G" ? 2 : 1;
141
+ const cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);
142
+ (0, cards_in_hand_1.addCardsInHand)(attackingBoardHero, attackingBoard, cardsToAdd, gameState);
143
+ }
144
+ else if (attacker.cardId === "BG29_809" || attacker.cardId === "BG29_809_G") {
145
+ const loops = attacker.cardId === "BG29_809_G" ? 2 : 1;
146
+ for (let i = 0; i < loops; i++) {
147
+ for (const entity of [...attackingBoard]) {
148
+ if (entity.entityId === attacker.entityId) {
149
+ continue;
123
150
  }
151
+ const isSameSide = entity.friendly === attacker.friendly;
152
+ const board = isSameSide ? attackingBoard : defendingBoard;
153
+ const hero = isSameSide ? attackingBoardHero : defendingBoardHero;
154
+ (0, attack_1.dealDamageToMinion)(entity, board, hero, attacker, 1, isSameSide ? defendingBoard : attackingBoard, isSameSide ? defendingBoardHero : attackingBoardHero, gameState);
124
155
  }
125
156
  }
126
- else if (attacker.cardId === "BG29_120" ||
127
- attacker.cardId === "BG29_120_G") {
128
- const loops = attacker.cardId === "BG29_120_G" ? 2 : 1;
129
- const attackerIndex = attackingBoard.indexOf(attacker);
130
- for (let i = 1; i <= loops; i++) {
131
- const target = attackingBoard[attackerIndex + i];
132
- if (!!target) {
133
- (0, reborn_1.updateReborn)(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);
134
- gameState.spectator.registerPowerTarget(attacker, target, attackingBoard, attackingBoardHero, defendingBoardHero);
135
- }
157
+ }
158
+ else if (attacker.cardId === "BG29_120" || attacker.cardId === "BG29_120_G") {
159
+ const loops = attacker.cardId === "BG29_120_G" ? 2 : 1;
160
+ const attackerIndex = attackingBoard.indexOf(attacker);
161
+ for (let i = 1; i <= loops; i++) {
162
+ const target = attackingBoard[attackerIndex + i];
163
+ if (!!target) {
164
+ (0, reborn_1.updateReborn)(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);
165
+ gameState.spectator.registerPowerTarget(attacker, target, attackingBoard, attackingBoardHero, defendingBoardHero);
136
166
  }
137
167
  }
138
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"on-attack.js","sourceRoot":"","sources":["../../src/simulation/on-attack.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAttack } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateReborn } from '../keywords/reborn';\r\nimport { pickRandom } from '../services/utils';\r\nimport { hasCorrectTribe } from '../utils';\r\nimport { dealDamageToMinion, getNeighbours } from './attack';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\n// Whenever it attacks\r\nexport const applyOnAttackEffects = (\r\n\tattacker: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\t// This assumes that only \"Rally\" effects trigger on attack\r\n\tconst rallyLoops =\r\n\t\t1 +\r\n\t\t(attackingBoardHero.questRewardEntities?.filter((r) => r.cardId === CardIds.RallyingCry_BG33_Reward_021)\r\n\t\t\t.length ?? 0);\r\n\tfor (let i = 0; i < rallyLoops; i++) {\r\n\t\tfor (const trinket of attackingBoardHero.trinkets ?? []) {\r\n\t\t\tconst onAttackImpl = cardMappings[trinket.cardId];\r\n\t\t\tif (hasOnAttack(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(trinket, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tisSelfAttacking: false,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (const boardEntity of attackingBoard) {\r\n\t\t\tconst onAttackImpl = cardMappings[boardEntity.cardId];\r\n\t\t\tif (hasOnAttack(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(boardEntity, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tisSelfAttacking: attacker === boardEntity,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t\tconst enchantments = boardEntity.enchantments;\r\n\t\t\tfor (const enchantment of enchantments) {\r\n\t\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\t\tif (hasOnAttack(onAttackImpl)) {\r\n\t\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(enchantment, {\r\n\t\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\t\tisSelfAttacking: attacker === boardEntity,\r\n\t\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Damage happens before the entity is buffed, e.g. before an attack buff from Roaring Rallier\r\n\t\tif (\r\n\t\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017 ||\r\n\t\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017_G\r\n\t\t) {\r\n\t\t\tconst neighbours = getNeighbours(defendingBoard, defendingEntity);\r\n\t\t\tconst targets =\r\n\t\t\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017_G ? neighbours : [pickRandom(neighbours)];\r\n\t\t\t[defendingEntity, ...targets].forEach((target) => {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t);\r\n\t\t\t\t// damageDoneByAttacker +=\r\n\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\tattacker.attack,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Roaring Rallier\r\n\t\tif (hasCorrectTribe(attacker, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tattackingBoard\r\n\t\t\t\t.filter(\r\n\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\te.cardId === CardIds.RoaringRallier_BG29_816 || e.cardId === CardIds.RoaringRallier_BG29_816_G,\r\n\t\t\t\t)\r\n\t\t\t\t.forEach((rallier) => {\r\n\t\t\t\t\tif (rallier !== attacker) {\r\n\t\t\t\t\t\tconst stats = rallier.cardId === CardIds.RoaringRallier_BG29_816_G ? 2 : 1;\r\n\t\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\t\trallier,\r\n\t\t\t\t\t\t\t3 * stats,\r\n\t\t\t\t\t\t\t1 * stats,\r\n\t\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\t// if (attacker.cardId === CardIds.GlyphGuardian_BGS_045) {\r\n\t\t// \t// For now the utility method only works additively, so we hack around it\r\n\t\t// \tmodifyStats(\r\n\t\t// \t\tattacker,\r\n\t\t// \t\tnull,\r\n\t\t// \t\t2 * attacker.attack - attacker.attack,\r\n\t\t// \t\t0,\r\n\t\t// \t\tattackingBoard,\r\n\t\t// \t\tattackingBoardHero,\r\n\t\t// \t\tgameState,\r\n\t\t// \t);\r\n\t\t// } else if (attacker.cardId === CardIds.GlyphGuardian_TB_BaconUps_115) {\r\n\t\t// \tmodifyStats(\r\n\t\t// \t\tattacker,\r\n\t\t// \t\tnull,\r\n\t\t// \t\t3 * attacker.attack - attacker.attack,\r\n\t\t// \t\t0,\r\n\t\t// \t\tattackingBoard,\r\n\t\t// \t\tattackingBoardHero,\r\n\t\t// \t\tgameState,\r\n\t\t// \t);\r\n\t\t// } else\r\n\t\tif (attacker.cardId === CardIds.GlimGuardian_BG29_888 || attacker.cardId === CardIds.GlimGuardian_BG29_888_G) {\r\n\t\t\tconst multiplier = attacker.cardId === CardIds.GlimGuardian_BG29_888_G ? 2 : 1;\r\n\t\t\tmodifyStats(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t} else if (\r\n\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708 ||\r\n\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G\r\n\t\t) {\r\n\t\t\tattackingBoard\r\n\t\t\t\t.filter((e) =>\r\n\t\t\t\t\thasCorrectTribe(e, attackingBoardHero, Race.PIRATE, gameState.anomalies, gameState.allCards),\r\n\t\t\t\t)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\te,\r\n\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\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} else if (\r\n\t\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635 ||\r\n\t\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G\r\n\t\t) {\r\n\t\t\tconst numberOfCardsToAdd = attacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G ? 2 : 1;\r\n\t\t\tconst cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);\r\n\t\t\taddCardsInHand(attackingBoardHero, attackingBoard, cardsToAdd, gameState);\r\n\t\t} else if (attacker.cardId === CardIds.Rampager_BG29_809 || attacker.cardId === CardIds.Rampager_BG29_809_G) {\r\n\t\t\tconst loops = attacker.cardId === CardIds.Rampager_BG29_809_G ? 2 : 1;\r\n\t\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\t\t// Don't include new spawns\r\n\t\t\t\tfor (const entity of [...attackingBoard]) {\r\n\t\t\t\t\tif (entity.entityId === attacker.entityId) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst isSameSide = entity.friendly === attacker.friendly;\r\n\t\t\t\t\tconst board = isSameSide ? attackingBoard : defendingBoard;\r\n\t\t\t\t\tconst hero = isSameSide ? attackingBoardHero : defendingBoardHero;\r\n\t\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\thero,\r\n\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\t1,\r\n\t\t\t\t\t\tisSameSide ? defendingBoard : attackingBoard,\r\n\t\t\t\t\t\tisSameSide ? defendingBoardHero : attackingBoardHero,\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}\r\n\t\t} else if (\r\n\t\t\tattacker.cardId === CardIds.HatefulHag_BG29_120 ||\r\n\t\t\tattacker.cardId === CardIds.HatefulHag_BG29_120_G\r\n\t\t) {\r\n\t\t\tconst loops = attacker.cardId === CardIds.HatefulHag_BG29_120_G ? 2 : 1;\r\n\t\t\tconst attackerIndex = attackingBoard.indexOf(attacker);\r\n\t\t\tfor (let i = 1; i <= loops; i++) {\r\n\t\t\t\tconst target = attackingBoard[attackerIndex + i];\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tupdateReborn(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst eclipsion = attackingBoard.find(\r\n\t\t(e) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t].includes(e.cardId as CardIds) && e.abiityChargesLeft > 0,\r\n\t);\r\n\t// Only once per minion\r\n\tif (!!eclipsion && attacker.immuneWhenAttackCharges == null) {\r\n\t\tattacker.immuneWhenAttackCharges = 1;\r\n\t\t// If we have 2 eclipsions, the first minion that attacks eats both charges\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\te.abiityChargesLeft--;\r\n\t\t\t});\r\n\t}\r\n\r\n\tfor (const trinket of attackingBoardHero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.CeremonialSword_BG30_MagicItem_925:\r\n\t\t\t\tmodifyStats(attacker, trinket, 4, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\nexport interface OnAttackInput {\r\n\tattacker: BoardEntity;\r\n\tisSelfAttacking: boolean;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"on-attack.js","sourceRoot":"","sources":["../../src/simulation/on-attack.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnWheneverAnotherMinionAttacks, hasRally } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateReborn } from '../keywords/reborn';\r\nimport { pickRandom } from '../services/utils';\r\nimport { hasCorrectTribe } from '../utils';\r\nimport { dealDamageToMinion, getNeighbours } from './attack';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\n// Whenever it attacks\r\nexport const applyOnAttackEffects = (\r\n\tattacker: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\tfor (const trinket of attackingBoardHero.trinkets ?? []) {\r\n\t\tconst onAttackImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnWheneverAnotherMinionAttacks(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(trinket, {\r\n\t\t\t\tattacker: attacker,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t}\r\n\r\n\t// \"Whenever friendly minion attacks\" triggers before the rally itself?\r\n\t// https://replays.firestoneapp.com/?reviewId=04e6a624-ccd5-4068-9420-884843f3685f&turn=25&action=1\r\n\tconst attackingBoardOtherEntities = attackingBoard.filter((e) => e !== attacker);\r\n\tfor (const boardEntity of attackingBoardOtherEntities) {\r\n\t\tconst onAttackImpl = cardMappings[boardEntity.cardId];\r\n\t\tif (hasOnWheneverAnotherMinionAttacks(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(boardEntity, {\r\n\t\t\t\tattacker: attacker,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tconst enchantments = boardEntity.enchantments;\r\n\t\tfor (const enchantment of enchantments) {\r\n\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasOnWheneverAnotherMinionAttacks(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(\r\n\t\t\t\t\tenchantment,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// This assumes that only \"Rally\" effects trigger on attack\r\n\t// 2025-08-20: this is false. \"Whenever a friendly minion attacks\" is not a rally effect\r\n\tconst rallyLoops =\r\n\t\t1 +\r\n\t\t(attackingBoardHero.questRewardEntities?.filter((r) => r.cardId === CardIds.RallyingCry_BG33_Reward_021)\r\n\t\t\t.length ?? 0);\r\n\tfor (let i = 0; i < rallyLoops; i++) {\r\n\t\tconst onAttackImpl = cardMappings[attacker.cardId];\r\n\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(attacker, {\r\n\t\t\t\tattacker: attacker,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tconst enchantments = attacker.enchantments;\r\n\t\tfor (const enchantment of enchantments) {\r\n\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(enchantment, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Damage happens before the entity is buffed, e.g. before an attack buff from Roaring Rallier\r\n\tif (\r\n\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017 ||\r\n\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017_G\r\n\t) {\r\n\t\tconst neighbours = getNeighbours(defendingBoard, defendingEntity);\r\n\t\tconst targets = attacker.cardId === CardIds.ObsidianRavager_BG27_017_G ? neighbours : [pickRandom(neighbours)];\r\n\t\t[defendingEntity, ...targets].forEach((target) => {\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tattacker,\r\n\t\t\t\ttarget,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t);\r\n\t\t\t// damageDoneByAttacker +=\r\n\t\t\tdealDamageToMinion(\r\n\t\t\t\ttarget,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattacker,\r\n\t\t\t\tattacker.attack,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\r\n\t// Roaring Rallier\r\n\tif (hasCorrectTribe(attacker, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t\tattackingBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) => e.cardId === CardIds.RoaringRallier_BG29_816 || e.cardId === CardIds.RoaringRallier_BG29_816_G,\r\n\t\t\t)\r\n\t\t\t.forEach((rallier) => {\r\n\t\t\t\tif (rallier !== attacker) {\r\n\t\t\t\t\tconst stats = rallier.cardId === CardIds.RoaringRallier_BG29_816_G ? 2 : 1;\r\n\t\t\t\t\tmodifyStats(attacker, rallier, 3 * stats, 1 * stats, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n\r\n\t// if (attacker.cardId === CardIds.GlyphGuardian_BGS_045) {\r\n\t// \t// For now the utility method only works additively, so we hack around it\r\n\t// \tmodifyStats(\r\n\t// \t\tattacker,\r\n\t// \t\tnull,\r\n\t// \t\t2 * attacker.attack - attacker.attack,\r\n\t// \t\t0,\r\n\t// \t\tattackingBoard,\r\n\t// \t\tattackingBoardHero,\r\n\t// \t\tgameState,\r\n\t// \t);\r\n\t// } else if (attacker.cardId === CardIds.GlyphGuardian_TB_BaconUps_115) {\r\n\t// \tmodifyStats(\r\n\t// \t\tattacker,\r\n\t// \t\tnull,\r\n\t// \t\t3 * attacker.attack - attacker.attack,\r\n\t// \t\t0,\r\n\t// \t\tattackingBoard,\r\n\t// \t\tattackingBoardHero,\r\n\t// \t\tgameState,\r\n\t// \t);\r\n\t// } else\r\n\tif (attacker.cardId === CardIds.GlimGuardian_BG29_888 || attacker.cardId === CardIds.GlimGuardian_BG29_888_G) {\r\n\t\tconst multiplier = attacker.cardId === CardIds.GlimGuardian_BG29_888_G ? 2 : 1;\r\n\t\tmodifyStats(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t} else if (\r\n\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708 ||\r\n\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G\r\n\t) {\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) => hasCorrectTribe(e, attackingBoardHero, Race.PIRATE, gameState.anomalies, gameState.allCards))\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyStats(\r\n\t\t\t\t\te,\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t} else if (\r\n\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635 ||\r\n\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G\r\n\t) {\r\n\t\tconst numberOfCardsToAdd = attacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);\r\n\t\taddCardsInHand(attackingBoardHero, attackingBoard, cardsToAdd, gameState);\r\n\t} else if (attacker.cardId === CardIds.Rampager_BG29_809 || attacker.cardId === CardIds.Rampager_BG29_809_G) {\r\n\t\tconst loops = attacker.cardId === CardIds.Rampager_BG29_809_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\t// Don't include new spawns\r\n\t\t\tfor (const entity of [...attackingBoard]) {\r\n\t\t\t\tif (entity.entityId === attacker.entityId) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tconst isSameSide = entity.friendly === attacker.friendly;\r\n\t\t\t\tconst board = isSameSide ? attackingBoard : defendingBoard;\r\n\t\t\t\tconst hero = isSameSide ? attackingBoardHero : defendingBoardHero;\r\n\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tboard,\r\n\t\t\t\t\thero,\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tisSameSide ? defendingBoard : attackingBoard,\r\n\t\t\t\t\tisSameSide ? defendingBoardHero : attackingBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (attacker.cardId === CardIds.HatefulHag_BG29_120 || attacker.cardId === CardIds.HatefulHag_BG29_120_G) {\r\n\t\tconst loops = attacker.cardId === CardIds.HatefulHag_BG29_120_G ? 2 : 1;\r\n\t\tconst attackerIndex = attackingBoard.indexOf(attacker);\r\n\t\tfor (let i = 1; i <= loops; i++) {\r\n\t\t\tconst target = attackingBoard[attackerIndex + i];\r\n\t\t\tif (!!target) {\r\n\t\t\t\tupdateReborn(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst eclipsion = attackingBoard.find(\r\n\t\t(e) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t].includes(e.cardId as CardIds) && e.abiityChargesLeft > 0,\r\n\t);\r\n\t// Only once per minion\r\n\tif (!!eclipsion && attacker.immuneWhenAttackCharges == null) {\r\n\t\tattacker.immuneWhenAttackCharges = 1;\r\n\t\t// If we have 2 eclipsions, the first minion that attacks eats both charges\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\te.abiityChargesLeft--;\r\n\t\t\t});\r\n\t}\r\n\r\n\tfor (const trinket of attackingBoardHero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.CeremonialSword_BG30_MagicItem_925:\r\n\t\t\t\tmodifyStats(attacker, trinket, 4, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\nexport interface OnAttackInput {\r\n\tattacker: BoardEntity;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
@@ -95,7 +95,7 @@ const handleRebornForEntity = (boardWithKilledMinion, boardWithKilledMinionHero,
95
95
  .filter((e) => e.cardId === "BG25_005" || e.cardId === "BG25_005_G")
96
96
  .forEach((e) => {
97
97
  const multiplier = e.cardId === "BG25_005_G" ? 2 : 1;
98
- (0, stats_1.modifyStats)(e, e, multiplier * 1, multiplier * 2, boardWithKilledMinion, boardWithKilledMinionHero, gameState);
98
+ (0, stats_1.modifyStats)(e, e, multiplier * 2, multiplier * 3, boardWithKilledMinion, boardWithKilledMinionHero, gameState);
99
99
  });
100
100
  }
101
101
  };
@@ -1 +1 @@
1
- {"version":3,"file":"reborn.js","sourceRoot":"","sources":["../../src/simulation/reborn.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasRebornEffect, hasRebornSelfEffect } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\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 { modifyStats } from './stats';\r\n\r\nexport const handleRebornForEntity = (\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadMinionIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst numberOfReborns = 1;\r\n\tlet entityToSpawn: BoardEntity = null;\r\n\tif (\r\n\t\tdeadEntity.cardId === CardIds.SinrunnerBlanchy_BG24_005 ||\r\n\t\tdeadEntity.cardId === CardIds.SinrunnerBlanchy_BG24_005_G\r\n\t) {\r\n\t\tentityToSpawn = {\r\n\t\t\t...deadEntity,\r\n\t\t\thasAttacked: 0,\r\n\t\t\thealth: deadEntity.maxHealth,\r\n\t\t\tdivineShield: deadEntity.hadDivineShield,\r\n\t\t\treborn: false,\r\n\t\t};\r\n\t}\r\n\tconst entitiesFromReborn: readonly BoardEntity[] =\r\n\t\tdeadEntity.reborn && deadMinionIndexFromRight >= 0\r\n\t\t\t? spawnEntities(\r\n\t\t\t\t\tdeadEntity.cardId,\r\n\t\t\t\t\tnumberOfReborns,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\topponentBoard,\r\n\t\t\t\t\topponentBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tdeadEntity.friendly,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tentityToSpawn,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t )\r\n\t\t\t: [];\r\n\tif (!entitiesFromReborn.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (\r\n\t\tdeadEntity.cardId === CardIds.WannabeGargoyle_BG30_109 ||\r\n\t\tdeadEntity.cardId === CardIds.WannabeGargoyle_BG30_109_G\r\n\t) {\r\n\t\tentitiesFromReborn.forEach((e) => {\r\n\t\t\tconst attack = deadEntity.maxAttack;\r\n\t\t\tconst health = deadEntity.cardId === CardIds.WannabeGargoyle_BG30_109_G ? deadEntity.maxHealth : 1;\r\n\t\t\te.attack = attack;\r\n\t\t\te.health = health;\r\n\t\t});\r\n\t}\r\n\r\n\tfor (const entity of entitiesFromReborn) {\r\n\t\tconst rebornImpl = cardMappings[entity.cardId];\r\n\t\tif (hasRebornSelfEffect(rebornImpl)) {\r\n\t\t\trebornImpl.rebornSelfEffect(entity, {\r\n\t\t\t\trebornEntity: deadEntity,\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const entity of boardWithKilledMinion) {\r\n\t\tconst rebornImpl = cardMappings[entity.cardId];\r\n\t\tif (hasRebornEffect(rebornImpl)) {\r\n\t\t\trebornImpl.rebornEffect(entity, {\r\n\t\t\t\trebornEntity: deadEntity,\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst entitiesThatWereReborn = performEntitySpawns(\r\n\t\tentitiesFromReborn,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tentitiesThatWereReborn.forEach((e) => (e.rebornFromEntityId = deadEntity.entityId));\r\n\tconst entityRightToSpawns =\r\n\t\tdeadMinionIndexFromRight === 0\r\n\t\t\t? null\r\n\t\t\t: boardWithKilledMinion[boardWithKilledMinion.length - deadMinionIndexFromRight];\r\n\tentitiesThatWereReborn.forEach((entity) => {\r\n\t\tentity.hasAttacked = deadEntity.hasAttacked > 1 ? 1 : entityRightToSpawns?.hasAttacked ?? 0;\r\n\t});\r\n\r\n\t// Arfus\r\n\tboardWithKilledMinion\r\n\t\t.filter(\r\n\t\t\t(e) =>\r\n\t\t\t\te.cardId === CardIds.Arfus_TB_BaconShop_HERO_22_Buddy ||\r\n\t\t\t\te.cardId === CardIds.Arfus_TB_BaconShop_HERO_22_Buddy_G,\r\n\t\t)\r\n\t\t.forEach((arfus) => {\r\n\t\t\tconst multiplier = arfus.cardId === CardIds.Arfus_TB_BaconShop_HERO_22_Buddy_G ? 2 : 1;\r\n\t\t\tconst attackBonus = arfus.attack * multiplier;\r\n\t\t\tentitiesThatWereReborn\r\n\t\t\t\t.filter((e) => e.entityId !== arfus.entityId && e.rebornFromEntityId !== arfus.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tmodifyStats(e, arfus, attackBonus, 0, boardWithKilledMinion, boardWithKilledMinionHero, gameState);\r\n\t\t\t\t});\r\n\t\t});\r\n\r\n\tconst numberOfTriggersForDeathwhisper = Math.min(entitiesThatWereReborn.length, 1);\r\n\tfor (let i = 0; i < numberOfTriggersForDeathwhisper; i++) {\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.SisterDeathwhisper_BG25_020 ||\r\n\t\t\t\t\te.cardId === CardIds.SisterDeathwhisper_BG25_020_G,\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.SisterDeathwhisper_BG25_020_G ? 2 : 1;\r\n\t\t\t\taddStatsToBoard(\r\n\t\t\t\t\te,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\tmultiplier * 1,\r\n\t\t\t\t\tmultiplier * 3,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter((e) => e.cardId === CardIds.JellyBelly_BG25_005 || e.cardId === CardIds.JellyBelly_BG25_005_G)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.JellyBelly_BG25_005_G ? 2 : 1;\r\n\t\t\t\tmodifyStats(\r\n\t\t\t\t\te,\r\n\t\t\t\t\te,\r\n\t\t\t\t\tmultiplier * 1,\r\n\t\t\t\t\tmultiplier * 2,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\nexport interface RebornEffectInput {\r\n\treadonly rebornEntity: BoardEntity;\r\n\treadonly boardWithKilledMinion: BoardEntity[];\r\n\treadonly boardWithKilledMinionHero: BgsPlayerEntity;\r\n\treadonly opponentBoard: BoardEntity[];\r\n\treadonly opponentBoardHero: BgsPlayerEntity;\r\n\treadonly gameState: FullGameState;\r\n}\r\n"]}
1
+ {"version":3,"file":"reborn.js","sourceRoot":"","sources":["../../src/simulation/reborn.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasRebornEffect, hasRebornSelfEffect } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\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 { modifyStats } from './stats';\r\n\r\nexport const handleRebornForEntity = (\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadMinionIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst numberOfReborns = 1;\r\n\tlet entityToSpawn: BoardEntity = null;\r\n\tif (\r\n\t\tdeadEntity.cardId === CardIds.SinrunnerBlanchy_BG24_005 ||\r\n\t\tdeadEntity.cardId === CardIds.SinrunnerBlanchy_BG24_005_G\r\n\t) {\r\n\t\tentityToSpawn = {\r\n\t\t\t...deadEntity,\r\n\t\t\thasAttacked: 0,\r\n\t\t\thealth: deadEntity.maxHealth,\r\n\t\t\tdivineShield: deadEntity.hadDivineShield,\r\n\t\t\treborn: false,\r\n\t\t};\r\n\t}\r\n\tconst entitiesFromReborn: readonly BoardEntity[] =\r\n\t\tdeadEntity.reborn && deadMinionIndexFromRight >= 0\r\n\t\t\t? spawnEntities(\r\n\t\t\t\t\tdeadEntity.cardId,\r\n\t\t\t\t\tnumberOfReborns,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\topponentBoard,\r\n\t\t\t\t\topponentBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tdeadEntity.friendly,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tentityToSpawn,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t )\r\n\t\t\t: [];\r\n\tif (!entitiesFromReborn.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (\r\n\t\tdeadEntity.cardId === CardIds.WannabeGargoyle_BG30_109 ||\r\n\t\tdeadEntity.cardId === CardIds.WannabeGargoyle_BG30_109_G\r\n\t) {\r\n\t\tentitiesFromReborn.forEach((e) => {\r\n\t\t\tconst attack = deadEntity.maxAttack;\r\n\t\t\tconst health = deadEntity.cardId === CardIds.WannabeGargoyle_BG30_109_G ? deadEntity.maxHealth : 1;\r\n\t\t\te.attack = attack;\r\n\t\t\te.health = health;\r\n\t\t});\r\n\t}\r\n\r\n\tfor (const entity of entitiesFromReborn) {\r\n\t\tconst rebornImpl = cardMappings[entity.cardId];\r\n\t\tif (hasRebornSelfEffect(rebornImpl)) {\r\n\t\t\trebornImpl.rebornSelfEffect(entity, {\r\n\t\t\t\trebornEntity: deadEntity,\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const entity of boardWithKilledMinion) {\r\n\t\tconst rebornImpl = cardMappings[entity.cardId];\r\n\t\tif (hasRebornEffect(rebornImpl)) {\r\n\t\t\trebornImpl.rebornEffect(entity, {\r\n\t\t\t\trebornEntity: deadEntity,\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst entitiesThatWereReborn = performEntitySpawns(\r\n\t\tentitiesFromReborn,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tentitiesThatWereReborn.forEach((e) => (e.rebornFromEntityId = deadEntity.entityId));\r\n\tconst entityRightToSpawns =\r\n\t\tdeadMinionIndexFromRight === 0\r\n\t\t\t? null\r\n\t\t\t: boardWithKilledMinion[boardWithKilledMinion.length - deadMinionIndexFromRight];\r\n\tentitiesThatWereReborn.forEach((entity) => {\r\n\t\tentity.hasAttacked = deadEntity.hasAttacked > 1 ? 1 : entityRightToSpawns?.hasAttacked ?? 0;\r\n\t});\r\n\r\n\t// Arfus\r\n\tboardWithKilledMinion\r\n\t\t.filter(\r\n\t\t\t(e) =>\r\n\t\t\t\te.cardId === CardIds.Arfus_TB_BaconShop_HERO_22_Buddy ||\r\n\t\t\t\te.cardId === CardIds.Arfus_TB_BaconShop_HERO_22_Buddy_G,\r\n\t\t)\r\n\t\t.forEach((arfus) => {\r\n\t\t\tconst multiplier = arfus.cardId === CardIds.Arfus_TB_BaconShop_HERO_22_Buddy_G ? 2 : 1;\r\n\t\t\tconst attackBonus = arfus.attack * multiplier;\r\n\t\t\tentitiesThatWereReborn\r\n\t\t\t\t.filter((e) => e.entityId !== arfus.entityId && e.rebornFromEntityId !== arfus.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tmodifyStats(e, arfus, attackBonus, 0, boardWithKilledMinion, boardWithKilledMinionHero, gameState);\r\n\t\t\t\t});\r\n\t\t});\r\n\r\n\tconst numberOfTriggersForDeathwhisper = Math.min(entitiesThatWereReborn.length, 1);\r\n\tfor (let i = 0; i < numberOfTriggersForDeathwhisper; i++) {\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.SisterDeathwhisper_BG25_020 ||\r\n\t\t\t\t\te.cardId === CardIds.SisterDeathwhisper_BG25_020_G,\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.SisterDeathwhisper_BG25_020_G ? 2 : 1;\r\n\t\t\t\taddStatsToBoard(\r\n\t\t\t\t\te,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\tmultiplier * 1,\r\n\t\t\t\t\tmultiplier * 3,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter((e) => e.cardId === CardIds.JellyBelly_BG25_005 || e.cardId === CardIds.JellyBelly_BG25_005_G)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.JellyBelly_BG25_005_G ? 2 : 1;\r\n\t\t\t\tmodifyStats(\r\n\t\t\t\t\te,\r\n\t\t\t\t\te,\r\n\t\t\t\t\tmultiplier * 2,\r\n\t\t\t\t\tmultiplier * 3,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\nexport interface RebornEffectInput {\r\n\treadonly rebornEntity: BoardEntity;\r\n\treadonly boardWithKilledMinion: BoardEntity[];\r\n\treadonly boardWithKilledMinionHero: BgsPlayerEntity;\r\n\treadonly opponentBoard: BoardEntity[];\r\n\treadonly opponentBoardHero: BgsPlayerEntity;\r\n\treadonly gameState: FullGameState;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firestone-hs/simulate-bgs-battle",
3
- "version": "1.1.617",
3
+ "version": "1.1.619",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "lint": "eslint --color --fix --ext .ts .",