diff --git a/play.pokemonshowdown.com/src/battle-tooltips.ts b/play.pokemonshowdown.com/src/battle-tooltips.ts index b13a4418b..2ea62eea7 100644 --- a/play.pokemonshowdown.com/src/battle-tooltips.ts +++ b/play.pokemonshowdown.com/src/battle-tooltips.ts @@ -1839,6 +1839,7 @@ export class BattleTooltips { return 1; } const hardcoreMode = this.battle.hardcoreMode; + const inverse = this.battle.rules['Inverse Mod']; const targetTypes = target.getTypeList(); const sourceAbility = source.effectiveAbility(); // Mold Breaker doesn't ignore _everything_, but it sure ignores everything that affects effectiveness @@ -1905,7 +1906,15 @@ export class BattleTooltips { factor = 1; break; } - factor = 0; + // Inverse replaces immunities with weaknesses. This has to + // be coded here, else it won't calculate secondary type's + // effectiveness. It sets a resistance to be consistent with + // the inversion done at the end. + if (inverse) { + factor *= 0.5; + } else { + factor = 0; + } } else if (move.id === 'freezedry' && targetType === 'Water') { factor *= 2; } else { @@ -1970,11 +1979,20 @@ export class BattleTooltips { return factor * otherFactor === 0 ? 0 : 1; } if (hardcoreMode && dex.gen <= 9) { - if (factor > 2) return 2; - if (factor < 0.5) return 0.5; + if (factor > 2) factor = 2; + if (factor < 0.5) factor = 0.5; + if (inverse && dex.gen >= 7) return 1 / factor; return factor; } - if (hardcoreMode) return factor; + if (hardcoreMode) { + if (inverse && dex.gen >= 7) return 1 / factor; + return factor; + } + + // Inverse Mod reverses effectiveness + if (inverse) { + return 1 / (factor * otherFactor); + } return factor * otherFactor; } getMoveTypeText(move: Dex.Move, value: ModifiableValue, forMaxMove?: boolean | Dex.Move) {