From 40058539a77d3042e46cd2b3c55e66a66f4ba4c4 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 18 Apr 2023 15:07:10 -0400 Subject: [PATCH] Fix crashes --- src/arena.ts | 2 +- src/battle-phases.ts | 14 +++-- src/game-data.ts | 3 +- src/pokemon-evolutions.ts | 88 +++++++++++++++++------------ src/pokemon-species.ts | 35 +++++------- src/pokemon.ts | 11 +++- src/ui/starter-select-ui-handler.ts | 3 +- 7 files changed, 91 insertions(+), 65 deletions(-) diff --git a/src/arena.ts b/src/arena.ts index 4ac0e2605..5623b71ed 100644 --- a/src/arena.ts +++ b/src/arena.ts @@ -61,7 +61,7 @@ export class Arena { ret = getPokemonSpecies(species); } - const newSpeciesId = ret.getSpeciesForLevel(5); + const newSpeciesId = ret.getSpeciesForLevel(level); if (newSpeciesId !== ret.speciesId) { console.log('Replaced', Species[ret.speciesId], 'with', Species[newSpeciesId]); ret = getPokemonSpecies(newSpeciesId); diff --git a/src/battle-phases.ts b/src/battle-phases.ts index af86367d7..5becd815c 100644 --- a/src/battle-phases.ts +++ b/src/battle-phases.ts @@ -534,11 +534,15 @@ export class TurnEndPhase extends BattlePhase { const playerPokemon = this.scene.getPlayerPokemon(); const enemyPokemon = this.scene.getEnemyPokemon(); - playerPokemon.lapseTags(BattleTagLapseType.TURN_END); - enemyPokemon.lapseTags(BattleTagLapseType.TURN_END); + if (playerPokemon) { + playerPokemon.lapseTags(BattleTagLapseType.TURN_END); + playerPokemon.battleSummonData.turnCount++; + } - playerPokemon.battleSummonData.turnCount++; - enemyPokemon.battleSummonData.turnCount++; + if (enemyPokemon) { + enemyPokemon.lapseTags(BattleTagLapseType.TURN_END); + enemyPokemon.battleSummonData.turnCount++; + } this.end(); } @@ -691,7 +695,7 @@ export abstract class MovePhase extends BattlePhase { } end() { - if (!this.followUp) + if (!this.followUp && this.canMove()) this.scene.unshiftPhase(new MoveEndPhase(this.scene, this.pokemon.isPlayer())); super.end(); diff --git a/src/game-data.ts b/src/game-data.ts index fbf2472d5..b5559d989 100644 --- a/src/game-data.ts +++ b/src/game-data.ts @@ -1,6 +1,7 @@ import BattleScene from "./battle-scene"; import { Gender } from "./gender"; import Pokemon from "./pokemon"; +import { pokemonPrevolutions } from "./pokemon-evolutions"; import PokemonSpecies, { allSpecies } from "./pokemon-species"; import { Species } from "./species"; import * as Utils from "./utils"; @@ -148,7 +149,7 @@ export class GameData { dexEntry.caught = true; this.save(); - if (newCatch && !pokemon.species.getPrevolutionLevels(true).length) { + if (newCatch && !pokemonPrevolutions.hasOwnProperty(pokemon.species.speciesId)) { this.scene.playSoundWithoutBgm('level_up_fanfare', 1500); this.scene.ui.showText(`${pokemon.name} has been\nadded as a starter!`, null, () => resolve(), null, true); return; diff --git a/src/pokemon-evolutions.ts b/src/pokemon-evolutions.ts index dd91c9882..f4f1e085a 100644 --- a/src/pokemon-evolutions.ts +++ b/src/pokemon-evolutions.ts @@ -1,4 +1,4 @@ -import { Biome } from "./biome"; +import { Gender } from "./gender"; import { AttackTypeBoosterModifier } from "./modifier"; import { AttackTypeBoosterModifierType } from "./modifier-type"; import { Moves } from "./move"; @@ -32,6 +32,9 @@ export enum EvolutionItem { SHINY_STONE } +export type EvolutionConditionPredicate = (p: Pokemon) => boolean; +export type EvolutionConditionEnforceFunc = (p: Pokemon) => void; + export class SpeciesEvolution { public speciesId: Species; public level: integer; @@ -49,12 +52,12 @@ export class SpeciesEvolution { } export class SpeciesEvolutionCondition { - public predicate: Function; - public applyToWild: boolean; + public predicate: EvolutionConditionPredicate; + public enforceFunc: EvolutionConditionEnforceFunc; - constructor(predicate: Function, applyToWild?: boolean) { + constructor(predicate: EvolutionConditionPredicate, enforceFunc?: EvolutionConditionEnforceFunc) { this.predicate = predicate; - this.applyToWild = !!applyToWild; + this.enforceFunc = enforceFunc; } } @@ -346,8 +349,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LINOONE, 20, null, null) ], [Species.WURMPLE]: [ - new SpeciesEvolution(Species.SILCOON, 7, null, new SpeciesEvolutionCondition((p: Pokemon) => Utils.randInt(2) === 0, true)), // TODO: Improve these conditions - new SpeciesEvolution(Species.CASCOON, 7, null, new SpeciesEvolutionCondition((p: Pokemon) => Utils.randInt(2) === 0, true)) + new SpeciesEvolution(Species.SILCOON, 7, null, new SpeciesEvolutionCondition((p: Pokemon) => Utils.randInt(2) === 0)), // TODO: Improve these conditions + new SpeciesEvolution(Species.CASCOON, 7, null, null) ], [Species.SILCOON]: [ new SpeciesEvolution(Species.BEAUTIFLY, 10, null, null) @@ -371,8 +374,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KIRLIA, 20, null, null) ], [Species.KIRLIA]: [ - new SpeciesEvolution(Species.GARDEVOIR, 30, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true)), - new SpeciesEvolution(Species.GALLADE, 1, EvolutionItem.DAWN_STONE, new SpeciesEvolutionCondition((p: Pokemon) => p.gender, true), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.GARDEVOIR, 30, null, new SpeciesEvolutionCondition((p: Pokemon) => p.gender === Gender.FEMALE, (p: Pokemon) => p.gender = Gender.FEMALE)), + new SpeciesEvolution(Species.GALLADE, 1, EvolutionItem.DAWN_STONE, new SpeciesEvolutionCondition((p: Pokemon) => p.gender === Gender.MALE, (p: Pokemon) => p.gender = Gender.MALE), SpeciesWildEvolutionDelay.LONG) ], [Species.SURSKIT]: [ new SpeciesEvolution(Species.MASQUERAIN, 22, null, null) @@ -388,7 +391,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.NINCADA]: [ new SpeciesEvolution(Species.NINJASK, 20, null, null), - new SpeciesEvolution(Species.SHEDINJA, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().length < 6 && p.scene.pokeballCounts[PokeballType.POKEBALL], true)) + new SpeciesEvolution(Species.SHEDINJA, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().length < 6 && p.scene.pokeballCounts[PokeballType.POKEBALL] > 0)) ], [Species.WHISMUR]: [ new SpeciesEvolution(Species.LOUDRED, 20, null, null) @@ -461,7 +464,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.SNORUNT]: [ new SpeciesEvolution(Species.GLALIE, 42, null, null), - new SpeciesEvolution(Species.FROSLASS, 1, EvolutionItem.DAWN_STONE, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.FROSLASS, 1, EvolutionItem.DAWN_STONE, new SpeciesEvolutionCondition((p: Pokemon) => p.gender === Gender.FEMALE, (p: Pokemon) => p.gender = Gender.FEMALE), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SPHEAL]: [ new SpeciesEvolution(Species.SEALEO, 32, null, null) @@ -524,13 +527,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BASTIODON, 30, null, null) ], [Species.BURMY]: [ - 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 && p.scene.arena?.biomeType === Biome.FOREST, true)), - new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender && p.scene.arena?.biomeType === Biome.CAVE, true)), - new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender && p.scene.arena?.biomeType === Biome.CITY, true)) + new SpeciesEvolution(Species.MOTHIM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.gender === Gender.MALE, (p: Pokemon) => p.gender = Gender.MALE)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition((p: Pokemon) => p.gender === Gender.FEMALE, (p: Pokemon) => p.gender = Gender.FEMALE)) ], [Species.COMBEE]: [ - new SpeciesEvolution(Species.VESPIQUEN, 21, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.gender, true)) + new SpeciesEvolution(Species.VESPIQUEN, 21, null, new SpeciesEvolutionCondition((p: Pokemon) => p.gender === Gender.FEMALE, (p: Pokemon) => p.gender = Gender.FEMALE)) ], [Species.BUIZEL]: [ new SpeciesEvolution(Species.FLOATZEL, 26, null, null) @@ -793,17 +794,17 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.TANGELA]: [ - new SpeciesEvolution(Species.TANGROWTH, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TANGROWTH, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.LICKITUNG]: [ - new SpeciesEvolution(Species.LICKILICKY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LICKILICKY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.STARYU]: [ new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.EEVEE]: [ - new SpeciesEvolution(Species.ESPEON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && p.scene.arena?.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.UMBREON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && !p.scene.arena?.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.ESPEON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.UMBREON, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && !p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM), new SpeciesEvolution(Species.VAPOREON, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), new SpeciesEvolution(Species.JOLTEON, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), new SpeciesEvolution(Species.FLAREON, 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.MEDIUM), @@ -814,13 +815,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOGEKISS, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.AIPOM]: [ - new SpeciesEvolution(Species.AMBIPOM, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.DOUBLE_HIT).length), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.AMBIPOM, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.DOUBLE_HIT).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.SUNKERN]: [ new SpeciesEvolution(Species.SUNFLORA, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) ], [Species.YANMA]: [ - new SpeciesEvolution(Species.YANMEGA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.YANMEGA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ROLLOUT).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.MURKROW]: [ new SpeciesEvolution(Species.HONCHKROW, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -829,13 +830,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MISMAGIUS, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GLIGAR]: [ - new SpeciesEvolution(Species.GLISCOR, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.scene.arena?.isDaytime() /* Razor fang at night*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.GLISCOR, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.scene.arena.isDaytime() /* Razor fang at night*/), SpeciesWildEvolutionDelay.LONG) ], [Species.SNEASEL]: [ - new SpeciesEvolution(Species.WEAVILE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.scene.arena?.isDaytime() /* Razor claw at night*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.WEAVILE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !p.scene.arena.isDaytime() /* Razor claw at night*/), SpeciesWildEvolutionDelay.LONG) ], [Species.PILOSWINE]: [ - new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.LOMBRE]: [ new SpeciesEvolution(Species.LUDICOLO, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -853,13 +854,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ROSERADE, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.BONSLY]: [ - new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.MIMIC).length), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MIME_JR]: [ - new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.MIMIC).length), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.moveset.filter(m => m.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MANTYKE]: [ - new SpeciesEvolution(Species.MANTINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().find(p => p.species.speciesId === Species.REMORAID)), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.MANTINE, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => !!p.scene.getParty().find(p => p.species.speciesId === Species.REMORAID)), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANSAGE]: [ new SpeciesEvolution(Species.SIMISAGE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.MEDIUM) @@ -902,7 +903,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.ONIX]: [ new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - (p: Pokemon) => p.scene.findModifier(m => m instanceof AttackTypeBoosterModifier && (m.type as AttackTypeBoosterModifierType).moveType === Type.STEEL)), + (p: Pokemon) => !!p.scene.findModifier(m => m instanceof AttackTypeBoosterModifier && (m.type as AttackTypeBoosterModifierType).moveType === Type.STEEL)), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ @@ -913,7 +914,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.SCYTHER]: [ new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - (p: Pokemon) => p.scene.findModifier(m => m instanceof AttackTypeBoosterModifier && (m.type as AttackTypeBoosterModifierType).moveType === Type.STEEL) ), + (p: Pokemon) => !!p.scene.findModifier(m => m instanceof AttackTypeBoosterModifier && (m.type as AttackTypeBoosterModifierType).moveType === Type.STEEL) ), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ELECTABUZZ]: [ @@ -945,10 +946,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CONKELDURR, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KARRABLAST]: [ - new SpeciesEvolution(Species.ESCAVALIER, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().find(p => p.species.speciesId === Species.SHELMET)), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ESCAVALIER, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => !!p.scene.getParty().find(p => p.species.speciesId === Species.SHELMET)), SpeciesWildEvolutionDelay.LONG) ], [Species.SHELMET]: [ - new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => p.scene.getParty().find(p => p.species.speciesId === Species.KARRABLAST)), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition((p: Pokemon) => !!p.scene.getParty().find(p => p.species.speciesId === Species.KARRABLAST)), SpeciesWildEvolutionDelay.LONG) ], [Species.PICHU]: [ new SpeciesEvolution(Species.PIKACHU, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.SHORT) @@ -975,16 +976,16 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MARILL, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.SHORT) ], [Species.BUDEW]: [ - new SpeciesEvolution(Species.ROSELIA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 && p.scene.arena?.isDaytime()), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.ROSELIA, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 && p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.SHORT) ], [Species.CHINGLING]: [ - new SpeciesEvolution(Species.CHIMECHO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && !p.scene.arena?.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.CHIMECHO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && !p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.BUNEARY]: [ new SpeciesEvolution(Species.LOPUNNY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.RIOLU]: [ - new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && p.scene.arena?.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 && p.scene.arena.isDaytime()), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.WOOBAT]: [ new SpeciesEvolution(Species.SWOOBAT, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.MEDIUM) @@ -992,4 +993,19 @@ export const pokemonEvolutions: PokemonEvolutions = { [Species.SWADLOON]: [ new SpeciesEvolution(Species.LEAVANNY, 1, null, new SpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10), SpeciesWildEvolutionDelay.LONG) ] -}; \ No newline at end of file +}; + +interface PokemonPrevolutions { + [key: string]: Species +} + +export const pokemonPrevolutions: PokemonPrevolutions = {}; + +{ + const prevolutionKeys = Object.keys(pokemonEvolutions); + prevolutionKeys.forEach(pk => { + const evolutions = pokemonEvolutions[pk]; + for (let ev of evolutions) + pokemonPrevolutions[ev.speciesId] = parseInt(pk) as Species; + }); +} \ No newline at end of file diff --git a/src/pokemon-species.ts b/src/pokemon-species.ts index a8e6a7487..4a93ea3af 100644 --- a/src/pokemon-species.ts +++ b/src/pokemon-species.ts @@ -1,6 +1,7 @@ import { Abilities } from './abilities'; import BattleScene from './battle-scene'; import { GrowthRate } from './exp'; +import { EnemyPokemon } from './pokemon'; import { pokemonEvolutions } from './pokemon-evolutions'; import { Species } from './species'; import { Type } from './type'; @@ -259,38 +260,32 @@ export default class PokemonSpecies extends PokemonSpeciesForm { if (pokemonEvolutions.hasOwnProperty(this.speciesId)) { for (let e of pokemonEvolutions[this.speciesId]) { - const condition = e.condition; - if (!condition || typeof(condition) === 'string' || !condition.applyToWild || condition.predicate(this)) { - const speciesId = e.speciesId; - const level = e.level; - evolutionLevels.push([ speciesId, level ]); - //console.log(Species[speciesId], getPokemonSpecies(speciesId), getPokemonSpecies(speciesId).getEvolutionLevels()); - const nextEvolutionLevels = getPokemonSpecies(speciesId).getEvolutionLevels(); - for (let npl of nextEvolutionLevels) - evolutionLevels.push(npl); - } + const speciesId = e.speciesId; + const level = e.level; + evolutionLevels.push([ speciesId, level ]); + //console.log(Species[speciesId], getPokemonSpecies(speciesId), getPokemonSpecies(speciesId).getEvolutionLevels()); + const nextEvolutionLevels = getPokemonSpecies(speciesId).getEvolutionLevels(); + for (let npl of nextEvolutionLevels) + evolutionLevels.push(npl); } } return evolutionLevels; } - getPrevolutionLevels(ignoreConditions?: boolean) { + getPrevolutionLevels() { const prevolutionLevels = []; const allEvolvingPokemon = Object.keys(pokemonEvolutions); for (let p of allEvolvingPokemon) { for (let e of pokemonEvolutions[p]) { if (e.speciesId === this.speciesId) { - const condition = e.condition; - if (ignoreConditions || !condition || typeof(condition) === 'string' || !condition.applyToWild || condition.predicate(this)) { - const speciesId = parseInt(p) as Species; - let level = e.level; - prevolutionLevels.push([ speciesId, level ]); - const subPrevolutionLevels = getPokemonSpecies(speciesId).getPrevolutionLevels(); - for (let spl of subPrevolutionLevels) - prevolutionLevels.push(spl); - } + const speciesId = parseInt(p) as Species; + let level = e.level; + prevolutionLevels.push([ speciesId, level ]); + const subPrevolutionLevels = getPokemonSpecies(speciesId).getPrevolutionLevels(); + for (let spl of subPrevolutionLevels) + prevolutionLevels.push(spl); } } } diff --git a/src/pokemon.ts b/src/pokemon.ts index 8c05ea8eb..4ab358e6d 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -14,7 +14,7 @@ import { Gender } from './gender'; import { initMoveAnim, loadMoveAnimAssets } from './battle-anims'; import { Status, StatusEffect } from './status-effect'; import { tmSpecies } from './tms'; -import { pokemonEvolutions, SpeciesEvolution, SpeciesEvolutionCondition } from './pokemon-evolutions'; +import { pokemonEvolutions, pokemonPrevolutions, SpeciesEvolution, SpeciesEvolutionCondition } from './pokemon-evolutions'; import { DamagePhase, FaintPhase, MessagePhase } from './battle-phases'; import { BattleStat } from './battle-stat'; import { BattleTag, BattleTagLapseType, BattleTagType, getBattleTag } from './battle-tag'; @@ -851,6 +851,15 @@ export class EnemyPokemon extends Pokemon { constructor(scene: BattleScene, species: PokemonSpecies, level: integer) { super(scene, -66, 84, species, level, scene.arena.getFormIndex(species)); + let prevolution: Species; + let speciesId = species.speciesId; + while ((prevolution = pokemonPrevolutions[speciesId])) { + const evolution = pokemonEvolutions[prevolution].find(pe => pe.speciesId === speciesId); + if (evolution.condition?.enforceFunc) + evolution.condition.enforceFunc(this); + speciesId = prevolution; + } + this.aiType = AiType.SMART_RANDOM; } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 25e88cdf4..32768e1f7 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import * as Utils from "../utils"; import MessageUiHandler from "./message-ui-handler"; import { DexEntryDetails, StarterDexUnlockTree } from "../game-data"; import { Gender, getGenderColor, getGenderSymbol } from "../gender"; +import { pokemonPrevolutions } from "../pokemon-evolutions"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -123,7 +124,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.genSpecies.push([]); for (let species of allSpecies) { - if (species.getPrevolutionLevels(true).length || species.generation !== g + 1) + if (pokemonPrevolutions.hasOwnProperty(species.speciesId) || species.generation !== g + 1) continue; this.speciesLoaded.set(species.speciesId, false); this.genSpecies[g].push(species);