@robsonbittencourt/calc 0.10.0

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 (144) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +12 -0
  3. package/bundle +107 -0
  4. package/dist/adaptable.d.ts +6 -0
  5. package/dist/adaptable.js +28 -0
  6. package/dist/adaptable.js.map +1 -0
  7. package/dist/calc.d.ts +6 -0
  8. package/dist/calc.js +26 -0
  9. package/dist/calc.js.map +1 -0
  10. package/dist/data/abilities.d.ts +15 -0
  11. package/dist/data/abilities.js +448 -0
  12. package/dist/data/abilities.js.map +1 -0
  13. package/dist/data/index.d.ts +2 -0
  14. package/dist/data/index.js +30 -0
  15. package/dist/data/index.js.map +1 -0
  16. package/dist/data/interface.d.ts +150 -0
  17. package/dist/data/interface.js +3 -0
  18. package/dist/data/interface.js.map +1 -0
  19. package/dist/data/items.d.ts +24 -0
  20. package/dist/data/items.js +708 -0
  21. package/dist/data/items.js.map +1 -0
  22. package/dist/data/moves.d.ts +86 -0
  23. package/dist/data/moves.js +5014 -0
  24. package/dist/data/moves.js.map +1 -0
  25. package/dist/data/natures.d.ts +17 -0
  26. package/dist/data/natures.js +127 -0
  27. package/dist/data/natures.js.map +1 -0
  28. package/dist/data/production.min.js +1 -0
  29. package/dist/data/species.d.ts +48 -0
  30. package/dist/data/species.js +10126 -0
  31. package/dist/data/species.js.map +1 -0
  32. package/dist/data/types.d.ts +23 -0
  33. package/dist/data/types.js +538 -0
  34. package/dist/data/types.js.map +1 -0
  35. package/dist/desc.d.ts +65 -0
  36. package/dist/desc.js +866 -0
  37. package/dist/desc.js.map +1 -0
  38. package/dist/field.d.ts +49 -0
  39. package/dist/field.js +111 -0
  40. package/dist/field.js.map +1 -0
  41. package/dist/index.d.ts +44 -0
  42. package/dist/index.js +99 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/items.d.ts +13 -0
  45. package/dist/items.js +434 -0
  46. package/dist/items.js.map +1 -0
  47. package/dist/mechanics/gen12.d.ts +6 -0
  48. package/dist/mechanics/gen12.js +271 -0
  49. package/dist/mechanics/gen12.js.map +1 -0
  50. package/dist/mechanics/gen3.d.ts +11 -0
  51. package/dist/mechanics/gen3.js +371 -0
  52. package/dist/mechanics/gen3.js.map +1 -0
  53. package/dist/mechanics/gen4.d.ts +11 -0
  54. package/dist/mechanics/gen4.js +596 -0
  55. package/dist/mechanics/gen4.js.map +1 -0
  56. package/dist/mechanics/gen56.d.ts +13 -0
  57. package/dist/mechanics/gen56.js +836 -0
  58. package/dist/mechanics/gen56.js.map +1 -0
  59. package/dist/mechanics/gen789.d.ts +14 -0
  60. package/dist/mechanics/gen789.js +1325 -0
  61. package/dist/mechanics/gen789.js.map +1 -0
  62. package/dist/mechanics/util.d.ts +39 -0
  63. package/dist/mechanics/util.js +675 -0
  64. package/dist/mechanics/util.js.map +1 -0
  65. package/dist/move.d.ts +50 -0
  66. package/dist/move.js +324 -0
  67. package/dist/move.js.map +1 -0
  68. package/dist/pokemon.d.ts +55 -0
  69. package/dist/pokemon.js +240 -0
  70. package/dist/pokemon.js.map +1 -0
  71. package/dist/production.min.js +1 -0
  72. package/dist/result.d.ts +34 -0
  73. package/dist/result.js +94 -0
  74. package/dist/result.js.map +1 -0
  75. package/dist/state.d.ts +77 -0
  76. package/dist/state.js +3 -0
  77. package/dist/state.js.map +1 -0
  78. package/dist/stats.d.ts +26 -0
  79. package/dist/stats.js +183 -0
  80. package/dist/stats.js.map +1 -0
  81. package/dist/test/calc.test.d.ts +1 -0
  82. package/dist/test/calc.test.js +1297 -0
  83. package/dist/test/calc.test.js.map +1 -0
  84. package/dist/test/data.test.d.ts +1 -0
  85. package/dist/test/data.test.js +368 -0
  86. package/dist/test/data.test.js.map +1 -0
  87. package/dist/test/gen.d.ts +135 -0
  88. package/dist/test/gen.js +636 -0
  89. package/dist/test/gen.js.map +1 -0
  90. package/dist/test/helper.d.ts +55 -0
  91. package/dist/test/helper.js +174 -0
  92. package/dist/test/helper.js.map +1 -0
  93. package/dist/test/move.test.d.ts +1 -0
  94. package/dist/test/move.test.js +14 -0
  95. package/dist/test/move.test.js.map +1 -0
  96. package/dist/test/pokemon.test.d.ts +1 -0
  97. package/dist/test/pokemon.test.js +102 -0
  98. package/dist/test/pokemon.test.js.map +1 -0
  99. package/dist/test/stats.test.d.ts +1 -0
  100. package/dist/test/stats.test.js +64 -0
  101. package/dist/test/stats.test.js.map +1 -0
  102. package/dist/test/utils.test.d.ts +1 -0
  103. package/dist/test/utils.test.js +19 -0
  104. package/dist/test/utils.test.js.map +1 -0
  105. package/dist/util.d.ts +17 -0
  106. package/dist/util.js +115 -0
  107. package/dist/util.js.map +1 -0
  108. package/jest.config.js +11 -0
  109. package/package.json +40 -0
  110. package/src/adaptable.ts +12 -0
  111. package/src/calc.ts +40 -0
  112. package/src/data/abilities.ts +383 -0
  113. package/src/data/index.ts +36 -0
  114. package/src/data/interface.ts +176 -0
  115. package/src/data/items.ts +632 -0
  116. package/src/data/moves.ts +5028 -0
  117. package/src/data/natures.ts +65 -0
  118. package/src/data/species.ts +10098 -0
  119. package/src/data/types.ts +478 -0
  120. package/src/desc.ts +1063 -0
  121. package/src/field.ts +124 -0
  122. package/src/index.ts +156 -0
  123. package/src/items.ts +423 -0
  124. package/src/mechanics/gen12.ts +297 -0
  125. package/src/mechanics/gen3.ts +444 -0
  126. package/src/mechanics/gen4.ts +702 -0
  127. package/src/mechanics/gen56.ts +1134 -0
  128. package/src/mechanics/gen789.ts +1788 -0
  129. package/src/mechanics/util.ts +676 -0
  130. package/src/move.ts +337 -0
  131. package/src/pokemon.ts +244 -0
  132. package/src/result.ts +106 -0
  133. package/src/state.ts +81 -0
  134. package/src/stats.ts +213 -0
  135. package/src/test/calc.test.ts +1588 -0
  136. package/src/test/data.test.ts +129 -0
  137. package/src/test/gen.ts +514 -0
  138. package/src/test/helper.ts +185 -0
  139. package/src/test/move.test.ts +13 -0
  140. package/src/test/pokemon.test.ts +121 -0
  141. package/src/test/stats.test.ts +84 -0
  142. package/src/test/utils.test.ts +18 -0
  143. package/src/util.ts +153 -0
  144. package/tsconfig.json +10 -0
@@ -0,0 +1,836 @@
1
+ "use strict";
2
+ exports.__esModule = true;
3
+ exports.calculateDfModsBWXY = exports.calculateDefenseBWXY = exports.calculateAtModsBWXY = exports.calculateAttackBWXY = exports.calculateBPModsBWXY = exports.calculateBasePowerBWXY = exports.calculateBWXY = void 0;
4
+ var util_1 = require("../util");
5
+ var items_1 = require("../items");
6
+ var result_1 = require("../result");
7
+ var util_2 = require("./util");
8
+ function calculateBWXY(gen, attacker, defender, move, field) {
9
+ var _a;
10
+ (0, util_2.checkAirLock)(attacker, field);
11
+ (0, util_2.checkAirLock)(defender, field);
12
+ (0, util_2.checkForecast)(attacker, field.weather);
13
+ (0, util_2.checkForecast)(defender, field.weather);
14
+ (0, util_2.checkItem)(attacker, field.isMagicRoom);
15
+ (0, util_2.checkItem)(defender, field.isMagicRoom);
16
+ (0, util_2.checkWonderRoom)(attacker, field.isWonderRoom);
17
+ (0, util_2.checkWonderRoom)(defender, field.isWonderRoom);
18
+ (0, util_2.checkSeedBoost)(attacker, field);
19
+ (0, util_2.checkSeedBoost)(defender, field);
20
+ (0, util_2.computeFinalStats)(gen, attacker, defender, field, 'def', 'spd', 'spe');
21
+ (0, util_2.checkIntimidate)(gen, attacker, defender);
22
+ (0, util_2.checkIntimidate)(gen, defender, attacker);
23
+ (0, util_2.checkDownload)(attacker, defender, field.isWonderRoom);
24
+ (0, util_2.checkDownload)(defender, attacker, field.isWonderRoom);
25
+ (0, util_2.computeFinalStats)(gen, attacker, defender, field, 'atk', 'spa');
26
+ (0, util_2.checkInfiltrator)(attacker, field.defenderSide);
27
+ (0, util_2.checkInfiltrator)(defender, field.attackerSide);
28
+ var desc = {
29
+ attackerName: attacker.name,
30
+ moveName: move.name,
31
+ defenderName: defender.name,
32
+ isWonderRoom: field.isWonderRoom
33
+ };
34
+ var result = new result_1.Result(gen, attacker, defender, move, field, 0, desc);
35
+ if (move.category === 'Status' && !move.named('Nature Power')) {
36
+ return result;
37
+ }
38
+ if (field.defenderSide.isProtected && !move.breaksProtect) {
39
+ desc.isProtected = true;
40
+ return result;
41
+ }
42
+ if (move.name === 'Pain Split') {
43
+ var average = Math.floor((attacker.curHP() + defender.curHP()) / 2);
44
+ var damage_1 = Math.max(0, defender.curHP() - average);
45
+ result.damage = damage_1;
46
+ return result;
47
+ }
48
+ var defenderAbilityIgnored = defender.hasAbility('Aroma Veil', 'Aura Break', 'Battle Armor', 'Big Pecks', 'Bulletproof', 'Clear Body', 'Contrary', 'Damp', 'Dark Aura', 'Dry Skin', 'Fairy Aura', 'Filter', 'Flash Fire', 'Flower Gift', 'Flower Veil', 'Friend Guard', 'Fur Coat', 'Grass Pelt', 'Heatproof', 'Heavy Metal', 'Hyper Cutter', 'Immunity', 'Inner Focus', 'Insomnia', 'Keen Eye', 'Leaf Guard', 'Levitate', 'Light Metal', 'Lightning Rod', 'Limber', 'Magic Bounce', 'Magma Armor', 'Marvel Scale', 'Motor Drive', 'Multiscale', 'Oblivious', 'Overcoat', 'Own Tempo', 'Sand Veil', 'Sap Sipper', 'Shell Armor', 'Shield Dust', 'Simple', 'Snow Cloak', 'Solid Rock', 'Soundproof', 'Sticky Hold', 'Storm Drain', 'Sturdy', 'Suction Cups', 'Sweet Veil', 'Tangled Feet', 'Telepathy', 'Thick Fat', 'Unaware', 'Vital Spirit', 'Volt Absorb', 'Water Absorb', 'Water Veil', 'White Smoke', 'Wonder Guard', 'Wonder Skin');
49
+ if (attacker.hasAbility('Mold Breaker', 'Teravolt', 'Turboblaze') && defenderAbilityIgnored) {
50
+ defender.ability = '';
51
+ desc.attackerAbility = attacker.ability;
52
+ }
53
+ var isCritical = move.isCrit && !defender.hasAbility('Battle Armor', 'Shell Armor') && move.timesUsed === 1;
54
+ if (move.named('Weather Ball')) {
55
+ move.type =
56
+ field.hasWeather('Sun', 'Harsh Sunshine') ? 'Fire'
57
+ : field.hasWeather('Rain', 'Heavy Rain') ? 'Water'
58
+ : field.hasWeather('Sand') ? 'Rock'
59
+ : field.hasWeather('Hail') ? 'Ice'
60
+ : 'Normal';
61
+ desc.weather = field.weather;
62
+ desc.moveType = move.type;
63
+ }
64
+ else if (move.named('Judgment') && attacker.item && attacker.item.includes('Plate')) {
65
+ move.type = (0, items_1.getItemBoostType)(attacker.item);
66
+ }
67
+ else if (move.named('Techno Blast') && attacker.item && attacker.item.includes('Drive')) {
68
+ move.type = (0, items_1.getTechnoBlast)(attacker.item);
69
+ }
70
+ else if (move.named('Natural Gift') && ((_a = attacker.item) === null || _a === void 0 ? void 0 : _a.endsWith('Berry'))) {
71
+ var gift = (0, items_1.getNaturalGift)(gen, attacker.item);
72
+ move.type = gift.t;
73
+ move.bp = gift.p;
74
+ desc.attackerItem = attacker.item;
75
+ desc.moveBP = move.bp;
76
+ desc.moveType = move.type;
77
+ }
78
+ else if (move.named('Nature Power')) {
79
+ if (gen.num === 5) {
80
+ move.type = 'Ground';
81
+ }
82
+ else {
83
+ move.type =
84
+ field.hasTerrain('Electric') ? 'Electric'
85
+ : field.hasTerrain('Grassy') ? 'Grass'
86
+ : field.hasTerrain('Misty') ? 'Fairy'
87
+ : 'Normal';
88
+ }
89
+ }
90
+ else if (move.named('Brick Break')) {
91
+ field.defenderSide.isReflect = false;
92
+ field.defenderSide.isLightScreen = false;
93
+ }
94
+ var hasAteAbilityTypeChange = false;
95
+ var isAerilate = false;
96
+ var isPixilate = false;
97
+ var isRefrigerate = false;
98
+ var isNormalize = false;
99
+ var noTypeChange = move.named('Judgment', 'Nature Power', 'Techo Blast', 'Natural Gift', 'Weather Ball', 'Struggle');
100
+ if (!move.isZ && !noTypeChange) {
101
+ var normal = move.hasType('Normal');
102
+ if ((isAerilate = attacker.hasAbility('Aerilate') && normal)) {
103
+ move.type = 'Flying';
104
+ }
105
+ else if ((isPixilate = attacker.hasAbility('Pixilate') && normal)) {
106
+ move.type = 'Fairy';
107
+ }
108
+ else if ((isRefrigerate = attacker.hasAbility('Refrigerate') && normal)) {
109
+ move.type = 'Ice';
110
+ }
111
+ else if ((isNormalize = attacker.hasAbility('Normalize'))) {
112
+ move.type = 'Normal';
113
+ }
114
+ if (isPixilate || isRefrigerate || isAerilate || isNormalize) {
115
+ desc.attackerAbility = attacker.ability;
116
+ }
117
+ if (isPixilate || isRefrigerate || isAerilate) {
118
+ hasAteAbilityTypeChange = true;
119
+ }
120
+ }
121
+ if (attacker.hasAbility('Gale Wings') && move.hasType('Flying')) {
122
+ move.priority = 1;
123
+ desc.attackerAbility = attacker.ability;
124
+ }
125
+ var isGhostRevealed = attacker.hasAbility('Scrappy') || field.defenderSide.isForesight;
126
+ var isRingTarget = defender.hasItem('Ring Target') && !defender.hasAbility('Klutz');
127
+ var type1Effectiveness = (0, util_2.getMoveEffectiveness)(gen, move, defender.types[0], isGhostRevealed, field.isGravity, isRingTarget);
128
+ var type2Effectiveness = defender.types[1]
129
+ ? (0, util_2.getMoveEffectiveness)(gen, move, defender.types[1], isGhostRevealed, field.isGravity, isRingTarget)
130
+ : 1;
131
+ var typeEffectiveness = type1Effectiveness * type2Effectiveness;
132
+ if (typeEffectiveness === 0 && move.named('Thousand Arrows')) {
133
+ typeEffectiveness = 1;
134
+ }
135
+ else if (typeEffectiveness === 0 && move.hasType('Ground') &&
136
+ defender.hasItem('Iron Ball') && !defender.hasAbility('Klutz')) {
137
+ typeEffectiveness = 1;
138
+ }
139
+ if (typeEffectiveness === 0) {
140
+ return result;
141
+ }
142
+ if ((move.named('Sky Drop') &&
143
+ (defender.hasType('Flying') || defender.weightkg >= 200 || field.isGravity)) ||
144
+ (move.named('Synchronoise') && !defender.hasType(attacker.types[0]) &&
145
+ (!attacker.types[1] || !defender.hasType(attacker.types[1]))) ||
146
+ (move.named('Dream Eater') && !defender.hasStatus('slp'))) {
147
+ return result;
148
+ }
149
+ if ((field.hasWeather('Harsh Sunshine') && move.hasType('Water')) ||
150
+ (field.hasWeather('Heavy Rain') && move.hasType('Fire'))) {
151
+ desc.weather = field.weather;
152
+ return result;
153
+ }
154
+ if (field.hasWeather('Strong Winds') && defender.hasType('Flying') &&
155
+ gen.types.get((0, util_1.toID)(move.type)).effectiveness['Flying'] > 1) {
156
+ typeEffectiveness /= 2;
157
+ desc.weather = field.weather;
158
+ }
159
+ if ((defender.hasAbility('Wonder Guard') && typeEffectiveness <= 1) ||
160
+ (move.hasType('Grass') && defender.hasAbility('Sap Sipper')) ||
161
+ (move.hasType('Fire') && defender.hasAbility('Flash Fire')) ||
162
+ (move.hasType('Water') && defender.hasAbility('Dry Skin', 'Storm Drain', 'Water Absorb')) ||
163
+ (move.hasType('Electric') &&
164
+ defender.hasAbility('Lightning Rod', 'Motor Drive', 'Volt Absorb')) ||
165
+ (move.hasType('Ground') &&
166
+ !field.isGravity && !move.named('Thousand Arrows') &&
167
+ !defender.hasItem('Iron Ball') && defender.hasAbility('Levitate')) ||
168
+ (move.flags.bullet && defender.hasAbility('Bulletproof')) ||
169
+ (move.flags.sound && defender.hasAbility('Soundproof'))) {
170
+ desc.defenderAbility = defender.ability;
171
+ return result;
172
+ }
173
+ if (move.hasType('Ground') && !move.named('Thousand Arrows') &&
174
+ !field.isGravity && defender.hasItem('Air Balloon')) {
175
+ desc.defenderItem = defender.item;
176
+ return result;
177
+ }
178
+ if (move.priority > 0 && field.hasTerrain('Psychic') && (0, util_2.isGrounded)(defender, field)) {
179
+ desc.terrain = field.terrain;
180
+ return result;
181
+ }
182
+ desc.HPEVs = (0, util_2.getStatDescriptionText)(gen, defender, 'hp');
183
+ var fixedDamage = (0, util_2.handleFixedDamageMoves)(attacker, move);
184
+ if (fixedDamage) {
185
+ if (attacker.hasAbility('Parental Bond')) {
186
+ result.damage = [fixedDamage, fixedDamage];
187
+ desc.attackerAbility = attacker.ability;
188
+ }
189
+ else {
190
+ result.damage = fixedDamage;
191
+ }
192
+ return result;
193
+ }
194
+ if (move.named('Final Gambit')) {
195
+ result.damage = attacker.curHP();
196
+ return result;
197
+ }
198
+ if (move.hits > 1) {
199
+ desc.hits = move.hits;
200
+ }
201
+ var basePower = calculateBasePowerBWXY(gen, attacker, defender, move, field, hasAteAbilityTypeChange, desc);
202
+ if (basePower === 0) {
203
+ return result;
204
+ }
205
+ var attack = calculateAttackBWXY(gen, attacker, defender, move, field, desc, isCritical);
206
+ var attackStat = move.category === 'Special' ? 'spa' : 'atk';
207
+ var defense = calculateDefenseBWXY(gen, attacker, defender, move, field, desc, isCritical);
208
+ var baseDamage = calculateBaseDamageBWXY(gen, attacker, basePower, attack, defense, move, field, desc, isCritical);
209
+ var stabMod = (0, util_2.getStabMod)(attacker, move, desc);
210
+ var applyBurn = attacker.hasStatus('brn') &&
211
+ move.category === 'Physical' &&
212
+ !attacker.hasAbility('Guts') &&
213
+ !(move.named('Facade') && gen.num === 6);
214
+ desc.isBurned = applyBurn;
215
+ var finalMods = calculateFinalModsBWXY(gen, attacker, defender, move, field, desc, isCritical, typeEffectiveness);
216
+ var finalMod = (0, util_2.chainMods)(finalMods, 41, 131072);
217
+ var isSpread = field.gameType !== 'Singles' &&
218
+ ['allAdjacent', 'allAdjacentFoes'].includes(move.target);
219
+ var childDamage;
220
+ if (attacker.hasAbility('Parental Bond') && move.hits === 1 && !isSpread) {
221
+ var child = attacker.clone();
222
+ child.ability = 'Parental Bond (Child)';
223
+ (0, util_2.checkMultihitBoost)(gen, child, defender, move, field, desc);
224
+ childDamage = calculateBWXY(gen, child, defender, move, field).damage;
225
+ desc.attackerAbility = attacker.ability;
226
+ }
227
+ var damage = [];
228
+ for (var i = 0; i < 16; i++) {
229
+ damage[i] =
230
+ (0, util_2.getFinalDamage)(baseDamage, i, typeEffectiveness, applyBurn, stabMod, finalMod);
231
+ }
232
+ desc.attackBoost =
233
+ move.named('Foul Play') ? defender.boosts[attackStat] : attacker.boosts[attackStat];
234
+ if ((move.dropsStats && move.timesUsed > 1) || move.hits > 1) {
235
+ var origDefBoost = desc.defenseBoost;
236
+ var origAtkBoost = desc.attackBoost;
237
+ var numAttacks = 1;
238
+ if (move.dropsStats && move.timesUsed > 1) {
239
+ desc.moveTurns = "over ".concat(move.timesUsed, " turns");
240
+ numAttacks = move.timesUsed;
241
+ }
242
+ else {
243
+ numAttacks = move.hits;
244
+ }
245
+ var usedItems = [false, false];
246
+ var _loop_1 = function (times) {
247
+ usedItems = (0, util_2.checkMultihitBoost)(gen, attacker, defender, move, field, desc, usedItems[0], usedItems[1]);
248
+ var newAtk = calculateAttackBWXY(gen, attacker, defender, move, field, desc, isCritical);
249
+ var newDef = calculateDefenseBWXY(gen, attacker, defender, move, field, desc, isCritical);
250
+ hasAteAbilityTypeChange = hasAteAbilityTypeChange &&
251
+ attacker.hasAbility('Aerilate', 'Galvanize', 'Pixilate', 'Refrigerate');
252
+ if ((move.dropsStats && move.timesUsed > 1)) {
253
+ stabMod = (0, util_2.getStabMod)(attacker, move, desc);
254
+ }
255
+ var newBasePower = calculateBasePowerBWXY(gen, attacker, defender, move, field, hasAteAbilityTypeChange, desc);
256
+ var newBaseDamage = (0, util_2.getBaseDamage)(attacker.level, newBasePower, newAtk, newDef);
257
+ var newFinalMods = calculateFinalModsBWXY(gen, attacker, defender, move, field, desc, isCritical, typeEffectiveness, times);
258
+ var newFinalMod = (0, util_2.chainMods)(newFinalMods, 41, 131072);
259
+ var damageMultiplier = 0;
260
+ damage = damage.map(function (affectedAmount) {
261
+ var newFinalDamage = (0, util_2.getFinalDamage)(newBaseDamage, damageMultiplier, typeEffectiveness, applyBurn, stabMod, newFinalMod);
262
+ damageMultiplier++;
263
+ return affectedAmount + newFinalDamage;
264
+ });
265
+ };
266
+ for (var times = 1; times < numAttacks; times++) {
267
+ _loop_1(times);
268
+ }
269
+ desc.defenseBoost = origDefBoost;
270
+ desc.attackBoost = origAtkBoost;
271
+ }
272
+ result.damage = childDamage ? [damage, childDamage] : damage;
273
+ return result;
274
+ }
275
+ exports.calculateBWXY = calculateBWXY;
276
+ function calculateBasePowerBWXY(gen, attacker, defender, move, field, hasAteAbilityTypeChange, desc, hit) {
277
+ if (hit === void 0) { hit = 1; }
278
+ var basePower;
279
+ var turnOrder = attacker.stats.spe > defender.stats.spe ? 'first' : 'last';
280
+ switch (move.name) {
281
+ case 'Payback':
282
+ basePower = move.bp * (turnOrder === 'last' ? 2 : 1);
283
+ desc.moveBP = basePower;
284
+ break;
285
+ case 'Pursuit':
286
+ var switching = field.defenderSide.isSwitching === 'out';
287
+ basePower = move.bp * (switching ? 2 : 1);
288
+ if (switching)
289
+ desc.isSwitching = 'out';
290
+ desc.moveBP = basePower;
291
+ break;
292
+ case 'Electro Ball':
293
+ if (defender.stats.spe === 0)
294
+ defender.stats.spe = 1;
295
+ var r = Math.floor(attacker.stats.spe / defender.stats.spe);
296
+ basePower = r >= 4 ? 150 : r >= 3 ? 120 : r >= 2 ? 80 : r >= 1 ? 60 : 40;
297
+ desc.moveBP = basePower;
298
+ break;
299
+ case 'Gyro Ball':
300
+ if (attacker.stats.spe === 0)
301
+ attacker.stats.spe = 1;
302
+ basePower = Math.min(150, Math.floor((25 * defender.stats.spe) / attacker.stats.spe) + 1);
303
+ desc.moveBP = basePower;
304
+ break;
305
+ case 'Punishment':
306
+ basePower = Math.min(200, 60 + 20 * (0, util_2.countBoosts)(gen, defender.boosts));
307
+ desc.moveBP = basePower;
308
+ break;
309
+ case 'Low Kick':
310
+ case 'Grass Knot':
311
+ var w = (0, util_2.getWeight)(defender, desc, 'defender');
312
+ basePower = w >= 200 ? 120 : w >= 100 ? 100 : w >= 50 ? 80 : w >= 25 ? 60 : w >= 10 ? 40 : 20;
313
+ desc.moveBP = basePower;
314
+ break;
315
+ case 'Hex':
316
+ basePower = move.bp * (defender.status ? 2 : 1);
317
+ desc.moveBP = basePower;
318
+ break;
319
+ case 'Heavy Slam':
320
+ case 'Heat Crash':
321
+ var wr = (0, util_2.getWeight)(attacker, desc, 'attacker') /
322
+ (0, util_2.getWeight)(defender, desc, 'defender');
323
+ basePower = wr >= 5 ? 120 : wr >= 4 ? 100 : wr >= 3 ? 80 : wr >= 2 ? 60 : 40;
324
+ desc.moveBP = basePower;
325
+ break;
326
+ case 'Stored Power':
327
+ case 'Power Trip':
328
+ basePower = 20 + 20 * (0, util_2.countBoosts)(gen, attacker.boosts);
329
+ desc.moveBP = basePower;
330
+ break;
331
+ case 'Acrobatics':
332
+ basePower = move.bp * (attacker.hasItem('Flying Gem') || !attacker.item ? 2 : 1);
333
+ desc.moveBP = basePower;
334
+ break;
335
+ case 'Assurance':
336
+ basePower = move.bp * (defender.hasAbility('Parental Bond (Child)') ? 2 : 1);
337
+ break;
338
+ case 'Wake-Up Slap':
339
+ basePower = move.bp * (defender.hasStatus('slp') ? 2 : 1);
340
+ desc.moveBP = basePower;
341
+ break;
342
+ case 'Smelling Salts':
343
+ basePower = move.bp * (defender.hasStatus('par') ? 2 : 1);
344
+ desc.moveBP = basePower;
345
+ break;
346
+ case 'Weather Ball':
347
+ basePower = move.bp * (field.weather && !field.hasWeather('Strong Winds') ? 2 : 1);
348
+ desc.moveBP = basePower;
349
+ break;
350
+ case 'Fling':
351
+ basePower = (0, items_1.getFlingPower)(attacker.item);
352
+ desc.moveBP = basePower;
353
+ desc.attackerItem = attacker.item;
354
+ break;
355
+ case 'Eruption':
356
+ case 'Water Spout':
357
+ basePower = Math.max(1, Math.floor((150 * attacker.curHP()) / attacker.maxHP()));
358
+ desc.moveBP = basePower;
359
+ break;
360
+ case 'Flail':
361
+ case 'Reversal':
362
+ var p = Math.floor((48 * attacker.curHP()) / attacker.maxHP());
363
+ basePower = p <= 1 ? 200 : p <= 4 ? 150 : p <= 9 ? 100 : p <= 16 ? 80 : p <= 32 ? 40 : 20;
364
+ desc.moveBP = basePower;
365
+ break;
366
+ case 'Nature Power':
367
+ if (gen.num === 5) {
368
+ move.category = 'Physical';
369
+ move.target = 'allAdjacent';
370
+ basePower = 100;
371
+ desc.moveName = 'Earthquake';
372
+ }
373
+ else {
374
+ move.category = 'Special';
375
+ move.secondaries = true;
376
+ switch (field.terrain) {
377
+ case 'Electric':
378
+ basePower = 90;
379
+ desc.moveName = 'Thunderbolt';
380
+ break;
381
+ case 'Grassy':
382
+ basePower = 90;
383
+ desc.moveName = 'Energy Ball';
384
+ break;
385
+ case 'Misty':
386
+ basePower = 95;
387
+ desc.moveName = 'Moonblast';
388
+ break;
389
+ default:
390
+ basePower = 80;
391
+ desc.moveName = 'Tri Attack';
392
+ }
393
+ }
394
+ break;
395
+ case 'Triple Kick':
396
+ basePower = hit * 10;
397
+ desc.moveBP = move.hits === 2 ? 30 : move.hits === 3 ? 60 : 10;
398
+ break;
399
+ case 'Crush Grip':
400
+ case 'Wring Out':
401
+ basePower = 100 * Math.floor((defender.curHP() * 4096) / defender.maxHP());
402
+ basePower = Math.floor(Math.floor((120 * basePower + 2048 - 1) / 4096) / 100) || 1;
403
+ desc.moveBP = basePower;
404
+ break;
405
+ default:
406
+ basePower = move.bp;
407
+ }
408
+ if (basePower === 0) {
409
+ return 0;
410
+ }
411
+ var bpMods = calculateBPModsBWXY(gen, attacker, defender, move, field, desc, basePower, hasAteAbilityTypeChange, turnOrder);
412
+ basePower = (0, util_2.OF16)(Math.max(1, (0, util_2.pokeRound)((basePower * (0, util_2.chainMods)(bpMods, 41, 2097152)) / 4096)));
413
+ return basePower;
414
+ }
415
+ exports.calculateBasePowerBWXY = calculateBasePowerBWXY;
416
+ function calculateBPModsBWXY(gen, attacker, defender, move, field, desc, basePower, hasAteAbilityTypeChange, turnOrder) {
417
+ var bpMods = [];
418
+ var defenderItem = (defender.item && defender.item !== '')
419
+ ? defender.item : defender.disabledItem;
420
+ var resistedKnockOffDamage = !defenderItem ||
421
+ (defender.named('Giratina-Origin') && defenderItem === 'Griseous Orb') ||
422
+ (defender.name.includes('Arceus') && defenderItem.includes('Plate')) ||
423
+ (defender.name.includes('Genesect') && defenderItem.includes('Drive')) ||
424
+ (defender.named('Groudon', 'Groudon-Primal') && defenderItem === 'Red Orb') ||
425
+ (defender.named('Kyogre', 'Kyogre-Primal') && defenderItem === 'Blue Orb');
426
+ if (!resistedKnockOffDamage && defenderItem) {
427
+ var item = gen.items.get((0, util_1.toID)(defenderItem));
428
+ resistedKnockOffDamage = !!(item.megaEvolves && defender.name.includes(item.megaEvolves));
429
+ }
430
+ if ((attacker.hasAbility('Technician') && basePower <= 60) ||
431
+ (attacker.hasAbility('Flare Boost') &&
432
+ attacker.hasStatus('brn') && move.category === 'Special') ||
433
+ (attacker.hasAbility('Toxic Boost') &&
434
+ attacker.hasStatus('psn', 'tox') && move.category === 'Physical')) {
435
+ bpMods.push(6144);
436
+ desc.attackerAbility = attacker.ability;
437
+ }
438
+ else if (attacker.hasAbility('Analytic') && turnOrder !== 'first') {
439
+ bpMods.push(5325);
440
+ desc.attackerAbility = attacker.ability;
441
+ }
442
+ else if (attacker.hasAbility('Sand Force') &&
443
+ field.hasWeather('Sand') &&
444
+ move.hasType('Rock', 'Ground', 'Steel')) {
445
+ bpMods.push(5325);
446
+ desc.attackerAbility = attacker.ability;
447
+ desc.weather = field.weather;
448
+ }
449
+ else if ((attacker.hasAbility('Reckless') && (move.recoil || move.hasCrashDamage)) ||
450
+ (attacker.hasAbility('Iron Fist') && move.flags.punch)) {
451
+ bpMods.push(4915);
452
+ desc.attackerAbility = attacker.ability;
453
+ }
454
+ if (defender.hasAbility('Heatproof') && move.hasType('Fire')) {
455
+ bpMods.push(2048);
456
+ desc.defenderAbility = defender.ability;
457
+ }
458
+ else if (defender.hasAbility('Dry Skin') && move.hasType('Fire')) {
459
+ bpMods.push(5120);
460
+ desc.defenderAbility = defender.ability;
461
+ }
462
+ if (attacker.hasAbility('Sheer Force') && move.secondaries) {
463
+ bpMods.push(5325);
464
+ desc.attackerAbility = attacker.ability;
465
+ }
466
+ if (attacker.hasAbility('Rivalry') && ![attacker.gender, defender.gender].includes('N')) {
467
+ if (attacker.gender === defender.gender) {
468
+ bpMods.push(5120);
469
+ desc.rivalry = 'buffed';
470
+ }
471
+ else {
472
+ bpMods.push(3072);
473
+ desc.rivalry = 'nerfed';
474
+ }
475
+ desc.attackerAbility = attacker.ability;
476
+ }
477
+ if (attacker.item && (0, items_1.getItemBoostType)(attacker.item) === move.type) {
478
+ bpMods.push(4915);
479
+ desc.attackerItem = attacker.item;
480
+ }
481
+ else if ((attacker.hasItem('Muscle Band') && move.category === 'Physical') ||
482
+ (attacker.hasItem('Wise Glasses') && move.category === 'Special')) {
483
+ bpMods.push(4505);
484
+ desc.attackerItem = attacker.item;
485
+ }
486
+ else if ((attacker.hasItem('Adamant Orb') &&
487
+ attacker.named('Dialga') &&
488
+ move.hasType('Steel', 'Dragon')) ||
489
+ (attacker.hasItem('Lustrous Orb') &&
490
+ attacker.named('Palkia') &&
491
+ move.hasType('Water', 'Dragon')) ||
492
+ (attacker.hasItem('Griseous Orb') &&
493
+ attacker.named('Giratina-Origin') &&
494
+ move.hasType('Ghost', 'Dragon'))) {
495
+ bpMods.push(4915);
496
+ desc.attackerItem = attacker.item;
497
+ }
498
+ else if (attacker.hasItem("".concat(move.type, " Gem"))) {
499
+ bpMods.push(gen.num > 5 ? 5325 : 6144);
500
+ desc.attackerItem = attacker.item;
501
+ }
502
+ if ((move.named('Facade') && attacker.hasStatus('brn', 'par', 'psn', 'tox')) ||
503
+ (move.named('Brine') && defender.curHP() <= defender.maxHP() / 2) ||
504
+ (move.named('Venoshock') && defender.hasStatus('psn', 'tox'))) {
505
+ bpMods.push(8192);
506
+ desc.moveBP = basePower * 2;
507
+ }
508
+ else if (gen.num > 5 && move.named('Knock Off') && !resistedKnockOffDamage) {
509
+ bpMods.push(6144);
510
+ desc.moveBP = basePower * 1.5;
511
+ }
512
+ else if (move.named('Solar Beam') && field.hasWeather('Rain', 'Heavy Rain', 'Sand', 'Hail')) {
513
+ bpMods.push(2048);
514
+ desc.moveBP = basePower / 2;
515
+ desc.weather = field.weather;
516
+ }
517
+ if (field.attackerSide.isHelpingHand) {
518
+ bpMods.push(6144);
519
+ desc.isHelpingHand = true;
520
+ }
521
+ if (hasAteAbilityTypeChange) {
522
+ bpMods.push(5325);
523
+ desc.attackerAbility = attacker.ability;
524
+ }
525
+ else if ((attacker.hasAbility('Mega Launcher') && move.flags.pulse) ||
526
+ (attacker.hasAbility('Strong Jaw') && move.flags.bite)) {
527
+ bpMods.push(6144);
528
+ desc.attackerAbility = attacker.ability;
529
+ }
530
+ else if (attacker.hasAbility('Tough Claws') && move.flags.contact) {
531
+ bpMods.push(5325);
532
+ desc.attackerAbility = attacker.ability;
533
+ }
534
+ var aura = "".concat(move.type, " Aura");
535
+ var isAttackerAura = attacker.hasAbility(aura);
536
+ var isDefenderAura = defender.hasAbility(aura);
537
+ var isUserAuraBreak = attacker.hasAbility('Aura Break') || defender.hasAbility('Aura Break');
538
+ var isFieldAuraBreak = field.isAuraBreak;
539
+ var isFieldFairyAura = field.isFairyAura && move.type === 'Fairy';
540
+ var isFieldDarkAura = field.isDarkAura && move.type === 'Dark';
541
+ var auraActive = isAttackerAura || isDefenderAura || isFieldFairyAura || isFieldDarkAura;
542
+ var auraBreak = isFieldAuraBreak || isUserAuraBreak;
543
+ if (auraActive) {
544
+ if (auraBreak) {
545
+ bpMods.push(3072);
546
+ desc.attackerAbility = attacker.ability;
547
+ desc.defenderAbility = defender.ability;
548
+ }
549
+ else {
550
+ bpMods.push(5448);
551
+ if (isAttackerAura)
552
+ desc.attackerAbility = attacker.ability;
553
+ if (isDefenderAura)
554
+ desc.defenderAbility = defender.ability;
555
+ }
556
+ }
557
+ if ((0, util_2.isGrounded)(attacker, field)) {
558
+ if ((field.hasTerrain('Electric') && move.hasType('Electric')) ||
559
+ (field.hasTerrain('Grassy') && move.hasType('Grass'))) {
560
+ bpMods.push(6144);
561
+ desc.terrain = field.terrain;
562
+ }
563
+ }
564
+ if ((0, util_2.isGrounded)(defender, field)) {
565
+ if ((field.hasTerrain('Misty') && move.hasType('Dragon')) ||
566
+ (field.hasTerrain('Grassy') && move.named('Bulldoze', 'Earthquake'))) {
567
+ bpMods.push(2048);
568
+ desc.terrain = field.terrain;
569
+ }
570
+ }
571
+ return bpMods;
572
+ }
573
+ exports.calculateBPModsBWXY = calculateBPModsBWXY;
574
+ function calculateAttackBWXY(gen, attacker, defender, move, field, desc, isCritical) {
575
+ if (isCritical === void 0) { isCritical = false; }
576
+ var attack;
577
+ var attackSource = move.named('Foul Play') ? defender : attacker;
578
+ var attackStat = move.category === 'Special' ? 'spa' : 'atk';
579
+ desc.attackEVs =
580
+ move.named('Foul Play')
581
+ ? (0, util_2.getStatDescriptionText)(gen, defender, attackStat, defender.nature)
582
+ : (0, util_2.getStatDescriptionText)(gen, attacker, attackStat, attacker.nature);
583
+ if (attackSource.boosts[attackStat] === 0 ||
584
+ (isCritical && attackSource.boosts[attackStat] < 0)) {
585
+ attack = attackSource.rawStats[attackStat];
586
+ }
587
+ else if (defender.hasAbility('Unaware')) {
588
+ attack = attackSource.rawStats[attackStat];
589
+ desc.defenderAbility = defender.ability;
590
+ }
591
+ else {
592
+ attack = (0, util_2.getModifiedStat)(attackSource.rawStats[attackStat], attackSource.boosts[attackStat]);
593
+ desc.attackBoost = attackSource.boosts[attackStat];
594
+ }
595
+ if (attacker.hasAbility('Hustle') && move.category === 'Physical') {
596
+ attack = (0, util_2.pokeRound)((attack * 3) / 2);
597
+ desc.attackerAbility = attacker.ability;
598
+ }
599
+ var atMods = calculateAtModsBWXY(attacker, defender, move, field, desc);
600
+ attack = (0, util_2.OF16)(Math.max(1, (0, util_2.pokeRound)((attack * (0, util_2.chainMods)(atMods, 410, 131072)) / 4096)));
601
+ return attack;
602
+ }
603
+ exports.calculateAttackBWXY = calculateAttackBWXY;
604
+ function calculateAtModsBWXY(attacker, defender, move, field, desc) {
605
+ var atMods = [];
606
+ if (defender.hasAbility('Thick Fat') && move.hasType('Fire', 'Ice')) {
607
+ atMods.push(2048);
608
+ desc.defenderAbility = defender.ability;
609
+ }
610
+ if ((attacker.hasAbility('Guts') && attacker.status && move.category === 'Physical') ||
611
+ (attacker.curHP() <= attacker.maxHP() / 3 &&
612
+ ((attacker.hasAbility('Overgrow') && move.hasType('Grass')) ||
613
+ (attacker.hasAbility('Blaze') && move.hasType('Fire')) ||
614
+ (attacker.hasAbility('Torrent') && move.hasType('Water')) ||
615
+ (attacker.hasAbility('Swarm') && move.hasType('Bug')))) ||
616
+ (move.category === 'Special' && attacker.abilityOn && attacker.hasAbility('Plus', 'Minus'))) {
617
+ atMods.push(6144);
618
+ desc.attackerAbility = attacker.ability;
619
+ }
620
+ else if (attacker.hasAbility('Flash Fire') && attacker.abilityOn && move.hasType('Fire')) {
621
+ atMods.push(6144);
622
+ desc.attackerAbility = 'Flash Fire';
623
+ }
624
+ else if ((attacker.hasAbility('Solar Power') &&
625
+ field.hasWeather('Sun', 'Harsh Sunshine') &&
626
+ move.category === 'Special') ||
627
+ (attacker.named('Cherrim') &&
628
+ attacker.hasAbility('Flower Gift') &&
629
+ field.hasWeather('Sun', 'Harsh Sunshine') &&
630
+ move.category === 'Physical')) {
631
+ atMods.push(6144);
632
+ desc.attackerAbility = attacker.ability;
633
+ desc.weather = field.weather;
634
+ }
635
+ else if ((attacker.hasAbility('Defeatist') && attacker.curHP() <= attacker.maxHP() / 2) ||
636
+ (attacker.hasAbility('Slow Start') && attacker.abilityOn && move.category === 'Physical')) {
637
+ atMods.push(2048);
638
+ desc.attackerAbility = attacker.ability;
639
+ }
640
+ else if (attacker.hasAbility('Huge Power', 'Pure Power') && move.category === 'Physical') {
641
+ atMods.push(8192);
642
+ desc.attackerAbility = attacker.ability;
643
+ }
644
+ if (field.attackerSide.isFlowerGift &&
645
+ !attacker.hasAbility('Flower Gift') &&
646
+ field.hasWeather('Sun', 'Harsh Sunshine') &&
647
+ move.category === 'Physical') {
648
+ atMods.push(6144);
649
+ desc.weather = field.weather;
650
+ desc.isFlowerGiftAttacker = true;
651
+ }
652
+ if ((attacker.hasItem('Thick Club') &&
653
+ attacker.named('Cubone', 'Marowak', 'Marowak-Alola') &&
654
+ move.category === 'Physical') ||
655
+ (attacker.hasItem('Deep Sea Tooth') &&
656
+ attacker.named('Clamperl') &&
657
+ move.category === 'Special') ||
658
+ (attacker.hasItem('Light Ball') && attacker.name.startsWith('Pikachu') && !move.isZ)) {
659
+ atMods.push(8192);
660
+ desc.attackerItem = attacker.item;
661
+ }
662
+ else if ((attacker.hasItem('Soul Dew') &&
663
+ attacker.named('Latios', 'Latias', 'Latios-Mega', 'Latias-Mega') &&
664
+ move.category === 'Special') ||
665
+ (attacker.hasItem('Choice Band') && move.category === 'Physical') ||
666
+ (attacker.hasItem('Choice Specs') && move.category === 'Special')) {
667
+ atMods.push(6144);
668
+ desc.attackerItem = attacker.item;
669
+ }
670
+ return atMods;
671
+ }
672
+ exports.calculateAtModsBWXY = calculateAtModsBWXY;
673
+ function calculateDefenseBWXY(gen, attacker, defender, move, field, desc, isCritical) {
674
+ if (isCritical === void 0) { isCritical = false; }
675
+ var defense;
676
+ var defenseStat = move.overrideDefensiveStat || move.category === 'Physical' ? 'def' : 'spd';
677
+ var hitsPhysical = defenseStat === 'def';
678
+ desc.defenseEVs = (0, util_2.getStatDescriptionText)(gen, defender, defenseStat, defender.nature);
679
+ if (defender.boosts[defenseStat] === 0 ||
680
+ (isCritical && defender.boosts[defenseStat] > 0) ||
681
+ move.ignoreDefensive) {
682
+ defense = defender.rawStats[defenseStat];
683
+ }
684
+ else if (attacker.hasAbility('Unaware')) {
685
+ defense = defender.rawStats[defenseStat];
686
+ desc.attackerAbility = attacker.ability;
687
+ }
688
+ else {
689
+ defense = (0, util_2.getModifiedStat)(defender.rawStats[defenseStat], defender.boosts[defenseStat]);
690
+ desc.defenseBoost = defender.boosts[defenseStat];
691
+ }
692
+ if (field.hasWeather('Sand') && defender.hasType('Rock') && !hitsPhysical) {
693
+ defense = (0, util_2.pokeRound)((defense * 3) / 2);
694
+ desc.weather = field.weather;
695
+ }
696
+ var dfMods = calculateDfModsBWXY(gen, defender, field, desc, hitsPhysical);
697
+ defense = (0, util_2.OF16)(Math.max(1, (0, util_2.pokeRound)((defense * (0, util_2.chainMods)(dfMods, 410, 131072)) / 4096)));
698
+ return defense;
699
+ }
700
+ exports.calculateDefenseBWXY = calculateDefenseBWXY;
701
+ function calculateDfModsBWXY(gen, defender, field, desc, hitsPhysical) {
702
+ var _a;
703
+ if (hitsPhysical === void 0) { hitsPhysical = false; }
704
+ var dfMods = [];
705
+ if (defender.hasAbility('Marvel Scale') && defender.status && hitsPhysical) {
706
+ dfMods.push(6144);
707
+ desc.defenderAbility = defender.ability;
708
+ }
709
+ else if (defender.named('Cherrim') &&
710
+ defender.hasAbility('Flower Gift') &&
711
+ field.hasWeather('Sun', 'Harsh Sunshine') &&
712
+ !hitsPhysical) {
713
+ dfMods.push(6144);
714
+ desc.defenderAbility = defender.ability;
715
+ desc.weather = field.weather;
716
+ }
717
+ else if (field.defenderSide.isFlowerGift &&
718
+ field.hasWeather('Sun', 'Harsh Sunshine') &&
719
+ !hitsPhysical) {
720
+ dfMods.push(6144);
721
+ desc.weather = field.weather;
722
+ desc.isFlowerGiftDefender = true;
723
+ }
724
+ if (field.hasTerrain('Grassy') && defender.hasAbility('Grass Pelt') && hitsPhysical) {
725
+ dfMods.push(6144);
726
+ desc.defenderAbility = defender.ability;
727
+ }
728
+ if ((!hitsPhysical && defender.hasItem('Soul Dew') &&
729
+ defender.named('Latios', 'Latias', 'Latios-Mega', 'Latias-Mega')) ||
730
+ (defender.hasItem('Eviolite') && ((_a = gen.species.get((0, util_1.toID)(defender.name))) === null || _a === void 0 ? void 0 : _a.nfe)) ||
731
+ (!hitsPhysical && defender.hasItem('Assault Vest'))) {
732
+ dfMods.push(6144);
733
+ desc.defenderItem = defender.item;
734
+ }
735
+ if ((defender.hasItem('Metal Powder') && defender.named('Ditto') && hitsPhysical) ||
736
+ (defender.hasItem('Deep Sea Scale') && defender.named('Clamperl') && !hitsPhysical)) {
737
+ dfMods.push(8192);
738
+ desc.defenderItem = defender.item;
739
+ }
740
+ if (defender.hasAbility('Fur Coat') && hitsPhysical) {
741
+ dfMods.push(8192);
742
+ desc.defenderAbility = defender.ability;
743
+ }
744
+ return dfMods;
745
+ }
746
+ exports.calculateDfModsBWXY = calculateDfModsBWXY;
747
+ function calculateBaseDamageBWXY(gen, attacker, basePower, attack, defense, move, field, desc, isCritical) {
748
+ if (isCritical === void 0) { isCritical = false; }
749
+ var baseDamage = (0, util_2.getBaseDamage)(attacker.level, basePower, attack, defense);
750
+ var isSpread = field.gameType !== 'Singles' &&
751
+ ['allAdjacent', 'allAdjacentFoes'].includes(move.target);
752
+ if (isSpread) {
753
+ baseDamage = (0, util_2.pokeRound)((0, util_2.OF32)(baseDamage * 3072) / 4096);
754
+ }
755
+ if (attacker.hasAbility('Parental Bond (Child)')) {
756
+ baseDamage = (0, util_2.pokeRound)((0, util_2.OF32)(baseDamage * 2048) / 4096);
757
+ }
758
+ if ((field.hasWeather('Sun', 'Harsh Sunshine') && move.hasType('Fire')) ||
759
+ (field.hasWeather('Rain', 'Heavy Rain') && move.hasType('Water'))) {
760
+ baseDamage = (0, util_2.pokeRound)((0, util_2.OF32)(baseDamage * 6144) / 4096);
761
+ desc.weather = field.weather;
762
+ }
763
+ else if ((field.hasWeather('Sun') && move.hasType('Water')) ||
764
+ (field.hasWeather('Rain') && move.hasType('Fire'))) {
765
+ baseDamage = (0, util_2.pokeRound)((0, util_2.OF32)(baseDamage * 2048) / 4096);
766
+ desc.weather = field.weather;
767
+ }
768
+ if (isCritical) {
769
+ baseDamage = Math.floor((0, util_2.OF32)(baseDamage * (gen.num > 5 ? 1.5 : 2)));
770
+ desc.isCritical = isCritical;
771
+ }
772
+ return baseDamage;
773
+ }
774
+ function calculateFinalModsBWXY(gen, attacker, defender, move, field, desc, isCritical, typeEffectiveness, hitCount) {
775
+ if (isCritical === void 0) { isCritical = false; }
776
+ if (hitCount === void 0) { hitCount = 0; }
777
+ var finalMods = [];
778
+ if (field.defenderSide.isReflect && move.category === 'Physical' && !isCritical) {
779
+ finalMods.push(field.gameType !== 'Singles' ? (gen.num > 5 ? 2732 : 2703) : 2048);
780
+ desc.isReflect = true;
781
+ }
782
+ else if (field.defenderSide.isLightScreen && move.category === 'Special' && !isCritical) {
783
+ finalMods.push(field.gameType !== 'Singles' ? (gen.num > 5 ? 2732 : 2703) : 2048);
784
+ desc.isLightScreen = true;
785
+ }
786
+ if (defender.hasAbility('Multiscale') && defender.curHP() === defender.maxHP() &&
787
+ hitCount === 0 &&
788
+ !field.defenderSide.isSR && (!field.defenderSide.spikes || defender.hasType('Flying')) &&
789
+ !attacker.hasAbility('Parental Bond (Child)')) {
790
+ finalMods.push(2048);
791
+ desc.defenderAbility = defender.ability;
792
+ }
793
+ if (attacker.hasAbility('Tinted Lens') && typeEffectiveness < 1) {
794
+ finalMods.push(8192);
795
+ desc.attackerAbility = attacker.ability;
796
+ }
797
+ if (field.defenderSide.isFriendGuard) {
798
+ finalMods.push(3072);
799
+ desc.isFriendGuard = true;
800
+ }
801
+ if (attacker.hasAbility('Sniper') && isCritical) {
802
+ finalMods.push(6144);
803
+ desc.attackerAbility = attacker.ability;
804
+ }
805
+ if (defender.hasAbility('Solid Rock', 'Filter') && typeEffectiveness > 1) {
806
+ finalMods.push(3072);
807
+ desc.defenderAbility = defender.ability;
808
+ }
809
+ if (attacker.hasItem('Metronome') && move.timesUsedWithMetronome >= 1) {
810
+ var timesUsedWithMetronome = Math.floor(move.timesUsedWithMetronome);
811
+ if (timesUsedWithMetronome <= 4) {
812
+ finalMods.push(4096 + timesUsedWithMetronome * 819);
813
+ }
814
+ else {
815
+ finalMods.push(8192);
816
+ }
817
+ desc.attackerItem = attacker.item;
818
+ }
819
+ if (attacker.hasItem('Expert Belt') && typeEffectiveness > 1 && !move.isZ) {
820
+ finalMods.push(4915);
821
+ desc.attackerItem = attacker.item;
822
+ }
823
+ else if (attacker.hasItem('Life Orb')) {
824
+ finalMods.push(5324);
825
+ desc.attackerItem = attacker.item;
826
+ }
827
+ if (move.hasType((0, items_1.getBerryResistType)(defender.item)) &&
828
+ (typeEffectiveness > 1 || move.hasType('Normal')) &&
829
+ hitCount === 0 &&
830
+ !attacker.hasAbility('Unnerve')) {
831
+ finalMods.push(2048);
832
+ desc.defenderItem = defender.item;
833
+ }
834
+ return finalMods;
835
+ }
836
+ //# sourceMappingURL=gen56.js.map