diff --git a/src/modules/pokemons/evolutions/Restrictions.ts b/src/modules/pokemons/evolutions/Restrictions.ts index 612a9b23d2..6cb4e9a55b 100644 --- a/src/modules/pokemons/evolutions/Restrictions.ts +++ b/src/modules/pokemons/evolutions/Restrictions.ts @@ -1,4 +1,4 @@ -import { GameState, Region, Environment, MegaStoneType } from '../../GameConstants'; +import { GameState, Region, Environment, MegaStoneType, AchievementOption } from '../../GameConstants'; import { ItemNameType } from '../../items/ItemNameType'; import { QuestLineNameType } from '../../quests/QuestLineNameType'; import GameStateRequirement from '../../requirements/GameStateRequirement'; @@ -16,7 +16,7 @@ import MegaEvolveRequirement from '../../requirements/MegaEvolveRequirement'; import { EvoData, restrict } from './Base'; import DayCyclePart from '../../dayCycle/DayCyclePart'; import MoonCyclePhase from '../../moonCycle/MoonCyclePhase'; -import AttackEvolveRequirement from '../../requirements/AttackEvolveRequirement'; +import PokemonAttackRequirement from '../../requirements/PokemonAttackRequirement'; export type EvoFn = (...args: unknown[]) => EvoData; @@ -136,7 +136,7 @@ export const attackRestrict = (evo: T) => ( const data = evo(...rest); return restrict( data, - new AttackEvolveRequirement(data.basePokemon, attackMultiplier), + new PokemonAttackRequirement(data.basePokemon, attackMultiplier, AchievementOption.more), ); }; diff --git a/src/modules/requirements/AttackEvolveRequirement.ts b/src/modules/requirements/AttackEvolveRequirement.ts deleted file mode 100644 index 364289883a..0000000000 --- a/src/modules/requirements/AttackEvolveRequirement.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AchievementOption } from '../GameConstants'; -import { pokemonMap } from '../pokemons/PokemonList'; -import { PokemonNameType } from '../pokemons/PokemonNameType'; -import Requirement from './Requirement'; - -export default class AttackEvolveRequirement extends Requirement { - constructor(public pokemon: PokemonNameType, attackMultiplier: number) { - super(attackMultiplier, AchievementOption.equal); - } - - getProgress(): number { - const partyPokemon = App.game.party.getPokemonByName(this.pokemon); - - return partyPokemon?.attack >= pokemonMap[this.pokemon].attack * this.requiredValue ? 1 : 0; - } - - hint(): string { - const attackRequired = pokemonMap[this.pokemon].attack * this.requiredValue; - if (this.getProgress()) { - return 'Level up to evolve.'; - } else { - return `Needs at least ${attackRequired.toLocaleString('en-US')} attack to evolve.`; - } - } -} diff --git a/src/modules/requirements/PokemonAttackRequirement.ts b/src/modules/requirements/PokemonAttackRequirement.ts new file mode 100644 index 0000000000..7aac7a6801 --- /dev/null +++ b/src/modules/requirements/PokemonAttackRequirement.ts @@ -0,0 +1,36 @@ +import { AchievementOption } from '../GameConstants'; +import { pokemonMap } from '../pokemons/PokemonList'; +import { PokemonNameType } from '../pokemons/PokemonNameType'; +import Requirement from './Requirement'; + +export default class PokemonAttackRequirement extends Requirement { + constructor(public pokemon: PokemonNameType, attackMultiplier: number, option: AchievementOption) { + super(attackMultiplier, option); + } + + getProgress(): number { + const partyPokemon = App.game.party.getPokemonByName(this.pokemon); + const partyPokemonAttackRatio = Math.trunc(partyPokemon?.attack / pokemonMap[this.pokemon].attack); + + switch (this.option) { + case AchievementOption.less: + case AchievementOption.more: return Math.min(partyPokemonAttackRatio, this.requiredValue); + case AchievementOption.equal: + default: return partyPokemonAttackRatio; + } + + + } + + hint(): string { + if (this.getProgress() == this.requiredValue) { + return 'Level up to evolve.'; + } else { + const attackRequired = pokemonMap[this.pokemon].attack * this.requiredValue; + const comparisonOperator = this.option === AchievementOption.less ? 'less than' : + this.option === AchievementOption.more ? 'more than' : + 'exactly'; + return `${this.pokemon} needs ${comparisonOperator} ${attackRequired.toLocaleString('en-US')} attack.`; + } + } +} diff --git a/src/modules/temporaryWindowInjection.ts b/src/modules/temporaryWindowInjection.ts index e213ef9724..d607e354fb 100644 --- a/src/modules/temporaryWindowInjection.ts +++ b/src/modules/temporaryWindowInjection.ts @@ -141,6 +141,7 @@ import UndergroundLevelRequirement from './requirements/UndergroundLevelRequirem import UndergroundUseToolRequirement from './requirements/UndergroundUseToolRequirement'; import WeatherRequirement from './requirements/WeatherRequirement'; import MegaEvolveRequirement from './requirements/MegaEvolveRequirement'; +import PokemonAttackRequirement from './requirements/PokemonAttackRequirement'; import { SortModules, SortSaves } from './Sortable'; import KeyItemController from './keyItems/KeyItemController'; import KeyItem from './keyItems/KeyItem'; @@ -362,6 +363,7 @@ Object.assign(window, { UndergroundUseToolRequirement, WeatherRequirement, MegaEvolveRequirement, + PokemonAttackRequirement, SortModules, SortSaves, KeyItemController,