diff --git a/calc/src/mechanics/gen3.ts b/calc/src/mechanics/gen3.ts
index b2d42f4a2..07da95a2b 100644
--- a/calc/src/mechanics/gen3.ts
+++ b/calc/src/mechanics/gen3.ts
@@ -165,7 +165,7 @@ export function calculateADV(
result.damage[i - 85] = Math.max(1, Math.floor((baseDamage * i) / 100));
}
- if ((move.dropsStats && move.timesUsed! > 1) || move.hits > 1) {
+ if (move.timesUsed! > 1 || move.hits > 1) {
// store boosts so intermediate boosts don't show.
const origDefBoost = desc.defenseBoost;
const origAtkBoost = desc.attackBoost;
diff --git a/calc/src/mechanics/gen4.ts b/calc/src/mechanics/gen4.ts
index f8b6d3318..0c95ec116 100644
--- a/calc/src/mechanics/gen4.ts
+++ b/calc/src/mechanics/gen4.ts
@@ -279,7 +279,7 @@ export function calculateDPP(
}
result.damage = damage;
- if ((move.dropsStats && move.timesUsed! > 1) || move.hits > 1) {
+ if (move.timesUsed! > 1 || move.hits > 1) {
// store boosts so intermediate boosts don't show.
const origDefBoost = desc.defenseBoost;
const origAtkBoost = desc.attackBoost;
diff --git a/calc/src/mechanics/gen56.ts b/calc/src/mechanics/gen56.ts
index 8000d4823..896f8bff0 100644
--- a/calc/src/mechanics/gen56.ts
+++ b/calc/src/mechanics/gen56.ts
@@ -371,12 +371,12 @@ export function calculateBWXY(
desc.attackBoost =
move.named('Foul Play') ? defender.boosts[attackStat] : attacker.boosts[attackStat];
- if ((move.dropsStats && move.timesUsed! > 1) || move.hits > 1) {
+ if (move.timesUsed! > 1 || move.hits > 1) {
// store boosts so intermediate boosts don't show.
const origDefBoost = desc.defenseBoost;
const origAtkBoost = desc.attackBoost;
let numAttacks = 1;
- if (move.dropsStats && move.timesUsed! > 1) {
+ if (move.timesUsed! > 1) {
desc.moveTurns = `over ${move.timesUsed} turns`;
numAttacks = move.timesUsed!;
} else {
@@ -393,7 +393,7 @@ export function calculateBWXY(
hasAteAbilityTypeChange = hasAteAbilityTypeChange &&
attacker.hasAbility('Aerilate', 'Galvanize', 'Pixilate', 'Refrigerate');
- if ((move.dropsStats && move.timesUsed! > 1)) {
+ if (move.timesUsed! > 1) {
// Adaptability does not change between hits of a multihit, only between turns
stabMod = getStabMod(attacker, move, desc);
}
@@ -600,7 +600,8 @@ export function calculateBasePowerBWXY(
desc,
basePower,
hasAteAbilityTypeChange,
- turnOrder
+ turnOrder,
+ hit
);
basePower = OF16(Math.max(1, pokeRound((basePower * chainMods(bpMods, 41, 2097152)) / 4096)));
@@ -616,7 +617,8 @@ export function calculateBPModsBWXY(
desc: RawDesc,
basePower: number,
hasAteAbilityTypeChange: boolean,
- turnOrder: string
+ turnOrder: string,
+ hit: number
) {
const bpMods = [];
@@ -637,6 +639,11 @@ export function calculateBPModsBWXY(
resistedKnockOffDamage = !!(item.megaEvolves && defender.name.includes(item.megaEvolves));
}
+ // Resist knock off damage if your item was already knocked off
+ if (!resistedKnockOffDamage && hit > 1 && !defender.hasAbility('Sticky Hold')) {
+ resistedKnockOffDamage = true;
+ }
+
// Use BasePower after moves with custom BP to determine if Technician should boost
if ((attacker.hasAbility('Technician') && basePower <= 60) ||
diff --git a/calc/src/mechanics/gen789.ts b/calc/src/mechanics/gen789.ts
index 6c063f690..7c8aee0e3 100644
--- a/calc/src/mechanics/gen789.ts
+++ b/calc/src/mechanics/gen789.ts
@@ -676,13 +676,13 @@ export function calculateSMSSSV(
desc.attackBoost =
move.named('Foul Play') ? defender.boosts[attackStat] : attacker.boosts[attackStat];
- if ((move.dropsStats && move.timesUsed! > 1) || move.hits > 1) {
+ if (move.timesUsed! > 1 || move.hits > 1) {
// store boosts so intermediate boosts don't show.
const origDefBoost = desc.defenseBoost;
const origAtkBoost = desc.attackBoost;
let numAttacks = 1;
- if (move.dropsStats && move.timesUsed! > 1) {
+ if (move.timesUsed! > 1) {
desc.moveTurns = `over ${move.timesUsed} turns`;
numAttacks = move.timesUsed!;
} else {
@@ -701,7 +701,7 @@ export function calculateSMSSSV(
hasAteAbilityTypeChange = hasAteAbilityTypeChange &&
attacker.hasAbility('Aerilate', 'Galvanize', 'Pixilate', 'Refrigerate', 'Normalize');
- if ((move.dropsStats && move.timesUsed! > 1)) {
+ if (move.timesUsed! > 1) {
// Adaptability does not change between hits of a multihit, only between turns
preStellarStabMod = getStabMod(attacker, move, desc);
// Hack to make Tera Shell with multihit moves, but not over multiple turns
@@ -1004,7 +1004,8 @@ export function calculateBasePowerSMSSSV(
desc,
basePower,
hasAteAbilityTypeChange,
- turnOrder
+ turnOrder,
+ hit
);
basePower = OF16(Math.max(1, pokeRound((basePower * chainMods(bpMods, 41, 2097152)) / 4096)));
if (
@@ -1028,7 +1029,8 @@ export function calculateBPModsSMSSSV(
desc: RawDesc,
basePower: number,
hasAteAbilityTypeChange: boolean,
- turnOrder: string
+ turnOrder: string,
+ hit: number
) {
const bpMods = [];
@@ -1061,6 +1063,11 @@ export function calculateBPModsSMSSSV(
resistedKnockOffDamage = !!item.megaEvolves && defender.name.includes(item.megaEvolves);
}
+ // Resist knock off damage if your item was already knocked off
+ if (!resistedKnockOffDamage && hit > 1 && !defender.hasAbility('Sticky Hold')) {
+ resistedKnockOffDamage = true;
+ }
+
if ((move.named('Facade') && attacker.hasStatus('brn', 'par', 'psn', 'tox')) ||
(move.named('Brine') && defender.curHP() <= defender.maxHP() / 2) ||
(move.named('Venoshock') && defender.hasStatus('psn', 'tox')) ||
diff --git a/calc/src/move.ts b/calc/src/move.ts
index 47526a57d..bc3f9a24f 100644
--- a/calc/src/move.ts
+++ b/calc/src/move.ts
@@ -133,7 +133,7 @@ export class Move implements State.Move {
if (data.self?.boosts && data.self.boosts[stat] && data.self.boosts[stat]! < 0) {
this.dropsStats = Math.abs(data.self.boosts[stat]!);
}
- this.timesUsed = (this.dropsStats && options.timesUsed) || 1;
+ this.timesUsed = options.timesUsed || 1;
this.secondaries = data.secondaries;
// For the purposes of the damage formula only 'allAdjacent' and 'allAdjacentFoes' matter, so we
// simply default to 'any' for the others even though they may not actually be 'any'-target
diff --git a/src/honkalculate.template.html b/src/honkalculate.template.html
index 84edb5140..d5d5f973d 100644
--- a/src/honkalculate.template.html
+++ b/src/honkalculate.template.html
@@ -509,7 +509,7 @@
-