From a739a1666fd19e0fc1fa8670ca12e24f55f6e441 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 29 Mar 2023 00:31:25 -0400 Subject: [PATCH] Add auto mode and various changes --- jsconfig.json | 2 +- src/auto-play.ts | 268 +++++++++++ src/battle-phase.ts | 41 +- src/battle-scene.ts | 44 +- src/modifier.ts | 6 +- src/move.ts | 4 +- src/pokemon-evolutions.ts | 643 ++++++++++++++------------- src/pokemon-level-moves.ts | 126 +++--- src/pokemon-species.ts | 7 +- src/pokemon.ts | 81 ++-- src/ui/message-ui-handler.ts | 70 +-- src/ui/modifier-select-ui-handler.ts | 13 +- src/ui/party-ui-handler.ts | 1 - src/ui/uiHandler.ts | 2 +- 14 files changed, 806 insertions(+), 502 deletions(-) create mode 100644 src/auto-play.ts diff --git a/jsconfig.json b/jsconfig.json index 8a7034e2e..8bcefca6e 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es6", + "target": "ES2019", "moduleResolution": "node", "checkJs": true, "esModuleInterop": true diff --git a/src/auto-play.ts b/src/auto-play.ts new file mode 100644 index 000000000..5ba8d86d6 --- /dev/null +++ b/src/auto-play.ts @@ -0,0 +1,268 @@ +import { SelectModifierPhase } from "./battle-phase"; +import BattleScene from "./battle-scene"; +import { ModifierTier, ModifierType, PokemonBaseStatBoosterModifierType, PokemonHpRestoreModifierType, PokemonReviveModifierType } from "./modifier"; +import Pokemon, { AiType, EnemyPokemon, PlayerPokemon, PokemonMove } from "./pokemon"; +import { Species } from "./species"; +import { getTypeDamageMultiplier } from "./type"; +import BattleMessageUiHandler from "./ui/battle-message-ui-handler"; +import CommandUiHandler from "./ui/command-ui-handler"; +import FightUiHandler from "./ui/fight-ui-handler"; +import MessageUiHandler from "./ui/message-ui-handler"; +import ModifierSelectUiHandler from "./ui/modifier-select-ui-handler"; +import PartyUiHandler from "./ui/party-ui-handler"; +import SwitchCheckUiHandler from "./ui/switch-check-ui-handler"; +import { Mode } from "./ui/ui"; + +export function initAutoPlay(speed: number) { + const thisArg = this as BattleScene; + + const originalDelayedCall = this.time.delayedCall; + this.time.delayedCall = function (delay: number, callback: Function, args?: any[], callbackScope?: any) { + delay /= speed; + originalDelayedCall.apply(this, [ delay, callback, args, callbackScope ]); + }; + const originalAddEvent = this.time.addEvent; + this.time.addEvent = function (config: Phaser.Time.TimerEvent | Phaser.Types.Time.TimerEventConfig) { + if (config.delay) + config.delay = Math.ceil(config.delay / speed); + if (config.startAt) + config.startAt = Math.ceil(config.startAt / speed); + return originalAddEvent.apply(this, [ config ]); + }; + const originalTweensAdd = this.tweens.add; + this.tweens.add = function (config: Phaser.Types.Tweens.TweenBuilderConfig | object) { + if (config.duration) + config.duration = Math.ceil(config.duration / speed); + if (config.delay) + config.delay = Math.ceil(config.delay / speed); + return originalTweensAdd.apply(this, [ config ]); + }; + const originalAddCounter = this.tweens.addCounter; + this.tweens.addCounter = function (config: Phaser.Types.Tweens.NumberTweenBuilderConfig) { + if (config.duration) + config.duration = Math.ceil(config.duration / speed); + if (config.delay) + config.delay = Math.ceil(config.delay / speed); + return originalAddCounter.apply(this, [ config ]); + }; + + const keyCodes = Phaser.Input.Keyboard.KeyCodes; + + PlayerPokemon.prototype.getNextMove = EnemyPokemon.prototype.getNextMove; + + const playerPokemon = this.getParty()[0] as PlayerPokemon; + + const messageUiHandler = this.ui.handlers[Mode.MESSAGE] as BattleMessageUiHandler; + const commandUiHandler = this.ui.handlers[Mode.COMMAND] as CommandUiHandler; + const fightUiHandler = this.ui.handlers[Mode.FIGHT] as FightUiHandler; + const partyUiHandler = this.ui.handlers[Mode.PARTY] as PartyUiHandler; + const switchCheckUiHandler = this.ui.handlers[Mode.SWITCH_CHECK] as SwitchCheckUiHandler; + const modifierSelectUiHandler = this.ui.handlers[Mode.MODIFIER_SELECT] as ModifierSelectUiHandler; + + const getBestPartyMemberIndex = () => { + const enemyPokemon = thisArg.getEnemyPokemon(); + const party = thisArg.getParty(); + let bestPartyMemberIndex = -1; + let bestPartyMemberEffectiveness = 0.5; + for (let p = 0; p < party.length; p++) { + const pokemon = party[p]; + if ((pokemon.hp / pokemon.getMaxHp()) <= 0.4) + continue; + const effectiveness = getMaxMoveEffectiveness(pokemon, enemyPokemon) / getMaxMoveEffectiveness(enemyPokemon, pokemon); + if (effectiveness > bestPartyMemberEffectiveness) { + bestPartyMemberIndex = p; + bestPartyMemberEffectiveness = effectiveness; + } + console.log(p, Species[pokemon.species.speciesId], '->', Species[enemyPokemon.species.speciesId], effectiveness); + } + + if (bestPartyMemberIndex === -1) { + let highestHpValue = 0; + for (let p = 0; p < party.length; p++) { + const pokemon = party[p]; + if (pokemon.hp > highestHpValue) { + highestHpValue = pokemon.hp; + bestPartyMemberIndex = p; + } + } + } + + return bestPartyMemberIndex; + }; + + const getMaxMoveEffectiveness = (attacker: Pokemon, defender: Pokemon) => { + let maxEffectiveness = 0.5; + for (let m of attacker.moveset) { + const moveType = m.getMove().type; + let effectiveness = getTypeDamageMultiplier(moveType, defender.species.type1); + if (defender.species.type2 > -1) + effectiveness *= getTypeDamageMultiplier(moveType, defender.species.type2); + if (effectiveness > maxEffectiveness) + maxEffectiveness = effectiveness; + } + + return maxEffectiveness; + }; + + let nextPartyMemberIndex = -1; + + const originalMessageUiHandlerShowText = MessageUiHandler.prototype.showText; + MessageUiHandler.prototype.showText = function (text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean) { + delay = 0; + callbackDelay = 0; + originalMessageUiHandlerShowText.apply(this, [ text, delay, callback, callbackDelay, prompt ]); + }; + + const originalMessageUiHandlerShowPrompt = MessageUiHandler.prototype.showPrompt; + MessageUiHandler.prototype.showPrompt = function (callback: Function, callbackDelay: integer) { + callbackDelay = 0; + originalMessageUiHandlerShowPrompt.apply(this, [ callback, callbackDelay ]); + thisArg.time.delayedCall(20, () => this.processInput(keyCodes.Z)); + }; + + const originalMessageUiHandlerPromptLevelUpStats = messageUiHandler.promptLevelUpStats; + messageUiHandler.promptLevelUpStats = function (prevStats: integer[], showTotals: boolean, callback?: Function) { + originalMessageUiHandlerPromptLevelUpStats.apply(this, [ prevStats, showTotals, callback ]); + this.processInput(keyCodes.Z); + }; + + const originalCommandUiHandlerShow = commandUiHandler.show; + commandUiHandler.show = function (args: any[]) { + originalCommandUiHandlerShow.apply(this, [ args ]); + const bestPartyMemberIndex = getBestPartyMemberIndex(); + if (bestPartyMemberIndex) { + console.log(bestPartyMemberIndex, thisArg.getParty()) + console.log('Switching to ', Species[thisArg.getParty()[bestPartyMemberIndex].species.speciesId]); + nextPartyMemberIndex = bestPartyMemberIndex; + commandUiHandler.setCursor(2); + this.processInput(keyCodes.Z); + } else { + commandUiHandler.setCursor(0); + this.processInput(keyCodes.Z); + } + }; + + const originalFightUiHandlerShow = fightUiHandler.show; + fightUiHandler.show = function (args: any[]) { + originalFightUiHandlerShow.apply(this, [ args ]); + if (!playerPokemon.aiType) + playerPokemon.aiType = AiType.SMART; + thisArg.time.delayedCall(20, () => { + const nextMove = playerPokemon.getNextMove() as PokemonMove; + fightUiHandler.setCursor(playerPokemon.moveset.indexOf(nextMove)); + this.processInput(keyCodes.Z); + }); + }; + + const originalPartyUiHandlerShow = partyUiHandler.show; + partyUiHandler.show = function (args: any[]) { + originalPartyUiHandlerShow.apply(this, [ args ]); + thisArg.time.delayedCall(20, () => { + if (nextPartyMemberIndex === -1) + nextPartyMemberIndex = getBestPartyMemberIndex(); + partyUiHandler.setCursor(nextPartyMemberIndex); + nextPartyMemberIndex = -1; + this.processInput(keyCodes.Z); + }); + }; + + const originalSwitchCheckUiHandlerShow = switchCheckUiHandler.show; + switchCheckUiHandler.show = function (args: any[]) { + originalSwitchCheckUiHandlerShow.apply(this, [ args ]); + const bestPartyMemberIndex = getBestPartyMemberIndex(); + thisArg.time.delayedCall(20, () => { + if (bestPartyMemberIndex) + nextPartyMemberIndex = bestPartyMemberIndex; + switchCheckUiHandler.setCursor(bestPartyMemberIndex ? 1 : 0); + this.processInput(keyCodes.Z); + }); + } + + const tryGetBestModifier = (modifierTypes: Array, predicate: Function) => { + for (let mt = 0; mt < modifierTypes.length; mt++) { + const modifierType = modifierTypes[mt]; + if (predicate(modifierType)) { + return mt; + } + } + + return -1; + }; + + const originalModifierSelectUiHandlerShow = modifierSelectUiHandler.show; + modifierSelectUiHandler.show = function (args: any[]) { + if (modifierSelectUiHandler.active) + return; + + originalModifierSelectUiHandlerShow.apply(this, [ args ]); + + const party = thisArg.getParty(); + const modifierTypes = modifierSelectUiHandler.options.map(o => o.modifierType); + const faintedPartyMemberIndex = party.findIndex(p => !p.hp); + const lowHpPartyMemberIndex = party.findIndex(p => (p.hp / p.getMaxHp()) <= 0.5); + const criticalHpPartyMemberIndex = party.findIndex(p => (p.hp / p.getMaxHp()) <= 0.25); + + let optionIndex = tryGetBestModifier(modifierTypes, (modifierType: ModifierType) => { + if (modifierType instanceof PokemonHpRestoreModifierType) { + if (modifierType instanceof PokemonReviveModifierType) { + if (faintedPartyMemberIndex > -1) { + nextPartyMemberIndex = faintedPartyMemberIndex; + return true; + } + } else if (criticalHpPartyMemberIndex > -1){ + nextPartyMemberIndex = faintedPartyMemberIndex; + return true; + } + } + }); + + if (optionIndex === -1) { + optionIndex = tryGetBestModifier(modifierTypes, (modifierType: ModifierType) => { + if (modifierType.tier >= ModifierTier.ULTRA) { + nextPartyMemberIndex = 0; + return true; + } + }); + } + + if (optionIndex === -1) { + optionIndex = tryGetBestModifier(modifierTypes, (modifierType: ModifierType) => { + if (modifierType instanceof PokemonBaseStatBoosterModifierType) { + nextPartyMemberIndex = 0; + return true; + } + }); + } + + if (optionIndex === -1) { + optionIndex = tryGetBestModifier(modifierTypes, (modifierType: ModifierType) => { + if (lowHpPartyMemberIndex && modifierType instanceof PokemonHpRestoreModifierType && !(ModifierType instanceof PokemonReviveModifierType)) { + nextPartyMemberIndex = lowHpPartyMemberIndex; + return true; + } + }); + } + + if (optionIndex === -1) + optionIndex = 0; + + const trySelectModifier = () => { + modifierSelectUiHandler.setCursor(optionIndex); + thisArg.time.delayedCall(20, () => { + modifierSelectUiHandler.processInput(keyCodes.Z); + thisArg.time.delayedCall(100, () => { + console.log(modifierTypes[optionIndex]?.name); + if (thisArg.getCurrentPhase() instanceof SelectModifierPhase) { + if (optionIndex < modifierSelectUiHandler.options.length - 1) { + optionIndex++; + trySelectModifier(); + } else + modifierSelectUiHandler.processInput(keyCodes.X); + } + }); + }); + }; + + thisArg.time.delayedCall(4000, () => trySelectModifier()); + } +} \ No newline at end of file diff --git a/src/battle-phase.ts b/src/battle-phase.ts index e6cd611b6..ce5456116 100644 --- a/src/battle-phase.ts +++ b/src/battle-phase.ts @@ -74,23 +74,26 @@ export class NextEncounterPhase extends BattlePhase { this.scene.getEnemyPokemon().destroy(); const newEnemyPokemon = new EnemyPokemon(this.scene, this.scene.randomSpecies(true), this.scene.getLevelForWave()); - this.scene.setEnemyPokemon(newEnemyPokemon); - this.scene.field.add(newEnemyPokemon); - this.scene.field.moveBelow(newEnemyPokemon, this.scene.getPlayerPokemon()); - newEnemyPokemon.tint(0, 0.5); - this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, this.scene.arenaEnemy2, newEnemyPokemon ], - x: '+=300', - duration: 2000, - onComplete: () => { - this.scene.arenaEnemy.setX(this.scene.arenaEnemy2.x); - this.scene.arenaEnemy2.setX(this.scene.arenaEnemy2.x - 300); - newEnemyPokemon.untint(100, 'Sine.easeOut'); - newEnemyPokemon.cry(); - newEnemyPokemon.showInfo(); - this.scene.ui.showText(`A wild ${newEnemyPokemon.name} appeared!`, null, () => this.end(), 1500); - } - }); + newEnemyPokemon.loadAssets().then(() => { + this.scene.setEnemyPokemon(newEnemyPokemon); + this.scene.field.add(newEnemyPokemon); + this.scene.field.moveBelow(newEnemyPokemon, this.scene.getPlayerPokemon()); + newEnemyPokemon.tint(0, 0.5); + this.scene.tweens.add({ + targets: [ this.scene.arenaEnemy, this.scene.arenaEnemy2, newEnemyPokemon ], + x: '+=300', + duration: 2000, + onComplete: () => { + this.scene.arenaEnemy.setX(this.scene.arenaEnemy2.x); + this.scene.arenaEnemy2.setX(this.scene.arenaEnemy2.x - 300); + newEnemyPokemon.untint(100, 'Sine.easeOut'); + newEnemyPokemon.cry(); + newEnemyPokemon.showInfo(); + this.scene.ui.showText(`A wild ${newEnemyPokemon.name} appeared!`, null, () => this.end(), 1500); + } + }); + }); + this.scene.load.start(); } end() { @@ -241,7 +244,7 @@ export class CheckSwitchPhase extends BattlePhase { start() { super.start(); - this.scene.ui.showText('Will you switch\nPokémon?', null, () => { + this.scene.ui.showText('Will you switch\nPOKéMON?', null, () => { this.scene.ui.setMode(Mode.SWITCH_CHECK, () => this.end()); }); } @@ -340,6 +343,8 @@ abstract class MovePhase extends BattlePhase { this.end(); return; } + if (!this.move) + console.log(this.pokemon.moveset); this.scene.ui.showText(`${this.pokemon.name} used\n${this.move.getName()}!`, null, () => this.end(), 500); if (this.move.getMove().category !== MOVE_CATEGORY.STATUS) this.scene.unshiftPhase(this.getDamagePhase()); diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a12dcbc9b..61e9bf22a 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -3,13 +3,17 @@ import { ArenaType, Arena } from './arena'; import UI from './ui/ui'; import { BattlePhase, EncounterPhase, SummonPhase, CommandPhase } from './battle-phase'; import { PlayerPokemon, EnemyPokemon } from './pokemon'; -import PokemonSpecies, { default as Pokemon, allSpecies } from './pokemon-species'; +import PokemonSpecies, { allSpecies, getPokemonSpecies } from './pokemon-species'; import * as Utils from './utils'; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonModifierType, PokemonModifier } from './modifier'; -import { Stat } from './pokemon-stat'; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonModifier } from './modifier'; import { PokeballType } from './pokeball'; +import { Species } from './species'; +import { initAutoPlay } from './auto-play'; export default class BattleScene extends Phaser.Scene { + private auto: boolean; + private autoSpeed: integer = 10; + private phaseQueue: Array; private phaseQueuePrepend: Array; private currentPhase: BattlePhase; @@ -190,7 +194,7 @@ export default class BattleScene extends Phaser.Scene { new Arena(this, ArenaType.ARENA_PINK, 'elite_4'), new Arena(this, ArenaType.ARENA_ORANGE, 'elite_5') ]; - const arena = arenas[Utils.randInt(15)]; + const arena = arenas[0];//arenas[Utils.randInt(15)]; this.arena = arena; @@ -218,17 +222,20 @@ export default class BattleScene extends Phaser.Scene { this.modifiers = []; this.modifierBar = new ModifierBar(this); - this.add.existing(this.modifierBar); - uiContainer.add(this.modifierBar); + this.add.existing(this.modifierBar); + uiContainer.add(this.modifierBar); this.waveIndex = 1; this.party = []; + let loadPokemonAssets = []; + for (let s = 0; s < 3; s++) { - const playerSpecies = this.randomSpecies(); + const playerSpecies = getPokemonSpecies(s === 0 ? Species.TORCHIC : s === 1 ? Species.TREECKO : Species.MUDKIP); //this.randomSpecies(); const playerPokemon = new PlayerPokemon(this, playerSpecies, 5); playerPokemon.setVisible(false); + loadPokemonAssets.push(playerPokemon.loadAssets()); this.party.push(playerPokemon); } @@ -236,6 +243,7 @@ export default class BattleScene extends Phaser.Scene { const enemySpecies = arena.randomSpecies(1); console.log(enemySpecies.name); const enemyPokemon = new EnemyPokemon(this, enemySpecies, this.getLevelForWave()); + loadPokemonAssets.push(enemyPokemon.loadAssets()); this.add.existing(enemyPokemon); this.enemyPokemon = enemyPokemon; @@ -274,16 +282,22 @@ export default class BattleScene extends Phaser.Scene { ui.setup(); - this.phaseQueue.push(new EncounterPhase(this), new SummonPhase(this)); - - this.shiftPhase(); - this.upKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.UP); this.downKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.DOWN); this.leftKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.LEFT); this.rightKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.RIGHT); this.actionKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Z); this.cancelKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.X); + + Promise.all(loadPokemonAssets).then(() => { + if (this.auto) + initAutoPlay.apply(this, [ this.autoSpeed ]); + + this.phaseQueue.push(new EncounterPhase(this), new SummonPhase(this)); + + this.shiftPhase(); + }); + this.load.start(); } update() { @@ -313,16 +327,14 @@ export default class BattleScene extends Phaser.Scene { } getLevelForWave() { - if (this.waveIndex === 1) - return 5; - let averageLevel = 5 + this.waveIndex * 0.5; + let averageLevel = 1 + this.waveIndex * 0.25; if (this.waveIndex % 10 === 0) - return averageLevel + 5; + return Math.floor(averageLevel * 1.25); const deviation = 10 / this.waveIndex; - return averageLevel + Math.round(Utils.randGauss(deviation)); + return Math.max(Math.round(averageLevel + Utils.randGauss(deviation)), 1); } checkInput(): boolean { diff --git a/src/modifier.ts b/src/modifier.ts index 57c5c0634..2bf5f68d4 100644 --- a/src/modifier.ts +++ b/src/modifier.ts @@ -334,7 +334,7 @@ export abstract class PokemonModifierType extends ModifierType { } } -class PokemonHpRestoreModifierType extends PokemonModifierType { +export class PokemonHpRestoreModifierType extends PokemonModifierType { protected restorePercent: integer; constructor(name: string, restorePercent: integer, iconImage?: string) { @@ -349,7 +349,7 @@ class PokemonHpRestoreModifierType extends PokemonModifierType { } } -class PokemonReviveModifierType extends PokemonHpRestoreModifierType { +export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { constructor(name: string, restorePercent: integer, iconImage?: string) { super(name, restorePercent, iconImage); @@ -362,7 +362,7 @@ class PokemonReviveModifierType extends PokemonHpRestoreModifierType { } } -class PokemonBaseStatBoosterModifierType extends PokemonModifierType { +export class PokemonBaseStatBoosterModifierType extends PokemonModifierType { private stat: Stat; constructor(name: string, stat: Stat, _iconImage?: string) { diff --git a/src/move.ts b/src/move.ts index ee7c6ac7e..6e37adb79 100644 --- a/src/move.ts +++ b/src/move.ts @@ -219,7 +219,7 @@ export enum Moves { PROTECT, MACH_PUNCH, SCARY_FACE, - FAINT_ATTACK, + FEINT_ATTACK, SWEET_KISS, BELLY_DRUM, SLUDGE_BOMB, @@ -781,7 +781,7 @@ export const allMoves = [ [ Moves.PROTECT, "Protect", Type.NORMAL, MOVE_CATEGORY.STATUS, -1, -1, 10, "TM07", "Protects the user, but may fail if used consecutively.", -1, 2 ], [ Moves.MACH_PUNCH, "Mach Punch", Type.FIGHTING, MOVE_CATEGORY.PHYSICAL, 40, 100, 30, "", "User attacks first.", -1, 2 ], [ Moves.SCARY_FACE, "Scary Face", Type.NORMAL, MOVE_CATEGORY.STATUS, -1, 100, 10, "TM06", "Sharply lowers opponent's Speed.", -1, 2 ], - [ Moves.FAINT_ATTACK, "Faint Attack", Type.DARK, MOVE_CATEGORY.PHYSICAL, 60, 999, 20, "", "Ignores Accuracy and Evasiveness.", -1, 2 ], + [ Moves.FEINT_ATTACK, "Feint Attack", Type.DARK, MOVE_CATEGORY.PHYSICAL, 60, 999, 20, "", "Ignores Accuracy and Evasiveness.", -1, 2 ], [ Moves.SWEET_KISS, "Sweet Kiss", Type.FAIRY, MOVE_CATEGORY.STATUS, -1, 75, 10, "", "Confuses opponent.", -1, 2 ], [ Moves.BELLY_DRUM, "Belly Drum", Type.NORMAL, MOVE_CATEGORY.STATUS, -1, -1, 10, "", "User loses 50% of its max HP, but Attack raises to maximum.", -1, 2 ], [ Moves.SLUDGE_BOMB, "Sludge Bomb", Type.POISON, MOVE_CATEGORY.SPECIAL, 90, 100, 10, "TM148", "May poison opponent.", 30, 2 ], diff --git a/src/pokemon-evolutions.ts b/src/pokemon-evolutions.ts index 2e296b102..6decc2916 100644 --- a/src/pokemon-evolutions.ts +++ b/src/pokemon-evolutions.ts @@ -2,31 +2,32 @@ import Pokemon from "./pokemon"; import { Stat } from "./pokemon-stat"; import { Species } from "./species"; -export enum WildEvolutionRate { - NORMAL, - UNCOMMON, - RARE, - ULTRA_RARE, +export enum SpeciesWildEvolutionRate { + INSTANT, + FAST, + MEDIUM, + SLOW, + VERY_SLOW, TAG_NONE } -export class PokemonSpeciesEvolution { +export class SpeciesEvolution { public speciesId: Species; public level: integer; public item: string; - public condition: PokemonSpeciesEvolutionCondition | string; - public wildRate: WildEvolutionRate; + public condition: SpeciesEvolutionCondition | string; + public wildRate: SpeciesWildEvolutionRate; - constructor(speciesId: Species, level: integer, item: string, condition: PokemonSpeciesEvolutionCondition | string, wildRate?: WildEvolutionRate) { + constructor(speciesId: Species, level: integer, item: string, condition: SpeciesEvolutionCondition | string, wildRate?: SpeciesWildEvolutionRate) { this.speciesId = speciesId; this.level = level; this.item = item; this.condition = condition; - this.wildRate = wildRate || WildEvolutionRate.NORMAL; + this.wildRate = wildRate || SpeciesWildEvolutionRate.INSTANT; } } -export class PokemonSpeciesEvolutionCondition { +export class SpeciesEvolutionCondition { public predicate: Function; public applyToWild: boolean; @@ -38,897 +39,897 @@ export class PokemonSpeciesEvolutionCondition { export const pokemonEvolutions = { [Species.BULBASAUR]: [ - new PokemonSpeciesEvolution(Species.IVYSAUR, 16, null, null) + new SpeciesEvolution(Species.IVYSAUR, 16, null, null) ], [Species.IVYSAUR]: [ - new PokemonSpeciesEvolution(Species.VENUSAUR, 32, null, null) + new SpeciesEvolution(Species.VENUSAUR, 32, null, null) ], [Species.CHARMANDER]: [ - new PokemonSpeciesEvolution(Species.CHARMELEON, 16, null, null) + new SpeciesEvolution(Species.CHARMELEON, 16, null, null) ], [Species.CHARMELEON]: [ - new PokemonSpeciesEvolution(Species.CHARIZARD, 36, null, null) + new SpeciesEvolution(Species.CHARIZARD, 36, null, null) ], [Species.SQUIRTLE]: [ - new PokemonSpeciesEvolution(Species.WARTORTLE, 16, null, null) + new SpeciesEvolution(Species.WARTORTLE, 16, null, null) ], [Species.WARTORTLE]: [ - new PokemonSpeciesEvolution(Species.BLASTOISE, 36, null, null) + new SpeciesEvolution(Species.BLASTOISE, 36, null, null) ], [Species.CATERPIE]: [ - new PokemonSpeciesEvolution(Species.METAPOD, 7, null, null) + new SpeciesEvolution(Species.METAPOD, 7, null, null) ], [Species.METAPOD]: [ - new PokemonSpeciesEvolution(Species.BUTTERFREE, 10, null, null) + new SpeciesEvolution(Species.BUTTERFREE, 10, null, null) ], [Species.WEEDLE]: [ - new PokemonSpeciesEvolution(Species.KAKUNA, 7, null, null) + new SpeciesEvolution(Species.KAKUNA, 7, null, null) ], [Species.KAKUNA]: [ - new PokemonSpeciesEvolution(Species.BEEDRILL, 10, null, null) + new SpeciesEvolution(Species.BEEDRILL, 10, null, null) ], [Species.PIDGEY]: [ - new PokemonSpeciesEvolution(Species.PIDGEOTTO, 18, null, null) + new SpeciesEvolution(Species.PIDGEOTTO, 18, null, null) ], [Species.PIDGEOTTO]: [ - new PokemonSpeciesEvolution(Species.PIDGEOT, 36, null, null) + new SpeciesEvolution(Species.PIDGEOT, 36, null, null) ], [Species.RATTATA]: [ - new PokemonSpeciesEvolution(Species.RATICATE, 20, null, null) + new SpeciesEvolution(Species.RATICATE, 20, null, null) ], [Species.SPEAROW]: [ - new PokemonSpeciesEvolution(Species.FEAROW, 20, null, null) + new SpeciesEvolution(Species.FEAROW, 20, null, null) ], [Species.EKANS]: [ - new PokemonSpeciesEvolution(Species.ARBOK, 22, null, null) + new SpeciesEvolution(Species.ARBOK, 22, null, null) ], [Species.SANDSHREW]: [ - new PokemonSpeciesEvolution(Species.SANDSLASH, 22, null, null) + new SpeciesEvolution(Species.SANDSLASH, 22, null, null) ], [Species.NIDORAN_F]: [ - new PokemonSpeciesEvolution(Species.NIDORINA, 16, null, null) + new SpeciesEvolution(Species.NIDORINA, 16, null, null) ], [Species.NIDORAN_M]: [ - new PokemonSpeciesEvolution(Species.NIDORINO, 16, null, null) + new SpeciesEvolution(Species.NIDORINO, 16, null, null) ], [Species.ZUBAT]: [ - new PokemonSpeciesEvolution(Species.GOLBAT, 22, null, null) + new SpeciesEvolution(Species.GOLBAT, 22, null, null) ], [Species.ODDISH]: [ - new PokemonSpeciesEvolution(Species.GLOOM, 21, null, null) + new SpeciesEvolution(Species.GLOOM, 21, null, null) ], [Species.PARAS]: [ - new PokemonSpeciesEvolution(Species.PARASECT, 24, null, null) + new SpeciesEvolution(Species.PARASECT, 24, null, null) ], [Species.VENONAT]: [ - new PokemonSpeciesEvolution(Species.VENOMOTH, 31, null, null) + new SpeciesEvolution(Species.VENOMOTH, 31, null, null) ], [Species.DIGLETT]: [ - new PokemonSpeciesEvolution(Species.DUGTRIO, 26, null, null) + new SpeciesEvolution(Species.DUGTRIO, 26, null, null) ], [Species.MEOWTH]: [ - new PokemonSpeciesEvolution(Species.PERSIAN, 28, null, null) + new SpeciesEvolution(Species.PERSIAN, 28, null, null) ], [Species.PSYDUCK]: [ - new PokemonSpeciesEvolution(Species.GOLDUCK, 33, null, null) + new SpeciesEvolution(Species.GOLDUCK, 33, null, null) ], [Species.MANKEY]: [ - new PokemonSpeciesEvolution(Species.PRIMEAPE, 28, null, null) + new SpeciesEvolution(Species.PRIMEAPE, 28, null, null) ], [Species.POLIWAG]: [ - new PokemonSpeciesEvolution(Species.POLIWHIRL, 25, null, null) + new SpeciesEvolution(Species.POLIWHIRL, 25, null, null) ], [Species.ABRA]: [ - new PokemonSpeciesEvolution(Species.KADABRA, 16, null, null) + new SpeciesEvolution(Species.KADABRA, 16, null, null) ], [Species.MACHOP]: [ - new PokemonSpeciesEvolution(Species.MACHOKE, 28, null, null) + new SpeciesEvolution(Species.MACHOKE, 28, null, null) ], [Species.BELLSPROUT]: [ - new PokemonSpeciesEvolution(Species.WEEPINBELL, 21, null, null) + new SpeciesEvolution(Species.WEEPINBELL, 21, null, null) ], [Species.TENTACOOL]: [ - new PokemonSpeciesEvolution(Species.TENTACRUEL, 30, null, null) + new SpeciesEvolution(Species.TENTACRUEL, 30, null, null) ], [Species.GEODUDE]: [ - new PokemonSpeciesEvolution(Species.GRAVELER, 25, null, null) + new SpeciesEvolution(Species.GRAVELER, 25, null, null) ], [Species.PONYTA]: [ - new PokemonSpeciesEvolution(Species.RAPIDASH, 40, null, null) + new SpeciesEvolution(Species.RAPIDASH, 40, null, null) ], [Species.SLOWPOKE]: [ - new PokemonSpeciesEvolution(Species.SLOWBRO, 37, null, null) + new SpeciesEvolution(Species.SLOWBRO, 37, null, null) ], [Species.MAGNEMITE]: [ - new PokemonSpeciesEvolution(Species.MAGNETON, 30, null, null) + new SpeciesEvolution(Species.MAGNETON, 30, null, null) ], [Species.DODUO]: [ - new PokemonSpeciesEvolution(Species.DODRIO, 31, null, null) + new SpeciesEvolution(Species.DODRIO, 31, null, null) ], [Species.SEEL]: [ - new PokemonSpeciesEvolution(Species.DEWGONG, 34, null, null) + new SpeciesEvolution(Species.DEWGONG, 34, null, null) ], [Species.GRIMER]: [ - new PokemonSpeciesEvolution(Species.MUK, 38, null, null) + new SpeciesEvolution(Species.MUK, 38, null, null) ], [Species.GASTLY]: [ - new PokemonSpeciesEvolution(Species.HAUNTER, 25, null, null) + new SpeciesEvolution(Species.HAUNTER, 25, null, null) ], [Species.DROWZEE]: [ - new PokemonSpeciesEvolution(Species.HYPNO, 26, null, null) + new SpeciesEvolution(Species.HYPNO, 26, null, null) ], [Species.KRABBY]: [ - new PokemonSpeciesEvolution(Species.KINGLER, 28, null, null) + new SpeciesEvolution(Species.KINGLER, 28, null, null) ], [Species.VOLTORB]: [ - new PokemonSpeciesEvolution(Species.ELECTRODE, 30, null, null) + new SpeciesEvolution(Species.ELECTRODE, 30, null, null) ], [Species.CUBONE]: [ - new PokemonSpeciesEvolution(Species.MAROWAK, 28, null, null) + new SpeciesEvolution(Species.MAROWAK, 28, null, null) ], [Species.TYROGUE]: [ - new PokemonSpeciesEvolution(Species.HITMONLEE, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.stats[Stat.ATK] > p.stats[Stat.DEF])), - new PokemonSpeciesEvolution(Species.HITMONCHAN, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.stats[Stat.ATK] < p.stats[Stat.DEF])), - new PokemonSpeciesEvolution(Species.HITMONTOP, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.stats[Stat.ATK] === p.stats[Stat.DEF])) + new SpeciesEvolution(Species.HITMONLEE, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.stats[Stat.ATK] > p.stats[Stat.DEF])), + new SpeciesEvolution(Species.HITMONCHAN, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.stats[Stat.ATK] < p.stats[Stat.DEF])), + new SpeciesEvolution(Species.HITMONTOP, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.stats[Stat.ATK] === p.stats[Stat.DEF])) ], [Species.KOFFING]: [ - new PokemonSpeciesEvolution(Species.WEEZING, 35, null, null) + new SpeciesEvolution(Species.WEEZING, 35, null, null) ], [Species.RHYHORN]: [ - new PokemonSpeciesEvolution(Species.RHYDON, 42, null, null) + new SpeciesEvolution(Species.RHYDON, 42, null, null) ], [Species.HORSEA]: [ - new PokemonSpeciesEvolution(Species.SEADRA, 32, null, null) + new SpeciesEvolution(Species.SEADRA, 32, null, null) ], [Species.GOLDEEN]: [ - new PokemonSpeciesEvolution(Species.SEAKING, 33, null, null) + new SpeciesEvolution(Species.SEAKING, 33, null, null) ], [Species.SMOOCHUM]: [ - new PokemonSpeciesEvolution(Species.JYNX, 30, null, null) + new SpeciesEvolution(Species.JYNX, 30, null, null) ], [Species.ELEKID]: [ - new PokemonSpeciesEvolution(Species.ELECTABUZZ, 30, null, null) + new SpeciesEvolution(Species.ELECTABUZZ, 30, null, null) ], [Species.MAGBY]: [ - new PokemonSpeciesEvolution(Species.MAGMAR, 30, null, null) + new SpeciesEvolution(Species.MAGMAR, 30, null, null) ], [Species.MAGIKARP]: [ - new PokemonSpeciesEvolution(Species.GYARADOS, 20, null, null) + new SpeciesEvolution(Species.GYARADOS, 20, null, null) ], [Species.OMANYTE]: [ - new PokemonSpeciesEvolution(Species.OMASTAR, 40, null, null) + new SpeciesEvolution(Species.OMASTAR, 40, null, null) ], [Species.KABUTO]: [ - new PokemonSpeciesEvolution(Species.KABUTOPS, 40, null, null) + new SpeciesEvolution(Species.KABUTOPS, 40, null, null) ], [Species.DRATINI]: [ - new PokemonSpeciesEvolution(Species.DRAGONAIR, 30, null, null) + new SpeciesEvolution(Species.DRAGONAIR, 30, null, null) ], [Species.DRAGONAIR]: [ - new PokemonSpeciesEvolution(Species.DRAGONITE, 55, null, null) + new SpeciesEvolution(Species.DRAGONITE, 55, null, null) ], [Species.CHIKORITA]: [ - new PokemonSpeciesEvolution(Species.BAYLEEF, 16, null, null) + new SpeciesEvolution(Species.BAYLEEF, 16, null, null) ], [Species.BAYLEEF]: [ - new PokemonSpeciesEvolution(Species.MEGANIUM, 32, null, null) + new SpeciesEvolution(Species.MEGANIUM, 32, null, null) ], [Species.CYNDAQUIL]: [ - new PokemonSpeciesEvolution(Species.QUILAVA, 14, null, null) + new SpeciesEvolution(Species.QUILAVA, 14, null, null) ], [Species.QUILAVA]: [ - new PokemonSpeciesEvolution(Species.TYPHLOSION, 36, null, null) + new SpeciesEvolution(Species.TYPHLOSION, 36, null, null) ], [Species.TOTODILE]: [ - new PokemonSpeciesEvolution(Species.CROCONAW, 18, null, null) + new SpeciesEvolution(Species.CROCONAW, 18, null, null) ], [Species.CROCONAW]: [ - new PokemonSpeciesEvolution(Species.FERALIGATR, 30, null, null) + new SpeciesEvolution(Species.FERALIGATR, 30, null, null) ], [Species.SENTRET]: [ - new PokemonSpeciesEvolution(Species.FURRET, 15, null, null) + new SpeciesEvolution(Species.FURRET, 15, null, null) ], [Species.HOOTHOOT]: [ - new PokemonSpeciesEvolution(Species.NOCTOWL, 20, null, null) + new SpeciesEvolution(Species.NOCTOWL, 20, null, null) ], [Species.LEDYBA]: [ - new PokemonSpeciesEvolution(Species.LEDIAN, 18, null, null) + new SpeciesEvolution(Species.LEDIAN, 18, null, null) ], [Species.SPINARAK]: [ - new PokemonSpeciesEvolution(Species.ARIADOS, 22, null, null) + new SpeciesEvolution(Species.ARIADOS, 22, null, null) ], [Species.CHINCHOU]: [ - new PokemonSpeciesEvolution(Species.LANTURN, 27, null, null) + new SpeciesEvolution(Species.LANTURN, 27, null, null) ], [Species.NATU]: [ - new PokemonSpeciesEvolution(Species.XATU, 25, null, null) + new SpeciesEvolution(Species.XATU, 25, null, null) ], [Species.MAREEP]: [ - new PokemonSpeciesEvolution(Species.FLAAFFY, 15, null, null) + new SpeciesEvolution(Species.FLAAFFY, 15, null, null) ], [Species.FLAAFFY]: [ - new PokemonSpeciesEvolution(Species.AMPHAROS, 30, null, null) + new SpeciesEvolution(Species.AMPHAROS, 30, null, null) ], [Species.MARILL]: [ - new PokemonSpeciesEvolution(Species.AZUMARILL, 18, null, null) + new SpeciesEvolution(Species.AZUMARILL, 18, null, null) ], [Species.HOPPIP]: [ - new PokemonSpeciesEvolution(Species.SKIPLOOM, 18, null, null) + new SpeciesEvolution(Species.SKIPLOOM, 18, null, null) ], [Species.SKIPLOOM]: [ - new PokemonSpeciesEvolution(Species.JUMPLUFF, 27, null, null) + new SpeciesEvolution(Species.JUMPLUFF, 27, null, null) ], [Species.WOOPER]: [ - new PokemonSpeciesEvolution(Species.QUAGSIRE, 20, null, null) + new SpeciesEvolution(Species.QUAGSIRE, 20, null, null) ], [Species.WYNAUT]: [ - new PokemonSpeciesEvolution(Species.WOBBUFFET, 15, null, null) + new SpeciesEvolution(Species.WOBBUFFET, 15, null, null) ], [Species.PINECO]: [ - new PokemonSpeciesEvolution(Species.FORRETRESS, 31, null, null) + new SpeciesEvolution(Species.FORRETRESS, 31, null, null) ], [Species.SNUBBULL]: [ - new PokemonSpeciesEvolution(Species.GRANBULL, 23, null, null) + new SpeciesEvolution(Species.GRANBULL, 23, null, null) ], [Species.TEDDIURSA]: [ - new PokemonSpeciesEvolution(Species.URSARING, 30, null, null) + new SpeciesEvolution(Species.URSARING, 30, null, null) ], [Species.SLUGMA]: [ - new PokemonSpeciesEvolution(Species.MAGCARGO, 38, null, null) + new SpeciesEvolution(Species.MAGCARGO, 38, null, null) ], [Species.SWINUB]: [ - new PokemonSpeciesEvolution(Species.PILOSWINE, 33, null, null) + new SpeciesEvolution(Species.PILOSWINE, 33, null, null) ], [Species.REMORAID]: [ - new PokemonSpeciesEvolution(Species.OCTILLERY, 25, null, null) + new SpeciesEvolution(Species.OCTILLERY, 25, null, null) ], [Species.HOUNDOUR]: [ - new PokemonSpeciesEvolution(Species.HOUNDOOM, 24, null, null) + new SpeciesEvolution(Species.HOUNDOOM, 24, null, null) ], [Species.PHANPY]: [ - new PokemonSpeciesEvolution(Species.DONPHAN, 25, null, null) + new SpeciesEvolution(Species.DONPHAN, 25, null, null) ], [Species.LARVITAR]: [ - new PokemonSpeciesEvolution(Species.PUPITAR, 30, null, null) + new SpeciesEvolution(Species.PUPITAR, 30, null, null) ], [Species.PUPITAR]: [ - new PokemonSpeciesEvolution(Species.TYRANITAR, 55, null, null) + new SpeciesEvolution(Species.TYRANITAR, 55, null, null) ], [Species.TREECKO]: [ - new PokemonSpeciesEvolution(Species.GROVYLE, 16, null, null) + new SpeciesEvolution(Species.GROVYLE, 16, null, null) ], [Species.GROVYLE]: [ - new PokemonSpeciesEvolution(Species.SCEPTILE, 36, null, null) + new SpeciesEvolution(Species.SCEPTILE, 36, null, null) ], [Species.TORCHIC]: [ - new PokemonSpeciesEvolution(Species.COMBUSKEN, 16, null, null) + new SpeciesEvolution(Species.COMBUSKEN, 16, null, null) ], [Species.COMBUSKEN]: [ - new PokemonSpeciesEvolution(Species.BLAZIKEN, 36, null, null) + new SpeciesEvolution(Species.BLAZIKEN, 36, null, null) ], [Species.MUDKIP]: [ - new PokemonSpeciesEvolution(Species.MARSHTOMP, 16, null, null) + new SpeciesEvolution(Species.MARSHTOMP, 16, null, null) ], [Species.MARSHTOMP]: [ - new PokemonSpeciesEvolution(Species.SWAMPERT, 36, null, null) + new SpeciesEvolution(Species.SWAMPERT, 36, null, null) ], [Species.POOCHYENA]: [ - new PokemonSpeciesEvolution(Species.MIGHTYENA, 18, null, null) + new SpeciesEvolution(Species.MIGHTYENA, 18, null, null) ], [Species.ZIGZAGOON]: [ - new PokemonSpeciesEvolution(Species.LINOONE, 20, null, null) + new SpeciesEvolution(Species.LINOONE, 20, null, null) ], [Species.WURMPLE]: [ - new PokemonSpeciesEvolution(Species.SILCOON, 7, null, 'random based on personality'), - new PokemonSpeciesEvolution(Species.CASCOON, 7, null, 'random based on personality') + new SpeciesEvolution(Species.SILCOON, 7, null, 'random based on personality'), + new SpeciesEvolution(Species.CASCOON, 7, null, 'random based on personality') ], [Species.SILCOON]: [ - new PokemonSpeciesEvolution(Species.BEAUTIFLY, 10, null, null) + new SpeciesEvolution(Species.BEAUTIFLY, 10, null, null) ], [Species.CASCOON]: [ - new PokemonSpeciesEvolution(Species.DUSTOX, 10, null, null) + new SpeciesEvolution(Species.DUSTOX, 10, null, null) ], [Species.LOTAD]: [ - new PokemonSpeciesEvolution(Species.LOMBRE, 14, null, null) + new SpeciesEvolution(Species.LOMBRE, 14, null, null) ], [Species.SEEDOT]: [ - new PokemonSpeciesEvolution(Species.NUZLEAF, 14, null, null) + new SpeciesEvolution(Species.NUZLEAF, 14, null, null) ], [Species.TAILLOW]: [ - new PokemonSpeciesEvolution(Species.SWELLOW, 22, null, null) + new SpeciesEvolution(Species.SWELLOW, 22, null, null) ], [Species.WINGULL]: [ - new PokemonSpeciesEvolution(Species.PELIPPER, 25, null, null) + new SpeciesEvolution(Species.PELIPPER, 25, null, null) ], [Species.RALTS]: [ - new PokemonSpeciesEvolution(Species.KIRLIA, 20, null, null) + new SpeciesEvolution(Species.KIRLIA, 20, null, null) ], [Species.KIRLIA]: [ - new PokemonSpeciesEvolution(Species.GARDEVOIR, 30, null, null), - new PokemonSpeciesEvolution(Species.GALLADE, 1, "Dawn Stone", new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.gender, true), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.GARDEVOIR, 30, null, null), + new SpeciesEvolution(Species.GALLADE, 1, "Dawn Stone", new SpeciesEvolutionCondition((p: Pokemon) => p.gender, true), SpeciesWildEvolutionRate.SLOW) ], [Species.SURSKIT]: [ - new PokemonSpeciesEvolution(Species.MASQUERAIN, 22, null, null) + new SpeciesEvolution(Species.MASQUERAIN, 22, null, null) ], [Species.SHROOMISH]: [ - new PokemonSpeciesEvolution(Species.BRELOOM, 23, null, null) + new SpeciesEvolution(Species.BRELOOM, 23, null, null) ], [Species.SLAKOTH]: [ - new PokemonSpeciesEvolution(Species.VIGOROTH, 18, null, null) + new SpeciesEvolution(Species.VIGOROTH, 18, null, null) ], [Species.VIGOROTH]: [ - new PokemonSpeciesEvolution(Species.SLAKING, 36, null, null) + new SpeciesEvolution(Species.SLAKING, 36, null, null) ], [Species.NINCADA]: [ - new PokemonSpeciesEvolution(Species.NINJASK, 20, null, null), - new PokemonSpeciesEvolution(Species.SHEDINJA, 20, null, 'empty spot in party, Pokéball in bag', WildEvolutionRate.ULTRA_RARE) + new SpeciesEvolution(Species.NINJASK, 20, null, null), + new SpeciesEvolution(Species.SHEDINJA, 20, null, 'empty spot in party, Pokéball in bag') ], [Species.WHISMUR]: [ - new PokemonSpeciesEvolution(Species.LOUDRED, 20, null, null) + new SpeciesEvolution(Species.LOUDRED, 20, null, null) ], [Species.LOUDRED]: [ - new PokemonSpeciesEvolution(Species.EXPLOUD, 40, null, null) + new SpeciesEvolution(Species.EXPLOUD, 40, null, null) ], [Species.MAKUHITA]: [ - new PokemonSpeciesEvolution(Species.HARIYAMA, 24, null, null) + new SpeciesEvolution(Species.HARIYAMA, 24, null, null) ], [Species.ARON]: [ - new PokemonSpeciesEvolution(Species.LAIRON, 32, null, null) + new SpeciesEvolution(Species.LAIRON, 32, null, null) ], [Species.LAIRON]: [ - new PokemonSpeciesEvolution(Species.AGGRON, 42, null, null) + new SpeciesEvolution(Species.AGGRON, 42, null, null) ], [Species.MEDITITE]: [ - new PokemonSpeciesEvolution(Species.MEDICHAM, 37, null, null) + new SpeciesEvolution(Species.MEDICHAM, 37, null, null) ], [Species.ELECTRIKE]: [ - new PokemonSpeciesEvolution(Species.MANECTRIC, 26, null, null) + new SpeciesEvolution(Species.MANECTRIC, 26, null, null) ], [Species.GULPIN]: [ - new PokemonSpeciesEvolution(Species.SWALOT, 26, null, null) + new SpeciesEvolution(Species.SWALOT, 26, null, null) ], [Species.CARVANHA]: [ - new PokemonSpeciesEvolution(Species.SHARPEDO, 30, null, null) + new SpeciesEvolution(Species.SHARPEDO, 30, null, null) ], [Species.WAILMER]: [ - new PokemonSpeciesEvolution(Species.WAILORD, 40, null, null, WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.WAILORD, 40, null, null) ], [Species.NUMEL]: [ - new PokemonSpeciesEvolution(Species.CAMERUPT, 33, null, null) + new SpeciesEvolution(Species.CAMERUPT, 33, null, null) ], [Species.SPOINK]: [ - new PokemonSpeciesEvolution(Species.GRUMPIG, 32, null, null) + new SpeciesEvolution(Species.GRUMPIG, 32, null, null) ], [Species.TRAPINCH]: [ - new PokemonSpeciesEvolution(Species.VIBRAVA, 35, null, null) + new SpeciesEvolution(Species.VIBRAVA, 35, null, null) ], [Species.VIBRAVA]: [ - new PokemonSpeciesEvolution(Species.FLYGON, 45, null, null) + new SpeciesEvolution(Species.FLYGON, 45, null, null) ], [Species.CACNEA]: [ - new PokemonSpeciesEvolution(Species.CACTURNE, 32, null, null) + new SpeciesEvolution(Species.CACTURNE, 32, null, null) ], [Species.SWABLU]: [ - new PokemonSpeciesEvolution(Species.ALTARIA, 35, null, null) + new SpeciesEvolution(Species.ALTARIA, 35, null, null) ], [Species.BARBOACH]: [ - new PokemonSpeciesEvolution(Species.WHISCASH, 30, null, null) + new SpeciesEvolution(Species.WHISCASH, 30, null, null) ], [Species.CORPHISH]: [ - new PokemonSpeciesEvolution(Species.CRAWDAUNT, 30, null, null) + new SpeciesEvolution(Species.CRAWDAUNT, 30, null, null) ], [Species.BALTOY]: [ - new PokemonSpeciesEvolution(Species.CLAYDOL, 36, null, null) + new SpeciesEvolution(Species.CLAYDOL, 36, null, null) ], [Species.LILEEP]: [ - new PokemonSpeciesEvolution(Species.CRADILY, 40, null, null) + new SpeciesEvolution(Species.CRADILY, 40, null, null) ], [Species.ANORITH]: [ - new PokemonSpeciesEvolution(Species.ARMALDO, 40, null, null) + new SpeciesEvolution(Species.ARMALDO, 40, null, null) ], [Species.SHUPPET]: [ - new PokemonSpeciesEvolution(Species.BANETTE, 37, null, null) + new SpeciesEvolution(Species.BANETTE, 37, null, null) ], [Species.DUSKULL]: [ - new PokemonSpeciesEvolution(Species.DUSCLOPS, 37, null, null) + new SpeciesEvolution(Species.DUSCLOPS, 37, null, null) ], [Species.SNORUNT]: [ - new PokemonSpeciesEvolution(Species.GLALIE, 42, null, null), - new PokemonSpeciesEvolution(Species.FROSLASS, 1, "Dawn Stone", new PokemonSpeciesEvolutionCondition((p: Pokemon) => !p.gender, true), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.GLALIE, 42, null, null), + new SpeciesEvolution(Species.FROSLASS, 1, "Dawn Stone", new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.SPHEAL]: [ - new PokemonSpeciesEvolution(Species.SEALEO, 32, null, null) + new SpeciesEvolution(Species.SEALEO, 32, null, null) ], [Species.SEALEO]: [ - new PokemonSpeciesEvolution(Species.WALREIN, 44, null, null) + new SpeciesEvolution(Species.WALREIN, 44, null, null) ], [Species.BAGON]: [ - new PokemonSpeciesEvolution(Species.SHELGON, 30, null, null) + new SpeciesEvolution(Species.SHELGON, 30, null, null) ], [Species.SHELGON]: [ - new PokemonSpeciesEvolution(Species.SALAMENCE, 50, null, null) + new SpeciesEvolution(Species.SALAMENCE, 50, null, null) ], [Species.BELDUM]: [ - new PokemonSpeciesEvolution(Species.METANG, 20, null, null) + new SpeciesEvolution(Species.METANG, 20, null, null) ], [Species.METANG]: [ - new PokemonSpeciesEvolution(Species.METAGROSS, 45, null, null) + new SpeciesEvolution(Species.METAGROSS, 45, null, null) ], [Species.TURTWIG]: [ - new PokemonSpeciesEvolution(Species.GROTLE, 18, null, null) + new SpeciesEvolution(Species.GROTLE, 18, null, null) ], [Species.GROTLE]: [ - new PokemonSpeciesEvolution(Species.TORTERRA, 32, null, null) + new SpeciesEvolution(Species.TORTERRA, 32, null, null) ], [Species.CHIMCHAR]: [ - new PokemonSpeciesEvolution(Species.MONFERNO, 14, null, null) + new SpeciesEvolution(Species.MONFERNO, 14, null, null) ], [Species.MONFERNO]: [ - new PokemonSpeciesEvolution(Species.INFERNAPE, 36, null, null) + new SpeciesEvolution(Species.INFERNAPE, 36, null, null) ], [Species.PIPLUP]: [ - new PokemonSpeciesEvolution(Species.PRINPLUP, 16, null, null) + new SpeciesEvolution(Species.PRINPLUP, 16, null, null) ], [Species.PRINPLUP]: [ - new PokemonSpeciesEvolution(Species.EMPOLEON, 36, null, null) + new SpeciesEvolution(Species.EMPOLEON, 36, null, null) ], [Species.STARLY]: [ - new PokemonSpeciesEvolution(Species.STARAVIA, 14, null, null) + new SpeciesEvolution(Species.STARAVIA, 14, null, null) ], [Species.STARAVIA]: [ - new PokemonSpeciesEvolution(Species.STARAPTOR, 34, null, null) + new SpeciesEvolution(Species.STARAPTOR, 34, null, null) ], [Species.BIDOOF]: [ - new PokemonSpeciesEvolution(Species.BIBAREL, 15, null, null) + new SpeciesEvolution(Species.BIBAREL, 15, null, null) ], [Species.KRICKETOT]: [ - new PokemonSpeciesEvolution(Species.KRICKETUNE, 10, null, null) + new SpeciesEvolution(Species.KRICKETUNE, 10, null, null) ], [Species.SHINX]: [ - new PokemonSpeciesEvolution(Species.LUXIO, 15, null, null) + new SpeciesEvolution(Species.LUXIO, 15, null, null) ], [Species.LUXIO]: [ - new PokemonSpeciesEvolution(Species.LUXRAY, 30, null, null) + new SpeciesEvolution(Species.LUXRAY, 30, null, null) ], [Species.CRANIDOS]: [ - new PokemonSpeciesEvolution(Species.RAMPARDOS, 30, null, null) + new SpeciesEvolution(Species.RAMPARDOS, 30, null, null) ], [Species.SHIELDON]: [ - new PokemonSpeciesEvolution(Species.BASTIODON, 30, null, null) + new SpeciesEvolution(Species.BASTIODON, 30, null, null) ], [Species.BURMY]: [ - new PokemonSpeciesEvolution(Species.MOTHIM, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.gender, true)), - new PokemonSpeciesEvolution(Species.WORMADAM, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && grass*/, true)), - new PokemonSpeciesEvolution(Species.WORMADAM, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && cave*/, true)), - new PokemonSpeciesEvolution(Species.WORMADAM, 20, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && building*/, true)) + new SpeciesEvolution(Species.MOTHIM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.gender, true)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && grass*/, true)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && cave*/, true)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender/* && building*/, true)) ], [Species.COMBEE]: [ - new PokemonSpeciesEvolution(Species.VESPIQUEN, 21, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => !p.gender, true)) + new SpeciesEvolution(Species.VESPIQUEN, 21, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true)) ], [Species.BUIZEL]: [ - new PokemonSpeciesEvolution(Species.FLOATZEL, 26, null, null) + new SpeciesEvolution(Species.FLOATZEL, 26, null, null) ], [Species.CHERUBI]: [ - new PokemonSpeciesEvolution(Species.CHERRIM, 25, null, null) + new SpeciesEvolution(Species.CHERRIM, 25, null, null) ], [Species.SHELLOS]: [ - new PokemonSpeciesEvolution(Species.GASTRODON, 30, null, null) + new SpeciesEvolution(Species.GASTRODON, 30, null, null) ], [Species.DRIFLOON]: [ - new PokemonSpeciesEvolution(Species.DRIFBLIM, 28, null, null) + new SpeciesEvolution(Species.DRIFBLIM, 28, null, null) ], [Species.GLAMEOW]: [ - new PokemonSpeciesEvolution(Species.PURUGLY, 38, null, null) + new SpeciesEvolution(Species.PURUGLY, 38, null, null) ], [Species.STUNKY]: [ - new PokemonSpeciesEvolution(Species.SKUNTANK, 34, null, null) + new SpeciesEvolution(Species.SKUNTANK, 34, null, null) ], [Species.BRONZOR]: [ - new PokemonSpeciesEvolution(Species.BRONZONG, 33, null, null) + new SpeciesEvolution(Species.BRONZONG, 33, null, null) ], [Species.GIBLE]: [ - new PokemonSpeciesEvolution(Species.GABITE, 24, null, null) + new SpeciesEvolution(Species.GABITE, 24, null, null) ], [Species.GABITE]: [ - new PokemonSpeciesEvolution(Species.GARCHOMP, 48, null, null) + new SpeciesEvolution(Species.GARCHOMP, 48, null, null) ], [Species.HIPPOPOTAS]: [ - new PokemonSpeciesEvolution(Species.HIPPOWDON, 34, null, null) + new SpeciesEvolution(Species.HIPPOWDON, 34, null, null) ], [Species.SKORUPI]: [ - new PokemonSpeciesEvolution(Species.DRAPION, 40, null, null) + new SpeciesEvolution(Species.DRAPION, 40, null, null) ], [Species.CROAGUNK]: [ - new PokemonSpeciesEvolution(Species.TOXICROAK, 37, null, null) + new SpeciesEvolution(Species.TOXICROAK, 37, null, null) ], [Species.FINNEON]: [ - new PokemonSpeciesEvolution(Species.LUMINEON, 31, null, null) + new SpeciesEvolution(Species.LUMINEON, 31, null, null) ], [Species.SNOVER]: [ - new PokemonSpeciesEvolution(Species.ABOMASNOW, 40, null, null) + new SpeciesEvolution(Species.ABOMASNOW, 40, null, null) ], [Species.SNIVY]: [ - new PokemonSpeciesEvolution(Species.SERVINE, 17, null, null) + new SpeciesEvolution(Species.SERVINE, 17, null, null) ], [Species.SERVINE]: [ - new PokemonSpeciesEvolution(Species.SERPERIOR, 36, null, null) + new SpeciesEvolution(Species.SERPERIOR, 36, null, null) ], [Species.TEPIG]: [ - new PokemonSpeciesEvolution(Species.PIGNITE, 17, null, null) + new SpeciesEvolution(Species.PIGNITE, 17, null, null) ], [Species.PIGNITE]: [ - new PokemonSpeciesEvolution(Species.EMBOAR, 36, null, null) + new SpeciesEvolution(Species.EMBOAR, 36, null, null) ], [Species.OSHAWOTT]: [ - new PokemonSpeciesEvolution(Species.DEWOTT, 17, null, null) + new SpeciesEvolution(Species.DEWOTT, 17, null, null) ], [Species.DEWOTT]: [ - new PokemonSpeciesEvolution(Species.SAMUROTT, 36, null, null) + new SpeciesEvolution(Species.SAMUROTT, 36, null, null) ], [Species.PATRAT]: [ - new PokemonSpeciesEvolution(Species.WATCHOG, 20, null, null) + new SpeciesEvolution(Species.WATCHOG, 20, null, null) ], [Species.LILLIPUP]: [ - new PokemonSpeciesEvolution(Species.HERDIER, 16, null, null) + new SpeciesEvolution(Species.HERDIER, 16, null, null) ], [Species.HERDIER]: [ - new PokemonSpeciesEvolution(Species.STOUTLAND, 32, null, null) + new SpeciesEvolution(Species.STOUTLAND, 32, null, null) ], [Species.PURRLOIN]: [ - new PokemonSpeciesEvolution(Species.LIEPARD, 20, null, null) + new SpeciesEvolution(Species.LIEPARD, 20, null, null) ], [Species.PIDOVE]: [ - new PokemonSpeciesEvolution(Species.TRANQUILL, 21, null, null) + new SpeciesEvolution(Species.TRANQUILL, 21, null, null) ], [Species.TRANQUILL]: [ - new PokemonSpeciesEvolution(Species.UNFEZANT, 32, null, null) + new SpeciesEvolution(Species.UNFEZANT, 32, null, null) ], [Species.BLITZLE]: [ - new PokemonSpeciesEvolution(Species.ZEBSTRIKA, 27, null, null) + new SpeciesEvolution(Species.ZEBSTRIKA, 27, null, null) ], [Species.ROGGENROLA]: [ - new PokemonSpeciesEvolution(Species.BOLDORE, 25, null, null) + new SpeciesEvolution(Species.BOLDORE, 25, null, null) ], [Species.DRILBUR]: [ - new PokemonSpeciesEvolution(Species.EXCADRILL, 31, null, null) + new SpeciesEvolution(Species.EXCADRILL, 31, null, null) ], [Species.TIMBURR]: [ - new PokemonSpeciesEvolution(Species.GURDURR, 25, null, null) + new SpeciesEvolution(Species.GURDURR, 25, null, null) ], [Species.TYMPOLE]: [ - new PokemonSpeciesEvolution(Species.PALPITOAD, 25, null, null) + new SpeciesEvolution(Species.PALPITOAD, 25, null, null) ], [Species.PALPITOAD]: [ - new PokemonSpeciesEvolution(Species.SEISMITOAD, 36, null, null) + new SpeciesEvolution(Species.SEISMITOAD, 36, null, null) ], [Species.SEWADDLE]: [ - new PokemonSpeciesEvolution(Species.SWADLOON, 20, null, null) + new SpeciesEvolution(Species.SWADLOON, 20, null, null) ], [Species.VENIPEDE]: [ - new PokemonSpeciesEvolution(Species.WHIRLIPEDE, 22, null, null) + new SpeciesEvolution(Species.WHIRLIPEDE, 22, null, null) ], [Species.WHIRLIPEDE]: [ - new PokemonSpeciesEvolution(Species.SCOLIPEDE, 30, null, null) + new SpeciesEvolution(Species.SCOLIPEDE, 30, null, null) ], [Species.SANDILE]: [ - new PokemonSpeciesEvolution(Species.KROKOROK, 29, null, null) + new SpeciesEvolution(Species.KROKOROK, 29, null, null) ], [Species.KROKOROK]: [ - new PokemonSpeciesEvolution(Species.KROOKODILE, 40, null, null) + new SpeciesEvolution(Species.KROOKODILE, 40, null, null) ], [Species.DARUMAKA]: [ - new PokemonSpeciesEvolution(Species.DARMANITAN, 35, null, null) + new SpeciesEvolution(Species.DARMANITAN, 35, null, null) ], [Species.DWEBBLE]: [ - new PokemonSpeciesEvolution(Species.CRUSTLE, 34, null, null) + new SpeciesEvolution(Species.CRUSTLE, 34, null, null) ], [Species.SCRAGGY]: [ - new PokemonSpeciesEvolution(Species.SCRAFTY, 39, null, null) + new SpeciesEvolution(Species.SCRAFTY, 39, null, null) ], [Species.YAMASK]: [ - new PokemonSpeciesEvolution(Species.COFAGRIGUS, 34, null, null) + new SpeciesEvolution(Species.COFAGRIGUS, 34, null, null) ], [Species.TIRTOUGA]: [ - new PokemonSpeciesEvolution(Species.CARRACOSTA, 37, null, null) + new SpeciesEvolution(Species.CARRACOSTA, 37, null, null) ], [Species.ARCHEN]: [ - new PokemonSpeciesEvolution(Species.ARCHEOPS, 37, null, null) + new SpeciesEvolution(Species.ARCHEOPS, 37, null, null) ], [Species.TRUBBISH]: [ - new PokemonSpeciesEvolution(Species.GARBODOR, 36, null, null) + new SpeciesEvolution(Species.GARBODOR, 36, null, null) ], [Species.ZORUA]: [ - new PokemonSpeciesEvolution(Species.ZOROARK, 30, null, null) + new SpeciesEvolution(Species.ZOROARK, 30, null, null) ], [Species.GOTHITA]: [ - new PokemonSpeciesEvolution(Species.GOTHORITA, 32, null, null) + new SpeciesEvolution(Species.GOTHORITA, 32, null, null) ], [Species.GOTHORITA]: [ - new PokemonSpeciesEvolution(Species.GOTHITELLE, 41, null, null) + new SpeciesEvolution(Species.GOTHITELLE, 41, null, null) ], [Species.SOLOSIS]: [ - new PokemonSpeciesEvolution(Species.DUOSION, 32, null, null) + new SpeciesEvolution(Species.DUOSION, 32, null, null) ], [Species.DUOSION]: [ - new PokemonSpeciesEvolution(Species.REUNICLUS, 41, null, null) + new SpeciesEvolution(Species.REUNICLUS, 41, null, null) ], [Species.DUCKLETT]: [ - new PokemonSpeciesEvolution(Species.SWANNA, 35, null, null) + new SpeciesEvolution(Species.SWANNA, 35, null, null) ], [Species.VANILLITE]: [ - new PokemonSpeciesEvolution(Species.VANILLISH, 35, null, null) + new SpeciesEvolution(Species.VANILLISH, 35, null, null) ], [Species.VANILLISH]: [ - new PokemonSpeciesEvolution(Species.VANILLUXE, 47, null, null) + new SpeciesEvolution(Species.VANILLUXE, 47, null, null) ], [Species.DEERLING]: [ - new PokemonSpeciesEvolution(Species.SAWSBUCK, 34, null, null) + new SpeciesEvolution(Species.SAWSBUCK, 34, null, null) ], [Species.FOONGUS]: [ - new PokemonSpeciesEvolution(Species.AMOONGUSS, 39, null, null) + new SpeciesEvolution(Species.AMOONGUSS, 39, null, null) ], [Species.FRILLISH]: [ - new PokemonSpeciesEvolution(Species.JELLICENT, 40, null, null) + new SpeciesEvolution(Species.JELLICENT, 40, null, null) ], [Species.JOLTIK]: [ - new PokemonSpeciesEvolution(Species.GALVANTULA, 36, null, null) + new SpeciesEvolution(Species.GALVANTULA, 36, null, null) ], [Species.FERROSEED]: [ - new PokemonSpeciesEvolution(Species.FERROTHORN, 40, null, null) + new SpeciesEvolution(Species.FERROTHORN, 40, null, null) ], [Species.KLINK]: [ - new PokemonSpeciesEvolution(Species.KLANG, 38, null, null) + new SpeciesEvolution(Species.KLANG, 38, null, null) ], [Species.KLANG]: [ - new PokemonSpeciesEvolution(Species.KLINKLANG, 49, null, null) + new SpeciesEvolution(Species.KLINKLANG, 49, null, null) ], [Species.TYNAMO]: [ - new PokemonSpeciesEvolution(Species.EELEKTRIK, 39, null, null) + new SpeciesEvolution(Species.EELEKTRIK, 39, null, null) ], [Species.ELGYEM]: [ - new PokemonSpeciesEvolution(Species.BEHEEYEM, 42, null, null) + new SpeciesEvolution(Species.BEHEEYEM, 42, null, null) ], [Species.LITWICK]: [ - new PokemonSpeciesEvolution(Species.LAMPENT, 41, null, null) + new SpeciesEvolution(Species.LAMPENT, 41, null, null) ], [Species.AXEW]: [ - new PokemonSpeciesEvolution(Species.FRAXURE, 38, null, null) + new SpeciesEvolution(Species.FRAXURE, 38, null, null) ], [Species.FRAXURE]: [ - new PokemonSpeciesEvolution(Species.HAXORUS, 48, null, null) + new SpeciesEvolution(Species.HAXORUS, 48, null, null) ], [Species.CUBCHOO]: [ - new PokemonSpeciesEvolution(Species.BEARTIC, 37, null, null) + new SpeciesEvolution(Species.BEARTIC, 37, null, null) ], [Species.MIENFOO]: [ - new PokemonSpeciesEvolution(Species.MIENSHAO, 50, null, null) + new SpeciesEvolution(Species.MIENSHAO, 50, null, null) ], [Species.GOLETT]: [ - new PokemonSpeciesEvolution(Species.GOLURK, 43, null, null) + new SpeciesEvolution(Species.GOLURK, 43, null, null) ], [Species.PAWNIARD]: [ - new PokemonSpeciesEvolution(Species.BISHARP, 52, null, null) + new SpeciesEvolution(Species.BISHARP, 52, null, null) ], [Species.RUFFLET]: [ - new PokemonSpeciesEvolution(Species.BRAVIARY, 54, null, null) + new SpeciesEvolution(Species.BRAVIARY, 54, null, null) ], [Species.VULLABY]: [ - new PokemonSpeciesEvolution(Species.MANDIBUZZ, 54, null, null) + new SpeciesEvolution(Species.MANDIBUZZ, 54, null, null) ], [Species.DEINO]: [ - new PokemonSpeciesEvolution(Species.ZWEILOUS, 50, null, null) + new SpeciesEvolution(Species.ZWEILOUS, 50, null, null) ], [Species.ZWEILOUS]: [ - new PokemonSpeciesEvolution(Species.HYDREIGON, 64, null, null) + new SpeciesEvolution(Species.HYDREIGON, 64, null, null) ], [Species.LARVESTA]: [ - new PokemonSpeciesEvolution(Species.VOLCARONA, 59, null, null) + new SpeciesEvolution(Species.VOLCARONA, 59, null, null) ], [Species.PIKACHU]: [ - new PokemonSpeciesEvolution(Species.RAICHU, 1, "Thunder Stone", null) + new SpeciesEvolution(Species.RAICHU, 1, "Thunder Stone", null) ], [Species.NIDORINA]: [ - new PokemonSpeciesEvolution(Species.NIDOQUEEN, 1, "Moon Stone", null) + new SpeciesEvolution(Species.NIDOQUEEN, 1, "Moon Stone", null) ], [Species.NIDORINO]: [ - new PokemonSpeciesEvolution(Species.NIDOKING, 1, "Moon Stone", null) + new SpeciesEvolution(Species.NIDOKING, 1, "Moon Stone", null) ], [Species.CLEFAIRY]: [ - new PokemonSpeciesEvolution(Species.CLEFABLE, 1, "Moon Stone", null) + new SpeciesEvolution(Species.CLEFABLE, 1, "Moon Stone", null) ], [Species.VULPIX]: [ - new PokemonSpeciesEvolution(Species.NINETALES, 1, "Fire Stone", null) + new SpeciesEvolution(Species.NINETALES, 1, "Fire Stone", null) ], [Species.JIGGLYPUFF]: [ - new PokemonSpeciesEvolution(Species.WIGGLYTUFF, 1, "Moon Stone", null) + new SpeciesEvolution(Species.WIGGLYTUFF, 1, "Moon Stone", null) ], [Species.GLOOM]: [ - new PokemonSpeciesEvolution(Species.VILEPLUME, 1, "Leaf Stone", null), - new PokemonSpeciesEvolution(Species.BELLOSSOM, 1, "Sun Stone", null) + new SpeciesEvolution(Species.VILEPLUME, 1, "Leaf Stone", null), + new SpeciesEvolution(Species.BELLOSSOM, 1, "Sun Stone", null) ], [Species.GROWLITHE]: [ - new PokemonSpeciesEvolution(Species.ARCANINE, 1, "Fire Stone", null) + new SpeciesEvolution(Species.ARCANINE, 1, "Fire Stone", null) ], [Species.POLIWHIRL]: [ - new PokemonSpeciesEvolution(Species.POLIWRATH, 1, "Water Stone", null), - new PokemonSpeciesEvolution(Species.POLITOED, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.POLIWRATH, 1, "Water Stone", null, SpeciesWildEvolutionRate.SLOW), + new SpeciesEvolution(Species.POLITOED, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), SpeciesWildEvolutionRate.SLOW) ], [Species.WEEPINBELL]: [ - new PokemonSpeciesEvolution(Species.VICTREEBEL, 1, "Leaf Stone", null) + new SpeciesEvolution(Species.VICTREEBEL, 1, "Leaf Stone", null) ], [Species.MAGNETON]: [ - new PokemonSpeciesEvolution(Species.MAGNEZONE, 1, "Thunder Stone", null) + new SpeciesEvolution(Species.MAGNEZONE, 1, "Thunder Stone", null) ], [Species.SHELLDER]: [ - new PokemonSpeciesEvolution(Species.CLOYSTER, 1, "Water Stone", null) + new SpeciesEvolution(Species.CLOYSTER, 1, "Water Stone", null) ], [Species.EXEGGCUTE]: [ - new PokemonSpeciesEvolution(Species.EXEGGUTOR, 1, "Leaf Stone", null) + new SpeciesEvolution(Species.EXEGGUTOR, 1, "Leaf Stone", null) ], [Species.STARYU]: [ - new PokemonSpeciesEvolution(Species.STARMIE, 1, "Water Stone", null) + new SpeciesEvolution(Species.STARMIE, 1, "Water Stone", null) ], [Species.EEVEE]: [ - new PokemonSpeciesEvolution(Species.ESPEON, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */), WildEvolutionRate.RARE), - new PokemonSpeciesEvolution(Species.UMBREON, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */), WildEvolutionRate.RARE), - new PokemonSpeciesEvolution(Species.VAPOREON, 1, "Water Stone", null, WildEvolutionRate.UNCOMMON), - new PokemonSpeciesEvolution(Species.JOLTEON, 1, "Thunder Stone", null, WildEvolutionRate.UNCOMMON), - new PokemonSpeciesEvolution(Species.FLAREON, 1, "Fire Stone", null, WildEvolutionRate.UNCOMMON), - new PokemonSpeciesEvolution(Species.LEAFEON, 1, "Leaf Stone", null, WildEvolutionRate.UNCOMMON), - new PokemonSpeciesEvolution(Species.GLACEON, 1, "Ice Stone", null, WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.ESPEON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */), SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.UMBREON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */), SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.VAPOREON, 1, "Water Stone", null, SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.JOLTEON, 1, "Thunder Stone", null, SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.FLAREON, 1, "Fire Stone", null, SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.LEAFEON, 1, "Leaf Stone", null, SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.GLACEON, 1, "Ice Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.TOGETIC]: [ - new PokemonSpeciesEvolution(Species.TOGEKISS, 1, "Shiny Stone", null, WildEvolutionRate.RARE) + new SpeciesEvolution(Species.TOGEKISS, 1, "Shiny Stone", null, SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.SUNKERN]: [ - new PokemonSpeciesEvolution(Species.SUNFLORA, 1, "Sun Stone", null) + new SpeciesEvolution(Species.SUNFLORA, 1, "Sun Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.MURKROW]: [ - new PokemonSpeciesEvolution(Species.HONCHKROW, 1, "Dusk Stone", null, WildEvolutionRate.RARE) + new SpeciesEvolution(Species.HONCHKROW, 1, "Dusk Stone", null, SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.MISDREAVUS]: [ - new PokemonSpeciesEvolution(Species.MISMAGIUS, 1, "Dusk Stone", null, WildEvolutionRate.RARE) + new SpeciesEvolution(Species.MISMAGIUS, 1, "Dusk Stone", null, SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.LOMBRE]: [ - new PokemonSpeciesEvolution(Species.LUDICOLO, 1, "Water Stone", null) + new SpeciesEvolution(Species.LUDICOLO, 1, "Water Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.NUZLEAF]: [ - new PokemonSpeciesEvolution(Species.SHIFTRY, 1, "Leaf Stone", null) + new SpeciesEvolution(Species.SHIFTRY, 1, "Leaf Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.SKITTY]: [ - new PokemonSpeciesEvolution(Species.DELCATTY, 1, "Moon Stone", null) + new SpeciesEvolution(Species.DELCATTY, 1, "Moon Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.ROSELIA]: [ - new PokemonSpeciesEvolution(Species.ROSERADE, 1, "Shiny Stone", null) + new SpeciesEvolution(Species.ROSERADE, 1, "Shiny Stone", null, SpeciesWildEvolutionRate.SLOW) ], [Species.PANSAGE]: [ - new PokemonSpeciesEvolution(Species.SIMISAGE, 1, "Leaf Stone", null) + new SpeciesEvolution(Species.SIMISAGE, 1, "Leaf Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.PANSEAR]: [ - new PokemonSpeciesEvolution(Species.SIMISEAR, 1, "Fire Stone", null) + new SpeciesEvolution(Species.SIMISEAR, 1, "Fire Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.PANPOUR]: [ - new PokemonSpeciesEvolution(Species.SIMIPOUR, 1, "Water Stone", null) + new SpeciesEvolution(Species.SIMIPOUR, 1, "Water Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.MUNNA]: [ - new PokemonSpeciesEvolution(Species.MUSHARNA, 1, "Moon Stone", null) + new SpeciesEvolution(Species.MUSHARNA, 1, "Moon Stone", null, SpeciesWildEvolutionRate.SLOW) ], [Species.COTTONEE]: [ - new PokemonSpeciesEvolution(Species.WHIMSICOTT, 1, "Sun Stone", null) + new SpeciesEvolution(Species.WHIMSICOTT, 1, "Sun Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.PETILIL]: [ - new PokemonSpeciesEvolution(Species.LILLIGANT, 1, "Sun Stone", null) + new SpeciesEvolution(Species.LILLIGANT, 1, "Sun Stone", null, SpeciesWildEvolutionRate.MEDIUM) ], [Species.MINCCINO]: [ - new PokemonSpeciesEvolution(Species.CINCCINO, 1, "Shiny Stone", null, WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.CINCCINO, 1, "Shiny Stone", null, SpeciesWildEvolutionRate.FAST) ], [Species.EELEKTRIK]: [ - new PokemonSpeciesEvolution(Species.EELEKTROSS, 1, "Thunder Stone", null) + new SpeciesEvolution(Species.EELEKTROSS, 1, "Thunder Stone", null, SpeciesWildEvolutionRate.SLOW) ], [Species.LAMPENT]: [ - new PokemonSpeciesEvolution(Species.CHANDELURE, 1, "Dusk Stone", null) + new SpeciesEvolution(Species.CHANDELURE, 1, "Dusk Stone", null, SpeciesWildEvolutionRate.SLOW) ], [Species.KADABRA]: [ - new PokemonSpeciesEvolution(Species.ALAKAZAM, 1, "Link Cable", null) + new SpeciesEvolution(Species.ALAKAZAM, 1, "Link Cable", null, SpeciesWildEvolutionRate.SLOW) ], [Species.MACHOKE]: [ - new PokemonSpeciesEvolution(Species.MACHAMP, 1, "Link Cable", null, WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.MACHAMP, 1, "Link Cable", null, SpeciesWildEvolutionRate.FAST) ], [Species.GRAVELER]: [ - new PokemonSpeciesEvolution(Species.GOLEM, 1, "Link Cable", null, WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.GOLEM, 1, "Link Cable", null, SpeciesWildEvolutionRate.FAST) ], [Species.SLOWPOKE]: [ - new PokemonSpeciesEvolution(Species.SLOWKING, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.SLOWKING, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), SpeciesWildEvolutionRate.SLOW) ], [Species.HAUNTER]: [ - new PokemonSpeciesEvolution(Species.GENGAR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true), WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.GENGAR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true), SpeciesWildEvolutionRate.FAST) ], [Species.ONIX]: [ - new PokemonSpeciesEvolution(Species.STEELIX, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/ ), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.STEELIX, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/ ), SpeciesWildEvolutionRate.SLOW) ], [Species.RHYDON]: [ - new PokemonSpeciesEvolution(Species.RHYPERIOR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Protector */), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.RHYPERIOR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Protector */), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.SEADRA]: [ - new PokemonSpeciesEvolution(Species.KINGDRA, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Dragon scale*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.KINGDRA, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Dragon scale*/), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.SCYTHER]: [ - new PokemonSpeciesEvolution(Species.SCIZOR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/), WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.SCIZOR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.ELECTABUZZ]: [ - new PokemonSpeciesEvolution(Species.ELECTIVIRE, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Electirizer*/), WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.ELECTIVIRE, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Electirizer*/), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.MAGMAR]: [ - new PokemonSpeciesEvolution(Species.MAGMORTAR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Magmarizer*/), WildEvolutionRate.UNCOMMON) + new SpeciesEvolution(Species.MAGMORTAR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Magmarizer*/), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.PORYGON]: [ - new PokemonSpeciesEvolution(Species.PORYGON2, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /*Upgrade*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.PORYGON2, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /*Upgrade*/), SpeciesWildEvolutionRate.SLOW) ], [Species.PORYGON2]: [ - new PokemonSpeciesEvolution(Species.PORYGON_Z, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Dubious disc*/), WildEvolutionRate.ULTRA_RARE) + new SpeciesEvolution(Species.PORYGON_Z, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Dubious disc*/), SpeciesWildEvolutionRate.MEDIUM) ], [Species.FEEBAS]: [ - new PokemonSpeciesEvolution(Species.MILOTIC, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Prism scale*/), WildEvolutionRate.ULTRA_RARE) + new SpeciesEvolution(Species.MILOTIC, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Prism scale*/), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.DUSCLOPS]: [ - new PokemonSpeciesEvolution(Species.DUSKNOIR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Reaper cloth*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.DUSKNOIR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Reaper cloth*/), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.CLAMPERL]: [ - new PokemonSpeciesEvolution(Species.HUNTAIL, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea tooth*/), WildEvolutionRate.RARE), - new PokemonSpeciesEvolution(Species.GOREBYSS, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea scale*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.HUNTAIL, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea tooth*/), SpeciesWildEvolutionRate.MEDIUM), + new SpeciesEvolution(Species.GOREBYSS, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Deep sea scale*/), SpeciesWildEvolutionRate.MEDIUM) ], [Species.BOLDORE]: [ - new PokemonSpeciesEvolution(Species.GIGALITH, 1, "Link Cable", null) + new SpeciesEvolution(Species.GIGALITH, 1, "Link Cable", null, SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.GURDURR]: [ - new PokemonSpeciesEvolution(Species.CONKELDURR, 1, "Link Cable", null) + new SpeciesEvolution(Species.CONKELDURR, 1, "Link Cable", null, SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.KARRABLAST]: [ - new PokemonSpeciesEvolution(Species.ESCAVALIER, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Trade with shelmet??*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.ESCAVALIER, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Trade with shelmet??*/), SpeciesWildEvolutionRate.SLOW) ], [Species.SHELMET]: [ - new PokemonSpeciesEvolution(Species.ACCELGOR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Trade with karrablast??*/), WildEvolutionRate.RARE) + new SpeciesEvolution(Species.ACCELGOR, 1, "Link Cable", new SpeciesEvolutionCondition((p: Pokemon) => true /* Trade with karrablast??*/), SpeciesWildEvolutionRate.SLOW) ], [Species.PICHU]: [ - new PokemonSpeciesEvolution(Species.PIKACHU, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.FAST) ], [Species.CLEFFA]: [ - new PokemonSpeciesEvolution(Species.CLEFAIRY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.FAST) ], [Species.IGGLYBUFF]: [ - new PokemonSpeciesEvolution(Species.JIGGLYPUFF, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.JIGGLYPUFF, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.FAST) ], [Species.GOLBAT]: [ - new PokemonSpeciesEvolution(Species.CROBAT, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.CROBAT, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.CHANSEY]: [ - new PokemonSpeciesEvolution(Species.BLISSEY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.MUNCHLAX]: [ - new PokemonSpeciesEvolution(Species.SNORLAX, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.SNORLAX, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.VERY_SLOW) ], [Species.TOGEPI]: [ - new PokemonSpeciesEvolution(Species.TOGETIC, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.TOGETIC, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.FAST) ], [Species.AZURILL]: [ - new PokemonSpeciesEvolution(Species.MARILL, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.MARILL, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.FAST) ], [Species.BUDEW]: [ - new PokemonSpeciesEvolution(Species.ROSELIA, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 /* daytime */)) + new SpeciesEvolution(Species.ROSELIA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 /* daytime */), SpeciesWildEvolutionRate.FAST) ], [Species.CHINGLING]: [ - new PokemonSpeciesEvolution(Species.CHIMECHO, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */)) + new SpeciesEvolution(Species.CHIMECHO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */), SpeciesWildEvolutionRate.MEDIUM) ], [Species.BUNEARY]: [ - new PokemonSpeciesEvolution(Species.LOPUNNY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.LOPUNNY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.MEDIUM) ], [Species.RIOLU]: [ - new PokemonSpeciesEvolution(Species.LUCARIO, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */)) + new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */), SpeciesWildEvolutionRate.MEDIUM) ], [Species.WOOBAT]: [ - new PokemonSpeciesEvolution(Species.SWOOBAT, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.SWOOBAT, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.MEDIUM) ], [Species.SWADLOON]: [ - new PokemonSpeciesEvolution(Species.LEAVANNY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10)) + new SpeciesEvolution(Species.LEAVANNY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionRate.SLOW) ] } \ No newline at end of file diff --git a/src/pokemon-level-moves.ts b/src/pokemon-level-moves.ts index a3938c2d7..574656e4a 100644 --- a/src/pokemon-level-moves.ts +++ b/src/pokemon-level-moves.ts @@ -550,7 +550,7 @@ export const pokemonLevelMoves = { [ 12, Moves.FIRE_SPIN ], [ 15, Moves.CONFUSE_RAY ], [ 18, Moves.IMPRISON ], - [ 20, Moves.FAINT_ATTACK ], + [ 20, Moves.FEINT_ATTACK ], [ 23, Moves.FLAME_BURST ], [ 26, Moves.WILL_O_WISP ], [ 28, Moves.HEX ], @@ -775,7 +775,7 @@ export const pokemonLevelMoves = { [ 9, Moves.FAKE_OUT ], [ 14, Moves.FURY_SWIPES ], [ 17, Moves.SCREECH ], - [ 22, Moves.FAINT_ATTACK ], + [ 22, Moves.FEINT_ATTACK ], [ 25, Moves.TAUNT ], [ 30, Moves.PAY_DAY ], [ 33, Moves.SLASH ], @@ -795,7 +795,7 @@ export const pokemonLevelMoves = { [ 9, Moves.FAKE_OUT ], [ 14, Moves.FURY_SWIPES ], [ 17, Moves.SCREECH ], - [ 22, Moves.FAINT_ATTACK ], + [ 22, Moves.FEINT_ATTACK ], [ 25, Moves.TAUNT ], [ 28, Moves.SWIFT ], [ 32, Moves.POWER_GEM ], @@ -2078,7 +2078,7 @@ export const pokemonLevelMoves = { [ 1, Moves.SMOG ], [ 5, Moves.EMBER ], [ 8, Moves.SMOKESCREEN ], - [ 12, Moves.FAINT_ATTACK ], + [ 12, Moves.FEINT_ATTACK ], [ 15, Moves.FIRE_SPIN ], [ 19, Moves.CLEAR_SMOG ], [ 22, Moves.FLAME_BURST ], @@ -3066,7 +3066,7 @@ export const pokemonLevelMoves = { [ 12, Moves.ROCK_THROW ], [ 15, Moves.MIMIC ], [ 15, Moves.SLAM ], - [ 19, Moves.FAINT_ATTACK ], + [ 19, Moves.FEINT_ATTACK ], [ 22, Moves.ROCK_TOMB ], [ 26, Moves.BLOCK ], [ 29, Moves.ROCK_SLIDE ], @@ -3277,7 +3277,7 @@ export const pokemonLevelMoves = { [ 9, Moves.PURSUIT ], [ 13, Moves.QUICK_ATTACK ], [ 17, Moves.CONFUSE_RAY ], - [ 21, Moves.FAINT_ATTACK ], + [ 21, Moves.FEINT_ATTACK ], [ 25, Moves.ASSURANCE ], [ 29, Moves.SCREECH ], [ 33, Moves.MOONLIGHT ], @@ -3294,7 +3294,7 @@ export const pokemonLevelMoves = { [ 21, Moves.NIGHT_SHADE ], [ 25, Moves.ASSURANCE ], [ 31, Moves.TAUNT ], - [ 35, Moves.FAINT_ATTACK ], + [ 35, Moves.FEINT_ATTACK ], [ 41, Moves.MEAN_LOOK ], [ 45, Moves.FOUL_PLAY ], [ 51, Moves.TAILWIND ], @@ -3432,7 +3432,7 @@ export const pokemonLevelMoves = { [ 10, Moves.KNOCK_OFF ], [ 13, Moves.QUICK_ATTACK ], [ 16, Moves.FURY_CUTTER ], - [ 19, Moves.FAINT_ATTACK ], + [ 19, Moves.FEINT_ATTACK ], [ 22, Moves.ACROBATICS ], [ 27, Moves.SLASH ], [ 30, Moves.U_TURN ], @@ -3585,7 +3585,7 @@ export const pokemonLevelMoves = { [ 1, Moves.TAUNT ], [ 1, Moves.SCRATCH ], [ 8, Moves.QUICK_ATTACK ], - [ 10, Moves.FAINT_ATTACK ], + [ 10, Moves.FEINT_ATTACK ], [ 14, Moves.ICY_WIND ], [ 16, Moves.FURY_SWIPES ], [ 20, Moves.AGILITY ], @@ -3605,7 +3605,7 @@ export const pokemonLevelMoves = { [ 1, Moves.LICK ], [ 1, Moves.COVET ], [ 8, Moves.FURY_SWIPES ], - [ 15, Moves.FAINT_ATTACK ], + [ 15, Moves.FEINT_ATTACK ], [ 22, Moves.SWEET_SCENT ], [ 29, Moves.SLASH ], [ 36, Moves.CHARM ], @@ -3621,7 +3621,7 @@ export const pokemonLevelMoves = { [ 1, Moves.LICK ], [ 1, Moves.COVET ], [ 8, Moves.FURY_SWIPES ], - [ 15, Moves.FAINT_ATTACK ], + [ 15, Moves.FEINT_ATTACK ], [ 22, Moves.SWEET_SCENT ], [ 29, Moves.SLASH ], [ 38, Moves.SCARY_FACE ], @@ -3810,7 +3810,7 @@ export const pokemonLevelMoves = { [ 20, Moves.ODOR_SLEUTH ], [ 25, Moves.BEAT_UP ], [ 28, Moves.FIRE_FANG ], - [ 32, Moves.FAINT_ATTACK ], + [ 32, Moves.FEINT_ATTACK ], [ 37, Moves.EMBARGO ], [ 40, Moves.FOUL_PLAY ], [ 44, Moves.FLAMETHROWER ], @@ -3831,7 +3831,7 @@ export const pokemonLevelMoves = { [ 20, Moves.ODOR_SLEUTH ], [ 26, Moves.BEAT_UP ], [ 30, Moves.FIRE_FANG ], - [ 35, Moves.FAINT_ATTACK ], + [ 35, Moves.FEINT_ATTACK ], [ 41, Moves.EMBARGO ], [ 45, Moves.FOUL_PLAY ], [ 50, Moves.FLAMETHROWER ], @@ -3999,7 +3999,7 @@ export const pokemonLevelMoves = { [ 1, Moves.SMOG ], [ 5, Moves.EMBER ], [ 8, Moves.SMOKESCREEN ], - [ 12, Moves.FAINT_ATTACK ], + [ 12, Moves.FEINT_ATTACK ], [ 15, Moves.FIRE_SPIN ], [ 19, Moves.CLEAR_SMOG ], [ 22, Moves.FLAME_BURST ], @@ -4509,7 +4509,7 @@ export const pokemonLevelMoves = { [ 13, Moves.NATURE_POWER ], [ 19, Moves.FAKE_OUT ], [ 25, Moves.TORMENT ], - [ 31, Moves.FAINT_ATTACK ], + [ 31, Moves.FEINT_ATTACK ], [ 37, Moves.RAZOR_WIND ], [ 43, Moves.SWAGGER ], [ 49, Moves.EXTRASENSORY ] @@ -4518,7 +4518,7 @@ export const pokemonLevelMoves = { [ 1, Moves.WHIRLWIND ], [ 1, Moves.NASTY_PLOT ], [ 1, Moves.RAZOR_LEAF ], - [ 1, Moves.FAINT_ATTACK ], + [ 1, Moves.FEINT_ATTACK ], [ 19, Moves.LEAF_TORNADO ], [ 49, Moves.LEAF_STORM ] ], @@ -4711,7 +4711,7 @@ export const pokemonLevelMoves = { [ 1, Moves.SCRATCH ], [ 7, Moves.ENCORE ], [ 13, Moves.SLACK_OFF ], - [ 19, Moves.FAINT_ATTACK ], + [ 19, Moves.FEINT_ATTACK ], [ 25, Moves.AMNESIA ], [ 31, Moves.COVET ], [ 37, Moves.CHIP_AWAY ], @@ -4740,7 +4740,7 @@ export const pokemonLevelMoves = { [ 1, Moves.SCRATCH ], [ 7, Moves.ENCORE ], [ 13, Moves.SLACK_OFF ], - [ 19, Moves.FAINT_ATTACK ], + [ 19, Moves.FEINT_ATTACK ], [ 25, Moves.AMNESIA ], [ 31, Moves.COVET ], [ 36, Moves.SWAGGER ], @@ -4934,7 +4934,7 @@ export const pokemonLevelMoves = { [ 18, Moves.COPYCAT ], [ 22, Moves.ASSIST ], [ 25, Moves.CHARM ], - [ 29, Moves.FAINT_ATTACK ], + [ 29, Moves.FEINT_ATTACK ], [ 32, Moves.WAKE_UP_SLAP ], [ 36, Moves.COVET ], [ 39, Moves.HEAL_BELL ], @@ -4958,7 +4958,7 @@ export const pokemonLevelMoves = { [ 22, Moves.DETECT ], [ 25, Moves.SHADOW_SNEAK ], [ 29, Moves.KNOCK_OFF ], - [ 32, Moves.FAINT_ATTACK ], + [ 32, Moves.FEINT_ATTACK ], [ 36, Moves.PUNISHMENT ], [ 39, Moves.SHADOW_CLAW ], [ 43, Moves.POWER_GEM ], @@ -4974,7 +4974,7 @@ export const pokemonLevelMoves = { [ 11, Moves.BITE ], [ 16, Moves.SWEET_SCENT ], [ 21, Moves.VISE_GRIP ], - [ 26, Moves.FAINT_ATTACK ], + [ 26, Moves.FEINT_ATTACK ], [ 31, Moves.BATON_PASS ], [ 36, Moves.CRUNCH ], [ 41, Moves.IRON_DEFENSE ], @@ -5415,7 +5415,7 @@ export const pokemonLevelMoves = { [ 1, Moves.TACKLE ], [ 5, Moves.UPROAR ], [ 10, Moves.COPYCAT ], - [ 14, Moves.FAINT_ATTACK ], + [ 14, Moves.FEINT_ATTACK ], [ 19, Moves.PSYBEAM ], [ 23, Moves.HYPNOSIS ], [ 28, Moves.DIZZY_PUNCH ], @@ -5429,7 +5429,7 @@ export const pokemonLevelMoves = { [Species.TRAPINCH]: [ [ 1, Moves.BITE ], [ 4, Moves.SAND_ATTACK ], - [ 7, Moves.FAINT_ATTACK ], + [ 7, Moves.FEINT_ATTACK ], [ 10, Moves.SAND_TOMB ], [ 13, Moves.MUD_SLAP ], [ 17, Moves.BIDE ], @@ -5448,10 +5448,10 @@ export const pokemonLevelMoves = { [Species.VIBRAVA]: [ [ 1, Moves.SAND_ATTACK ], [ 1, Moves.SAND_TOMB ], - [ 1, Moves.FAINT_ATTACK ], + [ 1, Moves.FEINT_ATTACK ], [ 1, Moves.SONIC_BOOM ], [ 4, Moves.SAND_ATTACK ], - [ 7, Moves.FAINT_ATTACK ], + [ 7, Moves.FEINT_ATTACK ], [ 10, Moves.SAND_TOMB ], [ 13, Moves.MUD_SLAP ], [ 17, Moves.BIDE ], @@ -5467,10 +5467,10 @@ export const pokemonLevelMoves = { [Species.FLYGON]: [ [ 1, Moves.SAND_ATTACK ], [ 1, Moves.SAND_TOMB ], - [ 1, Moves.FAINT_ATTACK ], + [ 1, Moves.FEINT_ATTACK ], [ 1, Moves.SONIC_BOOM ], [ 4, Moves.SAND_ATTACK ], - [ 7, Moves.FAINT_ATTACK ], + [ 7, Moves.FEINT_ATTACK ], [ 10, Moves.SAND_TOMB ], [ 13, Moves.MUD_SLAP ], [ 17, Moves.BIDE ], @@ -5494,7 +5494,7 @@ export const pokemonLevelMoves = { [ 17, Moves.SAND_ATTACK ], [ 21, Moves.PIN_MISSILE ], [ 25, Moves.INGRAIN ], - [ 29, Moves.FAINT_ATTACK ], + [ 29, Moves.FEINT_ATTACK ], [ 33, Moves.SPIKES ], [ 37, Moves.SUCKER_PUNCH ], [ 41, Moves.PAYBACK ], @@ -5515,7 +5515,7 @@ export const pokemonLevelMoves = { [ 17, Moves.SAND_ATTACK ], [ 21, Moves.PIN_MISSILE ], [ 25, Moves.INGRAIN ], - [ 29, Moves.FAINT_ATTACK ], + [ 29, Moves.FEINT_ATTACK ], [ 35, Moves.SPIKES ], [ 41, Moves.SUCKER_PUNCH ], [ 47, Moves.PAYBACK ], @@ -5849,7 +5849,7 @@ export const pokemonLevelMoves = { [ 1, Moves.ASTONISH ], [ 1, Moves.THIEF ], [ 4, Moves.BIND ], - [ 7, Moves.FAINT_ATTACK ], + [ 7, Moves.FEINT_ATTACK ], [ 10, Moves.FURY_SWIPES ], [ 14, Moves.FEINT ], [ 18, Moves.PSYBEAM ], @@ -5870,7 +5870,7 @@ export const pokemonLevelMoves = { [ 13, Moves.WILL_O_WISP ], [ 16, Moves.SHADOW_SNEAK ], [ 19, Moves.CURSE ], - [ 22, Moves.FAINT_ATTACK ], + [ 22, Moves.FEINT_ATTACK ], [ 26, Moves.HEX ], [ 30, Moves.SHADOW_BALL ], [ 34, Moves.SUCKER_PUNCH ], @@ -5890,7 +5890,7 @@ export const pokemonLevelMoves = { [ 13, Moves.WILL_O_WISP ], [ 16, Moves.SHADOW_SNEAK ], [ 19, Moves.CURSE ], - [ 22, Moves.FAINT_ATTACK ], + [ 22, Moves.FEINT_ATTACK ], [ 26, Moves.HEX ], [ 30, Moves.SHADOW_BALL ], [ 34, Moves.SUCKER_PUNCH ], @@ -7061,7 +7061,7 @@ export const pokemonLevelMoves = { [ 5, Moves.SCRATCH ], [ 8, Moves.GROWL ], [ 13, Moves.HYPNOSIS ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 20, Moves.FURY_SWIPES ], [ 25, Moves.CHARM ], [ 29, Moves.ASSIST ], @@ -7078,7 +7078,7 @@ export const pokemonLevelMoves = { [ 5, Moves.SCRATCH ], [ 8, Moves.GROWL ], [ 13, Moves.HYPNOSIS ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 20, Moves.FURY_SWIPES ], [ 25, Moves.CHARM ], [ 29, Moves.ASSIST ], @@ -7138,7 +7138,7 @@ export const pokemonLevelMoves = { [ 11, Moves.CONFUSE_RAY ], [ 15, Moves.PSYWAVE ], [ 19, Moves.IRON_DEFENSE ], - [ 21, Moves.FAINT_ATTACK ], + [ 21, Moves.FEINT_ATTACK ], [ 25, Moves.SAFEGUARD ], [ 29, Moves.FUTURE_SIGHT ], [ 31, Moves.METAL_SOUND ], @@ -7160,7 +7160,7 @@ export const pokemonLevelMoves = { [ 11, Moves.CONFUSE_RAY ], [ 15, Moves.PSYWAVE ], [ 19, Moves.IRON_DEFENSE ], - [ 21, Moves.FAINT_ATTACK ], + [ 21, Moves.FEINT_ATTACK ], [ 25, Moves.SAFEGUARD ], [ 29, Moves.FUTURE_SIGHT ], [ 31, Moves.METAL_SOUND ], @@ -7178,7 +7178,7 @@ export const pokemonLevelMoves = { [ 8, Moves.LOW_KICK ], [ 12, Moves.ROCK_THROW ], [ 15, Moves.SLAM ], - [ 19, Moves.FAINT_ATTACK ], + [ 19, Moves.FEINT_ATTACK ], [ 22, Moves.ROCK_TOMB ], [ 26, Moves.BLOCK ], [ 29, Moves.ROCK_SLIDE ], @@ -7236,7 +7236,7 @@ export const pokemonLevelMoves = { [ 1, Moves.CURSE ], [ 1, Moves.SHADOW_SNEAK ], [ 1, Moves.PURSUIT ], - [ 7, Moves.FAINT_ATTACK ], + [ 7, Moves.FEINT_ATTACK ], [ 13, Moves.HYPNOSIS ], [ 19, Moves.DREAM_EATER ], [ 25, Moves.OMINOUS_WIND ], @@ -7419,7 +7419,7 @@ export const pokemonLevelMoves = { [ 8, Moves.POISON_STING ], [ 10, Moves.TAUNT ], [ 15, Moves.PURSUIT ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 22, Moves.REVENGE ], [ 24, Moves.SWAGGER ], [ 29, Moves.MUD_BOMB ], @@ -7438,7 +7438,7 @@ export const pokemonLevelMoves = { [ 8, Moves.POISON_STING ], [ 10, Moves.TAUNT ], [ 15, Moves.PURSUIT ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 22, Moves.REVENGE ], [ 24, Moves.SWAGGER ], [ 29, Moves.MUD_BOMB ], @@ -7456,7 +7456,7 @@ export const pokemonLevelMoves = { [ 11, Moves.VINE_WHIP ], [ 17, Moves.SWEET_SCENT ], [ 21, Moves.INGRAIN ], - [ 27, Moves.FAINT_ATTACK ], + [ 27, Moves.FEINT_ATTACK ], [ 31, Moves.LEAF_TORNADO ], [ 37, Moves.STOCKPILE ], [ 37, Moves.SWALLOW ], @@ -7556,7 +7556,7 @@ export const pokemonLevelMoves = { [ 1, Moves.ASSURANCE ], [ 1, Moves.SCRATCH ], [ 8, Moves.QUICK_ATTACK ], - [ 10, Moves.FAINT_ATTACK ], + [ 10, Moves.FEINT_ATTACK ], [ 14, Moves.ICY_WIND ], [ 16, Moves.FURY_SWIPES ], [ 20, Moves.NASTY_PLOT ], @@ -7680,7 +7680,7 @@ export const pokemonLevelMoves = { [ 1, Moves.SMOG ], [ 5, Moves.EMBER ], [ 8, Moves.SMOKESCREEN ], - [ 12, Moves.FAINT_ATTACK ], + [ 12, Moves.FEINT_ATTACK ], [ 15, Moves.FIRE_SPIN ], [ 19, Moves.CLEAR_SMOG ], [ 22, Moves.FLAME_BURST ], @@ -7765,7 +7765,7 @@ export const pokemonLevelMoves = { [ 10, Moves.KNOCK_OFF ], [ 13, Moves.QUICK_ATTACK ], [ 16, Moves.FURY_CUTTER ], - [ 19, Moves.FAINT_ATTACK ], + [ 19, Moves.FEINT_ATTACK ], [ 22, Moves.ACROBATICS ], [ 27, Moves.NIGHT_SLASH ], [ 30, Moves.U_TURN ], @@ -8081,7 +8081,7 @@ export const pokemonLevelMoves = { [ 1, Moves.OMINOUS_WIND ], [ 11, Moves.QUICK_ATTACK ], [ 20, Moves.HYPNOSIS ], - [ 29, Moves.FAINT_ATTACK ], + [ 29, Moves.FEINT_ATTACK ], [ 38, Moves.NIGHTMARE ], [ 47, Moves.DOUBLE_TEAM ], [ 57, Moves.HAZE ], @@ -9203,7 +9203,7 @@ export const pokemonLevelMoves = { [ 5, Moves.ROCK_BLAST ], [ 7, Moves.WITHDRAW ], [ 11, Moves.SAND_ATTACK ], - [ 13, Moves.FAINT_ATTACK ], + [ 13, Moves.FEINT_ATTACK ], [ 17, Moves.SMACK_DOWN ], [ 19, Moves.ROCK_POLISH ], [ 23, Moves.BUG_BITE ], @@ -9223,7 +9223,7 @@ export const pokemonLevelMoves = { [ 5, Moves.ROCK_BLAST ], [ 7, Moves.WITHDRAW ], [ 11, Moves.SAND_ATTACK ], - [ 13, Moves.FAINT_ATTACK ], + [ 13, Moves.FEINT_ATTACK ], [ 17, Moves.SMACK_DOWN ], [ 19, Moves.ROCK_POLISH ], [ 23, Moves.BUG_BITE ], @@ -9239,7 +9239,7 @@ export const pokemonLevelMoves = { [ 1, Moves.LEER ], [ 1, Moves.LOW_KICK ], [ 5, Moves.SAND_ATTACK ], - [ 9, Moves.FAINT_ATTACK ], + [ 9, Moves.FEINT_ATTACK ], [ 12, Moves.HEADBUTT ], [ 16, Moves.SWAGGER ], [ 20, Moves.BRICK_BREAK ], @@ -9257,9 +9257,9 @@ export const pokemonLevelMoves = { [ 1, Moves.SAND_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.LOW_KICK ], - [ 1, Moves.FAINT_ATTACK ], + [ 1, Moves.FEINT_ATTACK ], [ 5, Moves.SAND_ATTACK ], - [ 9, Moves.FAINT_ATTACK ], + [ 9, Moves.FEINT_ATTACK ], [ 12, Moves.HEADBUTT ], [ 16, Moves.SWAGGER ], [ 20, Moves.BRICK_BREAK ], @@ -9455,7 +9455,7 @@ export const pokemonLevelMoves = { [ 5, Moves.PURSUIT ], [ 9, Moves.FAKE_TEARS ], [ 13, Moves.FURY_SWIPES ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 21, Moves.SCARY_FACE ], [ 25, Moves.TAUNT ], [ 29, Moves.FOUL_PLAY ], @@ -9476,7 +9476,7 @@ export const pokemonLevelMoves = { [ 5, Moves.PURSUIT ], [ 9, Moves.HONE_CLAWS ], [ 13, Moves.FURY_SWIPES ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 21, Moves.SCARY_FACE ], [ 25, Moves.TAUNT ], [ 29, Moves.FOUL_PLAY ], @@ -9524,7 +9524,7 @@ export const pokemonLevelMoves = { [ 14, Moves.DOUBLE_SLAP ], [ 16, Moves.PSYBEAM ], [ 19, Moves.EMBARGO ], - [ 24, Moves.FAINT_ATTACK ], + [ 24, Moves.FEINT_ATTACK ], [ 25, Moves.PSYSHOCK ], [ 28, Moves.FLATTER ], [ 31, Moves.FUTURE_SIGHT ], @@ -9545,7 +9545,7 @@ export const pokemonLevelMoves = { [ 14, Moves.DOUBLE_SLAP ], [ 16, Moves.PSYBEAM ], [ 19, Moves.EMBARGO ], - [ 24, Moves.FAINT_ATTACK ], + [ 24, Moves.FEINT_ATTACK ], [ 25, Moves.PSYSHOCK ], [ 28, Moves.FLATTER ], [ 31, Moves.FUTURE_SIGHT ], @@ -9566,7 +9566,7 @@ export const pokemonLevelMoves = { [ 14, Moves.DOUBLE_SLAP ], [ 16, Moves.PSYBEAM ], [ 19, Moves.EMBARGO ], - [ 24, Moves.FAINT_ATTACK ], + [ 24, Moves.FEINT_ATTACK ], [ 25, Moves.PSYSHOCK ], [ 28, Moves.FLATTER ], [ 31, Moves.FUTURE_SIGHT ], @@ -9739,7 +9739,7 @@ export const pokemonLevelMoves = { [ 7, Moves.SAND_ATTACK ], [ 10, Moves.DOUBLE_KICK ], [ 13, Moves.LEECH_SEED ], - [ 16, Moves.FAINT_ATTACK ], + [ 16, Moves.FEINT_ATTACK ], [ 20, Moves.TAKE_DOWN ], [ 24, Moves.JUMP_KICK ], [ 28, Moves.AROMATHERAPY ], @@ -9759,7 +9759,7 @@ export const pokemonLevelMoves = { [ 7, Moves.SAND_ATTACK ], [ 10, Moves.DOUBLE_KICK ], [ 13, Moves.LEECH_SEED ], - [ 16, Moves.FAINT_ATTACK ], + [ 16, Moves.FEINT_ATTACK ], [ 20, Moves.TAKE_DOWN ], [ 24, Moves.JUMP_KICK ], [ 28, Moves.AROMATHERAPY ], @@ -9831,7 +9831,7 @@ export const pokemonLevelMoves = { [ 12, Moves.BIDE ], [ 15, Moves.MEGA_DRAIN ], [ 18, Moves.INGRAIN ], - [ 20, Moves.FAINT_ATTACK ], + [ 20, Moves.FEINT_ATTACK ], [ 24, Moves.SWEET_SCENT ], [ 28, Moves.GIGA_DRAIN ], [ 32, Moves.TOXIC ], @@ -9851,7 +9851,7 @@ export const pokemonLevelMoves = { [ 12, Moves.BIDE ], [ 15, Moves.MEGA_DRAIN ], [ 18, Moves.INGRAIN ], - [ 20, Moves.FAINT_ATTACK ], + [ 20, Moves.FEINT_ATTACK ], [ 24, Moves.SWEET_SCENT ], [ 28, Moves.GIGA_DRAIN ], [ 32, Moves.TOXIC ], @@ -10437,7 +10437,7 @@ export const pokemonLevelMoves = { [ 6, Moves.LEER ], [ 9, Moves.FURY_CUTTER ], [ 14, Moves.TORMENT ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 22, Moves.SCARY_FACE ], [ 25, Moves.METAL_CLAW ], [ 30, Moves.SLASH ], @@ -10459,7 +10459,7 @@ export const pokemonLevelMoves = { [ 6, Moves.LEER ], [ 9, Moves.FURY_CUTTER ], [ 14, Moves.TORMENT ], - [ 17, Moves.FAINT_ATTACK ], + [ 17, Moves.FEINT_ATTACK ], [ 22, Moves.SCARY_FACE ], [ 25, Moves.METAL_CLAW ], [ 30, Moves.SLASH ], @@ -10534,7 +10534,7 @@ export const pokemonLevelMoves = { [ 10, Moves.PLUCK ], [ 14, Moves.NASTY_PLOT ], [ 19, Moves.FLATTER ], - [ 23, Moves.FAINT_ATTACK ], + [ 23, Moves.FEINT_ATTACK ], [ 28, Moves.PUNISHMENT ], [ 32, Moves.DEFOG ], [ 37, Moves.TAILWIND ], @@ -10554,7 +10554,7 @@ export const pokemonLevelMoves = { [ 10, Moves.PLUCK ], [ 14, Moves.NASTY_PLOT ], [ 19, Moves.FLATTER ], - [ 23, Moves.FAINT_ATTACK ], + [ 23, Moves.FEINT_ATTACK ], [ 28, Moves.PUNISHMENT ], [ 32, Moves.DEFOG ], [ 37, Moves.TAILWIND ], diff --git a/src/pokemon-species.ts b/src/pokemon-species.ts index 0def8daa3..e0f956ff0 100644 --- a/src/pokemon-species.ts +++ b/src/pokemon-species.ts @@ -1,5 +1,5 @@ import { GrowthRate } from './exp'; -import { PokemonSpeciesEvolutionCondition, pokemonEvolutions } from './pokemon-evolutions'; +import { pokemonEvolutions } from './pokemon-evolutions'; import { Species } from './species'; import { Type } from './type'; import * as Utils from './utils'; @@ -69,7 +69,7 @@ export default class PokemonSpecies { return this.type1 === type || (this.type2 > -1 && this.type2 === type); } - getSpeciesForLevel(level: integer): Species { + getSpeciesForLevel(level: integer, allowEvolving?: boolean): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -80,6 +80,9 @@ export default class PokemonSpecies { } } + if (!allowEvolving) + return this.speciesId; + const evolutionLevels = this.getEvolutionLevels(); let speciesIds = []; diff --git a/src/pokemon.ts b/src/pokemon.ts index 330c602bf..f319e5719 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -114,25 +114,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { tintSprite.setVisible(false); - (this.scene as BattleScene).loadAtlas(this.getSpriteKey(), 'pokemon', this.getAtlasPath()); - this.scene.load.audio(this.species.speciesId.toString(), `audio/cry/${this.species.speciesId}.mp3`); - this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { - const originalWarn = console.warn; - // Ignore warnings for missing frames, because there will be a lot - console.warn = () => {}; - const frameNames = this.scene.anims.generateFrameNames(this.getSpriteKey(), { zeroPad: 4, suffix: ".png", start: 1, end: 256 }); - console.warn = originalWarn; - this.scene.anims.create({ - key: this.getSpriteKey(), - frames: frameNames, - frameRate: 12, - repeat: -1 - }); - sprite.play(this.getSpriteKey()); - tintSprite.play(this.getSpriteKey()); - }); - - this.scene.load.start() this.add(sprite); this.add(tintSprite); @@ -156,35 +137,58 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract isPlayer(): boolean; - getAtlasPath() { + loadAssets(): Promise { + return new Promise(resolve => { + (this.scene as BattleScene).loadAtlas(this.getSpriteKey(), 'pokemon', this.getAtlasPath()); + this.scene.load.audio(this.species.speciesId.toString(), `audio/cry/${this.species.speciesId}.mp3`); + this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { + const originalWarn = console.warn; + // Ignore warnings for missing frames, because there will be a lot + console.warn = () => {}; + const frameNames = this.scene.anims.generateFrameNames(this.getSpriteKey(), { zeroPad: 4, suffix: ".png", start: 1, end: 256 }); + console.warn = originalWarn; + this.scene.anims.create({ + key: this.getSpriteKey(), + frames: frameNames, + frameRate: 12, + repeat: -1 + }); + this.getSprite().play(this.getSpriteKey()); + this.getTintSprite().play(this.getSpriteKey()); + resolve(); + }); + }); + } + + getAtlasPath(): string { return this.getSpriteId().replace(/\_{2}/g, '/'); } - getSpriteId() { + getSpriteId(): string { return `${this.isPlayer() ? 'back__' : ''}${this.shiny ? 'shiny__' : ''}${this.species.genderDiffs && !this.gender ? 'female__' : ''}${this.species.speciesId}`; } - getSpriteKey() { + getSpriteKey(): string { return `pkmn__${this.getSpriteId()}`; } - getIconAtlasKey() { + getIconAtlasKey(): string { return `pokemon_icons_${this.species.generation}`; } - getIconId() { + getIconId(): string { return `${Utils.padInt(this.species.speciesId, 3)}`; } - getIconKey() { + getIconKey(): string { return `pkmn_icon__${this.getIconId()}`; } - getSprite() { + getSprite(): Phaser.GameObjects.Sprite { return this.getAt(0) as Phaser.GameObjects.Sprite; } - getTintSprite() { + getTintSprite(): Phaser.GameObjects.Sprite { return this.getAt(1) as Phaser.GameObjects.Sprite; } @@ -303,7 +307,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { apply(source: Pokemon, battlerMove: PokemonMove, callback?: Function) { const battleScene = this.scene as BattleScene; let result: integer; - let sound: Phaser.Sound.BaseSound; let success = false; const move = battlerMove.getMove(); const moveCategory = move.category; @@ -390,7 +393,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.sound.play(this.species.speciesId.toString()); } - faintCry(callback) { + faintCry(callback: Function) { const key = this.species.speciesId.toString(); let i = 0; let rate = 0.85; @@ -519,7 +522,7 @@ export class EnemyPokemon extends Pokemon { constructor(scene: BattleScene, species: PokemonSpecies, level: integer) { super(scene, -63, 86, species, level); - this.aiType = AiType.SMART; + this.aiType = AiType.SMART_RANDOM; } getNextMove(): PokemonMove { @@ -530,6 +533,7 @@ export class EnemyPokemon extends Pokemon { switch (this.aiType) { case AiType.RANDOM: return movePool[Utils.randInt(movePool.length)]; + case AiType.SMART_RANDOM: case AiType.SMART: const target = (this.scene as BattleScene).getPlayerPokemon(); const moveScores = movePool.map(() => 0); @@ -567,19 +571,23 @@ export class EnemyPokemon extends Pokemon { moveScores[m] = score; } } + + console.log(moveScores); + const sortedMovePool = movePool.slice(0); sortedMovePool.sort((a, b) => { const scoreA = moveScores[movePool.indexOf(a)]; const scoreB = moveScores[movePool.indexOf(b)]; - console.log(a, b, scoreA, scoreB) return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0; }); - let randomBool: integer; + let randInt: integer; let r = 0; - while (r < sortedMovePool.length - 1 && (randomBool = Utils.randInt(2))) - r++; + if (this.aiType === AiType.SMART_RANDOM) { + while (r < sortedMovePool.length - 1 && (randInt = Utils.randInt(8)) >= 5) + r++; + } console.log(movePool.map(m => m.getName()), moveScores, r, sortedMovePool.map(m => m.getName())); - return sortedMovePool[r] + return sortedMovePool[r]; } } return new PokemonMove(Moves.STRUGGLE, 0, 0); @@ -598,8 +606,9 @@ export class EnemyPokemon extends Pokemon { } } -enum AiType { +export enum AiType { RANDOM, + SMART_RANDOM, SMART }; diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 58614fa07..3d7bea076 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -26,41 +26,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { }; if (prompt) { const originalCallback = callback; - callback = () => { - const wrappedTextLines = this.message.runWordWrap(this.message.text).split(/\n/g); - const textLinesCount = wrappedTextLines.length; - const lastTextLine = wrappedTextLines[wrappedTextLines.length - 1]; - const lastLineTest = this.scene.add.text(0, 0, lastTextLine, { font: '96px emerald' }); - lastLineTest.setScale(this.message.scale); - const lastLineWidth = lastLineTest.displayWidth; - lastLineTest.destroy(); - if (prompt) { - if (this.prompt) { - this.prompt.setPosition(lastLineWidth + 2, (textLinesCount - 1) * 18 + 2); - this.prompt.play('prompt'); - } - this.pendingPrompt = false; - } - this.awaitingActionInput = true; - this.onActionInput = () => { - if (this.prompt) { - this.prompt.anims.stop(); - this.prompt.setVisible(false); - } - if (originalCallback) { - if (callbackDelay) { - this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => { - if (this.textCallbackTimer) { - this.textCallbackTimer.destroy(); - this.textCallbackTimer = null; - } - originalCallback(); - }); - } else - originalCallback(); - } - }; - }; + callback = () => this.showPrompt(originalCallback, callbackDelay); } if (delay) { this.clearText(); @@ -94,6 +60,40 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } } + showPrompt(callback: Function, callbackDelay: integer) { + const wrappedTextLines = this.message.runWordWrap(this.message.text).split(/\n/g); + const textLinesCount = wrappedTextLines.length; + const lastTextLine = wrappedTextLines[wrappedTextLines.length - 1]; + const lastLineTest = this.scene.add.text(0, 0, lastTextLine, { font: '96px emerald' }); + lastLineTest.setScale(this.message.scale); + const lastLineWidth = lastLineTest.displayWidth; + lastLineTest.destroy(); + if (this.prompt) { + this.prompt.setPosition(lastLineWidth + 2, (textLinesCount - 1) * 18 + 2); + this.prompt.play('prompt'); + } + this.pendingPrompt = false; + this.awaitingActionInput = true; + this.onActionInput = () => { + if (this.prompt) { + this.prompt.anims.stop(); + this.prompt.setVisible(false); + } + if (callback) { + if (callbackDelay) { + this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => { + if (this.textCallbackTimer) { + this.textCallbackTimer.destroy(); + this.textCallbackTimer = null; + } + callback(); + }); + } else + callback(); + } + }; + } + clearText() { this.message.setText(''); this.pendingPrompt = false; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 27d288056..f26ceb8b2 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -9,7 +9,7 @@ import { Mode } from "./ui"; export default class ModifierSelectUiHandler extends AwaitableUiHandler { private overlayBg: Phaser.GameObjects.Rectangle; private modifierContainer: Phaser.GameObjects.Container; - private options: ModifierOption[]; + public options: ModifierOption[]; private cursorObj: Phaser.GameObjects.Image; @@ -66,8 +66,10 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { onUpdate: t => { const value = t.getValue(); const index = Math.floor(value * types.length); - if (index > i && index <= types.length) - this.options[i++].show(Math.floor((1 - value) * 1250) * 0.325); + if (index > i && index <= types.length) { + const option = this.options[i++]; + option?.show(Math.floor((1 - value) * 1250) * 0.325); + } } }); @@ -225,6 +227,8 @@ class ModifierOption extends Phaser.GameObjects.Container { duration: 1250, ease: 'Bounce.Out', onUpdate: t => { + if (!this.scene) + return; const value = t.getValue(); if (!bounce && value > lastValue) { this.scene.sound.play('pb_bounce_1', { volume: 1 / ++bounceCount }); @@ -236,6 +240,9 @@ class ModifierOption extends Phaser.GameObjects.Container { }); this.scene.time.delayedCall(remainingDuration + 2000, () => { + if (!this.scene) + return; + this.pb.setTexture('pb', `${this.getPbAtlasKey()}_open`); this.scene.sound.play('pb_rel'); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 6187490ca..2e2e8d46d 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -63,7 +63,6 @@ export default class PartyUiHandler extends MessageUiHandler { this.partyMessageBox = partyMessageBox; const partyMessageText = addTextObject(this.scene, 8, 10, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); - partyMessageText.setPositionRelative partyMessageText.setOrigin(0, 0); partyMessageBoxContainer.add(partyMessageText); diff --git a/src/ui/uiHandler.ts b/src/ui/uiHandler.ts index 8a70f80b0..6927feac9 100644 --- a/src/ui/uiHandler.ts +++ b/src/ui/uiHandler.ts @@ -5,7 +5,7 @@ export default abstract class UiHandler { protected scene: BattleScene; protected mode: integer; protected cursor: integer = 0; - protected active: boolean = false; + public active: boolean = false; constructor(scene: BattleScene, mode: Mode) { this.scene = scene;