Initial commit

This commit is contained in:
Flashfyre committed 2023-03-28 14:54:52 -04:00
commit 2f17903d30
8188 files changed
+7877857

No files matched your search

+162
View File
@@ -0,0 +1,162 @@
import BattleScene from "./battle-scene";
import { default as PokemonSpecies, allSpecies, getPokemonSpecies } from "./pokemon-species";
import { Stat } from "./pokemon-stat";
import { Species } from "./species";
import { Type } from './type';
import * as Utils from './utils';
export enum ArenaType {
PLAINS = 1,
GRASS,
FOREST,
WATER,
SWAMP,
SEA,
MOUNTAIN,
LAND,
CAVE,
DESERT,
ARENA_BROWN,
ARENA_PURPLE,
ARENA_BLUE,
ARENA_ORANGE,
ARENA_PINK
};
enum PoolTier {
COMMON,
UNCOMMON,
RARE,
ULTRA_RARE,
LEGENDARY
};
export class Arena {
private scene: BattleScene;
public type: integer;
private bgm: string;
private pokemonPool: PokemonSpecies[][];
constructor(scene: BattleScene, type: integer, bgm: string) {
this.scene = scene;
this.type = type;
this.bgm = bgm;
const predicate = arenaPoolPredicates[type] || (() => {});
this.pokemonPool = Utils.getEnumValues(PoolTier).map(t => allSpecies.filter(p => predicate(p, t)));
}
randomSpecies(waveIndex: integer): PokemonSpecies {
const tier: PoolTier = Utils.randInt(5);
const tierPool = this.pokemonPool[tier];
let ret: PokemonSpecies;
if (!tierPool.length)
ret = this.scene.randomSpecies();
else
ret = tierPool[Utils.randInt(tierPool.length)];
const newSpeciesId = ret.getSpeciesForLevel(5);
if (newSpeciesId !== ret.speciesId) {
console.log('Replaced', Species[ret.speciesId], 'with', Species[newSpeciesId]);
ret = getPokemonSpecies(newSpeciesId);
}
return ret;
}
playBgm() {
this.scene.loadBgm(this.bgm);
this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => this.scene.playBgm(this.bgm));
}
}
const arenaPoolPredicates = {
[ArenaType.PLAINS]: (p, t) => {
if (p.isOfType(Type.GHOST) || p.isOfType(Type.STEEL) || p.isOfType(Type.ICE) || p.isOfType(Type.DRAGON))
return false;
for (let s in p.baseStats) {
let threshold: integer;
const stat = parseInt(s);
switch (stat) {
case Stat.HP:
threshold = 70;
break;
default:
threshold = 60;
break;
}
if (p.baseStats[s] > threshold) {
if (p.baseTotal <= 300 && p.baseExp <= 75 && (p.isOfType(Type.NORMAL) || p.isOfType(Type.BUG) || p.isOfType(Type.GRASS)))
return true;
return false;
}
}
return p.baseTotal <= 320 && p.baseExp <= 75;
},
[ArenaType.GRASS]: (p, t) => {
switch (t) {
case PoolTier.ULTRA_RARE:
return [ Species.ENTEI, Species.SUICUNE, Species.RAIKOU, Species.LATIOS, Species.LATIAS ].map(s => getPokemonSpecies(s));
case PoolTier.LEGENDARY:
return [ Species.MEW ].map(s => getPokemonSpecies(s));
}
return p.isOfType(Type.NORMAL) || p.isOfType(Type.FAIRY) || p.isOfType(Type.GRASS) || p.isOfType(Type.BUG) || p.isOfType(Type.ELECTRIC);
},
[ArenaType.FOREST]: (p, t) => {
switch (t) {
case PoolTier.LEGENDARY:
return getPokemonSpecies(Species.CELEBI);
}
return p.isOfType(Type.GRASS) || p.isOfType(Type.BUG) || p.isOfType(Type.POISON);
},
[ArenaType.WATER]: (p, t) => {
switch (t) {
case PoolTier.ULTRA_RARE:
return [ Species.UXIE, Species.MESPRIT, Species.AZELF ].map(s => getPokemonSpecies(s));
}
return p.isOfType(Type.WATER)
},
[ArenaType.SWAMP]: (p, t) => {
return p.isOfType(Type.GRASS) || p.isOfType(Type.WATER) || p.isOfType(Type.POISON);
},
[ArenaType.SEA]: (p, t) => {
switch (t) {
case PoolTier.ULTRA_RARE:
return [ Species.KYOGRE ].map(s => getPokemonSpecies(s));
case PoolTier.LEGENDARY:
return [ Species.LUGIA ].map(s => getPokemonSpecies(s));
}
return p.isOfType(Type.WATER);
},
[ArenaType.MOUNTAIN]: (p, t) => {
switch (t) {
case PoolTier.ULTRA_RARE:
return [ Species.ARTICUNO, Species.ZAPDOS, Species.MOLTRES ].map(s => getPokemonSpecies(s));
break;
case PoolTier.LEGENDARY:
return [ Species.HO_OH, Species.RAYQUAZA ].map(s => getPokemonSpecies(s));
}
return p.isOfType(Type.FLYING) || p.isOfType(Type.GROUND) || p.isOfType(Type.ROCK) || p.isOfType(Type.ELECTRIC) || p.isOfType(Type.STEEL);
},
[ArenaType.LAND]: (p, t) => {
switch (t) {
case PoolTier.ULTRA_RARE:
return [ Species.GROUDON ].map(s => getPokemonSpecies(s));
}
return p.isOfType(Type.GROUND);
},
[ArenaType.CAVE]: (p, t) => {
switch (t) {
case PoolTier.ULTRA_RARE:
return [ Species.REGIROCK, Species.REGICE, Species.REGISTEEL ].map(s => getPokemonSpecies(s));
case PoolTier.LEGENDARY:
return [ Species.MEWTWO, Species.REGIGIGAS ].map(s => getPokemonSpecies(s));
}
return p.isOfType(Type.ROCK);
},
[ArenaType.DESERT]: (p, t) => {
return p.isOfType(Type.GROUND) || p.isOfType(Type.ROCK);
},
[ArenaType.ARENA_PINK]: (p, t) => {
return p.legendary || p.mythical;
}
};
+9
View File
@@ -0,0 +1,9 @@
import BattleScene from "./battle-scene";
export class BattleAnimHandler {
private scene: BattleScene;
constructor(scene: BattleScene) {
this.scene = scene;
}
}
+245
View File
@@ -0,0 +1,245 @@
import { default as Pokemon } from './pokemon';
import { getLevelTotalExp, getLevelRelExp } from './exp';
import * as Utils from './utils';
export default class BattleInfo extends Phaser.GameObjects.Container {
private player: boolean;
private lastHp: integer;
private lastMaxHp: integer;
private lastHpFrame: string;
private lastExp: integer;
private lastLevelExp: integer;
private lastLevel: integer;
private lastName: string;
private nameText: Phaser.GameObjects.Text;
private levelContainer: Phaser.GameObjects.Container;
private hpBar: Phaser.GameObjects.Image;
private levelNumbersContainer: Phaser.GameObjects.Container;
private hpNumbersContainer: Phaser.GameObjects.Container;
private expBar: Phaser.GameObjects.Image;
constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) {
super(scene, x, y);
this.player = player;
this.lastHp = -1;
this.lastMaxHp = -1;
this.lastHpFrame = null;
this.lastExp = -1;
this.lastLevelExp = -1;
this.lastLevel = -1;
this.lastName = null;
// Initially invisible and shown via Pokemon.showInfo
this.setVisible(false);
const box = this.scene.add.image(0, 0, `pbinfo_${player ? 'player' : 'enemy'}`);
box.setOrigin(1, 0.5);
this.add(box);
const nameText = this.scene.add.text(player ? -115 : -124, player ? -15.2 : -11.2, '', {
color: '#404040',
font: '72px emerald'
});
nameText.setShadow(4, 4, '#ded6b5');
nameText.setOrigin(0, 0);
nameText.setScale(0.1666666667);
this.add(nameText);
this.nameText = nameText;
const levelContainer = this.scene.add.container(player ? -41 : -50, player ? -10 : -5);
this.add(levelContainer);
this.levelContainer = levelContainer;
const levelOverlay = this.scene.add.image(0, 0, 'overlay_lv');
levelContainer.add(levelOverlay);
const hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, 'overlay_hp');
hpBar.setOrigin(0);
this.add(hpBar);
this.hpBar = hpBar;
const levelNumbersContainer = this.scene.add.container(9.5, 0);
levelContainer.add(levelNumbersContainer);
this.levelNumbersContainer = levelNumbersContainer;
if (this.player) {
const hpNumbersContainer = this.scene.add.container(-15, 10);
this.add(hpNumbersContainer);
this.hpNumbersContainer = hpNumbersContainer;
const expBar = this.scene.add.image(-98, 18, 'overlay_exp');
expBar.setOrigin(0);
expBar.setScale(0, 1);
this.add(expBar);
this.expBar = expBar;
}
}
initInfo(battler: Pokemon) {
this.nameText.setText(battler.name);
this.lastName = battler.species.name;
this.hpBar.setScale(battler.hp / battler.getMaxHp(), 1);
if (this.player)
this.setHpNumbers(battler.hp, battler.getMaxHp());
this.lastHp = battler.hp;
this.lastHpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
this.lastMaxHp = battler.getMaxHp();
this.setLevel(battler.level);
this.lastLevel = battler.level;
if (this.player) {
this.expBar.setScale(battler.levelExp / getLevelTotalExp(battler.level, battler.species.growthRate), 1);
this.lastExp = battler.exp;
this.lastLevelExp = battler.levelExp;
}
}
updateInfo(battler: Pokemon, callback?: Function) {
if (!this.scene)
return;
if (this.lastName !== battler.species.name) {
this.nameText.setText(battler.name);
this.lastName = battler.species.name;
}
const updatePokemonHp = () => {
const duration = Utils.clampInt(Math.abs((this.lastHp) - battler.hp) * 5, 250, 5000);
this.scene.tweens.add({
targets: this.hpBar,
ease: 'Sine.easeOut',
scaleX: battler.hp / battler.getMaxHp(),
duration: duration,
onUpdate: () => {
if (this.player && this.lastHp !== battler.hp) {
const tweenHp = Math.ceil(this.hpBar.scaleX * battler.getMaxHp());
this.setHpNumbers(tweenHp, battler.getMaxHp())
this.lastHp = tweenHp;
}
const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
if (hpFrame !== this.lastHpFrame) {
this.hpBar.setFrame(hpFrame);
this.lastHpFrame = hpFrame;
}
},
onComplete: () => {
if (callback) {
callback();
callback = null;
}
}
});
if (!this.player)
this.lastHp = battler.hp;
this.lastMaxHp = battler.getMaxHp();
};
if (this.player && this.lastExp !== battler.exp) {
const originalCallback = callback;
callback = () => this.updatePokemonExp(battler, originalCallback);
}
if (this.lastHp !== battler.hp || this.lastMaxHp !== battler.getMaxHp())
updatePokemonHp();
else if (!this.player && this.lastLevel !== battler.level) {
this.setLevel(battler.level);
this.lastLevel = battler.level;
if (callback)
callback();
} else if (callback)
callback();
}
updatePokemonExp(battler: Pokemon, callback?: Function) {
const levelUp = this.lastLevel < battler.level;
const relLevelExp = getLevelRelExp(this.lastLevel + 1, battler.species.growthRate);
const levelExp = levelUp ? relLevelExp : battler.levelExp;
let ratio = levelExp / relLevelExp;
let duration = ((levelExp - this.lastLevelExp) / relLevelExp) * 1650;
this.scene.sound.play('exp');
this.scene.tweens.add({
targets: this.expBar,
ease: 'Sine.easeIn',
scaleX: ratio,
duration: duration,
onUpdate: () => {
if (this.player && this.lastHp !== battler.hp) {
const tweenHp = Math.ceil(this.hpBar.scaleX * battler.getMaxHp());
this.setHpNumbers(tweenHp, battler.getMaxHp());
this.lastHp = tweenHp;
}
const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
if (hpFrame !== this.lastHpFrame) {
this.hpBar.setFrame(hpFrame);
this.lastHpFrame = hpFrame;
}
},
onComplete: () => {
this.scene.sound.stopByKey('exp');
if (ratio === 1) {
this.lastLevelExp = 0;
this.lastLevel++;
this.scene.sound.play('level_up');
this.setLevel(this.lastLevel);
this.scene.time.delayedCall(500, () => {
this.expBar.setScale(0, 1);
this.updateInfo(battler, callback);
});
return;
} else {
this.lastExp = battler.exp;
this.lastLevelExp = battler.levelExp;
}
if (callback) {
callback();
callback = null;
}
}
});
}
setLevel(level: integer) {
this.levelNumbersContainer.removeAll();
const levelStr = level.toString();
for (let i = 0; i < levelStr.length; i++)
this.levelNumbersContainer.add(this.scene.add.image(i * 8, 0, 'numbers', levelStr[i]));
this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0));
}
setHpNumbers(hp: integer, maxHp: integer) {
if (!this.player)
return;
this.hpNumbersContainer.removeAll();
const hpStr = hp.toString();
const maxHpStr = maxHp.toString();
let offset = 0;
for (let i = maxHpStr.length - 1; i >= 0; i--)
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', maxHpStr[i]));
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', '/'));
for (let i = hpStr.length - 1; i >= 0; i--)
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', hpStr[i]));
}
}
export class PlayerBattleInfo extends BattleInfo {
constructor(scene: Phaser.Scene) {
super(scene, Math.floor(scene.game.canvas.width / 6) - 10, -72, true);
}
}
export class EnemyBattleInfo extends BattleInfo {
constructor(scene: Phaser.Scene) {
super(scene, 140, -141, false);
}
}
+795
View File
@@ -0,0 +1,795 @@
import BattleScene from "./battle-scene";
import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove } from "./pokemon";
import * as Utils from './utils';
import { allMoves, Moves as Move, MOVE_CATEGORY } from "./move";
import { Mode } from './ui/ui';
import { Command } from "./ui/command-ui-handler";
import { interp } from "./temp_interpreter";
import { Stat } from "./pokemon-stat";
import { ExpBoosterModifier, getNewModifierType, PokemonBaseStatModifier as PokemonBaseStatModifier, PokemonModifierType } from "./modifier";
import PartyUiHandler from "./ui/party-ui-handler";
import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getTintColor as getPokeballTintColor, PokeballType } from "./pokeball";
import { pokemonLevelMoves } from "./pokemon-level-moves";
export class BattlePhase {
protected scene: BattleScene;
constructor(scene: BattleScene) {
this.scene = scene;
}
start() {
console.log(`Start Phase ${this.constructor.name}`)
}
end() {
this.scene.shiftPhase();
}
}
export class EncounterPhase extends BattlePhase {
constructor(scene: BattleScene) {
super(scene);
}
start() {
super.start();
const enemyPokemon = this.scene.getEnemyPokemon();
enemyPokemon.tint(0, 0.5);
this.scene.tweens.add({
targets: [ this.scene.arenaEnemy, enemyPokemon, this.scene.arenaPlayer, this.scene.trainer ],
x: (_target, _key, value, targetIndex: integer) => targetIndex < 2 ? value + 300 : value - 300,
duration: 2000,
onComplete: () => {
enemyPokemon.untint(100, 'Sine.easeOut');
enemyPokemon.cry();
enemyPokemon.showInfo();
this.scene.ui.showText(`A wild ${enemyPokemon.name} appeared!`, null, () => this.end(), 1500);
}
});
}
end() {
if (this.scene.getEnemyPokemon().shiny)
this.scene.unshiftPhase(new ShinySparklePhase(this.scene, false));
// TODO: Remove
//this.scene.unshiftPhase(new SelectModifierPhase(this.scene));
super.end();
}
}
export class NextEncounterPhase extends BattlePhase {
constructor(scene: BattleScene) {
super(scene);
}
start() {
super.start();
this.scene.waveIndex++;
console.log(this.scene.getPlayerPokemon(), this.scene.getParty().map(p => p.name), this.scene.getPlayerPokemon().id)
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);
}
});
}
end() {
if (this.scene.getEnemyPokemon().shiny)
this.scene.unshiftPhase(new ShinySparklePhase(this.scene, false));
this.scene.unshiftPhase(new CheckSwitchPhase(this.scene));
super.end();
}
}
export class SummonPhase extends BattlePhase {
constructor(scene: BattleScene) {
super(scene);
}
start() {
super.start();
this.preSummon();
}
preSummon(): void {
this.scene.ui.showText(`Go! ${this.scene.getPlayerPokemon().name}!`);
this.scene.trainer.play('trainer_m_pb');
this.scene.tweens.add({
targets: this.scene.trainer,
x: -36,
duration: 1000
});
this.scene.time.delayedCall(750, () => this.summon());
}
summon(): void {
const pokeball = this.scene.add.sprite(36, 80, 'pb', 'pb');
pokeball.setVisible(false);
pokeball.setOrigin(0.5, 0.625);
this.scene.field.add(pokeball);
const playerPokemon = this.scene.getPlayerPokemon();
pokeball.setVisible(true);
this.scene.tweens.add({
targets: pokeball,
ease: 'Cubic.easeOut',
duration: 150,
x: 54,
y: 70,
onComplete: () => {
this.scene.tweens.add({
targets: pokeball,
duration: 500,
angle: 1440,
x: 100,
y: 132,
ease: 'Cubic.easeIn',
onComplete: () => {
this.scene.sound.play('pb_rel');
pokeball.destroy();
this.scene.add.existing(playerPokemon);
this.scene.field.add(playerPokemon);
playerPokemon.showInfo();
playerPokemon.setVisible(true);
playerPokemon.setScale(0.5);
playerPokemon.tint(getPokeballTintColor(playerPokemon.pokeball));
playerPokemon.untint(250, 'Sine.easeIn');
this.scene.tweens.add({
targets: playerPokemon,
duration: 250,
ease: 'Sine.easeIn',
scale: 1,
onComplete: () => {
playerPokemon.cry();
playerPokemon.getSprite().clearTint();
this.scene.time.delayedCall(1000, () => this.end());
}
});
}
});
}
});
}
end() {
if (this.scene.getEnemyPokemon().shiny)
this.scene.unshiftPhase(new ShinySparklePhase(this.scene, true));
super.end();
}
}
export class SwitchSummonPhase extends SummonPhase {
private slotIndex: integer;
private doReturn: boolean;
constructor(scene: BattleScene, slotIndex: integer, doReturn: boolean) {
super(scene);
this.slotIndex = slotIndex;
this.doReturn = doReturn;
}
start() {
super.start();
}
preSummon(): void {
if (!this.doReturn) {
this.switchAndSummon();
return;
}
const playerPokemon = this.scene.getPlayerPokemon();
this.scene.ui.showText(`Come back, ${this.scene.getPlayerPokemon().name}!`);
this.scene.sound.play('pb_rel');
playerPokemon.hideInfo();
playerPokemon.tint(getPokeballTintColor(playerPokemon.pokeball), 1, 250, 'Sine.easeIn');
this.scene.tweens.add({
targets: playerPokemon,
duration: 250,
ease: 'Sine.easeIn',
scale: 0.5,
onComplete: () => {
playerPokemon.setVisible(false);
this.scene.field.remove(playerPokemon);
this.scene.time.delayedCall(750, () => this.switchAndSummon());
}
});
}
switchAndSummon() {
const party = this.scene.getParty();
const switchedPokemon = party[this.slotIndex];
party[this.slotIndex] = this.scene.getPlayerPokemon();
party[0] = switchedPokemon;
this.scene.ui.showText(`Go! ${switchedPokemon.name}!`);
this.summon();
}
}
export class CheckSwitchPhase extends BattlePhase {
constructor(scene: BattleScene) {
super(scene)
}
start() {
super.start();
this.scene.ui.showText('Will you switch\nPokémon?', null, () => {
this.scene.ui.setMode(Mode.SWITCH_CHECK, () => this.end());
});
}
}
export class CommandPhase extends BattlePhase {
constructor(scene: BattleScene) {
super(scene)
}
start() {
super.start();
//interp(this.scene);
this.scene.ui.setMode(Mode.COMMAND);
}
handleCommand(command: Command, cursor: integer): boolean{
const playerPokemon = this.scene.getPlayerPokemon();
const enemyPokemon = this.scene.getEnemyPokemon();
let success: boolean;
let delayed: boolean;
switch (command) {
case Command.FIGHT:
if (playerPokemon.trySelectMove(cursor)) {
const playerPhase = new PlayerMovePhase(this.scene, playerPokemon, playerPokemon.moveset[cursor]);
delayed = playerPokemon.stats[Stat.SPD] < enemyPokemon.stats[Stat.SPD]
|| (playerPokemon.stats[Stat.SPD] === enemyPokemon.stats[Stat.SPD] && Utils.randInt(2) === 1)
this.scene.pushPhase(playerPhase);
success = true;
}
break;
case Command.BALL:
this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, PokeballType.POKEBALL));
success = true;
break;
case Command.POKEMON:
this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, cursor, true));
success = true;
break;
}
if (success) {
const enemyMove = enemyPokemon.getNextMove();
const enemyPhase = new EnemyMovePhase(this.scene, enemyPokemon, enemyMove);
if (delayed)
this.scene.unshiftPhase(enemyPhase);
else
this.scene.pushPhase(enemyPhase);
this.end();
}
return success;
}
end() {
super.end();
this.scene.ui.setMode(Mode.MESSAGE);
}
}
export abstract class PokemonPhase extends BattlePhase {
protected player: boolean;
constructor(scene: BattleScene, player: boolean) {
super(scene);
this.player = player;
}
getPokemon() {
return this.player ? this.scene.getPlayerPokemon() : this.scene.getEnemyPokemon();
}
}
abstract class MovePhase extends BattlePhase {
protected pokemon: Pokemon;
protected move: PokemonMove;
constructor(scene: BattleScene, pokemon: Pokemon, move: PokemonMove) {
super(scene);
this.pokemon = pokemon;
this.move = move;
}
abstract getDamagePhase(): MoveEffectPhase;
canMove(): boolean {
return !!this.pokemon.hp;
}
start() {
if (!this.canMove()) {
this.end();
return;
}
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());
}
}
export class PlayerMovePhase extends MovePhase {
constructor(scene: BattleScene, pokemon: PlayerPokemon, move: PokemonMove) {
super(scene, pokemon, move);
}
getDamagePhase(): MoveEffectPhase {
return new PlayerMoveEffectPhase(this.scene, this.move);
}
}
export class EnemyMovePhase extends MovePhase {
constructor(scene: BattleScene, pokemon: EnemyPokemon, move: PokemonMove) {
super(scene, pokemon, move);
}
getDamagePhase(): MoveEffectPhase {
return new EnemyMoveEffectPhase(this.scene, this.move);
}
}
abstract class MoveEffectPhase extends PokemonPhase {
protected move: PokemonMove;
constructor(scene: BattleScene, player: boolean, move: PokemonMove) {
super(scene, player);
this.move = move;
}
start() {
this.getTargetPokemon().apply(this.getUserPokemon(), this.move, () => this.end());
if (this.getTargetPokemon().hp <= 0) {
this.scene.pushPhase(new FaintPhase(this.scene, !this.player));
}
}
abstract getUserPokemon(): Pokemon;
abstract getTargetPokemon(): Pokemon;
}
export class PlayerMoveEffectPhase extends MoveEffectPhase {
constructor(scene: BattleScene, move: PokemonMove) {
super(scene, true, move);
}
getUserPokemon(): Pokemon {
return this.scene.getPlayerPokemon();
}
getTargetPokemon(): Pokemon {
if (this.move.getMove().category === MOVE_CATEGORY.STATUS)
return this.getUserPokemon();
return this.scene.getEnemyPokemon();
}
}
export class EnemyMoveEffectPhase extends MoveEffectPhase {
constructor(scene: BattleScene, move: PokemonMove) {
super(scene, false, move);
}
getUserPokemon(): Pokemon {
return this.scene.getEnemyPokemon();
}
getTargetPokemon(): Pokemon {
if (this.move.getMove().category === MOVE_CATEGORY.STATUS)
return this.getUserPokemon();
return this.scene.getPlayerPokemon();
}
}
export class MessagePhase extends BattlePhase {
private text: string;
private prompt: boolean;
constructor(scene: BattleScene, text: string, prompt?: boolean) {
super(scene);
this.text = text;
this.prompt = prompt;
}
start() {
super.start();
this.scene.ui.showText(this.text, null, () => this.end(), this.prompt ? 0 : 1500, this.prompt);
}
}
export class FaintPhase extends PokemonPhase {
constructor(scene: BattleScene, player: boolean) {
super(scene, player);
}
start() {
super.start();
if (this.player) {
this.scene.unshiftPhase(new MessagePhase(this.scene, `${this.getPokemon().name} fainted!`, true));
this.scene.unshiftPhase(new SwitchPhase(this.scene, true, false));
} else {
this.scene.unshiftPhase(new MessagePhase(this.scene, `Foe ${this.getPokemon().name} fainted!`, true));
this.scene.unshiftPhase(new VictoryPhase(this.scene));
}
const pokemon = this.getPokemon();
pokemon.faintCry(() => {
pokemon.hideInfo();
this.scene.sound.play('faint');
this.scene.tweens.add({
targets: pokemon,
duration: 500,
y: pokemon.y + 150,
ease: 'Sine.easeIn',
onComplete: () => {
pokemon.setVisible(false);
pokemon.y -= 150;
this.scene.field.remove(pokemon);
this.end();
}
});
});
}
}
export class VictoryPhase extends PokemonPhase {
constructor(scene: BattleScene) {
super(scene, true);
}
start() {
super.start();
if (this.scene.getPlayerPokemon().level < 100)
this.scene.unshiftPhase(new ExpPhase(this.scene));
this.scene.unshiftPhase(new SelectModifierPhase(this.scene));
this.scene.unshiftPhase(new NextEncounterPhase(this.scene));
this.end();
}
}
export class SwitchPhase extends BattlePhase {
private isModal: boolean;
private doReturn: boolean;
constructor(scene: BattleScene, isModal: boolean, doReturn: boolean) {
super(scene);
this.doReturn = doReturn;
this.isModal = isModal;
}
start() {
super.start();
this.scene.ui.setMode(Mode.PARTY, this.isModal, (slotIndex: integer) => {
if (slotIndex && slotIndex < 6)
this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, slotIndex, this.doReturn));
this.scene.ui.setMode(Mode.MESSAGE);
super.end();
}, PartyUiHandler.FilterNonFainted);
}
}
export class ExpPhase extends PokemonPhase {
constructor(scene: BattleScene) {
super(scene, true);
}
start() {
super.start();
const pokemon = this.getPokemon();
let exp = new Utils.IntegerHolder(this.scene.getEnemyPokemon().getExpValue(pokemon.level));
this.scene.applyModifiers(ExpBoosterModifier, exp);
this.scene.ui.showText(`${pokemon.name} gained\n${exp.value} EXP. Points!`, null, () => {
const lastLevel = pokemon.level;
let newLevel: integer;
pokemon.addExp(exp.value);
newLevel = pokemon.level;
if (newLevel > lastLevel)
this.scene.unshiftPhase(new LevelUpPhase(this.scene, newLevel));
pokemon.updateInfo(() => this.end());
}, null, true);
}
}
export class LevelUpPhase extends PokemonPhase {
private level: integer;
constructor(scene: BattleScene, level: integer) {
super(scene, true);
this.level = level;
}
start() {
super.start();
const pokemon = this.getPokemon();
const prevStats = pokemon.stats.slice(0);
pokemon.calculateStats();
pokemon.updateInfo();
this.scene.pauseBgm();
this.scene.sound.play('level_up_fanfare');
this.scene.ui.showText(`${this.getPokemon().name} grew to\nLV. ${this.level}!`, null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(prevStats, false, () => this.end()), null, true);
const levelMoves = pokemonLevelMoves[pokemon.species.speciesId];
if (levelMoves) {
for (let lm of levelMoves) {
const level = lm[0];
if (level < this.level)
continue;
else if (level > this.level)
break;
this.scene.unshiftPhase(new LearnMovePhase(this.scene, lm[1]));
}
}
this.scene.time.delayedCall(1500, () => this.scene.resumeBgm());
}
}
export class LearnMovePhase extends PokemonPhase {
private moveId: Move;
constructor(scene: BattleScene, moveId: Move) {
super(scene, true);
this.moveId = moveId;
}
start() {
super.start();
const pokemon = this.getPokemon();
const move = allMoves[this.moveId - 1];
if (pokemon.moveset.length < 4) {
pokemon.moveset.push(new PokemonMove(this.moveId, 0, 0));
this.scene.sound.play('level_up_fanfare');
this.scene.ui.showText(`${pokemon.name} learned\n${Utils.toPokemonUpperCase(move.name)}!`, null, () => this.end(), null, true);
} else
this.end();
}
}
export class AttemptCapturePhase extends BattlePhase {
private pokeballType: PokeballType;
private pokeball: Phaser.GameObjects.Sprite;
private originalY: number;
constructor(scene: BattleScene, pokeballType: PokeballType) {
super(scene);
this.pokeballType = pokeballType;
}
start() {
super.start();
const pokemon = this.scene.getEnemyPokemon();
this.originalY = pokemon.y;
const _3m = 3 * pokemon.getMaxHp();
const _2h = 2 * pokemon.hp;
const catchRate = pokemon.species.catchRate;
const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType);
const statusMultiplier = 1;
const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier);
const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x)));
const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType);
this.pokeball = this.scene.add.sprite(16, 80, 'pb', pokeballAtlasKey);
this.pokeball.setOrigin(0.5, 0.625);
this.scene.field.add(this.pokeball);
this.scene.sound.play('pb_throw');
this.scene.time.delayedCall(300, () => {
this.scene.field.moveBelow(this.pokeball, pokemon);
});
this.scene.tweens.add({
targets: this.pokeball,
x: { value: 236, ease: 'Linear' },
y: { value: 16, ease: 'Cubic.easeOut' },
duration: 500,
onComplete: () => {
this.pokeball.setTexture('pb', `${pokeballAtlasKey}_opening`);
this.scene.time.delayedCall(17, () => this.pokeball.setTexture('pb', `${pokeballAtlasKey}_open`));
this.scene.sound.play('pb_rel');
pokemon.tint(getPokeballTintColor(this.pokeballType));
this.scene.tweens.add({
targets: pokemon,
duration: 250,
ease: 'Sine.easeIn',
scale: 0.25,
y: 20,
onComplete: () => {
this.pokeball.setTexture('pb', `${pokeballAtlasKey}_opening`);
pokemon.setVisible(false);
this.scene.sound.play('pb_catch');
this.scene.time.delayedCall(17, () => this.pokeball.setTexture('pb', `${pokeballAtlasKey}`));
const doShake = this.pokeballType !== PokeballType.MASTER_BALL ? () => {
let shakeCount = 0;
const pbX = this.pokeball.x;
const shakeCounter = this.scene.tweens.addCounter({
from: 0,
to: 1,
repeat: 4,
yoyo: true,
ease: 'Cubic.easeOut',
duration: 250,
repeatDelay: 500,
onUpdate: t => {
if (shakeCount && shakeCount < 4) {
const value = t.getValue();
const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1;
this.pokeball.setX(pbX + value * 4 * directionMultiplier);
this.pokeball.setAngle(value * 27.5 * directionMultiplier);
}
},
onRepeat: t => {
if (shakeCount++ < 3) {
if (Utils.randInt(65536) < y)
this.scene.sound.play('pb_move');
else {
shakeCounter.stop();
this.release(shakeCount);
}
} else
this.scene.sound.play('pb_lock')
},
onComplete: () => {
this.catch();
}
});
} : () => this.catch();
this.scene.time.delayedCall(250, () => doPokeballBounceAnim(this.scene, this.pokeball, 16, 72, 350, doShake));
}
});
}
});
}
release(shakeCount: integer) {
const pokemon = this.scene.getEnemyPokemon();
this.scene.sound.play('pb_rel');
pokemon.setY(this.originalY);
pokemon.cry();
pokemon.tint(getPokeballTintColor(this.pokeballType));
pokemon.setVisible(true);
pokemon.untint(250, 'Sine.easeOut');
const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType);
this.pokeball.setTexture('pb', `${pokeballAtlasKey}_opening`);
this.scene.time.delayedCall(17, () => this.pokeball.setTexture('pb', `${pokeballAtlasKey}_open`));
this.scene.tweens.add({
targets: pokemon,
duration: 250,
ease: 'Sine.easeOut',
scale: 1
});
this.removePb();
this.end();
}
catch() {
console.log(this, 'catch')
const pokemon = this.scene.getEnemyPokemon();
this.scene.unshiftPhase(new VictoryPhase(this.scene));
this.scene.ui.showText(`${pokemon.name} was caught!`, null, () => {
pokemon.hideInfo();
pokemon.addToParty();
this.scene.field.remove(pokemon, true);
this.removePb();
this.end();
}, 0, true);
}
removePb() {
this.scene.tweens.add({
targets: this.pokeball,
duration: 250,
delay: 250,
ease: 'Sine.easeIn',
alpha: 0,
onComplete: () => this.pokeball.destroy()
});
}
}
export class SelectModifierPhase extends BattlePhase {
constructor(scene: BattleScene) {
super(scene);
}
start() {
super.start();
const types = [ getNewModifierType(), getNewModifierType(), getNewModifierType() ];
this.scene.ui.setMode(Mode.MODIFIER_SELECT, types, (cursor: integer) => {
if (cursor < 0) {
this.scene.ui.setMode(Mode.MESSAGE);
super.end();
return;
}
const modifierType = types[cursor];
if (modifierType instanceof PokemonModifierType) {
const pokemonModifierType = modifierType as PokemonModifierType;
this.scene.ui.setModeWithoutClear(Mode.PARTY, false, (slotIndex: integer) => {
if (slotIndex < 6) {
this.scene.ui.setMode(Mode.MODIFIER_SELECT);
this.scene.addModifier(types[cursor].newModifier(this.scene.getParty()[slotIndex].id));
this.scene.ui.setMode(Mode.MESSAGE);
super.end();
} else
this.scene.ui.setMode(Mode.MODIFIER_SELECT);
}, pokemonModifierType.selectFilter);
} else {
this.scene.addModifier(types[cursor].newModifier())
this.scene.ui.setMode(Mode.MESSAGE);
super.end();
}
});
}
}
export class ShinySparklePhase extends PokemonPhase {
constructor(scene: BattleScene, player: boolean) {
super(scene, player);
}
start() {
super.start();
this.getPokemon().sparkle();
this.scene.time.delayedCall(1000, () => this.end());
}
}
+435
View File
@@ -0,0 +1,435 @@
import Phaser from 'phaser';
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 * as Utils from './utils';
import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonModifierType, PokemonModifier } from './modifier';
import { Stat } from './pokemon-stat';
import { PokeballType } from './pokeball';
export default class BattleScene extends Phaser.Scene {
private phaseQueue: Array<BattlePhase>;
private phaseQueuePrepend: Array<BattlePhase>;
private currentPhase: BattlePhase;
private arena: Arena;
public field: Phaser.GameObjects.Container;
public fieldUI: Phaser.GameObjects.Container;
public arenaBg: Phaser.GameObjects.Image;
public arenaPlayer: Phaser.GameObjects.Image;
public arenaEnemy: Phaser.GameObjects.Image;
public arenaEnemy2: Phaser.GameObjects.Image;
public trainer: Phaser.GameObjects.Sprite;
public waveIndex: integer;
public pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).map(t => [ t, 0 ]));
private party: PlayerPokemon[];
private modifierBar: ModifierBar;
private modifiers: Modifier[];
private enemyPokemon: EnemyPokemon;
public uiContainer: Phaser.GameObjects.Container;
public ui: UI;
private bgm: Phaser.Sound.BaseSound;
private upKey: Phaser.Input.Keyboard.Key;
private downKey: Phaser.Input.Keyboard.Key;
private leftKey: Phaser.Input.Keyboard.Key;
private rightKey: Phaser.Input.Keyboard.Key;
private actionKey: Phaser.Input.Keyboard.Key;
private cancelKey: Phaser.Input.Keyboard.Key;
private blockInput: boolean;
public trainerId: integer = Utils.randInt(65536);
public secretId: integer = Utils.randInt(65536);
constructor() {
super('battle');
this.phaseQueue = [];
this.phaseQueuePrepend = [];
}
loadImage(key: string, folder: string, filename?: string) {
if (!filename)
filename = `${key}.png`;
this.load.image(key, `images/${folder}/${filename}`);
}
loadAtlas(key: string, folder: string, filenameRoot?: string) {
if (!filenameRoot)
filenameRoot = key;
if (folder)
folder += '/';
this.load.atlas(key, `images/${folder}${filenameRoot}.png`, `images/${folder}/${filenameRoot}.json`)
}
loadSe(key: string, folder?: string, filenames?: string | string[]) {
if (!filenames)
filenames = `${key}.wav`;
if (!folder)
folder = '';
else
folder += '/';
if (!Array.isArray(filenames))
filenames = [ filenames ];
for (let f of filenames as string[]) {
this.load.audio(key, `audio/se/${folder}${f}`);
}
}
loadBgm(key: string, filename?: string) {
if (!filename)
filename = `${key}.mp3`;
this.load.audio(key, `audio/bgm/${filename}`);
}
preload() {
// Load menu images
this.loadImage('bg', 'ui');
this.loadImage('bg_command', 'ui');
this.loadImage('bg_fight', 'ui');
this.loadAtlas('prompt', 'ui');
this.loadImage('cursor', 'ui');
this.loadImage('pbinfo_player', 'ui');
this.loadImage('pbinfo_enemy', 'ui');
this.loadImage('overlay_lv', 'ui');
this.loadAtlas('numbers', 'ui');
this.loadAtlas('overlay_hp', 'ui');
this.loadImage('overlay_exp', 'ui');
this.loadImage('level_up_stats', 'ui');
this.loadImage('boolean_window', 'ui');
this.loadImage('party_bg', 'ui');
this.loadAtlas('party_slot_main', 'ui');
this.loadAtlas('party_slot', 'ui');
this.loadImage('party_slot_overlay_lv', 'ui');
this.loadImage('party_slot_hp_bar', 'ui');
this.loadAtlas('party_slot_hp_overlay', 'ui');
this.loadAtlas('party_pb', 'ui');
this.loadImage('party_message', 'ui');
this.loadImage('party_message_large', 'ui');
this.loadAtlas('party_cancel', 'ui');
// Load arena images
for (let a = 1; a <= 15; a++) {
const arenaId = Utils.padInt(a, 2);
this.loadImage(`arena_${arenaId}`, 'arenas', `${arenaId}.png`);
this.loadImage(`arena_${arenaId}a`, 'arenas', `${arenaId}a.png`);
this.loadImage(`arena_${arenaId}b`, 'arenas', `${arenaId}b.png`);
}
// Load trainer images
this.loadImage('trainer_m', 'trainer');
this.loadAtlas('trainer_m_pb', 'trainer');
// Load pokemon-related images
this.loadImage(`pkmn__back__sub`, 'pokemon/back', 'sub.png');
this.loadImage(`pkmn__sub`, 'pokemon', 'sub.png');
this.loadAtlas('shiny', 'effects');
this.loadAtlas('pb', '');
this.loadAtlas('items', '');
for (let i = 0; i < 6; i++)
this.loadAtlas(`pokemon_icons_${i}`, 'ui');
this.loadSe('select');
this.loadSe('menu_open');
this.loadSe('hit');
this.loadSe('hit_strong');
this.loadSe('hit_weak');
this.loadSe('faint');
this.loadSe('flee');
this.loadSe('exp');
this.loadSe('level_up');
this.loadSe('shiny');
this.loadSe('restore');
this.loadSe('error');
this.loadSe('pb');
this.loadSe('pb_rel');
this.loadSe('pb_throw');
this.loadSe('pb_bounce_1');
this.loadSe('pb_bounce_2');
this.loadSe('pb_move');
this.loadSe('pb_catch');
this.loadSe('pb_lock');
this.loadSe('m_bubble');
this.loadSe('m_bubble3');
this.loadSe('m_crabhammer');
this.loadBgm('level_up_fanfare');
}
create() {
this.load.setBaseURL();
const field = this.add.container(0, 0);
field.setScale(6);
this.field = field;
// Init arena
const arenas = [
new Arena(this, ArenaType.PLAINS, 'battle'),
new Arena(this, ArenaType.GRASS, 'grass'),
new Arena(this, ArenaType.FOREST, 'forest'),
new Arena(this, ArenaType.WATER, 'water'),
new Arena(this, ArenaType.SWAMP, 'swamp'),
new Arena(this, ArenaType.SEA, 'sea'),
new Arena(this, ArenaType.MOUNTAIN, 'mountain'),
new Arena(this, ArenaType.LAND, 'land'),
new Arena(this, ArenaType.CAVE, 'cave'),
new Arena(this, ArenaType.DESERT, 'desert'),
new Arena(this, ArenaType.ARENA_BROWN, 'elite_1'),
new Arena(this, ArenaType.ARENA_BLUE, 'elite_2'),
new Arena(this, ArenaType.ARENA_PURPLE, 'elite_3'),
new Arena(this, ArenaType.ARENA_PINK, 'elite_4'),
new Arena(this, ArenaType.ARENA_ORANGE, 'elite_5')
];
const arena = arenas[Utils.randInt(15)];
this.arena = arena;
this.arenaBg = this.add.image(0, 0, `arena_${Utils.padInt(arena.type, 2)}`);
this.arenaPlayer = this.add.image(340, 20, `arena_${Utils.padInt(arena.type, 2)}a`);
this.arenaEnemy = this.add.image(-240, 13, `arena_${Utils.padInt(arena.type, 2)}b`);
this.arenaEnemy2 = this.add.image(-240, 13, `arena_${Utils.padInt(arena.type, 2)}b`);
[this.arenaBg, this.arenaPlayer, this.arenaEnemy, this.arenaEnemy2].forEach(a => {
a.setOrigin(0, 0);
field.add(a);
});
//arena.playBgm();
const fieldUI = this.add.container(0, this.game.canvas.height);
fieldUI.setScale(6);
this.fieldUI = fieldUI;
const uiContainer = this.add.container(0, 0);
uiContainer.setScale(6);
this.uiContainer = uiContainer;
this.modifiers = [];
this.modifierBar = new ModifierBar(this);
this.add.existing(this.modifierBar);
uiContainer.add(this.modifierBar);
this.waveIndex = 1;
this.party = [];
for (let s = 0; s < 3; s++) {
const playerSpecies = this.randomSpecies();
const playerPokemon = new PlayerPokemon(this, playerSpecies, 5);
playerPokemon.setVisible(false);
this.party.push(playerPokemon);
}
const enemySpecies = arena.randomSpecies(1);
console.log(enemySpecies.name);
const enemyPokemon = new EnemyPokemon(this, enemySpecies, this.getLevelForWave());
this.add.existing(enemyPokemon);
this.enemyPokemon = enemyPokemon;
field.add(enemyPokemon);
console.log(this.getPlayerPokemon().species.name, this.getPlayerPokemon().species.speciesId, this.getPlayerPokemon().stats);
console.log(enemyPokemon.species.name, enemyPokemon.species.speciesId, enemyPokemon.stats);
const trainerPbFrameNames = this.anims.generateFrameNames('trainer_m_pb', { zeroPad: 2, start: 1, end: 12 });
this.anims.create({
key: 'trainer_m_pb',
frames: trainerPbFrameNames,
frameRate: 16
});
const trainer = this.add.sprite(406, 132, 'trainer_m');
trainer.setOrigin(0.5, 1);
field.add(trainer);
this.trainer = trainer;
this.anims.create({
key: 'prompt',
frames: this.anims.generateFrameNumbers('prompt', { start: 1, end: 4 }),
frameRate: 6,
repeat: -1,
showOnStart: true
});
const ui = new UI(this);
this.uiContainer.add(ui);
this.ui = ui;
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);
}
update() {
this.checkInput();
}
getParty(): PlayerPokemon[] {
return this.party;
}
getPlayerPokemon(): PlayerPokemon {
return this.getParty()[0];
}
getEnemyPokemon(): EnemyPokemon {
return this.enemyPokemon;
}
setEnemyPokemon(enemyPokemon: EnemyPokemon) {
this.enemyPokemon = enemyPokemon;
}
randomSpecies(fromArenaPool?: boolean): PokemonSpecies {
return fromArenaPool
? this.arena.randomSpecies(1)
: allSpecies[(Utils.randInt(allSpecies.length)) - 1];
}
getLevelForWave() {
if (this.waveIndex === 1)
return 5;
let averageLevel = 5 + this.waveIndex * 0.5;
if (this.waveIndex % 10 === 0)
return averageLevel + 5;
const deviation = 10 / this.waveIndex;
return averageLevel + Math.round(Utils.randGauss(deviation));
}
checkInput(): boolean {
if (this.blockInput)
return;
if (this.upKey.isDown)
this.ui.processInput(this.upKey.keyCode);
else if (this.downKey.isDown)
this.ui.processInput(this.downKey.keyCode);
else if (this.leftKey.isDown)
this.ui.processInput(this.leftKey.keyCode);
else if (this.rightKey.isDown)
this.ui.processInput(this.rightKey.keyCode);
else if (this.actionKey.isDown)
this.ui.processInput(this.actionKey.keyCode);
else if (this.cancelKey.isDown)
this.ui.processInput(this.cancelKey.keyCode);
else
return;
this.blockInput = true;
this.time.delayedCall(250, () => {
this.blockInput = false;
});
}
playBgm(bgmName: string): void {
if (this.bgm) {
this.bgm.stop();
this.bgm.destroy();
}
this.bgm = this.sound.add(bgmName, { loop: true });
this.bgm.play();
}
pauseBgm(): void {
if (this.bgm)
this.bgm.pause();
}
resumeBgm(): void {
if (this.bgm && this.bgm.isPaused)
this.bgm.resume();
}
getCurrentPhase(): BattlePhase {
return this.currentPhase;
}
pushPhase(phase: BattlePhase): void {
this.phaseQueue.push(phase);
}
unshiftPhase(phase: BattlePhase): void {
this.phaseQueuePrepend.push(phase);
}
clearPhaseQueue(): void {
this.phaseQueue.splice(0, this.phaseQueue.length);
}
shiftPhase(): void {
if (this.phaseQueuePrepend.length) {
while (this.phaseQueuePrepend.length)
this.phaseQueue.unshift(this.phaseQueuePrepend.pop());
}
if (!this.phaseQueue.length)
this.populatePhaseQueue();
this.currentPhase = this.phaseQueue.shift();
this.currentPhase.start();
}
populatePhaseQueue(): void {
this.phaseQueue.push(new CommandPhase(this));
}
addModifier(modifier: Modifier): void {
if (modifier.add(this.modifierBar, this.modifiers))
this.sound.play('restore');
if (modifier instanceof ConsumableModifier) {
const args = [ this ];
if (modifier.shouldApply(args))
modifier.apply(args);
return;
}
if (modifier instanceof PokemonModifier) {
for (let p in this.party) {
const pokemon = this.party[p];
if (modifier instanceof ConsumablePokemonModifier) {
const args = [ pokemon ];
if (modifier.shouldApply(args))
modifier.apply(args);
}
pokemon.calculateStats();
pokemon.updateInfo();
}
}
}
applyModifiers(modifierType: { new(...args: any[]): Modifier }, ...args: any[]): void {
const modifiers = this.modifiers.filter(m => m instanceof modifierType && m.shouldApply(args));
for (let modifier of modifiers) {
if (modifier.apply(args))
console.log('Applied', modifier.type.name);
}
}
}
+26
View File
@@ -0,0 +1,26 @@
export enum GrowthRate {
ERRATIC = 0,
FAST,
MEDIUM_FAST,
MEDIUM_SLOW,
SLOW,
FLUCTUATING
};
const expLevels = [
[ 0, 15, 52, 122, 237, 406, 637, 942, 1326, 1800, 2369, 3041, 3822, 4719, 5737, 6881, 8155, 9564, 11111, 12800, 14632, 16610, 18737, 21012, 23437, 26012, 28737, 31610, 34632, 37800, 41111, 44564, 48155, 51881, 55737, 59719, 63822, 68041, 72369, 76800, 81326, 85942, 90637, 95406, 100237, 105122, 110052, 115015, 120001, 125000, 131324, 137795, 144410, 151165, 158056, 165079, 172229, 179503, 186894, 194400, 202013, 209728, 217540, 225443, 233431, 241496, 249633, 257834, 267406, 276458, 286328, 296358, 305767, 316074, 326531, 336255, 346965, 357812, 367807, 378880, 390077, 400293, 411686, 423190, 433572, 445239, 457001, 467489, 479378, 491346, 501878, 513934, 526049, 536557, 548720, 560922, 571333, 583539, 591882, 600000 ],
[ 0, 6, 21, 51, 100, 172, 274, 409, 583, 800, 1064, 1382, 1757, 2195, 2700, 3276, 3930, 4665, 5487, 6400, 7408, 8518, 9733, 11059, 12500, 14060, 15746, 17561, 19511, 21600, 23832, 26214, 28749, 31443, 34300, 37324, 40522, 43897, 47455, 51200, 55136, 59270, 63605, 68147, 72900, 77868, 83058, 88473, 94119, 100000, 106120, 112486, 119101, 125971, 133100, 140492, 148154, 156089, 164303, 172800, 181584, 190662, 200037, 209715, 219700, 229996, 240610, 251545, 262807, 274400, 286328, 298598, 311213, 324179, 337500, 351180, 365226, 379641, 394431, 409600, 425152, 441094, 457429, 474163, 491300, 508844, 526802, 545177, 563975, 583200, 602856, 622950, 643485, 664467, 685900, 707788, 730138, 752953, 776239, 800000 ],
[ 0, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000, 9261, 10648, 12167, 13824, 15625, 17576, 19683, 21952, 24389, 27000, 29791, 32768, 35937, 39304, 42875, 46656, 50653, 54872, 59319, 64000, 68921, 74088, 79507, 85184, 91125, 97336, 103823, 110592, 117649, 125000, 132651, 140608, 148877, 157464, 166375, 175616, 185193, 195112, 205379, 216000, 226981, 238328, 250047, 262144, 274625, 287496, 300763, 314432, 328509, 343000, 357911, 373248, 389017, 405224, 421875, 438976, 456533, 474552, 493039, 512000, 531441, 551368, 571787, 592704, 614125, 636056, 658503, 681472, 704969, 729000, 753571, 778688, 804357, 830584, 857375, 884736, 912673, 941192, 970299, 1000000 ],
[ 0, 9, 57, 96, 135, 179, 236, 314, 419, 560, 742, 973, 1261, 1612, 2035, 2535, 3120, 3798, 4575, 5460, 6458, 7577, 8825, 10208, 11735, 13411, 15244, 17242, 19411, 21760, 24294, 27021, 29949, 33084, 36435, 40007, 43808, 47846, 52127, 56660, 61450, 66505, 71833, 77440, 83335, 89523, 96012, 102810, 109923, 117360, 125126, 133229, 141677, 150476, 159635, 169159, 179056, 189334, 199999, 211060, 222522, 234393, 246681, 259392, 272535, 286115, 300140, 314618, 329555, 344960, 360838, 377197, 394045, 411388, 429235, 447591, 466464, 485862, 505791, 526260, 547274, 568841, 590969, 613664, 636935, 660787, 685228, 710266, 735907, 762160, 789030, 816525, 844653, 873420, 902835, 932903, 963632, 995030, 1027103, 1059860 ],
[ 0, 10, 33, 80, 156, 270, 428, 640, 911, 1250, 1663, 2160, 2746, 3430, 4218, 5120, 6141, 7290, 8573, 10000, 11576, 13310, 15208, 17280, 19531, 21970, 24603, 27440, 30486, 33750, 37238, 40960, 44921, 49130, 53593, 58320, 63316, 68590, 74148, 80000, 86151, 92610, 99383, 106480, 113906, 121670, 129778, 138240, 147061, 156250, 165813, 175760, 186096, 196830, 207968, 219520, 231491, 243890, 256723, 270000, 283726, 297910, 312558, 327680, 343281, 359370, 375953, 393040, 410636, 428750, 447388, 466560, 486271, 506530, 527343, 548720, 570666, 593190, 616298, 640000, 664301, 689210, 714733, 740880, 767656, 795070, 823128, 851840, 881211, 911250, 941963, 973360, 1005446, 1038230, 1071718, 1105920, 1140841, 1176490, 1212873, 1250000 ],
[ 0, 4, 13, 32, 65, 112, 178, 276, 393, 540, 745, 967, 1230, 1591, 1957, 2457, 3046, 3732, 4526, 5440, 6482, 7666, 9003, 10506, 12187, 14060, 16140, 18439, 20974, 23760, 26811, 30146, 33780, 37731, 42017, 46656, 50653, 55969, 60505, 66560, 71677, 78533, 84277, 91998, 98415, 107069, 114205, 123863, 131766, 142500, 151222, 163105, 172697, 185807, 196322, 210739, 222231, 238036, 250562, 267840, 281456, 300293, 315059, 335544, 351520, 373744, 390991, 415050, 433631, 459620, 479600, 507617, 529063, 559209, 582187, 614566, 639146, 673863, 700115, 737280, 765275, 804997, 834809, 877201, 908905, 954084, 987754, 1035837, 1071552, 1122660, 1160499, 1214753, 1254796, 1312322, 1354652, 1415577, 1460276, 1524731, 1571884, 1640000 ]
];
export function getLevelTotalExp(level: integer, growthRate: integer) {
console.log(level, growthRate)
return expLevels[growthRate][level - 1];
};
export function getLevelRelExp(level: integer, growthRate: integer) {
return getLevelTotalExp(level, growthRate) - getLevelTotalExp(level - 1, growthRate);
};
+36
View File
@@ -0,0 +1,36 @@
import Phaser from 'phaser';
import BattleScene from './battle-scene';
const config: Phaser.Types.Core.GameConfig = {
type: Phaser.AUTO,
parent: 'app',
scale: {
width: 1920,
height: 1080,
mode: Phaser.Scale.FIT
},
pixelArt: true,
scene: [ BattleScene ]
};
const setPositionRelative = function(guideObject: any, x: number, y: number) {
if (guideObject && guideObject.hasOwnProperty('width') && guideObject.hasOwnProperty('height')) {
const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX));
const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY));
this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y);
return;
}
this.setPosition(x, y);
};
Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative;
Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative;
Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative;
document.fonts.load('16px emerald').then(() => document.fonts.load('10px pkmnems'));
const game = new Phaser.Game(config);
game.sound.pauseOnBlur = false;
export default game;
+458
View File
@@ -0,0 +1,458 @@
import BattleScene from "./battle-scene";
import { getPokeballName, PokeballType } from "./pokeball";
import Pokemon, { PlayerPokemon } from "./pokemon";
import { Stat, getStatName } from "./pokemon-stat";
import { addTextObject, TextStyle } from "./text";
import PartyUiHandler from "./ui/party-ui-handler";
import * as Utils from "./utils";
export class ModifierBar extends Phaser.GameObjects.Container {
constructor(scene: BattleScene) {
super(scene, 1, 2);
this.setScale(0.5);
}
addModifier(modifier: Modifier) {
const icon = modifier.getIcon(this.scene as BattleScene);
this.add(icon);
this.setModifierIconPosition(icon);
}
updateModifier(modifier: Modifier, modifiers: Modifier[]) {
const index = modifiers.indexOf(modifier);
if (index > -1) {
this.getAt(index).destroy();
const newIcon = modifier.getIcon(this.scene as BattleScene);
this.addAt(newIcon, index);
this.setModifierIconPosition(newIcon);
}
}
setModifierIconPosition(icon: Phaser.GameObjects.Container) {
const x = (this.getIndex(icon) % 12) * 26;
const y = Math.floor((this.getIndex(icon) * 6) / (this.scene.game.canvas.width / 6)) * 20;
icon.setPosition(x, y);
}
}
export abstract class Modifier {
public type: ModifierType;
public stackCount: integer;
constructor(type: ModifierType) {
this.type = type;
this.stackCount = 1;
}
add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean {
modifiers.push(this);
modifierBar.addModifier(this);
return true;
}
shouldApply(_args: any[]): boolean {
return true;
}
abstract apply(args: any[]): boolean;
incrementStack(): void {
this.stackCount++;
}
getIcon(scene: BattleScene): Phaser.GameObjects.Container {
const container = scene.add.container(0, 0);
const item = scene.add.sprite(0, 12, 'items');
item.setFrame(this.type.iconImage);
item.setOrigin(0, 0.5);
container.add(item);
const stackText = this.getIconStackText(scene);
if (stackText)
container.add(stackText);
return container;
}
getIconStackText(scene: BattleScene): Phaser.GameObjects.Text {
if (this.stackCount <= 1)
return null;
const text = addTextObject(scene, 16, 12, this.stackCount.toString(), TextStyle.PARTY, { fontSize: '66px' });
text.setStroke('#424242', 16)
text.setOrigin(1, 0);
return text;
}
}
export abstract class ConsumableModifier extends Modifier {
constructor(type: ModifierType) {
super(type);
}
add(_modifierBar: ModifierBar, _modifiers: Modifier[]): boolean {
return true;
}
shouldApply(args: any[]): boolean {
return args.length === 1 && args[0] instanceof BattleScene;
}
}
class AddPokeballModifier extends ConsumableModifier {
private pokeballType: PokeballType;
private count: integer;
constructor(type: ModifierType, pokeballType: PokeballType, count: integer) {
super(type);
this.pokeballType = pokeballType;
this.count = count;
}
apply(args: any[]): boolean {
(args[0] as BattleScene).pokeballCounts[this.pokeballType] += this.count;
console.log((args[0] as BattleScene).pokeballCounts);
return true;
}
}
export abstract class PokemonModifier extends Modifier {
public pokemonId: integer;
constructor(type: ModifierType, pokemonId: integer) {
super(type);
this.pokemonId = pokemonId;
}
shouldApply(args: any[]): boolean {
return args.length && args[0] === this.pokemonId;
}
getIcon(scene: BattleScene): Phaser.GameObjects.Container {
const container = scene.add.container(0, 0);
const pokemon = this.getPokemon(scene);
const pokemonIcon = scene.add.sprite(0, 8, pokemon.getIconAtlasKey());
pokemonIcon.play(pokemon.getIconKey()).stop();
pokemonIcon.setOrigin(0, 0.5);
container.add(pokemonIcon);
return container;
}
getPokemon(scene: BattleScene) {
return scene.getParty().find(p => p.id === this.pokemonId);
}
}
export class PokemonBaseStatModifier extends PokemonModifier {
protected stat: Stat;
constructor(type: PokemonBaseStatBoosterModifierType, pokemonId: integer, stat: Stat) {
super(type, pokemonId);
this.stat = stat;
}
add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean {
for (let modifier of modifiers) {
if (modifier instanceof PokemonBaseStatModifier) {
const pokemonStatModifier = modifier as PokemonBaseStatModifier;
console.log(pokemonStatModifier.stat, this.stat, pokemonStatModifier.pokemonId === this.pokemonId && pokemonStatModifier.stat === this.stat)
if (pokemonStatModifier.pokemonId === this.pokemonId && pokemonStatModifier.stat === this.stat) {
pokemonStatModifier.incrementStack();
modifierBar.updateModifier(pokemonStatModifier, modifiers);
return true;
}
}
}
return super.add(modifierBar, modifiers);
}
shouldApply(args: any[]): boolean {
console.log(args, this.pokemonId, args)
return super.shouldApply(args) && args.length === 2 && args[1] instanceof Array<integer>;
}
apply(args: any[]): boolean {
args[1][this.stat] = Math.min(Math.floor(args[1][this.stat] * (1 + this.stackCount * 0.1)), 999999);
return true;
}
getIcon(scene: BattleScene): Phaser.GameObjects.Container {
const container = super.getIcon(scene);
const item = scene.add.sprite(16, 16, 'items');
item.setScale(0.5);
item.setOrigin(0, 0.5);
item.setTexture('items', this.type.iconImage);
container.add(item);
const stackText = this.getIconStackText(scene);
if (stackText)
container.add(stackText);
return container;
}
}
export abstract class ConsumablePokemonModifier extends PokemonModifier {
constructor(type: ModifierType, pokemonId: integer) {
super(type, pokemonId);
}
add(_modifierBar: ModifierBar, _modifiers: Modifier[]): boolean {
return true;
}
shouldApply(args: any[]): boolean {
return args.length === 1 && args[0] instanceof Pokemon && (this.pokemonId === -1 || (args[0] as Pokemon).id === this.pokemonId);
}
}
export class PokemonHpRestoreModifier extends ConsumablePokemonModifier {
private restorePercent: integer;
constructor(type: ModifierType, pokemonId: integer, restorePercent: integer, ) {
super(type, pokemonId);
this.restorePercent = restorePercent;
}
apply(args: any[]): boolean {
const pokemon = args[0] as Pokemon;
pokemon.hp = Math.min(pokemon.hp + (this.restorePercent * 0.01) * pokemon.getMaxHp(), pokemon.getMaxHp());
return true;
}
}
export class ExpBoosterModifier extends Modifier {
constructor(type: ModifierType) {
super(type);
}
add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean {
for (let modifier of modifiers) {
if (modifier instanceof ExpBoosterModifier) {
const expModifier = modifier as ExpBoosterModifier;
expModifier.incrementStack();
modifierBar.updateModifier(expModifier, modifiers);
return true;
}
}
return super.add(modifierBar, modifiers);
}
apply(args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value = Math.floor((args[0] as Utils.IntegerHolder).value * (1 + (this.stackCount * 0.25)));
return true;
}
}
export class ShinyRateBoosterModifier extends Modifier {
constructor(type: ModifierType) {
super(type);
}
add(modifierBar: ModifierBar, modifiers: Modifier[]): boolean {
for (let modifier of modifiers) {
if (modifier instanceof ShinyRateBoosterModifier) {
const shinyRateModifier = modifier as ShinyRateBoosterModifier;
shinyRateModifier.incrementStack();
modifierBar.updateModifier(shinyRateModifier, modifiers);
return true;
}
}
return super.add(modifierBar, modifiers);
}
apply(args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value = Math.pow((args[0] as Utils.IntegerHolder).value * 0.5, this.stackCount + 1);
return true;
}
}
export enum ModifierTier {
COMMON,
GREAT,
ULTRA,
MASTER
};
export class ModifierType {
public name: string;
public description: string;
public iconImage: string;
public tier: ModifierTier;
private newModifierFunc: Function;
constructor(name: string, description: string, newModifierFunc: Function, iconImage?: string) {
this.name = name;
this.description = description;
this.iconImage = iconImage || name.replace(/[ \-]/g, '_').toLowerCase();
this.newModifierFunc = newModifierFunc;
}
setTier(tier: ModifierTier) {
this.tier = tier;
}
newModifier(...args: any[]) {
return this.newModifierFunc(this, args);
}
}
class AddPokeballModifierType extends ModifierType {
constructor(pokeballType: PokeballType, count: integer, iconImage?: string) {
super(`${count}x ${getPokeballName(pokeballType)}`, `Receive ${getPokeballName(pokeballType)} x${count}`, (_type, _args) => new AddPokeballModifier(this, pokeballType, count), iconImage);
}
}
export abstract class PokemonModifierType extends ModifierType {
public selectFilter: Function;
constructor(name: string, description: string, newModifierFunc: Function, selectFilter?: Function, iconImage?: string) {
super(name, description, newModifierFunc, iconImage);
this.selectFilter = selectFilter;
}
}
class PokemonHpRestoreModifierType extends PokemonModifierType {
protected restorePercent: integer;
constructor(name: string, restorePercent: integer, iconImage?: string) {
super(name, `Restore ${restorePercent}% HP for one POKéMON`, (_type, args) => new PokemonHpRestoreModifier(this, args[0], this.restorePercent),
(pokemon: PlayerPokemon) => {
if (pokemon.hp >= pokemon.getMaxHp())
return PartyUiHandler.NoEffectMessage;
return null;
}, iconImage);
this.restorePercent = restorePercent;
}
}
class PokemonReviveModifierType extends PokemonHpRestoreModifierType {
constructor(name: string, restorePercent: integer, iconImage?: string) {
super(name, restorePercent, iconImage);
this.description = `Revive one POKéMON and restore ${restorePercent}% HP`;
this.selectFilter = (pokemon: PlayerPokemon) => {
if (pokemon.hp)
return PartyUiHandler.NoEffectMessage;
return null;
};
}
}
class PokemonBaseStatBoosterModifierType extends PokemonModifierType {
private stat: Stat;
constructor(name: string, stat: Stat, _iconImage?: string) {
super(name, `Increases one POKéMON's base ${getStatName(stat)} by 10%` , (_type, args) => new PokemonBaseStatModifier(this, args[0], this.stat));
this.stat = stat;
}
}
class AllPokemonHpRestoreModifierType extends ModifierType {
private restorePercent: integer;
constructor(name: string, restorePercent: integer, iconImage?: string) {
super(name, `Restore ${restorePercent}% HP for all POKéMON`, (_type, _args) => new PokemonHpRestoreModifier(this, -1, this.restorePercent), iconImage);
this.restorePercent = restorePercent;
}
}
class WeightedModifierType {
public modifierType: ModifierType;
public weight: integer;
constructor(modifierType: ModifierType, weight: integer) {
this.modifierType = modifierType;
this.weight = weight;
}
setTier(tier: ModifierTier) {
this.modifierType.setTier(tier);
}
}
const modifierPool = {
[ModifierTier.COMMON]: [
new WeightedModifierType(new AddPokeballModifierType(PokeballType.POKEBALL, 5, 'pb'), 2),
new WeightedModifierType(new PokemonHpRestoreModifierType('POTION', 20), 3),
new PokemonHpRestoreModifierType('SUPER POTION', 50),
new PokemonBaseStatBoosterModifierType('HP-UP', Stat.HP),
new PokemonBaseStatBoosterModifierType('PROTEIN', Stat.ATK),
new PokemonBaseStatBoosterModifierType('IRON', Stat.DEF),
new PokemonBaseStatBoosterModifierType('CALCIUM', Stat.SPATK),
new PokemonBaseStatBoosterModifierType('ZINC', Stat.SPDEF),
new PokemonBaseStatBoosterModifierType('CARBOS', Stat.SPD)
].map(m => { m.setTier(ModifierTier.COMMON); return m; }),
[ModifierTier.GREAT]: [
new AddPokeballModifierType(PokeballType.GREAT_BALL, 5, 'gb'),
new PokemonReviveModifierType('REVIVE', 50),
new PokemonHpRestoreModifierType('HYPER POTION', 100)
].map(m => { m.setTier(ModifierTier.GREAT); return m; }),
[ModifierTier.ULTRA]: [
new AddPokeballModifierType(PokeballType.ULTRA_BALL, 5, 'ub'),
new AllPokemonHpRestoreModifierType('MAX POTION', 100),
new ModifierType('LUCKY EGG', 'Increases gain of EXP. Points by 25%', (type, _args) => new ExpBoosterModifier(type))
].map(m => { m.setTier(ModifierTier.ULTRA); return m; }),
[ModifierTier.MASTER]: [
new AddPokeballModifierType(PokeballType.MASTER_BALL, 1, 'mb'),
new WeightedModifierType(new ModifierType('SHINY CHARM', 'Dramatically increases the chance of a wild POkéMON being shiny', (type, _args) => new ShinyRateBoosterModifier(type)), 2)
].map(m => { m.setTier(ModifierTier.MASTER); return m; })
};
const modifierPoolThresholds = Object.fromEntries(new Map(Object.keys(modifierPool).map(t => {
const thresholds = new Map();
let i = 0;
modifierPool[t].reduce((total: integer, modifierType: ModifierType | WeightedModifierType) => {
total += modifierType instanceof WeightedModifierType ? (modifierType as WeightedModifierType).weight : 1;
thresholds.set(total, i++);
return total;
}, 0);
return [ t, Object.fromEntries(thresholds) ]
})));
console.log(modifierPoolThresholds)
export function getNewModifierType(): ModifierType {
const tierValue = Utils.randInt(256);
const tier = tierValue >= 52 ? ModifierTier.COMMON : tierValue >= 8 ? ModifierTier.GREAT : tierValue >= 1 ? ModifierTier.ULTRA : ModifierTier.MASTER;
const thresholds = Object.keys(modifierPoolThresholds[tier]);
const totalWeight = parseInt(thresholds[thresholds.length - 1]);
const value = Utils.randInt(totalWeight);
let index: integer;
for (let t of thresholds) {
let threshold = parseInt(t);
if (value < threshold) {
index = modifierPoolThresholds[tier][threshold];
break;
}
}
let modifierType: ModifierType | WeightedModifierType = modifierPool[tier][index];
if (modifierType instanceof WeightedModifierType)
return (modifierType as WeightedModifierType).modifierType;
return modifierType;
}
+1162
View File
File diff suppressed because it is too large. Load diff
+104
View File
@@ -0,0 +1,104 @@
import BattleScene from "./battle-scene";
import { toPokemonUpperCase } from "./utils";
export enum PokeballType {
POKEBALL,
GREAT_BALL,
ULTRA_BALL,
MASTER_BALL
};
export function getPokeballAtlasKey(type: PokeballType): string {
switch (type) {
case PokeballType.POKEBALL:
return 'pb';
case PokeballType.GREAT_BALL:
return 'gb';
case PokeballType.ULTRA_BALL:
return 'ub';
case PokeballType.MASTER_BALL:
return 'mb';
}
}
export function getPokeballName(type: PokeballType): string {
let ret: string;
switch (type) {
case PokeballType.POKEBALL:
ret = 'Poké ball';
break;
case PokeballType.GREAT_BALL:
ret = 'Great Ball';
break;
case PokeballType.ULTRA_BALL:
ret = 'Ultra Ball';
break;
case PokeballType.MASTER_BALL:
ret = 'Master Ball';
break;
}
return toPokemonUpperCase(ret);
}
export function getPokeballCatchMultiplier(type: PokeballType): number {
switch (type) {
case PokeballType.POKEBALL:
return 1;
case PokeballType.GREAT_BALL:
return 1.5;
case PokeballType.ULTRA_BALL:
return 2;
case PokeballType.MASTER_BALL:
return -1;
}
}
export function getTintColor(type: PokeballType): number {
switch (type) {
case PokeballType.POKEBALL:
return 0xd52929;
case PokeballType.GREAT_BALL:
return 0x94b4de;
case PokeballType.ULTRA_BALL:
return 0xe6cd31;
case PokeballType.MASTER_BALL:
return 0xa441bd;
}
}
export function doPokeballBounceAnim(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite, y1: number, y2: number, baseBounceDuration: integer, callback: Function) {
let bouncePower = 1;
let bounceYOffset = y1;
let bounceY = y2;
let yd = y2 - y1;
const doBounce = () => {
scene.tweens.add({
targets: pokeball,
y: y2,
duration: bouncePower * baseBounceDuration,
ease: 'Cubic.easeIn',
onComplete: () => {
scene.sound.play('pb_bounce_1', { volume: bouncePower });
bouncePower = bouncePower > 0.01 ? bouncePower * 0.5 : 0;
if (bouncePower) {
bounceYOffset = yd * bouncePower;
bounceY = y2 - bounceYOffset;
scene.tweens.add({
targets: pokeball,
y: bounceY,
duration: bouncePower * baseBounceDuration,
ease: 'Cubic.easeOut',
onComplete: () => doBounce()
});
} else if (callback)
callback();
}
});
};
doBounce();
}
+934
View File
@@ -0,0 +1,934 @@
import Pokemon from "./pokemon";
import { Stat } from "./pokemon-stat";
import { Species } from "./species";
export enum WildEvolutionRate {
NORMAL,
UNCOMMON,
RARE,
ULTRA_RARE,
TAG_NONE
}
export class PokemonSpeciesEvolution {
public speciesId: Species;
public level: integer;
public item: string;
public condition: PokemonSpeciesEvolutionCondition | string;
public wildRate: WildEvolutionRate;
constructor(speciesId: Species, level: integer, item: string, condition: PokemonSpeciesEvolutionCondition | string, wildRate?: WildEvolutionRate) {
this.speciesId = speciesId;
this.level = level;
this.item = item;
this.condition = condition;
this.wildRate = wildRate || WildEvolutionRate.NORMAL;
}
}
export class PokemonSpeciesEvolutionCondition {
public predicate: Function;
public applyToWild: boolean;
constructor(predicate: Function, applyToWild?: boolean) {
this.predicate = predicate;
this.applyToWild = !!applyToWild;
}
}
export const pokemonEvolutions = {
[Species.BULBASAUR]: [
new PokemonSpeciesEvolution(Species.IVYSAUR, 16, null, null)
],
[Species.IVYSAUR]: [
new PokemonSpeciesEvolution(Species.VENUSAUR, 32, null, null)
],
[Species.CHARMANDER]: [
new PokemonSpeciesEvolution(Species.CHARMELEON, 16, null, null)
],
[Species.CHARMELEON]: [
new PokemonSpeciesEvolution(Species.CHARIZARD, 36, null, null)
],
[Species.SQUIRTLE]: [
new PokemonSpeciesEvolution(Species.WARTORTLE, 16, null, null)
],
[Species.WARTORTLE]: [
new PokemonSpeciesEvolution(Species.BLASTOISE, 36, null, null)
],
[Species.CATERPIE]: [
new PokemonSpeciesEvolution(Species.METAPOD, 7, null, null)
],
[Species.METAPOD]: [
new PokemonSpeciesEvolution(Species.BUTTERFREE, 10, null, null)
],
[Species.WEEDLE]: [
new PokemonSpeciesEvolution(Species.KAKUNA, 7, null, null)
],
[Species.KAKUNA]: [
new PokemonSpeciesEvolution(Species.BEEDRILL, 10, null, null)
],
[Species.PIDGEY]: [
new PokemonSpeciesEvolution(Species.PIDGEOTTO, 18, null, null)
],
[Species.PIDGEOTTO]: [
new PokemonSpeciesEvolution(Species.PIDGEOT, 36, null, null)
],
[Species.RATTATA]: [
new PokemonSpeciesEvolution(Species.RATICATE, 20, null, null)
],
[Species.SPEAROW]: [
new PokemonSpeciesEvolution(Species.FEAROW, 20, null, null)
],
[Species.EKANS]: [
new PokemonSpeciesEvolution(Species.ARBOK, 22, null, null)
],
[Species.SANDSHREW]: [
new PokemonSpeciesEvolution(Species.SANDSLASH, 22, null, null)
],
[Species.NIDORAN_F]: [
new PokemonSpeciesEvolution(Species.NIDORINA, 16, null, null)
],
[Species.NIDORAN_M]: [
new PokemonSpeciesEvolution(Species.NIDORINO, 16, null, null)
],
[Species.ZUBAT]: [
new PokemonSpeciesEvolution(Species.GOLBAT, 22, null, null)
],
[Species.ODDISH]: [
new PokemonSpeciesEvolution(Species.GLOOM, 21, null, null)
],
[Species.PARAS]: [
new PokemonSpeciesEvolution(Species.PARASECT, 24, null, null)
],
[Species.VENONAT]: [
new PokemonSpeciesEvolution(Species.VENOMOTH, 31, null, null)
],
[Species.DIGLETT]: [
new PokemonSpeciesEvolution(Species.DUGTRIO, 26, null, null)
],
[Species.MEOWTH]: [
new PokemonSpeciesEvolution(Species.PERSIAN, 28, null, null)
],
[Species.PSYDUCK]: [
new PokemonSpeciesEvolution(Species.GOLDUCK, 33, null, null)
],
[Species.MANKEY]: [
new PokemonSpeciesEvolution(Species.PRIMEAPE, 28, null, null)
],
[Species.POLIWAG]: [
new PokemonSpeciesEvolution(Species.POLIWHIRL, 25, null, null)
],
[Species.ABRA]: [
new PokemonSpeciesEvolution(Species.KADABRA, 16, null, null)
],
[Species.MACHOP]: [
new PokemonSpeciesEvolution(Species.MACHOKE, 28, null, null)
],
[Species.BELLSPROUT]: [
new PokemonSpeciesEvolution(Species.WEEPINBELL, 21, null, null)
],
[Species.TENTACOOL]: [
new PokemonSpeciesEvolution(Species.TENTACRUEL, 30, null, null)
],
[Species.GEODUDE]: [
new PokemonSpeciesEvolution(Species.GRAVELER, 25, null, null)
],
[Species.PONYTA]: [
new PokemonSpeciesEvolution(Species.RAPIDASH, 40, null, null)
],
[Species.SLOWPOKE]: [
new PokemonSpeciesEvolution(Species.SLOWBRO, 37, null, null)
],
[Species.MAGNEMITE]: [
new PokemonSpeciesEvolution(Species.MAGNETON, 30, null, null)
],
[Species.DODUO]: [
new PokemonSpeciesEvolution(Species.DODRIO, 31, null, null)
],
[Species.SEEL]: [
new PokemonSpeciesEvolution(Species.DEWGONG, 34, null, null)
],
[Species.GRIMER]: [
new PokemonSpeciesEvolution(Species.MUK, 38, null, null)
],
[Species.GASTLY]: [
new PokemonSpeciesEvolution(Species.HAUNTER, 25, null, null)
],
[Species.DROWZEE]: [
new PokemonSpeciesEvolution(Species.HYPNO, 26, null, null)
],
[Species.KRABBY]: [
new PokemonSpeciesEvolution(Species.KINGLER, 28, null, null)
],
[Species.VOLTORB]: [
new PokemonSpeciesEvolution(Species.ELECTRODE, 30, null, null)
],
[Species.CUBONE]: [
new PokemonSpeciesEvolution(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]))
],
[Species.KOFFING]: [
new PokemonSpeciesEvolution(Species.WEEZING, 35, null, null)
],
[Species.RHYHORN]: [
new PokemonSpeciesEvolution(Species.RHYDON, 42, null, null)
],
[Species.HORSEA]: [
new PokemonSpeciesEvolution(Species.SEADRA, 32, null, null)
],
[Species.GOLDEEN]: [
new PokemonSpeciesEvolution(Species.SEAKING, 33, null, null)
],
[Species.SMOOCHUM]: [
new PokemonSpeciesEvolution(Species.JYNX, 30, null, null)
],
[Species.ELEKID]: [
new PokemonSpeciesEvolution(Species.ELECTABUZZ, 30, null, null)
],
[Species.MAGBY]: [
new PokemonSpeciesEvolution(Species.MAGMAR, 30, null, null)
],
[Species.MAGIKARP]: [
new PokemonSpeciesEvolution(Species.GYARADOS, 20, null, null)
],
[Species.OMANYTE]: [
new PokemonSpeciesEvolution(Species.OMASTAR, 40, null, null)
],
[Species.KABUTO]: [
new PokemonSpeciesEvolution(Species.KABUTOPS, 40, null, null)
],
[Species.DRATINI]: [
new PokemonSpeciesEvolution(Species.DRAGONAIR, 30, null, null)
],
[Species.DRAGONAIR]: [
new PokemonSpeciesEvolution(Species.DRAGONITE, 55, null, null)
],
[Species.CHIKORITA]: [
new PokemonSpeciesEvolution(Species.BAYLEEF, 16, null, null)
],
[Species.BAYLEEF]: [
new PokemonSpeciesEvolution(Species.MEGANIUM, 32, null, null)
],
[Species.CYNDAQUIL]: [
new PokemonSpeciesEvolution(Species.QUILAVA, 14, null, null)
],
[Species.QUILAVA]: [
new PokemonSpeciesEvolution(Species.TYPHLOSION, 36, null, null)
],
[Species.TOTODILE]: [
new PokemonSpeciesEvolution(Species.CROCONAW, 18, null, null)
],
[Species.CROCONAW]: [
new PokemonSpeciesEvolution(Species.FERALIGATR, 30, null, null)
],
[Species.SENTRET]: [
new PokemonSpeciesEvolution(Species.FURRET, 15, null, null)
],
[Species.HOOTHOOT]: [
new PokemonSpeciesEvolution(Species.NOCTOWL, 20, null, null)
],
[Species.LEDYBA]: [
new PokemonSpeciesEvolution(Species.LEDIAN, 18, null, null)
],
[Species.SPINARAK]: [
new PokemonSpeciesEvolution(Species.ARIADOS, 22, null, null)
],
[Species.CHINCHOU]: [
new PokemonSpeciesEvolution(Species.LANTURN, 27, null, null)
],
[Species.NATU]: [
new PokemonSpeciesEvolution(Species.XATU, 25, null, null)
],
[Species.MAREEP]: [
new PokemonSpeciesEvolution(Species.FLAAFFY, 15, null, null)
],
[Species.FLAAFFY]: [
new PokemonSpeciesEvolution(Species.AMPHAROS, 30, null, null)
],
[Species.MARILL]: [
new PokemonSpeciesEvolution(Species.AZUMARILL, 18, null, null)
],
[Species.HOPPIP]: [
new PokemonSpeciesEvolution(Species.SKIPLOOM, 18, null, null)
],
[Species.SKIPLOOM]: [
new PokemonSpeciesEvolution(Species.JUMPLUFF, 27, null, null)
],
[Species.WOOPER]: [
new PokemonSpeciesEvolution(Species.QUAGSIRE, 20, null, null)
],
[Species.WYNAUT]: [
new PokemonSpeciesEvolution(Species.WOBBUFFET, 15, null, null)
],
[Species.PINECO]: [
new PokemonSpeciesEvolution(Species.FORRETRESS, 31, null, null)
],
[Species.SNUBBULL]: [
new PokemonSpeciesEvolution(Species.GRANBULL, 23, null, null)
],
[Species.TEDDIURSA]: [
new PokemonSpeciesEvolution(Species.URSARING, 30, null, null)
],
[Species.SLUGMA]: [
new PokemonSpeciesEvolution(Species.MAGCARGO, 38, null, null)
],
[Species.SWINUB]: [
new PokemonSpeciesEvolution(Species.PILOSWINE, 33, null, null)
],
[Species.REMORAID]: [
new PokemonSpeciesEvolution(Species.OCTILLERY, 25, null, null)
],
[Species.HOUNDOUR]: [
new PokemonSpeciesEvolution(Species.HOUNDOOM, 24, null, null)
],
[Species.PHANPY]: [
new PokemonSpeciesEvolution(Species.DONPHAN, 25, null, null)
],
[Species.LARVITAR]: [
new PokemonSpeciesEvolution(Species.PUPITAR, 30, null, null)
],
[Species.PUPITAR]: [
new PokemonSpeciesEvolution(Species.TYRANITAR, 55, null, null)
],
[Species.TREECKO]: [
new PokemonSpeciesEvolution(Species.GROVYLE, 16, null, null)
],
[Species.GROVYLE]: [
new PokemonSpeciesEvolution(Species.SCEPTILE, 36, null, null)
],
[Species.TORCHIC]: [
new PokemonSpeciesEvolution(Species.COMBUSKEN, 16, null, null)
],
[Species.COMBUSKEN]: [
new PokemonSpeciesEvolution(Species.BLAZIKEN, 36, null, null)
],
[Species.MUDKIP]: [
new PokemonSpeciesEvolution(Species.MARSHTOMP, 16, null, null)
],
[Species.MARSHTOMP]: [
new PokemonSpeciesEvolution(Species.SWAMPERT, 36, null, null)
],
[Species.POOCHYENA]: [
new PokemonSpeciesEvolution(Species.MIGHTYENA, 18, null, null)
],
[Species.ZIGZAGOON]: [
new PokemonSpeciesEvolution(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')
],
[Species.SILCOON]: [
new PokemonSpeciesEvolution(Species.BEAUTIFLY, 10, null, null)
],
[Species.CASCOON]: [
new PokemonSpeciesEvolution(Species.DUSTOX, 10, null, null)
],
[Species.LOTAD]: [
new PokemonSpeciesEvolution(Species.LOMBRE, 14, null, null)
],
[Species.SEEDOT]: [
new PokemonSpeciesEvolution(Species.NUZLEAF, 14, null, null)
],
[Species.TAILLOW]: [
new PokemonSpeciesEvolution(Species.SWELLOW, 22, null, null)
],
[Species.WINGULL]: [
new PokemonSpeciesEvolution(Species.PELIPPER, 25, null, null)
],
[Species.RALTS]: [
new PokemonSpeciesEvolution(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)
],
[Species.SURSKIT]: [
new PokemonSpeciesEvolution(Species.MASQUERAIN, 22, null, null)
],
[Species.SHROOMISH]: [
new PokemonSpeciesEvolution(Species.BRELOOM, 23, null, null)
],
[Species.SLAKOTH]: [
new PokemonSpeciesEvolution(Species.VIGOROTH, 18, null, null)
],
[Species.VIGOROTH]: [
new PokemonSpeciesEvolution(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)
],
[Species.WHISMUR]: [
new PokemonSpeciesEvolution(Species.LOUDRED, 20, null, null)
],
[Species.LOUDRED]: [
new PokemonSpeciesEvolution(Species.EXPLOUD, 40, null, null)
],
[Species.MAKUHITA]: [
new PokemonSpeciesEvolution(Species.HARIYAMA, 24, null, null)
],
[Species.ARON]: [
new PokemonSpeciesEvolution(Species.LAIRON, 32, null, null)
],
[Species.LAIRON]: [
new PokemonSpeciesEvolution(Species.AGGRON, 42, null, null)
],
[Species.MEDITITE]: [
new PokemonSpeciesEvolution(Species.MEDICHAM, 37, null, null)
],
[Species.ELECTRIKE]: [
new PokemonSpeciesEvolution(Species.MANECTRIC, 26, null, null)
],
[Species.GULPIN]: [
new PokemonSpeciesEvolution(Species.SWALOT, 26, null, null)
],
[Species.CARVANHA]: [
new PokemonSpeciesEvolution(Species.SHARPEDO, 30, null, null)
],
[Species.WAILMER]: [
new PokemonSpeciesEvolution(Species.WAILORD, 40, null, null, WildEvolutionRate.UNCOMMON)
],
[Species.NUMEL]: [
new PokemonSpeciesEvolution(Species.CAMERUPT, 33, null, null)
],
[Species.SPOINK]: [
new PokemonSpeciesEvolution(Species.GRUMPIG, 32, null, null)
],
[Species.TRAPINCH]: [
new PokemonSpeciesEvolution(Species.VIBRAVA, 35, null, null)
],
[Species.VIBRAVA]: [
new PokemonSpeciesEvolution(Species.FLYGON, 45, null, null)
],
[Species.CACNEA]: [
new PokemonSpeciesEvolution(Species.CACTURNE, 32, null, null)
],
[Species.SWABLU]: [
new PokemonSpeciesEvolution(Species.ALTARIA, 35, null, null)
],
[Species.BARBOACH]: [
new PokemonSpeciesEvolution(Species.WHISCASH, 30, null, null)
],
[Species.CORPHISH]: [
new PokemonSpeciesEvolution(Species.CRAWDAUNT, 30, null, null)
],
[Species.BALTOY]: [
new PokemonSpeciesEvolution(Species.CLAYDOL, 36, null, null)
],
[Species.LILEEP]: [
new PokemonSpeciesEvolution(Species.CRADILY, 40, null, null)
],
[Species.ANORITH]: [
new PokemonSpeciesEvolution(Species.ARMALDO, 40, null, null)
],
[Species.SHUPPET]: [
new PokemonSpeciesEvolution(Species.BANETTE, 37, null, null)
],
[Species.DUSKULL]: [
new PokemonSpeciesEvolution(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)
],
[Species.SPHEAL]: [
new PokemonSpeciesEvolution(Species.SEALEO, 32, null, null)
],
[Species.SEALEO]: [
new PokemonSpeciesEvolution(Species.WALREIN, 44, null, null)
],
[Species.BAGON]: [
new PokemonSpeciesEvolution(Species.SHELGON, 30, null, null)
],
[Species.SHELGON]: [
new PokemonSpeciesEvolution(Species.SALAMENCE, 50, null, null)
],
[Species.BELDUM]: [
new PokemonSpeciesEvolution(Species.METANG, 20, null, null)
],
[Species.METANG]: [
new PokemonSpeciesEvolution(Species.METAGROSS, 45, null, null)
],
[Species.TURTWIG]: [
new PokemonSpeciesEvolution(Species.GROTLE, 18, null, null)
],
[Species.GROTLE]: [
new PokemonSpeciesEvolution(Species.TORTERRA, 32, null, null)
],
[Species.CHIMCHAR]: [
new PokemonSpeciesEvolution(Species.MONFERNO, 14, null, null)
],
[Species.MONFERNO]: [
new PokemonSpeciesEvolution(Species.INFERNAPE, 36, null, null)
],
[Species.PIPLUP]: [
new PokemonSpeciesEvolution(Species.PRINPLUP, 16, null, null)
],
[Species.PRINPLUP]: [
new PokemonSpeciesEvolution(Species.EMPOLEON, 36, null, null)
],
[Species.STARLY]: [
new PokemonSpeciesEvolution(Species.STARAVIA, 14, null, null)
],
[Species.STARAVIA]: [
new PokemonSpeciesEvolution(Species.STARAPTOR, 34, null, null)
],
[Species.BIDOOF]: [
new PokemonSpeciesEvolution(Species.BIBAREL, 15, null, null)
],
[Species.KRICKETOT]: [
new PokemonSpeciesEvolution(Species.KRICKETUNE, 10, null, null)
],
[Species.SHINX]: [
new PokemonSpeciesEvolution(Species.LUXIO, 15, null, null)
],
[Species.LUXIO]: [
new PokemonSpeciesEvolution(Species.LUXRAY, 30, null, null)
],
[Species.CRANIDOS]: [
new PokemonSpeciesEvolution(Species.RAMPARDOS, 30, null, null)
],
[Species.SHIELDON]: [
new PokemonSpeciesEvolution(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))
],
[Species.COMBEE]: [
new PokemonSpeciesEvolution(Species.VESPIQUEN, 21, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => !p.gender, true))
],
[Species.BUIZEL]: [
new PokemonSpeciesEvolution(Species.FLOATZEL, 26, null, null)
],
[Species.CHERUBI]: [
new PokemonSpeciesEvolution(Species.CHERRIM, 25, null, null)
],
[Species.SHELLOS]: [
new PokemonSpeciesEvolution(Species.GASTRODON, 30, null, null)
],
[Species.DRIFLOON]: [
new PokemonSpeciesEvolution(Species.DRIFBLIM, 28, null, null)
],
[Species.GLAMEOW]: [
new PokemonSpeciesEvolution(Species.PURUGLY, 38, null, null)
],
[Species.STUNKY]: [
new PokemonSpeciesEvolution(Species.SKUNTANK, 34, null, null)
],
[Species.BRONZOR]: [
new PokemonSpeciesEvolution(Species.BRONZONG, 33, null, null)
],
[Species.GIBLE]: [
new PokemonSpeciesEvolution(Species.GABITE, 24, null, null)
],
[Species.GABITE]: [
new PokemonSpeciesEvolution(Species.GARCHOMP, 48, null, null)
],
[Species.HIPPOPOTAS]: [
new PokemonSpeciesEvolution(Species.HIPPOWDON, 34, null, null)
],
[Species.SKORUPI]: [
new PokemonSpeciesEvolution(Species.DRAPION, 40, null, null)
],
[Species.CROAGUNK]: [
new PokemonSpeciesEvolution(Species.TOXICROAK, 37, null, null)
],
[Species.FINNEON]: [
new PokemonSpeciesEvolution(Species.LUMINEON, 31, null, null)
],
[Species.SNOVER]: [
new PokemonSpeciesEvolution(Species.ABOMASNOW, 40, null, null)
],
[Species.SNIVY]: [
new PokemonSpeciesEvolution(Species.SERVINE, 17, null, null)
],
[Species.SERVINE]: [
new PokemonSpeciesEvolution(Species.SERPERIOR, 36, null, null)
],
[Species.TEPIG]: [
new PokemonSpeciesEvolution(Species.PIGNITE, 17, null, null)
],
[Species.PIGNITE]: [
new PokemonSpeciesEvolution(Species.EMBOAR, 36, null, null)
],
[Species.OSHAWOTT]: [
new PokemonSpeciesEvolution(Species.DEWOTT, 17, null, null)
],
[Species.DEWOTT]: [
new PokemonSpeciesEvolution(Species.SAMUROTT, 36, null, null)
],
[Species.PATRAT]: [
new PokemonSpeciesEvolution(Species.WATCHOG, 20, null, null)
],
[Species.LILLIPUP]: [
new PokemonSpeciesEvolution(Species.HERDIER, 16, null, null)
],
[Species.HERDIER]: [
new PokemonSpeciesEvolution(Species.STOUTLAND, 32, null, null)
],
[Species.PURRLOIN]: [
new PokemonSpeciesEvolution(Species.LIEPARD, 20, null, null)
],
[Species.PIDOVE]: [
new PokemonSpeciesEvolution(Species.TRANQUILL, 21, null, null)
],
[Species.TRANQUILL]: [
new PokemonSpeciesEvolution(Species.UNFEZANT, 32, null, null)
],
[Species.BLITZLE]: [
new PokemonSpeciesEvolution(Species.ZEBSTRIKA, 27, null, null)
],
[Species.ROGGENROLA]: [
new PokemonSpeciesEvolution(Species.BOLDORE, 25, null, null)
],
[Species.DRILBUR]: [
new PokemonSpeciesEvolution(Species.EXCADRILL, 31, null, null)
],
[Species.TIMBURR]: [
new PokemonSpeciesEvolution(Species.GURDURR, 25, null, null)
],
[Species.TYMPOLE]: [
new PokemonSpeciesEvolution(Species.PALPITOAD, 25, null, null)
],
[Species.PALPITOAD]: [
new PokemonSpeciesEvolution(Species.SEISMITOAD, 36, null, null)
],
[Species.SEWADDLE]: [
new PokemonSpeciesEvolution(Species.SWADLOON, 20, null, null)
],
[Species.VENIPEDE]: [
new PokemonSpeciesEvolution(Species.WHIRLIPEDE, 22, null, null)
],
[Species.WHIRLIPEDE]: [
new PokemonSpeciesEvolution(Species.SCOLIPEDE, 30, null, null)
],
[Species.SANDILE]: [
new PokemonSpeciesEvolution(Species.KROKOROK, 29, null, null)
],
[Species.KROKOROK]: [
new PokemonSpeciesEvolution(Species.KROOKODILE, 40, null, null)
],
[Species.DARUMAKA]: [
new PokemonSpeciesEvolution(Species.DARMANITAN, 35, null, null)
],
[Species.DWEBBLE]: [
new PokemonSpeciesEvolution(Species.CRUSTLE, 34, null, null)
],
[Species.SCRAGGY]: [
new PokemonSpeciesEvolution(Species.SCRAFTY, 39, null, null)
],
[Species.YAMASK]: [
new PokemonSpeciesEvolution(Species.COFAGRIGUS, 34, null, null)
],
[Species.TIRTOUGA]: [
new PokemonSpeciesEvolution(Species.CARRACOSTA, 37, null, null)
],
[Species.ARCHEN]: [
new PokemonSpeciesEvolution(Species.ARCHEOPS, 37, null, null)
],
[Species.TRUBBISH]: [
new PokemonSpeciesEvolution(Species.GARBODOR, 36, null, null)
],
[Species.ZORUA]: [
new PokemonSpeciesEvolution(Species.ZOROARK, 30, null, null)
],
[Species.GOTHITA]: [
new PokemonSpeciesEvolution(Species.GOTHORITA, 32, null, null)
],
[Species.GOTHORITA]: [
new PokemonSpeciesEvolution(Species.GOTHITELLE, 41, null, null)
],
[Species.SOLOSIS]: [
new PokemonSpeciesEvolution(Species.DUOSION, 32, null, null)
],
[Species.DUOSION]: [
new PokemonSpeciesEvolution(Species.REUNICLUS, 41, null, null)
],
[Species.DUCKLETT]: [
new PokemonSpeciesEvolution(Species.SWANNA, 35, null, null)
],
[Species.VANILLITE]: [
new PokemonSpeciesEvolution(Species.VANILLISH, 35, null, null)
],
[Species.VANILLISH]: [
new PokemonSpeciesEvolution(Species.VANILLUXE, 47, null, null)
],
[Species.DEERLING]: [
new PokemonSpeciesEvolution(Species.SAWSBUCK, 34, null, null)
],
[Species.FOONGUS]: [
new PokemonSpeciesEvolution(Species.AMOONGUSS, 39, null, null)
],
[Species.FRILLISH]: [
new PokemonSpeciesEvolution(Species.JELLICENT, 40, null, null)
],
[Species.JOLTIK]: [
new PokemonSpeciesEvolution(Species.GALVANTULA, 36, null, null)
],
[Species.FERROSEED]: [
new PokemonSpeciesEvolution(Species.FERROTHORN, 40, null, null)
],
[Species.KLINK]: [
new PokemonSpeciesEvolution(Species.KLANG, 38, null, null)
],
[Species.KLANG]: [
new PokemonSpeciesEvolution(Species.KLINKLANG, 49, null, null)
],
[Species.TYNAMO]: [
new PokemonSpeciesEvolution(Species.EELEKTRIK, 39, null, null)
],
[Species.ELGYEM]: [
new PokemonSpeciesEvolution(Species.BEHEEYEM, 42, null, null)
],
[Species.LITWICK]: [
new PokemonSpeciesEvolution(Species.LAMPENT, 41, null, null)
],
[Species.AXEW]: [
new PokemonSpeciesEvolution(Species.FRAXURE, 38, null, null)
],
[Species.FRAXURE]: [
new PokemonSpeciesEvolution(Species.HAXORUS, 48, null, null)
],
[Species.CUBCHOO]: [
new PokemonSpeciesEvolution(Species.BEARTIC, 37, null, null)
],
[Species.MIENFOO]: [
new PokemonSpeciesEvolution(Species.MIENSHAO, 50, null, null)
],
[Species.GOLETT]: [
new PokemonSpeciesEvolution(Species.GOLURK, 43, null, null)
],
[Species.PAWNIARD]: [
new PokemonSpeciesEvolution(Species.BISHARP, 52, null, null)
],
[Species.RUFFLET]: [
new PokemonSpeciesEvolution(Species.BRAVIARY, 54, null, null)
],
[Species.VULLABY]: [
new PokemonSpeciesEvolution(Species.MANDIBUZZ, 54, null, null)
],
[Species.DEINO]: [
new PokemonSpeciesEvolution(Species.ZWEILOUS, 50, null, null)
],
[Species.ZWEILOUS]: [
new PokemonSpeciesEvolution(Species.HYDREIGON, 64, null, null)
],
[Species.LARVESTA]: [
new PokemonSpeciesEvolution(Species.VOLCARONA, 59, null, null)
],
[Species.PIKACHU]: [
new PokemonSpeciesEvolution(Species.RAICHU, 1, "Thunder Stone", null)
],
[Species.NIDORINA]: [
new PokemonSpeciesEvolution(Species.NIDOQUEEN, 1, "Moon Stone", null)
],
[Species.NIDORINO]: [
new PokemonSpeciesEvolution(Species.NIDOKING, 1, "Moon Stone", null)
],
[Species.CLEFAIRY]: [
new PokemonSpeciesEvolution(Species.CLEFABLE, 1, "Moon Stone", null)
],
[Species.VULPIX]: [
new PokemonSpeciesEvolution(Species.NINETALES, 1, "Fire Stone", null)
],
[Species.JIGGLYPUFF]: [
new PokemonSpeciesEvolution(Species.WIGGLYTUFF, 1, "Moon Stone", null)
],
[Species.GLOOM]: [
new PokemonSpeciesEvolution(Species.VILEPLUME, 1, "Leaf Stone", null),
new PokemonSpeciesEvolution(Species.BELLOSSOM, 1, "Sun Stone", null)
],
[Species.GROWLITHE]: [
new PokemonSpeciesEvolution(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)
],
[Species.WEEPINBELL]: [
new PokemonSpeciesEvolution(Species.VICTREEBEL, 1, "Leaf Stone", null)
],
[Species.MAGNETON]: [
new PokemonSpeciesEvolution(Species.MAGNEZONE, 1, "Thunder Stone", null)
],
[Species.SHELLDER]: [
new PokemonSpeciesEvolution(Species.CLOYSTER, 1, "Water Stone", null)
],
[Species.EXEGGCUTE]: [
new PokemonSpeciesEvolution(Species.EXEGGUTOR, 1, "Leaf Stone", null)
],
[Species.STARYU]: [
new PokemonSpeciesEvolution(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)
],
[Species.TOGETIC]: [
new PokemonSpeciesEvolution(Species.TOGEKISS, 1, "Shiny Stone", null, WildEvolutionRate.RARE)
],
[Species.SUNKERN]: [
new PokemonSpeciesEvolution(Species.SUNFLORA, 1, "Sun Stone", null)
],
[Species.MURKROW]: [
new PokemonSpeciesEvolution(Species.HONCHKROW, 1, "Dusk Stone", null, WildEvolutionRate.RARE)
],
[Species.MISDREAVUS]: [
new PokemonSpeciesEvolution(Species.MISMAGIUS, 1, "Dusk Stone", null, WildEvolutionRate.RARE)
],
[Species.LOMBRE]: [
new PokemonSpeciesEvolution(Species.LUDICOLO, 1, "Water Stone", null)
],
[Species.NUZLEAF]: [
new PokemonSpeciesEvolution(Species.SHIFTRY, 1, "Leaf Stone", null)
],
[Species.SKITTY]: [
new PokemonSpeciesEvolution(Species.DELCATTY, 1, "Moon Stone", null)
],
[Species.ROSELIA]: [
new PokemonSpeciesEvolution(Species.ROSERADE, 1, "Shiny Stone", null)
],
[Species.PANSAGE]: [
new PokemonSpeciesEvolution(Species.SIMISAGE, 1, "Leaf Stone", null)
],
[Species.PANSEAR]: [
new PokemonSpeciesEvolution(Species.SIMISEAR, 1, "Fire Stone", null)
],
[Species.PANPOUR]: [
new PokemonSpeciesEvolution(Species.SIMIPOUR, 1, "Water Stone", null)
],
[Species.MUNNA]: [
new PokemonSpeciesEvolution(Species.MUSHARNA, 1, "Moon Stone", null)
],
[Species.COTTONEE]: [
new PokemonSpeciesEvolution(Species.WHIMSICOTT, 1, "Sun Stone", null)
],
[Species.PETILIL]: [
new PokemonSpeciesEvolution(Species.LILLIGANT, 1, "Sun Stone", null)
],
[Species.MINCCINO]: [
new PokemonSpeciesEvolution(Species.CINCCINO, 1, "Shiny Stone", null, WildEvolutionRate.UNCOMMON)
],
[Species.EELEKTRIK]: [
new PokemonSpeciesEvolution(Species.EELEKTROSS, 1, "Thunder Stone", null)
],
[Species.LAMPENT]: [
new PokemonSpeciesEvolution(Species.CHANDELURE, 1, "Dusk Stone", null)
],
[Species.KADABRA]: [
new PokemonSpeciesEvolution(Species.ALAKAZAM, 1, "Link Cable", null)
],
[Species.MACHOKE]: [
new PokemonSpeciesEvolution(Species.MACHAMP, 1, "Link Cable", null, WildEvolutionRate.UNCOMMON)
],
[Species.GRAVELER]: [
new PokemonSpeciesEvolution(Species.GOLEM, 1, "Link Cable", null, WildEvolutionRate.UNCOMMON)
],
[Species.SLOWPOKE]: [
new PokemonSpeciesEvolution(Species.SLOWKING, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* King's rock*/), WildEvolutionRate.RARE)
],
[Species.HAUNTER]: [
new PokemonSpeciesEvolution(Species.GENGAR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true), WildEvolutionRate.UNCOMMON)
],
[Species.ONIX]: [
new PokemonSpeciesEvolution(Species.STEELIX, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/ ), WildEvolutionRate.RARE)
],
[Species.RHYDON]: [
new PokemonSpeciesEvolution(Species.RHYPERIOR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Protector */), WildEvolutionRate.RARE)
],
[Species.SEADRA]: [
new PokemonSpeciesEvolution(Species.KINGDRA, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Dragon scale*/), WildEvolutionRate.RARE)
],
[Species.SCYTHER]: [
new PokemonSpeciesEvolution(Species.SCIZOR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Metal coat*/), WildEvolutionRate.UNCOMMON)
],
[Species.ELECTABUZZ]: [
new PokemonSpeciesEvolution(Species.ELECTIVIRE, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Electirizer*/), WildEvolutionRate.UNCOMMON)
],
[Species.MAGMAR]: [
new PokemonSpeciesEvolution(Species.MAGMORTAR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Magmarizer*/), WildEvolutionRate.UNCOMMON)
],
[Species.PORYGON]: [
new PokemonSpeciesEvolution(Species.PORYGON2, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /*Upgrade*/), WildEvolutionRate.RARE)
],
[Species.PORYGON2]: [
new PokemonSpeciesEvolution(Species.PORYGON_Z, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Dubious disc*/), WildEvolutionRate.ULTRA_RARE)
],
[Species.FEEBAS]: [
new PokemonSpeciesEvolution(Species.MILOTIC, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Prism scale*/), WildEvolutionRate.ULTRA_RARE)
],
[Species.DUSCLOPS]: [
new PokemonSpeciesEvolution(Species.DUSKNOIR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Reaper cloth*/), WildEvolutionRate.RARE)
],
[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)
],
[Species.BOLDORE]: [
new PokemonSpeciesEvolution(Species.GIGALITH, 1, "Link Cable", null)
],
[Species.GURDURR]: [
new PokemonSpeciesEvolution(Species.CONKELDURR, 1, "Link Cable", null)
],
[Species.KARRABLAST]: [
new PokemonSpeciesEvolution(Species.ESCAVALIER, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Trade with shelmet??*/), WildEvolutionRate.RARE)
],
[Species.SHELMET]: [
new PokemonSpeciesEvolution(Species.ACCELGOR, 1, "Link Cable", new PokemonSpeciesEvolutionCondition((p: Pokemon) => true /* Trade with karrablast??*/), WildEvolutionRate.RARE)
],
[Species.PICHU]: [
new PokemonSpeciesEvolution(Species.PIKACHU, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.CLEFFA]: [
new PokemonSpeciesEvolution(Species.CLEFAIRY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.IGGLYBUFF]: [
new PokemonSpeciesEvolution(Species.JIGGLYPUFF, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.GOLBAT]: [
new PokemonSpeciesEvolution(Species.CROBAT, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.CHANSEY]: [
new PokemonSpeciesEvolution(Species.BLISSEY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.MUNCHLAX]: [
new PokemonSpeciesEvolution(Species.SNORLAX, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.TOGEPI]: [
new PokemonSpeciesEvolution(Species.TOGETIC, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.AZURILL]: [
new PokemonSpeciesEvolution(Species.MARILL, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.BUDEW]: [
new PokemonSpeciesEvolution(Species.ROSELIA, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount > 10 /* daytime */))
],
[Species.CHINGLING]: [
new PokemonSpeciesEvolution(Species.CHIMECHO, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* nighttime */))
],
[Species.BUNEARY]: [
new PokemonSpeciesEvolution(Species.LOPUNNY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.RIOLU]: [
new PokemonSpeciesEvolution(Species.LUCARIO, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10 /* daytime */))
],
[Species.WOOBAT]: [
new PokemonSpeciesEvolution(Species.SWOOBAT, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
],
[Species.SWADLOON]: [
new PokemonSpeciesEvolution(Species.LEAVANNY, 1, null, new PokemonSpeciesEvolutionCondition((p: Pokemon) => p.winCount >= 10))
]
}
File diff suppressed because it is too large. Load diff
+929
View File
@@ -0,0 +1,929 @@
import { GrowthRate } from './exp';
import { PokemonSpeciesEvolutionCondition, pokemonEvolutions } from './pokemon-evolutions';
import { Species } from './species';
import { Type } from './type';
import * as Utils from './utils';
export function getPokemonSpecies(species: Species): PokemonSpecies {
if (species >= Species.XERNEAS)
return allSpecies[Species.GENESECT + (species - Species.XERNEAS)];
return allSpecies[species - 1];
}
export default class PokemonSpecies {
public speciesId: Species;
public name: string;
public pseudoLegendary: boolean;
public generation: integer;
public legendary: boolean;
public mythical: boolean;
public species: string;
public type1: integer;
public type2: integer;
public height: number;
public weight: number;
public ability1: string;
public ability2: string;
public abilityHidden: string;
public baseTotal: integer;
public baseStats: integer[];
public catchRate: integer;
public baseFriendship: integer;
public baseExp: integer;
public growthRate: integer;
public eggType1: string;
public eggType2: string;
public malePercent: number;
public eggCycles: integer;
public genderDiffs: boolean;
constructor(id, name, generation, pseudoLegendary, legendary, mythical, species, type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, growthRate, eggType1, eggType2, malePercent, eggCycles, genderDiffs) {
this.speciesId = id;
this.name = name;
this.generation = generation;
this.pseudoLegendary = pseudoLegendary === 1;
this.legendary = legendary === 1;
this.mythical = mythical === 1;
this.species = species;
this.type1 = type1;
this.type2 = type2;
this.height = height;
this.weight = weight;
this.ability1 = ability1;
this.ability2 = ability2;
this.abilityHidden = abilityHidden;
this.baseTotal = baseTotal;
this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ];
this.catchRate = catchRate;
this.baseFriendship = baseFriendship;
this.baseExp = baseExp;
this.growthRate = growthRate;
this.eggType1 = eggType1;
this.eggType2 = eggType2;
this.malePercent = malePercent;
this.eggCycles = eggCycles;
this.genderDiffs = genderDiffs === 1;
}
isOfType(type: integer) {
return this.type1 === type || (this.type2 > -1 && this.type2 === type);
}
getSpeciesForLevel(level: integer): Species {
const prevolutionLevels = this.getPrevolutionLevels();
if (prevolutionLevels.length) {
for (let pl = prevolutionLevels.length - 1; pl >= 0; pl--) {
const prevolutionLevel = prevolutionLevels[pl];
if (level < prevolutionLevel[1])
return prevolutionLevel[0];
}
}
const evolutionLevels = this.getEvolutionLevels();
let speciesIds = [];
let speciesIdsLevel = 0;
for (let el = evolutionLevels.length - 1; el >= 0; el--) {
const evolutionLevel = evolutionLevels[el];
if (level >= evolutionLevel[1]) {
if (!speciesIdsLevel) {
speciesIds = [];
speciesIdsLevel = evolutionLevel[1];
}
if (evolutionLevel[1] === speciesIdsLevel)
speciesIds.push(evolutionLevel[0]);
else
break;
}
}
if (speciesIds.length) {
const levelsAhead = level - speciesIdsLevel;
if (levelsAhead < 50) {
const evolutionChance = 0.35 + 0.65 * Phaser.Tweens.Builders.GetEaseFunction('Sine.easeOut')(levelsAhead / 50);
console.log(speciesIds.map(s => Species[s]), levelsAhead, 'levels ahead', `${evolutionChance * 100}% chance`);
if (Math.random() > evolutionChance) {
console.log('failed')
return this.speciesId;
} else
console.log('passed');
}
return speciesIds.length === 1
? speciesIds[0]
: speciesIds[Utils.randInt(speciesIds.length)];
}
return this.speciesId;
}
getEvolutionLevels() {
const evolutionLevels = [];
//console.log(Species[this.speciesId], pokemonEvolutions[this.speciesId])
if (pokemonEvolutions.hasOwnProperty(this.speciesId)) {
for (let e of pokemonEvolutions[this.speciesId]) {
const condition = e.condition;
if (!condition || !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);
}
}
}
return evolutionLevels;
}
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 (!condition || !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);
console.log(Species[speciesId])
}
}
}
}
return prevolutionLevels;
}
}
class PokemonForm extends PokemonSpecies {
public pokemon: PokemonSpecies;
public formName: string;
constructor(pokemon, formName, type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp) {
super(pokemon.id, pokemon.name, pokemon.generation, pokemon.pseudoLegendary, pokemon.legendary, pokemon.mythical, pokemon.species, type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, pokemon.growthRate, pokemon.eggType1, pokemon.eggType2, pokemon.malePercent, pokemon.eggCycles, pokemon.genderDiffs);
this.pokemon = pokemon;
this.formName = formName;
}
}
export const allSpecies = [
[ Species.BULBASAUR, "Bulbasaur", 1, 0, 0, 0, "Seed Pokémon", Type.GRASS, Type.POISON, 0.7, 6.9, "Overgrow", null, "Chlorophyll", 318, 45, 49, 49, 65, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.IVYSAUR, "Ivysaur", 1, 0, 0, 0, "Seed Pokémon", Type.GRASS, Type.POISON, 1, 13, "Overgrow", null, "Chlorophyll", 405, 60, 62, 63, 80, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.VENUSAUR, "Venusaur", 1, 0, 0, 0, "Seed Pokémon", Type.GRASS, Type.POISON, 2, 100, "Overgrow", null, "Chlorophyll", 525, 80, 82, 83, 100, 100, 80, 45, 70, 236, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.CHARMANDER, "Charmander", 1, 0, 0, 0, "Lizard Pokémon", Type.FIRE, -1, 0.6, 8.5, "Blaze", null, "Solar Power", 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Dragon", "Monster", 87.5, 20, 0 ],
[ Species.CHARMELEON, "Charmeleon", 1, 0, 0, 0, "Flame Pokémon", Type.FIRE, -1, 1.1, 19, "Blaze", null, "Solar Power", 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Dragon", "Monster", 87.5, 20, 0 ],
[ Species.CHARIZARD, "Charizard", 1, 0, 0, 0, "Flame Pokémon", Type.FIRE, Type.FLYING, 1.7, 90.5, "Blaze", null, "Solar Power", 534, 78, 84, 78, 109, 85, 100, 45, 70, 240, GrowthRate.MEDIUM_SLOW, "Dragon", "Monster", 87.5, 20, 0 ],
[ Species.SQUIRTLE, "Squirtle", 1, 0, 0, 0, "Tiny Turtle Pokémon", Type.WATER, -1, 0.5, 9, "Torrent", null, "Rain Dish", 314, 44, 48, 65, 50, 64, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.WARTORTLE, "Wartortle", 1, 0, 0, 0, "Turtle Pokémon", Type.WATER, -1, 1, 22.5, "Torrent", null, "Rain Dish", 405, 59, 63, 80, 65, 80, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.BLASTOISE, "Blastoise", 1, 0, 0, 0, "Shellfish Pokémon", Type.WATER, -1, 1.6, 85.5, "Torrent", null, "Rain Dish", 530, 79, 83, 100, 85, 105, 78, 45, 70, 239, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.CATERPIE, "Caterpie", 1, 0, 0, 0, "Worm Pokémon", Type.BUG, -1, 0.3, 2.9, "Shield Dust", null, "Run Away", 195, 45, 30, 35, 20, 20, 45, 255, 70, 39, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.METAPOD, "Metapod", 1, 0, 0, 0, "Cocoon Pokémon", Type.BUG, -1, 0.7, 9.9, "Shed Skin", null, null, 205, 50, 20, 55, 25, 25, 30, 120, 70, 72, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.BUTTERFREE, "Butterfree", 1, 0, 0, 0, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, "Compound Eyes", null, "Tinted Lens", 395, 60, 45, 50, 90, 80, 70, 45, 70, 178, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 1 ],
[ Species.WEEDLE, "Weedle", 1, 0, 0, 0, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, "Shield Dust", null, "Run Away", 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.KAKUNA, "Kakuna", 1, 0, 0, 0, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, "Shed Skin", null, null, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.BEEDRILL, "Beedrill", 1, 0, 0, 0, "Poison Bee Pokémon", Type.BUG, Type.POISON, 1, 29.5, "Swarm", null, "Sniper", 395, 65, 90, 40, 45, 80, 75, 45, 70, 178, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.PIDGEY, "Pidgey", 1, 0, 0, 0, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.8, "Keen Eye", "Tangled Feet", "Big Pecks", 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.PIDGEOTTO, "Pidgeotto", 1, 0, 0, 0, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.1, 30, "Keen Eye", "Tangled Feet", "Big Pecks", 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.PIDGEOT, "Pidgeot", 1, 0, 0, 0, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.5, 39.5, "Keen Eye", "Tangled Feet", "Big Pecks", 479, 83, 80, 75, 70, 70, 101, 45, 70, 216, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.RATTATA, "Rattata", 1, 0, 0, 0, "Mouse Pokémon", Type.NORMAL, -1, 0.3, 3.5, "Run Away", "Guts", "Hustle", 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 1 ],
[ Species.RATICATE, "Raticate", 1, 0, 0, 0, "Mouse Pokémon", Type.NORMAL, -1, 0.7, 18.5, "Run Away", "Guts", "Hustle", 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 1 ],
[ Species.SPEAROW, "Spearow", 1, 0, 0, 0, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, "Keen Eye", null, "Sniper", 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 0 ],
[ Species.FEAROW, "Fearow", 1, 0, 0, 0, "Beak Pokémon", Type.NORMAL, Type.FLYING, 1.2, 38, "Keen Eye", null, "Sniper", 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 0 ],
[ Species.EKANS, "Ekans", 1, 0, 0, 0, "Snake Pokémon", Type.POISON, -1, 2, 6.9, "Intimidate", "Shed Skin", "Unnerve", 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, "Dragon", "Field", 50, 20, 0 ],
[ Species.ARBOK, "Arbok", 1, 0, 0, 0, "Cobra Pokémon", Type.POISON, -1, 3.5, 65, "Intimidate", "Shed Skin", "Unnerve", 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, "Dragon", "Field", 50, 20, 0 ],
[ Species.PIKACHU, "Pikachu", 1, 0, 0, 0, "Mouse Pokémon", Type.ELECTRIC, -1, 0.4, 6, "Static", null, "Lightning Rod", 320, 35, 55, 40, 50, 50, 90, 190, 70, 112, GrowthRate.MEDIUM_FAST, "Fairy", "Field", 50, 10, 1 ],
[ Species.RAICHU, "Raichu", 1, 0, 0, 0, "Mouse Pokémon", Type.ELECTRIC, -1, 0.8, 30, "Static", null, "Lightning Rod", 485, 60, 90, 55, 90, 80, 110, 75, 70, 218, GrowthRate.MEDIUM_FAST, "Fairy", "Field", 50, 10, 1 ],
[ Species.SANDSHREW, "Sandshrew", 1, 0, 0, 0, "Mouse Pokémon", Type.GROUND, -1, 0.6, 12, "Sand Veil", null, "Sand Rush", 300, 50, 75, 85, 20, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.SANDSLASH, "Sandslash", 1, 0, 0, 0, "Mouse Pokémon", Type.GROUND, -1, 1, 29.5, "Sand Veil", null, "Sand Rush", 450, 75, 100, 110, 45, 55, 65, 90, 70, 158, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.NIDORAN_F, "Nidoran♀", 1, 0, 0, 0, "Poison Pin Pokémon", Type.POISON, -1, 0.4, 7, "Poison Point", "Rivalry", "Hustle", 275, 55, 47, 52, 40, 40, 41, 235, 70, 55, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 0, 20, 0 ],
[ Species.NIDORINA, "Nidorina", 1, 0, 0, 0, "Poison Pin Pokémon", Type.POISON, -1, 0.8, 20, "Poison Point", "Rivalry", "Hustle", 365, 70, 62, 67, 55, 55, 56, 120, 70, 128, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, 0, 20, 0 ],
[ Species.NIDOQUEEN, "Nidoqueen", 1, 0, 0, 0, "Drill Pokémon", Type.POISON, Type.GROUND, 1.3, 60, "Poison Point", "Rivalry", "Sheer Force", 505, 90, 92, 87, 75, 85, 76, 45, 70, 227, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, 0, 20, 0 ],
[ Species.NIDORAN_M, "Nidoran♂", 1, 0, 0, 0, "Poison Pin Pokémon", Type.POISON, -1, 0.5, 9, "Poison Point", "Rivalry", "Hustle", 273, 46, 57, 40, 40, 40, 50, 235, 70, 55, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 100, 20, 0 ],
[ Species.NIDORINO, "Nidorino", 1, 0, 0, 0, "Poison Pin Pokémon", Type.POISON, -1, 0.9, 19.5, "Poison Point", "Rivalry", "Hustle", 365, 61, 72, 57, 55, 55, 65, 120, 70, 128, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 100, 20, 0 ],
[ Species.NIDOKING, "Nidoking", 1, 0, 0, 0, "Drill Pokémon", Type.POISON, Type.GROUND, 1.4, 62, "Poison Point", "Rivalry", "Sheer Force", 505, 81, 102, 77, 85, 75, 85, 45, 70, 227, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 100, 20, 0 ],
[ Species.CLEFAIRY, "Clefairy", 1, 0, 0, 0, "Fairy Pokémon", Type.FAIRY, -1, 0.6, 7.5, "Cute Charm", "Magic Guard", "Friend Guard", 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, "Fairy", null, 25, 10, 0 ],
[ Species.CLEFABLE, "Clefable", 1, 0, 0, 0, "Fairy Pokémon", Type.FAIRY, -1, 1.3, 40, "Cute Charm", "Magic Guard", "Unaware", 483, 95, 70, 73, 95, 90, 60, 25, 140, 217, GrowthRate.FAST, "Fairy", null, 25, 10, 0 ],
[ Species.VULPIX, "Vulpix", 1, 0, 0, 0, "Fox Pokémon", Type.FIRE, -1, 0.6, 9.9, "Flash Fire", null, "Drought", 299, 38, 41, 40, 50, 65, 65, 190, 70, 60, GrowthRate.MEDIUM_FAST, "Field", null, 25, 20, 0 ],
[ Species.NINETALES, "Ninetales", 1, 0, 0, 0, "Fox Pokémon", Type.FIRE, -1, 1.1, 19.9, "Flash Fire", null, "Drought", 505, 73, 76, 75, 81, 100, 100, 75, 70, 177, GrowthRate.MEDIUM_FAST, "Field", null, 25, 20, 0 ],
[ Species.JIGGLYPUFF, "Jigglypuff", 1, 0, 0, 0, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.5, 5.5, "Cute Charm", "Competitive", "Friend Guard", 270, 115, 45, 20, 45, 25, 20, 170, 70, 95, GrowthRate.FAST, "Fairy", null, 25, 10, 0 ],
[ Species.WIGGLYTUFF, "Wigglytuff", 1, 0, 0, 0, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 1, 12, "Cute Charm", "Competitive", "Frisk", 435, 140, 70, 45, 85, 50, 45, 50, 70, 196, GrowthRate.FAST, "Fairy", null, 25, 10, 0 ],
[ Species.ZUBAT, "Zubat", 1, 0, 0, 0, "Bat Pokémon", Type.POISON, Type.FLYING, 0.8, 7.5, "Inner Focus", null, "Infiltrator", 245, 40, 45, 35, 30, 40, 55, 255, 70, 49, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 1 ],
[ Species.GOLBAT, "Golbat", 1, 0, 0, 0, "Bat Pokémon", Type.POISON, Type.FLYING, 1.6, 55, "Inner Focus", null, "Infiltrator", 455, 75, 80, 70, 65, 75, 90, 90, 70, 159, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 1 ],
[ Species.ODDISH, "Oddish", 1, 0, 0, 0, "Weed Pokémon", Type.GRASS, Type.POISON, 0.5, 5.4, "Chlorophyll", null, "Run Away", 320, 45, 50, 55, 75, 65, 30, 255, 70, 64, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.GLOOM, "Gloom", 1, 0, 0, 0, "Weed Pokémon", Type.GRASS, Type.POISON, 0.8, 8.6, "Chlorophyll", null, "Stench", 395, 60, 65, 70, 85, 75, 40, 120, 70, 138, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 1 ],
[ Species.VILEPLUME, "Vileplume", 1, 0, 0, 0, "Flower Pokémon", Type.GRASS, Type.POISON, 1.2, 18.6, "Chlorophyll", null, "Effect Spore", 490, 75, 80, 85, 110, 90, 50, 45, 70, 221, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 1 ],
[ Species.PARAS, "Paras", 1, 0, 0, 0, "Mushroom Pokémon", Type.BUG, Type.GRASS, 0.3, 5.4, "Effect Spore", "Dry Skin", "Damp", 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, "Bug", "Grass", 50, 20, 0 ],
[ Species.PARASECT, "Parasect", 1, 0, 0, 0, "Mushroom Pokémon", Type.BUG, Type.GRASS, 1, 29.5, "Effect Spore", "Dry Skin", "Damp", 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, "Bug", "Grass", 50, 20, 0 ],
[ Species.VENONAT, "Venonat", 1, 0, 0, 0, "Insect Pokémon", Type.BUG, Type.POISON, 1, 30, "Compound Eyes", "Tinted Lens", "Run Away", 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.VENOMOTH, "Venomoth", 1, 0, 0, 0, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.5, 12.5, "Shield Dust", "Tinted Lens", "Wonder Skin", 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.DIGLETT, "Diglett", 1, 0, 0, 0, "Mole Pokémon", Type.GROUND, -1, 0.2, 0.8, "Sand Veil", "Arena Trap", "Sand Force", 265, 10, 55, 25, 35, 45, 95, 255, 70, 53, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.DUGTRIO, "Dugtrio", 1, 0, 0, 0, "Mole Pokémon", Type.GROUND, -1, 0.7, 33.3, "Sand Veil", "Arena Trap", "Sand Force", 425, 35, 100, 50, 50, 70, 120, 50, 70, 149, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.MEOWTH, "Meowth", 1, 0, 0, 0, "Scratch Cat Pokémon", Type.NORMAL, -1, 0.4, 4.2, "Pickup", "Technician", "Unnerve", 290, 40, 45, 35, 40, 40, 90, 255, 70, 58, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.PERSIAN, "Persian", 1, 0, 0, 0, "Classy Cat Pokémon", Type.NORMAL, -1, 1, 32, "Limber", "Technician", "Unnerve", 440, 65, 70, 60, 65, 65, 115, 90, 70, 154, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.PSYDUCK, "Psyduck", 1, 0, 0, 0, "Duck Pokémon", Type.WATER, -1, 0.8, 19.6, "Damp", "Cloud Nine", "Swift Swim", 320, 50, 52, 48, 65, 50, 55, 190, 70, 64, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 0 ],
[ Species.GOLDUCK, "Golduck", 1, 0, 0, 0, "Duck Pokémon", Type.WATER, -1, 1.7, 76.6, "Damp", "Cloud Nine", "Swift Swim", 500, 80, 82, 78, 95, 80, 85, 75, 70, 175, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 0 ],
[ Species.MANKEY, "Mankey", 1, 0, 0, 0, "Pig Monkey Pokémon", Type.FIGHTING, -1, 0.5, 28, "Vital Spirit", "Anger Point", "Defiant", 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.PRIMEAPE, "Primeape", 1, 0, 0, 0, "Pig Monkey Pokémon", Type.FIGHTING, -1, 1, 32, "Vital Spirit", "Anger Point", "Defiant", 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.GROWLITHE, "Growlithe", 1, 0, 0, 0, "Puppy Pokémon", Type.FIRE, -1, 0.7, 19, "Intimidate", "Flash Fire", "Justified", 350, 55, 70, 45, 70, 50, 60, 190, 70, 70, GrowthRate.SLOW, "Field", null, 75, 20, 0 ],
[ Species.ARCANINE, "Arcanine", 1, 0, 0, 0, "Legendary Pokémon", Type.FIRE, -1, 1.9, 155, "Intimidate", "Flash Fire", "Justified", 555, 90, 110, 80, 100, 80, 95, 75, 70, 194, GrowthRate.SLOW, "Field", null, 75, 20, 0 ],
[ Species.POLIWAG, "Poliwag", 1, 0, 0, 0, "Tadpole Pokémon", Type.WATER, -1, 0.6, 12.4, "Water Absorb", "Damp", "Swift Swim", 300, 40, 50, 40, 40, 40, 90, 255, 70, 60, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 0 ],
[ Species.POLIWHIRL, "Poliwhirl", 1, 0, 0, 0, "Tadpole Pokémon", Type.WATER, -1, 1, 20, "Water Absorb", "Damp", "Swift Swim", 385, 65, 65, 65, 50, 50, 90, 120, 70, 135, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 0 ],
[ Species.POLIWRATH, "Poliwrath", 1, 0, 0, 0, "Tadpole Pokémon", Type.WATER, Type.FIGHTING, 1.3, 54, "Water Absorb", "Damp", "Swift Swim", 510, 90, 95, 95, 70, 90, 70, 45, 70, 230, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 0 ],
[ Species.ABRA, "Abra", 1, 0, 0, 0, "Psi Pokémon", Type.PSYCHIC, -1, 0.9, 19.5, "Synchronize", "Inner Focus", "Magic Guard", 310, 25, 20, 15, 105, 55, 90, 200, 70, 62, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.KADABRA, "Kadabra", 1, 0, 0, 0, "Psi Pokémon", Type.PSYCHIC, -1, 1.3, 56.5, "Synchronize", "Inner Focus", "Magic Guard", 400, 40, 35, 30, 120, 70, 105, 100, 70, 140, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 1 ],
[ Species.ALAKAZAM, "Alakazam", 1, 0, 0, 0, "Psi Pokémon", Type.PSYCHIC, -1, 1.5, 48, "Synchronize", "Inner Focus", "Magic Guard", 500, 55, 50, 45, 135, 95, 120, 50, 70, 225, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 1 ],
[ Species.MACHOP, "Machop", 1, 0, 0, 0, "Superpower Pokémon", Type.FIGHTING, -1, 0.8, 19.5, "Guts", "No Guard", "Steadfast", 305, 70, 80, 50, 35, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.MACHOKE, "Machoke", 1, 0, 0, 0, "Superpower Pokémon", Type.FIGHTING, -1, 1.5, 70.5, "Guts", "No Guard", "Steadfast", 405, 80, 100, 70, 50, 60, 45, 90, 70, 142, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.MACHAMP, "Machamp", 1, 0, 0, 0, "Superpower Pokémon", Type.FIGHTING, -1, 1.6, 130, "Guts", "No Guard", "Steadfast", 505, 90, 130, 80, 65, 85, 55, 45, 70, 227, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.BELLSPROUT, "Bellsprout", 1, 0, 0, 0, "Flower Pokémon", Type.GRASS, Type.POISON, 0.7, 4, "Chlorophyll", null, "Gluttony", 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.WEEPINBELL, "Weepinbell", 1, 0, 0, 0, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1, 6.4, "Chlorophyll", null, "Gluttony", 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.VICTREEBEL, "Victreebel", 1, 0, 0, 0, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1.7, 15.5, "Chlorophyll", null, "Gluttony", 490, 80, 105, 65, 100, 70, 70, 45, 70, 221, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.TENTACOOL, "Tentacool", 1, 0, 0, 0, "Jellyfish Pokémon", Type.WATER, Type.POISON, 0.9, 45.5, "Clear Body", "Liquid Ooze", "Rain Dish", 335, 40, 40, 35, 50, 100, 70, 190, 70, 67, GrowthRate.SLOW, "Water 3", null, 50, 20, 0 ],
[ Species.TENTACRUEL, "Tentacruel", 1, 0, 0, 0, "Jellyfish Pokémon", Type.WATER, Type.POISON, 1.6, 55, "Clear Body", "Liquid Ooze", "Rain Dish", 515, 80, 70, 65, 80, 120, 100, 60, 70, 180, GrowthRate.SLOW, "Water 3", null, 50, 20, 0 ],
[ Species.GEODUDE, "Geodude", 1, 0, 0, 0, "Rock Pokémon", Type.ROCK, Type.GROUND, 0.4, 20, "Rock Head", "Sturdy", "Sand Veil", 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, "Mineral", null, 50, 15, 0 ],
[ Species.GRAVELER, "Graveler", 1, 0, 0, 0, "Rock Pokémon", Type.ROCK, Type.GROUND, 1, 105, "Rock Head", "Sturdy", "Sand Veil", 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, "Mineral", null, 50, 15, 0 ],
[ Species.GOLEM, "Golem", 1, 0, 0, 0, "Megaton Pokémon", Type.ROCK, Type.GROUND, 1.4, 300, "Rock Head", "Sturdy", "Sand Veil", 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, "Mineral", null, 50, 15, 0 ],
[ Species.PONYTA, "Ponyta", 1, 0, 0, 0, "Fire Horse Pokémon", Type.FIRE, -1, 1, 30, "Run Away", "Flash Fire", "Flame Body", 410, 50, 85, 55, 65, 65, 90, 190, 70, 82, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.RAPIDASH, "Rapidash", 1, 0, 0, 0, "Fire Horse Pokémon", Type.FIRE, -1, 1.7, 95, "Run Away", "Flash Fire", "Flame Body", 500, 65, 100, 70, 80, 80, 105, 60, 70, 175, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.SLOWPOKE, "Slowpoke", 1, 0, 0, 0, "Dopey Pokémon", Type.WATER, Type.PSYCHIC, 1.2, 36, "Oblivious", "Own Tempo", "Regenerator", 315, 90, 65, 65, 40, 40, 15, 190, 70, 63, GrowthRate.MEDIUM_FAST, "Monster", "Water 1", 50, 20, 0 ],
[ Species.SLOWBRO, "Slowbro", 1, 0, 0, 0, "Hermit Crab Pokémon", Type.WATER, Type.PSYCHIC, 1.6, 78.5, "Oblivious", "Own Tempo", "Regenerator", 490, 95, 75, 110, 100, 80, 30, 75, 70, 172, GrowthRate.MEDIUM_FAST, "Monster", "Water 1", 50, 20, 0 ],
[ Species.MAGNEMITE, "Magnemite", 1, 0, 0, 0, "Magnet Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 6, "Magnet Pull", "Sturdy", "Analytic", 325, 25, 35, 70, 95, 55, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.MAGNETON, "Magneton", 1, 0, 0, 0, "Magnet Pokémon", Type.ELECTRIC, Type.STEEL, 1, 60, "Magnet Pull", "Sturdy", "Analytic", 465, 50, 60, 95, 120, 70, 70, 60, 70, 163, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.FARFETCHD, "Farfetch'd", 1, 0, 0, 0, "Wild Duck Pokémon", Type.NORMAL, Type.FLYING, 0.8, 15, "Keen Eye", "Inner Focus", "Defiant", 377, 52, 90, 55, 58, 62, 60, 45, 70, 132, GrowthRate.MEDIUM_FAST, "Field", "Flying", 50, 20, 0 ],
[ Species.DODUO, "Doduo", 1, 0, 0, 0, "Twin Bird Pokémon", Type.NORMAL, Type.FLYING, 1.4, 39.2, "Run Away", "Early Bird", "Tangled Feet", 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 20, 1 ],
[ Species.DODRIO, "Dodrio", 1, 0, 0, 0, "Triple Bird Pokémon", Type.NORMAL, Type.FLYING, 1.8, 85.2, "Run Away", "Early Bird", "Tangled Feet", 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 20, 1 ],
[ Species.SEEL, "Seel", 1, 0, 0, 0, "Sea Lion Pokémon", Type.WATER, -1, 1.1, 90, "Thick Fat", "Hydration", "Ice Body", 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 0 ],
[ Species.DEWGONG, "Dewgong", 1, 0, 0, 0, "Sea Lion Pokémon", Type.WATER, Type.ICE, 1.7, 120, "Thick Fat", "Hydration", "Ice Body", 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 0 ],
[ Species.GRIMER, "Grimer", 1, 0, 0, 0, "Sludge Pokémon", Type.POISON, -1, 0.9, 30, "Stench", "Sticky Hold", "Poison Touch", 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 0 ],
[ Species.MUK, "Muk", 1, 0, 0, 0, "Sludge Pokémon", Type.POISON, -1, 1.2, 30, "Stench", "Sticky Hold", "Poison Touch", 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 0 ],
[ Species.SHELLDER, "Shellder", 1, 0, 0, 0, "Bivalve Pokémon", Type.WATER, -1, 0.3, 4, "Shell Armor", "Skill Link", "Overcoat", 305, 30, 65, 100, 45, 25, 40, 190, 70, 61, GrowthRate.SLOW, "Water 3", null, 50, 20, 0 ],
[ Species.CLOYSTER, "Cloyster", 1, 0, 0, 0, "Bivalve Pokémon", Type.WATER, Type.ICE, 1.5, 132.5, "Shell Armor", "Skill Link", "Overcoat", 525, 50, 95, 180, 85, 45, 70, 60, 70, 184, GrowthRate.SLOW, "Water 3", null, 50, 20, 0 ],
[ Species.GASTLY, "Gastly", 1, 0, 0, 0, "Gas Pokémon", Type.GHOST, Type.POISON, 1.3, 0.1, "Levitate", null, null, 310, 30, 35, 30, 100, 35, 80, 190, 70, 62, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.HAUNTER, "Haunter", 1, 0, 0, 0, "Gas Pokémon", Type.GHOST, Type.POISON, 1.6, 0.1, "Levitate", null, null, 405, 45, 50, 45, 115, 55, 95, 90, 70, 142, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.GENGAR, "Gengar", 1, 0, 0, 0, "Shadow Pokémon", Type.GHOST, Type.POISON, 1.5, 40.5, "Cursed Body", null, null, 500, 60, 65, 60, 130, 75, 110, 45, 70, 225, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.ONIX, "Onix", 1, 0, 0, 0, "Rock Snake Pokémon", Type.ROCK, Type.GROUND, 8.8, 210, "Rock Head", "Sturdy", "Weak Armor", 385, 35, 45, 160, 30, 45, 70, 45, 70, 77, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 25, 0 ],
[ Species.DROWZEE, "Drowzee", 1, 0, 0, 0, "Hypnosis Pokémon", Type.PSYCHIC, -1, 1, 32.4, "Insomnia", "Forewarn", "Inner Focus", 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 0 ],
[ Species.HYPNO, "Hypno", 1, 0, 0, 0, "Hypnosis Pokémon", Type.PSYCHIC, -1, 1.6, 75.6, "Insomnia", "Forewarn", "Inner Focus", 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 1 ],
[ Species.KRABBY, "Krabby", 1, 0, 0, 0, "River Crab Pokémon", Type.WATER, -1, 0.4, 6.5, "Hyper Cutter", "Shell Armor", "Sheer Force", 325, 30, 105, 90, 25, 25, 50, 225, 70, 65, GrowthRate.MEDIUM_FAST, "Water 3", null, 50, 20, 0 ],
[ Species.KINGLER, "Kingler", 1, 0, 0, 0, "Pincer Pokémon", Type.WATER, -1, 1.3, 60, "Hyper Cutter", "Shell Armor", "Sheer Force", 475, 55, 130, 115, 50, 50, 75, 60, 70, 166, GrowthRate.MEDIUM_FAST, "Water 3", null, 50, 20, 0 ],
[ Species.VOLTORB, "Voltorb", 1, 0, 0, 0, "Ball Pokémon", Type.ELECTRIC, -1, 0.5, 10.4, "Soundproof", "Static", "Aftermath", 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.ELECTRODE, "Electrode", 1, 0, 0, 0, "Ball Pokémon", Type.ELECTRIC, -1, 1.2, 66.6, "Soundproof", "Static", "Aftermath", 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.EXEGGCUTE, "Exeggcute", 1, 0, 0, 0, "Egg Pokémon", Type.GRASS, Type.PSYCHIC, 0.4, 2.5, "Chlorophyll", null, "Harvest", 325, 60, 40, 80, 60, 45, 40, 90, 70, 65, GrowthRate.SLOW, "Grass", null, 50, 20, 0 ],
[ Species.EXEGGUTOR, "Exeggutor", 1, 0, 0, 0, "Coconut Pokémon", Type.GRASS, Type.PSYCHIC, 2, 120, "Chlorophyll", null, "Harvest", 530, 95, 95, 85, 125, 75, 55, 45, 70, 186, GrowthRate.SLOW, "Grass", null, 50, 20, 0 ],
[ Species.CUBONE, "Cubone", 1, 0, 0, 0, "Lonely Pokémon", Type.GROUND, -1, 0.4, 6.5, "Rock Head", "Lightning Rod", "Battle Armor", 320, 50, 50, 95, 40, 50, 35, 190, 70, 64, GrowthRate.MEDIUM_FAST, "Monster", null, 50, 20, 0 ],
[ Species.MAROWAK, "Marowak", 1, 0, 0, 0, "Bone Keeper Pokémon", Type.GROUND, -1, 1, 45, "Rock Head", "Lightning Rod", "Battle Armor", 425, 60, 80, 110, 50, 80, 45, 75, 70, 149, GrowthRate.MEDIUM_FAST, "Monster", null, 50, 20, 0 ],
[ Species.HITMONLEE, "Hitmonlee", 1, 0, 0, 0, "Kicking Pokémon", Type.FIGHTING, -1, 1.5, 49.8, "Limber", "Reckless", "Unburden", 455, 50, 120, 53, 35, 110, 87, 45, 70, 159, GrowthRate.MEDIUM_FAST, "Human-Like", null, 100, 25, 0 ],
[ Species.HITMONCHAN, "Hitmonchan", 1, 0, 0, 0, "Punching Pokémon", Type.FIGHTING, -1, 1.4, 50.2, "Keen Eye", "Iron Fist", "Inner Focus", 455, 50, 105, 79, 35, 110, 76, 45, 70, 159, GrowthRate.MEDIUM_FAST, "Human-Like", null, 100, 25, 0 ],
[ Species.LICKITUNG, "Lickitung", 1, 0, 0, 0, "Licking Pokémon", Type.NORMAL, -1, 1.2, 65.5, "Own Tempo", "Oblivious", "Cloud Nine", 385, 90, 55, 75, 60, 75, 30, 45, 70, 77, GrowthRate.MEDIUM_FAST, "Monster", null, 50, 20, 0 ],
[ Species.KOFFING, "Koffing", 1, 0, 0, 0, "Poison Gas Pokémon", Type.POISON, -1, 0.6, 1, "Levitate", "Neutralizing Gas", "Stench", 340, 40, 65, 95, 60, 45, 35, 190, 70, 68, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 0 ],
[ Species.WEEZING, "Weezing", 1, 0, 0, 0, "Poison Gas Pokémon", Type.POISON, -1, 1.2, 9.5, "Levitate", "Neutralizing Gas", "Stench", 490, 65, 90, 120, 85, 70, 60, 60, 70, 172, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 0 ],
[ Species.RHYHORN, "Rhyhorn", 1, 0, 0, 0, "Spikes Pokémon", Type.GROUND, Type.ROCK, 1, 115, "Lightning Rod", "Rock Head", "Reckless", 345, 80, 85, 95, 30, 30, 25, 120, 70, 69, GrowthRate.SLOW, "Field", "Monster", 50, 20, 1 ],
[ Species.RHYDON, "Rhydon", 1, 0, 0, 0, "Drill Pokémon", Type.GROUND, Type.ROCK, 1.9, 120, "Lightning Rod", "Rock Head", "Reckless", 485, 105, 130, 120, 45, 45, 40, 60, 70, 170, GrowthRate.SLOW, "Field", "Monster", 50, 20, 1 ],
[ Species.CHANSEY, "Chansey", 1, 0, 0, 0, "Egg Pokémon", Type.NORMAL, -1, 1.1, 34.6, "Natural Cure", "Serene Grace", "Healer", 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, "Fairy", null, 0, 40, 0 ],
[ Species.TANGELA, "Tangela", 1, 0, 0, 0, "Vine Pokémon", Type.GRASS, -1, 1, 35, "Chlorophyll", "Leaf Guard", "Regenerator", 435, 65, 55, 115, 100, 40, 60, 45, 70, 87, GrowthRate.MEDIUM_FAST, "Grass", null, 50, 20, 0 ],
[ Species.KANGASKHAN, "Kangaskhan", 1, 0, 0, 0, "Parent Pokémon", Type.NORMAL, -1, 2.2, 80, "Early Bird", "Scrappy", "Inner Focus", 490, 105, 95, 80, 40, 80, 90, 45, 70, 172, GrowthRate.MEDIUM_FAST, "Monster", null, 0, 20, 0 ],
[ Species.HORSEA, "Horsea", 1, 0, 0, 0, "Dragon Pokémon", Type.WATER, -1, 0.4, 8, "Swift Swim", "Sniper", "Damp", 295, 30, 40, 70, 70, 25, 60, 225, 70, 59, GrowthRate.MEDIUM_FAST, "Dragon", "Water 1", 50, 20, 0 ],
[ Species.SEADRA, "Seadra", 1, 0, 0, 0, "Dragon Pokémon", Type.WATER, -1, 1.2, 25, "Poison Point", "Sniper", "Damp", 440, 55, 65, 95, 95, 45, 85, 75, 70, 154, GrowthRate.MEDIUM_FAST, "Dragon", "Water 1", 50, 20, 0 ],
[ Species.GOLDEEN, "Goldeen", 1, 0, 0, 0, "Goldfish Pokémon", Type.WATER, -1, 0.6, 15, "Swift Swim", "Water Veil", "Lightning Rod", 320, 45, 67, 60, 35, 50, 63, 225, 70, 64, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 20, 1 ],
[ Species.SEAKING, "Seaking", 1, 0, 0, 0, "Goldfish Pokémon", Type.WATER, -1, 1.3, 39, "Swift Swim", "Water Veil", "Lightning Rod", 450, 80, 92, 65, 65, 80, 68, 60, 70, 158, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 20, 1 ],
[ Species.STARYU, "Staryu", 1, 0, 0, 0, "Star Shape Pokémon", Type.WATER, -1, 0.8, 34.5, "Illuminate", "Natural Cure", "Analytic", 340, 30, 45, 55, 70, 55, 85, 225, 70, 68, GrowthRate.SLOW, "Water 3", null, null, 20, 0 ],
[ Species.STARMIE, "Starmie", 1, 0, 0, 0, "Mysterious Pokémon", Type.WATER, Type.PSYCHIC, 1.1, 80, "Illuminate", "Natural Cure", "Analytic", 520, 60, 75, 85, 100, 85, 115, 60, 70, 182, GrowthRate.SLOW, "Water 3", null, null, 20, 0 ],
[ Species.MR_MIME, "Mr. Mime", 1, 0, 0, 0, "Barrier Pokémon", Type.PSYCHIC, Type.FAIRY, 1.3, 54.5, "Soundproof", "Filter", "Technician", 460, 40, 45, 65, 100, 120, 90, 45, 70, 161, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 25, 0 ],
[ Species.SCYTHER, "Scyther", 1, 0, 0, 0, "Mantis Pokémon", Type.BUG, Type.FLYING, 1.5, 56, "Swarm", "Technician", "Steadfast", 500, 70, 110, 80, 55, 80, 105, 45, 70, 100, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 25, 1 ],
[ Species.JYNX, "Jynx", 1, 0, 0, 0, "Human Shape Pokémon", Type.ICE, Type.PSYCHIC, 1.4, 40.6, "Oblivious", "Forewarn", "Dry Skin", 455, 65, 50, 35, 115, 95, 95, 45, 70, 159, GrowthRate.MEDIUM_FAST, "Human-Like", null, 0, 25, 0 ],
[ Species.ELECTABUZZ, "Electabuzz", 1, 0, 0, 0, "Electric Pokémon", Type.ELECTRIC, -1, 1.1, 30, "Static", null, "Vital Spirit", 490, 65, 83, 57, 95, 85, 105, 45, 70, 172, GrowthRate.MEDIUM_FAST, "Human-Like", null, 75, 25, 0 ],
[ Species.MAGMAR, "Magmar", 1, 0, 0, 0, "Spitfire Pokémon", Type.FIRE, -1, 1.3, 44.5, "Flame Body", null, "Vital Spirit", 495, 65, 95, 57, 100, 85, 93, 45, 70, 173, GrowthRate.MEDIUM_FAST, "Human-Like", null, 75, 25, 0 ],
[ Species.PINSIR, "Pinsir", 1, 0, 0, 0, "Stag Beetle Pokémon", Type.BUG, -1, 1.5, 55, "Hyper Cutter", "Mold Breaker", "Moxie", 500, 65, 125, 100, 55, 70, 85, 45, 70, 175, GrowthRate.SLOW, "Bug", null, 50, 25, 0 ],
[ Species.TAUROS, "Tauros", 1, 0, 0, 0, "Wild Bull Pokémon", Type.NORMAL, -1, 1.4, 88.4, "Intimidate", "Anger Point", "Sheer Force", 490, 75, 100, 95, 40, 70, 110, 45, 70, 172, GrowthRate.SLOW, "Field", null, 100, 20, 0 ],
[ Species.MAGIKARP, "Magikarp", 1, 0, 0, 0, "Fish Pokémon", Type.WATER, -1, 0.9, 10, "Swift Swim", null, "Rattled", 200, 20, 10, 55, 15, 20, 80, 255, 70, 40, GrowthRate.SLOW, "Dragon", "Water 2", 50, 5, 1 ],
[ Species.GYARADOS, "Gyarados", 1, 0, 0, 0, "Atrocious Pokémon", Type.WATER, Type.FLYING, 6.5, 235, "Intimidate", null, "Moxie", 540, 95, 125, 79, 60, 100, 81, 45, 70, 189, GrowthRate.SLOW, "Dragon", "Water 2", 50, 5, 1 ],
[ Species.LAPRAS, "Lapras", 1, 0, 0, 0, "Transport Pokémon", Type.WATER, Type.ICE, 2.5, 220, "Water Absorb", "Shell Armor", "Hydration", 535, 130, 85, 80, 85, 95, 60, 45, 70, 187, GrowthRate.SLOW, "Monster", "Water 1", 50, 40, 0 ],
[ Species.DITTO, "Ditto", 1, 0, 0, 0, "Transform Pokémon", Type.NORMAL, -1, 0.3, 4, "Limber", null, "Imposter", 288, 48, 48, 48, 48, 48, 48, 35, 70, 101, GrowthRate.MEDIUM_FAST, "Ditto", null, null, 20, 0 ],
[ Species.EEVEE, "Eevee", 1, 0, 0, 0, "Evolution Pokémon", Type.NORMAL, -1, 0.3, 6.5, "Run Away", "Adaptability", "Anticipation", 325, 55, 55, 50, 45, 65, 55, 45, 70, 65, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.VAPOREON, "Vaporeon", 1, 0, 0, 0, "Bubble Jet Pokémon", Type.WATER, -1, 1, 29, "Water Absorb", null, "Hydration", 525, 130, 65, 60, 110, 95, 65, 45, 70, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.JOLTEON, "Jolteon", 1, 0, 0, 0, "Lightning Pokémon", Type.ELECTRIC, -1, 0.8, 24.5, "Volt Absorb", null, "Quick Feet", 525, 65, 65, 60, 110, 95, 130, 45, 70, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.FLAREON, "Flareon", 1, 0, 0, 0, "Flame Pokémon", Type.FIRE, -1, 0.9, 25, "Flash Fire", null, "Guts", 525, 65, 130, 60, 95, 110, 65, 45, 70, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.PORYGON, "Porygon", 1, 0, 0, 0, "Virtual Pokémon", Type.NORMAL, -1, 0.8, 36.5, "Trace", "Download", "Analytic", 395, 65, 60, 70, 85, 75, 40, 45, 70, 79, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.OMANYTE, "Omanyte", 1, 0, 0, 0, "Spiral Pokémon", Type.ROCK, Type.WATER, 0.4, 7.5, "Swift Swim", "Shell Armor", "Weak Armor", 355, 35, 40, 100, 90, 55, 35, 45, 70, 71, GrowthRate.MEDIUM_FAST, "Water 1", "Water 3", 87.5, 30, 0 ],
[ Species.OMASTAR, "Omastar", 1, 0, 0, 0, "Spiral Pokémon", Type.ROCK, Type.WATER, 1, 35, "Swift Swim", "Shell Armor", "Weak Armor", 495, 70, 60, 125, 115, 70, 55, 45, 70, 173, GrowthRate.MEDIUM_FAST, "Water 1", "Water 3", 87.5, 30, 0 ],
[ Species.KABUTO, "Kabuto", 1, 0, 0, 0, "Shellfish Pokémon", Type.ROCK, Type.WATER, 0.5, 11.5, "Swift Swim", "Battle Armor", "Weak Armor", 355, 30, 80, 90, 55, 45, 55, 45, 70, 71, GrowthRate.MEDIUM_FAST, "Water 1", "Water 3", 87.5, 30, 0 ],
[ Species.KABUTOPS, "Kabutops", 1, 0, 0, 0, "Shellfish Pokémon", Type.ROCK, Type.WATER, 1.3, 40.5, "Swift Swim", "Battle Armor", "Weak Armor", 495, 60, 115, 105, 65, 70, 80, 45, 70, 173, GrowthRate.MEDIUM_FAST, "Water 1", "Water 3", 87.5, 30, 0 ],
[ Species.AERODACTYL, "Aerodactyl", 1, 0, 0, 0, "Fossil Pokémon", Type.ROCK, Type.FLYING, 1.8, 59, "Rock Head", "Pressure", "Unnerve", 515, 80, 105, 65, 60, 75, 130, 45, 70, 180, GrowthRate.SLOW, "Flying", null, 87.5, 35, 0 ],
[ Species.SNORLAX, "Snorlax", 1, 0, 0, 0, "Sleeping Pokémon", Type.NORMAL, -1, 2.1, 460, "Immunity", "Thick Fat", "Gluttony", 540, 160, 110, 65, 65, 110, 30, 25, 70, 189, GrowthRate.SLOW, "Monster", null, 87.5, 40, 0 ],
[ Species.ARTICUNO, "Articuno", 1, 1, 0, 0, "Freeze Pokémon", Type.ICE, Type.FLYING, 1.7, 55.4, "Pressure", null, "Snow Cloak", 580, 90, 85, 100, 95, 125, 85, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.ZAPDOS, "Zapdos", 1, 1, 0, 0, "Electric Pokémon", Type.ELECTRIC, Type.FLYING, 1.6, 52.6, "Pressure", null, "Static", 580, 90, 90, 85, 125, 90, 100, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.MOLTRES, "Moltres", 1, 1, 0, 0, "Flame Pokémon", Type.FIRE, Type.FLYING, 2, 60, "Pressure", null, "Flame Body", 580, 90, 100, 90, 125, 85, 90, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.DRATINI, "Dratini", 1, 0, 0, 0, "Dragon Pokémon", Type.DRAGON, -1, 1.8, 3.3, "Shed Skin", null, "Marvel Scale", 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, "Dragon", "Water 1", 50, 40, 0 ],
[ Species.DRAGONAIR, "Dragonair", 1, 0, 0, 0, "Dragon Pokémon", Type.DRAGON, -1, 4, 16.5, "Shed Skin", null, "Marvel Scale", 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, "Dragon", "Water 1", 50, 40, 0 ],
[ Species.DRAGONITE, "Dragonite", 1, 0, 0, 0, "Dragon Pokémon", Type.DRAGON, Type.FLYING, 2.2, 210, "Inner Focus", null, "Multiscale", 600, 91, 134, 95, 100, 100, 80, 45, 35, 270, GrowthRate.SLOW, "Dragon", "Water 1", 50, 40, 0 ],
[ Species.MEWTWO, "Mewtwo", 1, 0, 1, 0, "Genetic Pokémon", Type.PSYCHIC, -1, 2, 122, "Pressure", null, "Unnerve", 680, 106, 110, 90, 154, 90, 130, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.MEW, "Mew", 1, 0, 0, 1, "New Species Pokémon", Type.PSYCHIC, -1, 0.4, 4, "Synchronize", null, null, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.CHIKORITA, "Chikorita", 2, 0, 0, 0, "Leaf Pokémon", Type.GRASS, -1, 0.9, 6.4, "Overgrow", null, "Leaf Guard", 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.BAYLEEF, "Bayleef", 2, 0, 0, 0, "Leaf Pokémon", Type.GRASS, -1, 1.2, 15.8, "Overgrow", null, "Leaf Guard", 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.MEGANIUM, "Meganium", 2, 0, 0, 0, "Herb Pokémon", Type.GRASS, -1, 1.8, 100.5, "Overgrow", null, "Leaf Guard", 525, 80, 82, 100, 83, 100, 80, 45, 70, 236, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 1 ],
[ Species.CYNDAQUIL, "Cyndaquil", 2, 0, 0, 0, "Fire Mouse Pokémon", Type.FIRE, -1, 0.5, 7.9, "Blaze", null, "Flash Fire", 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.QUILAVA, "Quilava", 2, 0, 0, 0, "Volcano Pokémon", Type.FIRE, -1, 0.9, 19, "Blaze", null, "Flash Fire", 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.TYPHLOSION, "Typhlosion", 2, 0, 0, 0, "Volcano Pokémon", Type.FIRE, -1, 1.7, 79.5, "Blaze", null, "Flash Fire", 534, 78, 84, 78, 109, 85, 100, 45, 70, 240, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.TOTODILE, "Totodile", 2, 0, 0, 0, "Big Jaw Pokémon", Type.WATER, -1, 0.6, 9.5, "Torrent", null, "Sheer Force", 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.CROCONAW, "Croconaw", 2, 0, 0, 0, "Big Jaw Pokémon", Type.WATER, -1, 1.1, 25, "Torrent", null, "Sheer Force", 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.FERALIGATR, "Feraligatr", 2, 0, 0, 0, "Big Jaw Pokémon", Type.WATER, -1, 2.3, 88.8, "Torrent", null, "Sheer Force", 530, 85, 105, 100, 79, 83, 78, 45, 70, 239, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.SENTRET, "Sentret", 2, 0, 0, 0, "Scout Pokémon", Type.NORMAL, -1, 0.8, 6, "Run Away", "Keen Eye", "Frisk", 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.FURRET, "Furret", 2, 0, 0, 0, "Long Body Pokémon", Type.NORMAL, -1, 1.8, 32.5, "Run Away", "Keen Eye", "Frisk", 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.HOOTHOOT, "Hoothoot", 2, 0, 0, 0, "Owl Pokémon", Type.NORMAL, Type.FLYING, 0.7, 21.2, "Insomnia", "Keen Eye", "Tinted Lens", 262, 60, 30, 30, 36, 56, 50, 255, 70, 52, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 0 ],
[ Species.NOCTOWL, "Noctowl", 2, 0, 0, 0, "Owl Pokémon", Type.NORMAL, Type.FLYING, 1.6, 40.8, "Insomnia", "Keen Eye", "Tinted Lens", 452, 100, 50, 50, 86, 96, 70, 90, 70, 158, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 0 ],
[ Species.LEDYBA, "Ledyba", 2, 0, 0, 0, "Five Star Pokémon", Type.BUG, Type.FLYING, 1, 10.8, "Swarm", "Early Bird", "Rattled", 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, "Bug", null, 50, 15, 1 ],
[ Species.LEDIAN, "Ledian", 2, 0, 0, 0, "Five Star Pokémon", Type.BUG, Type.FLYING, 1.4, 35.6, "Swarm", "Early Bird", "Iron Fist", 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, "Bug", null, 50, 15, 1 ],
[ Species.SPINARAK, "Spinarak", 2, 0, 0, 0, "String Spit Pokémon", Type.BUG, Type.POISON, 0.5, 8.5, "Swarm", "Insomnia", "Sniper", 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, "Bug", null, 50, 15, 0 ],
[ Species.ARIADOS, "Ariados", 2, 0, 0, 0, "Long Leg Pokémon", Type.BUG, Type.POISON, 1.1, 33.5, "Swarm", "Insomnia", "Sniper", 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, "Bug", null, 50, 15, 0 ],
[ Species.CROBAT, "Crobat", 2, 0, 0, 0, "Bat Pokémon", Type.POISON, Type.FLYING, 1.8, 75, "Inner Focus", null, "Infiltrator", 535, 85, 90, 80, 70, 80, 130, 90, 70, 241, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 15, 0 ],
[ Species.CHINCHOU, "Chinchou", 2, 0, 0, 0, "Angler Pokémon", Type.WATER, Type.ELECTRIC, 0.5, 12, "Volt Absorb", "Illuminate", "Water Absorb", 330, 75, 38, 38, 56, 56, 67, 190, 70, 66, GrowthRate.SLOW, "Water 2", null, 50, 20, 0 ],
[ Species.LANTURN, "Lanturn", 2, 0, 0, 0, "Light Pokémon", Type.WATER, Type.ELECTRIC, 1.2, 22.5, "Volt Absorb", "Illuminate", "Water Absorb", 460, 125, 58, 58, 76, 76, 67, 75, 70, 161, GrowthRate.SLOW, "Water 2", null, 50, 20, 0 ],
[ Species.PICHU, "Pichu", 2, 0, 0, 0, "Tiny Mouse Pokémon", Type.ELECTRIC, -1, 0.3, 2, "Static", null, "Lightning Rod", 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 50, 10, 0 ],
[ Species.CLEFFA, "Cleffa", 2, 0, 0, 0, "Star Shape Pokémon", Type.FAIRY, -1, 0.3, 3, "Cute Charm", "Magic Guard", "Friend Guard", 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, "Undiscovered", null, 25, 10, 0 ],
[ Species.IGGLYBUFF, "Igglybuff", 2, 0, 0, 0, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.3, 1, "Cute Charm", "Competitive", "Friend Guard", 210, 90, 30, 15, 40, 20, 15, 170, 70, 42, GrowthRate.FAST, "Undiscovered", null, 25, 10, 0 ],
[ Species.TOGEPI, "Togepi", 2, 0, 0, 0, "Spike Ball Pokémon", Type.FAIRY, -1, 0.3, 1.5, "Hustle", "Serene Grace", "Super Luck", 245, 35, 20, 65, 40, 65, 20, 190, 70, 49, GrowthRate.FAST, "Undiscovered", null, 87.5, 10, 0 ],
[ Species.TOGETIC, "Togetic", 2, 0, 0, 0, "Happiness Pokémon", Type.FAIRY, Type.FLYING, 0.6, 3.2, "Hustle", "Serene Grace", "Super Luck", 405, 55, 40, 85, 80, 105, 40, 75, 70, 142, GrowthRate.FAST, "Fairy", "Flying", 87.5, 10, 0 ],
[ Species.NATU, "Natu", 2, 0, 0, 0, "Tiny Bird Pokémon", Type.PSYCHIC, Type.FLYING, 0.2, 2, "Synchronize", "Early Bird", "Magic Bounce", 320, 40, 50, 45, 70, 45, 70, 190, 70, 64, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 20, 0 ],
[ Species.XATU, "Xatu", 2, 0, 0, 0, "Mystic Pokémon", Type.PSYCHIC, Type.FLYING, 1.5, 15, "Synchronize", "Early Bird", "Magic Bounce", 470, 65, 75, 70, 95, 70, 95, 75, 70, 165, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 20, 1 ],
[ Species.MAREEP, "Mareep", 2, 0, 0, 0, "Wool Pokémon", Type.ELECTRIC, -1, 0.6, 7.8, "Static", null, "Plus", 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 50, 20, 0 ],
[ Species.FLAAFFY, "Flaaffy", 2, 0, 0, 0, "Wool Pokémon", Type.ELECTRIC, -1, 0.8, 13.3, "Static", null, "Plus", 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 50, 20, 0 ],
[ Species.AMPHAROS, "Ampharos", 2, 0, 0, 0, "Light Pokémon", Type.ELECTRIC, -1, 1.4, 61.5, "Static", null, "Plus", 510, 90, 75, 85, 115, 90, 55, 45, 70, 230, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 50, 20, 0 ],
[ Species.BELLOSSOM, "Bellossom", 2, 0, 0, 0, "Flower Pokémon", Type.GRASS, -1, 0.4, 5.8, "Chlorophyll", null, "Healer", 490, 75, 80, 95, 90, 100, 50, 45, 70, 221, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.MARILL, "Marill", 2, 0, 0, 0, "Aqua Mouse Pokémon", Type.WATER, Type.FAIRY, 0.4, 8.5, "Thick Fat", "Huge Power", "Sap Sipper", 250, 70, 20, 50, 20, 50, 40, 190, 70, 88, GrowthRate.FAST, "Fairy", "Water 1", 50, 10, 0 ],
[ Species.AZUMARILL, "Azumarill", 2, 0, 0, 0, "Aqua Rabbit Pokémon", Type.WATER, Type.FAIRY, 0.8, 28.5, "Thick Fat", "Huge Power", "Sap Sipper", 420, 100, 50, 80, 60, 80, 50, 75, 70, 189, GrowthRate.FAST, "Fairy", "Water 1", 50, 10, 0 ],
[ Species.SUDOWOODO, "Sudowoodo", 2, 0, 0, 0, "Imitation Pokémon", Type.ROCK, -1, 1.2, 38, "Sturdy", "Rock Head", "Rattled", 410, 70, 100, 115, 30, 65, 30, 65, 70, 144, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 20, 1 ],
[ Species.POLITOED, "Politoed", 2, 0, 0, 0, "Frog Pokémon", Type.WATER, -1, 1.1, 33.9, "Water Absorb", "Damp", "Drizzle", 500, 90, 75, 75, 90, 100, 70, 45, 70, 225, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 1 ],
[ Species.HOPPIP, "Hoppip", 2, 0, 0, 0, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.4, 0.5, "Chlorophyll", "Leaf Guard", "Infiltrator", 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, "Fairy", "Grass", 50, 20, 0 ],
[ Species.SKIPLOOM, "Skiploom", 2, 0, 0, 0, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.6, 1, "Chlorophyll", "Leaf Guard", "Infiltrator", 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, "Fairy", "Grass", 50, 20, 0 ],
[ Species.JUMPLUFF, "Jumpluff", 2, 0, 0, 0, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.8, 3, "Chlorophyll", "Leaf Guard", "Infiltrator", 460, 75, 55, 70, 55, 95, 110, 45, 70, 207, GrowthRate.MEDIUM_SLOW, "Fairy", "Grass", 50, 20, 0 ],
[ Species.AIPOM, "Aipom", 2, 0, 0, 0, "Long Tail Pokémon", Type.NORMAL, -1, 0.8, 11.5, "Run Away", "Pickup", "Skill Link", 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, "Field", null, 50, 20, 1 ],
[ Species.SUNKERN, "Sunkern", 2, 0, 0, 0, "Seed Pokémon", Type.GRASS, -1, 0.3, 1.8, "Chlorophyll", "Solar Power", "Early Bird", 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.SUNFLORA, "Sunflora", 2, 0, 0, 0, "Sun Pokémon", Type.GRASS, -1, 0.8, 8.5, "Chlorophyll", "Solar Power", "Early Bird", 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, "Grass", null, 50, 20, 0 ],
[ Species.YANMA, "Yanma", 2, 0, 0, 0, "Clear Wing Pokémon", Type.BUG, Type.FLYING, 1.2, 38, "Speed Boost", "Compound Eyes", "Frisk", 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.WOOPER, "Wooper", 2, 0, 0, 0, "Water Fish Pokémon", Type.WATER, Type.GROUND, 0.4, 8.5, "Damp", "Water Absorb", "Unaware", 210, 55, 45, 45, 25, 25, 15, 255, 70, 42, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 1 ],
[ Species.QUAGSIRE, "Quagsire", 2, 0, 0, 0, "Water Fish Pokémon", Type.WATER, Type.GROUND, 1.4, 75, "Damp", "Water Absorb", "Unaware", 430, 95, 85, 85, 65, 65, 35, 90, 70, 151, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 1 ],
[ Species.ESPEON, "Espeon", 2, 0, 0, 0, "Sun Pokémon", Type.PSYCHIC, -1, 0.9, 26.5, "Synchronize", null, "Magic Bounce", 525, 65, 65, 60, 130, 95, 110, 45, 70, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.UMBREON, "Umbreon", 2, 0, 0, 0, "Moonlight Pokémon", Type.DARK, -1, 1, 27, "Synchronize", null, "Inner Focus", 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.MURKROW, "Murkrow", 2, 0, 0, 0, "Darkness Pokémon", Type.DARK, Type.FLYING, 0.5, 2.1, "Insomnia", "Super Luck", "Prankster", 405, 60, 85, 42, 85, 32, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 20, 1 ],
[ Species.SLOWKING, "Slowking", 2, 0, 0, 0, "Royal Pokémon", Type.WATER, Type.PSYCHIC, 2, 79.5, "Oblivious", "Own Tempo", "Regenerator", 490, 95, 75, 80, 100, 110, 30, 70, 70, 172, GrowthRate.MEDIUM_FAST, "Monster", "Water 1", 50, 20, 0 ],
[ Species.MISDREAVUS, "Misdreavus", 2, 0, 0, 0, "Screech Pokémon", Type.GHOST, -1, 0.7, 1, "Levitate", null, null, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.UNOWN, "Unown", 2, 0, 0, 0, "Symbol Pokémon", Type.PSYCHIC, -1, 0.5, 5, "Levitate", null, null, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, "Undiscovered", null, null, 40, 1 ],
[ Species.WOBBUFFET, "Wobbuffet", 2, 0, 0, 0, "Patient Pokémon", Type.PSYCHIC, -1, 1.3, 28.5, "Shadow Tag", null, "Telepathy", 405, 190, 33, 58, 33, 58, 33, 45, 70, 142, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 1 ],
[ Species.GIRAFARIG, "Girafarig", 2, 0, 0, 0, "Long Neck Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 41.5, "Inner Focus", "Early Bird", "Sap Sipper", 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 1 ],
[ Species.PINECO, "Pineco", 2, 0, 0, 0, "Bagworm Pokémon", Type.BUG, -1, 0.6, 7.2, "Sturdy", null, "Overcoat", 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.FORRETRESS, "Forretress", 2, 0, 0, 0, "Bagworm Pokémon", Type.BUG, Type.STEEL, 1.2, 125.8, "Sturdy", null, "Overcoat", 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.DUNSPARCE, "Dunsparce", 2, 0, 0, 0, "Land Snake Pokémon", Type.NORMAL, -1, 1.5, 14, "Serene Grace", "Run Away", "Rattled", 415, 100, 70, 70, 65, 65, 45, 190, 70, 145, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.GLIGAR, "Gligar", 2, 0, 0, 0, "FlyScorpion Pokémon", Type.GROUND, Type.FLYING, 1.1, 64.8, "Hyper Cutter", "Sand Veil", "Immunity", 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 20, 1 ],
[ Species.STEELIX, "Steelix", 2, 0, 0, 0, "Iron Snake Pokémon", Type.STEEL, Type.GROUND, 9.2, 400, "Rock Head", "Sturdy", "Sheer Force", 510, 75, 85, 200, 55, 65, 30, 25, 70, 179, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 25, 1 ],
[ Species.SNUBBULL, "Snubbull", 2, 0, 0, 0, "Fairy Pokémon", Type.FAIRY, -1, 0.6, 7.8, "Intimidate", "Run Away", "Rattled", 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, "Fairy", "Field", 25, 20, 0 ],
[ Species.GRANBULL, "Granbull", 2, 0, 0, 0, "Fairy Pokémon", Type.FAIRY, -1, 1.4, 48.7, "Intimidate", "Quick Feet", "Rattled", 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, "Fairy", "Field", 25, 20, 0 ],
[ Species.QWILFISH, "Qwilfish", 2, 0, 0, 0, "Balloon Pokémon", Type.WATER, Type.POISON, 0.5, 3.9, "Poison Point", "Swift Swim", "Intimidate", 440, 65, 95, 85, 55, 55, 85, 45, 70, 88, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 20, 0 ],
[ Species.SCIZOR, "Scizor", 2, 0, 0, 0, "Pincer Pokémon", Type.BUG, Type.STEEL, 1.8, 118, "Swarm", "Technician", "Light Metal", 500, 70, 130, 100, 55, 80, 65, 25, 70, 175, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 25, 1 ],
[ Species.SHUCKLE, "Shuckle", 2, 0, 0, 0, "Mold Pokémon", Type.BUG, Type.ROCK, 0.6, 20.5, "Sturdy", "Gluttony", "Contrary", 505, 20, 10, 230, 10, 230, 5, 190, 70, 177, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 20, 0 ],
[ Species.HERACROSS, "Heracross", 2, 0, 0, 0, "Single Horn Pokémon", Type.BUG, Type.FIGHTING, 1.5, 54, "Swarm", "Guts", "Moxie", 500, 80, 125, 75, 40, 95, 85, 45, 70, 175, GrowthRate.SLOW, "Bug", null, 50, 25, 1 ],
[ Species.SNEASEL, "Sneasel", 2, 0, 0, 0, "Sharp Claw Pokémon", Type.DARK, Type.ICE, 0.9, 28, "Inner Focus", "Keen Eye", "Pickpocket", 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 1 ],
[ Species.TEDDIURSA, "Teddiursa", 2, 0, 0, 0, "Little Bear Pokémon", Type.NORMAL, -1, 0.6, 8.8, "Pickup", "Quick Feet", "Honey Gather", 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.URSARING, "Ursaring", 2, 0, 0, 0, "Hibernator Pokémon", Type.NORMAL, -1, 1.8, 125.8, "Guts", "Quick Feet", "Unnerve", 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 1 ],
[ Species.SLUGMA, "Slugma", 2, 0, 0, 0, "Lava Pokémon", Type.FIRE, -1, 0.7, 35, "Magma Armor", "Flame Body", "Weak Armor", 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 0 ],
[ Species.MAGCARGO, "Magcargo", 2, 0, 0, 0, "Lava Pokémon", Type.FIRE, Type.ROCK, 0.8, 55, "Magma Armor", "Flame Body", "Weak Armor", 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 0 ],
[ Species.SWINUB, "Swinub", 2, 0, 0, 0, "Pig Pokémon", Type.ICE, Type.GROUND, 0.4, 6.5, "Oblivious", "Snow Cloak", "Thick Fat", 250, 50, 50, 40, 30, 30, 50, 225, 70, 50, GrowthRate.SLOW, "Field", null, 50, 20, 0 ],
[ Species.PILOSWINE, "Piloswine", 2, 0, 0, 0, "Swine Pokémon", Type.ICE, Type.GROUND, 1.1, 55.8, "Oblivious", "Snow Cloak", "Thick Fat", 450, 100, 100, 80, 60, 60, 50, 75, 70, 158, GrowthRate.SLOW, "Field", null, 50, 20, 1 ],
[ Species.CORSOLA, "Corsola", 2, 0, 0, 0, "Coral Pokémon", Type.WATER, Type.ROCK, 0.6, 5, "Hustle", "Natural Cure", "Regenerator", 410, 65, 55, 95, 65, 95, 35, 60, 70, 144, GrowthRate.FAST, "Water 1", "Water 3", 25, 20, 0 ],
[ Species.REMORAID, "Remoraid", 2, 0, 0, 0, "Jet Pokémon", Type.WATER, -1, 0.6, 12, "Hustle", "Sniper", "Moody", 300, 35, 65, 35, 65, 35, 65, 190, 70, 60, GrowthRate.MEDIUM_FAST, "Water 1", "Water 2", 50, 20, 0 ],
[ Species.OCTILLERY, "Octillery", 2, 0, 0, 0, "Jet Pokémon", Type.WATER, -1, 0.9, 28.5, "Suction Cups", "Sniper", "Moody", 480, 75, 105, 75, 105, 75, 45, 75, 70, 168, GrowthRate.MEDIUM_FAST, "Water 1", "Water 2", 50, 20, 1 ],
[ Species.DELIBIRD, "Delibird", 2, 0, 0, 0, "Delivery Pokémon", Type.ICE, Type.FLYING, 0.9, 16, "Vital Spirit", "Hustle", "Insomnia", 330, 45, 55, 45, 65, 45, 75, 45, 70, 116, GrowthRate.FAST, "Field", "Water 1", 50, 20, 0 ],
[ Species.MANTINE, "Mantine", 2, 0, 0, 0, "Kite Pokémon", Type.WATER, Type.FLYING, 2.1, 220, "Swift Swim", "Water Absorb", "Water Veil", 485, 85, 40, 70, 80, 140, 70, 25, 70, 170, GrowthRate.SLOW, "Water 1", null, 50, 25, 0 ],
[ Species.SKARMORY, "Skarmory", 2, 0, 0, 0, "Armor Bird Pokémon", Type.STEEL, Type.FLYING, 1.7, 50.5, "Keen Eye", "Sturdy", "Weak Armor", 465, 65, 80, 140, 40, 70, 70, 25, 70, 163, GrowthRate.SLOW, "Flying", null, 50, 25, 0 ],
[ Species.HOUNDOUR, "Houndour", 2, 0, 0, 0, "Dark Pokémon", Type.DARK, Type.FIRE, 0.6, 10.8, "Early Bird", "Flash Fire", "Unnerve", 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, "Field", null, 50, 20, 0 ],
[ Species.HOUNDOOM, "Houndoom", 2, 0, 0, 0, "Dark Pokémon", Type.DARK, Type.FIRE, 1.4, 35, "Early Bird", "Flash Fire", "Unnerve", 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, GrowthRate.SLOW, "Field", null, 50, 20, 1 ],
[ Species.KINGDRA, "Kingdra", 2, 0, 0, 0, "Dragon Pokémon", Type.WATER, Type.DRAGON, 1.8, 152, "Swift Swim", "Sniper", "Damp", 540, 75, 95, 95, 95, 95, 85, 45, 70, 243, GrowthRate.MEDIUM_FAST, "Dragon", "Water 1", 50, 20, 0 ],
[ Species.PHANPY, "Phanpy", 2, 0, 0, 0, "Long Nose Pokémon", Type.GROUND, -1, 0.5, 33.5, "Pickup", null, "Sand Veil", 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.DONPHAN, "Donphan", 2, 0, 0, 0, "Armor Pokémon", Type.GROUND, -1, 1.1, 120, "Sturdy", null, "Sand Veil", 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 1 ],
[ Species.PORYGON2, "Porygon2", 2, 0, 0, 0, "Virtual Pokémon", Type.NORMAL, -1, 0.6, 32.5, "Trace", "Download", "Analytic", 515, 85, 80, 90, 105, 95, 60, 45, 70, 180, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.STANTLER, "Stantler", 2, 0, 0, 0, "Big Horn Pokémon", Type.NORMAL, -1, 1.4, 71.2, "Intimidate", "Frisk", "Sap Sipper", 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, "Field", null, 50, 20, 0 ],
[ Species.SMEARGLE, "Smeargle", 2, 0, 0, 0, "Painter Pokémon", Type.NORMAL, -1, 1.2, 58, "Own Tempo", "Technician", "Moody", 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, "Field", null, 50, 20, 0 ],
[ Species.TYROGUE, "Tyrogue", 2, 0, 0, 0, "Scuffle Pokémon", Type.FIGHTING, -1, 0.7, 21, "Guts", "Steadfast", "Vital Spirit", 210, 35, 35, 35, 35, 35, 35, 75, 70, 42, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 100, 25, 0 ],
[ Species.HITMONTOP, "Hitmontop", 2, 0, 0, 0, "Handstand Pokémon", Type.FIGHTING, -1, 1.4, 48, "Intimidate", "Technician", "Steadfast", 455, 50, 95, 95, 35, 110, 70, 45, 70, 159, GrowthRate.MEDIUM_FAST, "Human-Like", null, 100, 25, 0 ],
[ Species.SMOOCHUM, "Smoochum", 2, 0, 0, 0, "Kiss Pokémon", Type.ICE, Type.PSYCHIC, 0.4, 6, "Oblivious", "Forewarn", "Hydration", 305, 45, 30, 15, 85, 65, 65, 45, 70, 61, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 0, 25, 0 ],
[ Species.ELEKID, "Elekid", 2, 0, 0, 0, "Electric Pokémon", Type.ELECTRIC, -1, 0.6, 23.5, "Static", null, "Vital Spirit", 360, 45, 63, 37, 65, 55, 95, 45, 70, 72, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 75, 25, 0 ],
[ Species.MAGBY, "Magby", 2, 0, 0, 0, "Live Coal Pokémon", Type.FIRE, -1, 0.7, 21.4, "Flame Body", null, "Vital Spirit", 365, 45, 75, 37, 70, 55, 83, 45, 70, 73, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 75, 25, 0 ],
[ Species.MILTANK, "Miltank", 2, 0, 0, 0, "Milk Cow Pokémon", Type.NORMAL, -1, 1.2, 75.5, "Thick Fat", "Scrappy", "Sap Sipper", 490, 95, 80, 105, 40, 70, 100, 45, 70, 172, GrowthRate.SLOW, "Field", null, 0, 20, 0 ],
[ Species.BLISSEY, "Blissey", 2, 0, 0, 0, "Happiness Pokémon", Type.NORMAL, -1, 1.5, 46.8, "Natural Cure", "Serene Grace", "Healer", 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, "Fairy", null, 0, 40, 0 ],
[ Species.RAIKOU, "Raikou", 2, 1, 0, 0, "Thunder Pokémon", Type.ELECTRIC, -1, 1.9, 178, "Pressure", null, "Inner Focus", 580, 90, 85, 75, 115, 100, 115, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.ENTEI, "Entei", 2, 1, 0, 0, "Volcano Pokémon", Type.FIRE, -1, 2.1, 198, "Pressure", null, "Inner Focus", 580, 115, 115, 85, 90, 75, 100, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.SUICUNE, "Suicune", 2, 1, 0, 0, "Aurora Pokémon", Type.WATER, -1, 2, 187, "Pressure", null, "Inner Focus", 580, 100, 75, 115, 90, 115, 85, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.LARVITAR, "Larvitar", 2, 0, 0, 0, "Rock Skin Pokémon", Type.ROCK, Type.GROUND, 0.6, 72, "Guts", null, "Sand Veil", 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, "Monster", null, 50, 40, 0 ],
[ Species.PUPITAR, "Pupitar", 2, 0, 0, 0, "Hard Shell Pokémon", Type.ROCK, Type.GROUND, 1.2, 152, "Shed Skin", null, null, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, "Monster", null, 50, 40, 0 ],
[ Species.TYRANITAR, "Tyranitar", 2, 0, 0, 0, "Armor Pokémon", Type.ROCK, Type.DARK, 2, 202, "Sand Stream", null, "Unnerve", 600, 100, 134, 110, 95, 100, 61, 45, 35, 270, GrowthRate.SLOW, "Monster", null, 50, 40, 0 ],
[ Species.LUGIA, "Lugia", 2, 0, 1, 0, "Diving Pokémon", Type.PSYCHIC, Type.FLYING, 5.2, 216, "Pressure", null, "Multiscale", 680, 106, 90, 130, 90, 154, 110, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.HO_OH, "Ho-oh", 2, 0, 1, 0, "Rainbow Pokémon", Type.FIRE, Type.FLYING, 3.8, 199, "Pressure", null, "Regenerator", 680, 106, 130, 90, 110, 154, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.CELEBI, "Celebi", 2, 0, 0, 1, "Time Travel Pokémon", Type.PSYCHIC, Type.GRASS, 0.6, 5, "Natural Cure", null, null, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.TREECKO, "Treecko", 3, 0, 0, 0, "Wood Gecko Pokémon", Type.GRASS, -1, 0.5, 5, "Overgrow", null, "Unburden", 310, 40, 45, 35, 65, 55, 70, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Dragon", "Monster", 87.5, 20, 0 ],
[ Species.GROVYLE, "Grovyle", 3, 0, 0, 0, "Wood Gecko Pokémon", Type.GRASS, -1, 0.9, 21.6, "Overgrow", null, "Unburden", 405, 50, 65, 45, 85, 65, 95, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Dragon", "Monster", 87.5, 20, 0 ],
[ Species.SCEPTILE, "Sceptile", 3, 0, 0, 0, "Forest Pokémon", Type.GRASS, -1, 1.7, 52.2, "Overgrow", null, "Unburden", 530, 70, 85, 65, 105, 85, 120, 45, 70, 239, GrowthRate.MEDIUM_SLOW, "Dragon", "Monster", 87.5, 20, 0 ],
[ Species.TORCHIC, "Torchic", 3, 0, 0, 0, "Chick Pokémon", Type.FIRE, -1, 0.4, 2.5, "Blaze", null, "Speed Boost", 310, 45, 60, 40, 70, 50, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 1 ],
[ Species.COMBUSKEN, "Combusken", 3, 0, 0, 0, "Young Fowl Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 19.5, "Blaze", null, "Speed Boost", 405, 60, 85, 60, 85, 60, 55, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 1 ],
[ Species.BLAZIKEN, "Blaziken", 3, 0, 0, 0, "Blaze Pokémon", Type.FIRE, Type.FIGHTING, 1.9, 52, "Blaze", null, "Speed Boost", 530, 80, 120, 70, 110, 70, 80, 45, 70, 239, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 1 ],
[ Species.MUDKIP, "Mudkip", 3, 0, 0, 0, "Mud Fish Pokémon", Type.WATER, -1, 0.4, 7.6, "Torrent", null, "Damp", 310, 50, 70, 50, 50, 50, 40, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.MARSHTOMP, "Marshtomp", 3, 0, 0, 0, "Mud Fish Pokémon", Type.WATER, Type.GROUND, 0.7, 28, "Torrent", null, "Damp", 405, 70, 85, 70, 60, 70, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.SWAMPERT, "Swampert", 3, 0, 0, 0, "Mud Fish Pokémon", Type.WATER, Type.GROUND, 1.5, 81.9, "Torrent", null, "Damp", 535, 100, 110, 90, 85, 90, 60, 45, 70, 241, GrowthRate.MEDIUM_SLOW, "Monster", "Water 1", 87.5, 20, 0 ],
[ Species.POOCHYENA, "Poochyena", 3, 0, 0, 0, "Bite Pokémon", Type.DARK, -1, 0.5, 13.6, "Run Away", "Quick Feet", "Rattled", 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.MIGHTYENA, "Mightyena", 3, 0, 0, 0, "Bite Pokémon", Type.DARK, -1, 1, 37, "Intimidate", "Quick Feet", "Moxie", 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.ZIGZAGOON, "Zigzagoon", 3, 0, 0, 0, "TinyRaccoon Pokémon", Type.NORMAL, -1, 0.4, 17.5, "Pickup", "Gluttony", "Quick Feet", 240, 38, 30, 41, 30, 41, 60, 255, 70, 56, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.LINOONE, "Linoone", 3, 0, 0, 0, "Rushing Pokémon", Type.NORMAL, -1, 0.5, 32.5, "Pickup", "Gluttony", "Quick Feet", 420, 78, 70, 61, 50, 61, 100, 90, 70, 147, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.WURMPLE, "Wurmple", 3, 0, 0, 0, "Worm Pokémon", Type.BUG, -1, 0.3, 3.6, "Shield Dust", null, "Run Away", 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.SILCOON, "Silcoon", 3, 0, 0, 0, "Cocoon Pokémon", Type.BUG, -1, 0.6, 10, "Shed Skin", null, null, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.BEAUTIFLY, "Beautifly", 3, 0, 0, 0, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1, 28.4, "Swarm", null, "Rivalry", 395, 60, 70, 50, 100, 50, 65, 45, 70, 178, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 1 ],
[ Species.CASCOON, "Cascoon", 3, 0, 0, 0, "Cocoon Pokémon", Type.BUG, -1, 0.7, 11.5, "Shed Skin", null, null, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.DUSTOX, "Dustox", 3, 0, 0, 0, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.2, 31.6, "Shield Dust", null, "Compound Eyes", 385, 60, 50, 70, 50, 90, 65, 45, 70, 173, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 1 ],
[ Species.LOTAD, "Lotad", 3, 0, 0, 0, "Water Weed Pokémon", Type.WATER, Type.GRASS, 0.5, 2.6, "Swift Swim", "Rain Dish", "Own Tempo", 220, 40, 30, 30, 40, 50, 30, 255, 70, 44, GrowthRate.MEDIUM_SLOW, "Grass", "Water 1", 50, 15, 0 ],
[ Species.LOMBRE, "Lombre", 3, 0, 0, 0, "Jolly Pokémon", Type.WATER, Type.GRASS, 1.2, 32.5, "Swift Swim", "Rain Dish", "Own Tempo", 340, 60, 50, 50, 60, 70, 50, 120, 70, 119, GrowthRate.MEDIUM_SLOW, "Grass", "Water 1", 50, 15, 0 ],
[ Species.LUDICOLO, "Ludicolo", 3, 0, 0, 0, "Carefree Pokémon", Type.WATER, Type.GRASS, 1.5, 55, "Swift Swim", "Rain Dish", "Own Tempo", 480, 80, 70, 70, 90, 100, 70, 45, 70, 216, GrowthRate.MEDIUM_SLOW, "Grass", "Water 1", 50, 15, 1 ],
[ Species.SEEDOT, "Seedot", 3, 0, 0, 0, "Acorn Pokémon", Type.GRASS, -1, 0.5, 4, "Chlorophyll", "Early Bird", "Pickpocket", 220, 40, 40, 50, 30, 30, 30, 255, 70, 44, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 50, 15, 0 ],
[ Species.NUZLEAF, "Nuzleaf", 3, 0, 0, 0, "Wily Pokémon", Type.GRASS, Type.DARK, 1, 28, "Chlorophyll", "Early Bird", "Pickpocket", 340, 70, 70, 40, 60, 40, 60, 120, 70, 119, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 50, 15, 1 ],
[ Species.SHIFTRY, "Shiftry", 3, 0, 0, 0, "Wicked Pokémon", Type.GRASS, Type.DARK, 1.3, 59.6, "Chlorophyll", "Early Bird", "Pickpocket", 480, 90, 100, 60, 90, 60, 80, 45, 70, 216, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 50, 15, 1 ],
[ Species.TAILLOW, "Taillow", 3, 0, 0, 0, "TinySwallow Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2.3, "Guts", null, "Scrappy", 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.SWELLOW, "Swellow", 3, 0, 0, 0, "Swallow Pokémon", Type.NORMAL, Type.FLYING, 0.7, 19.8, "Guts", null, "Scrappy", 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.WINGULL, "Wingull", 3, 0, 0, 0, "Seagull Pokémon", Type.WATER, Type.FLYING, 0.6, 9.5, "Keen Eye", "Hydration", "Rain Dish", 270, 40, 30, 30, 55, 30, 85, 190, 70, 54, GrowthRate.MEDIUM_FAST, "Flying", "Water 1", 50, 20, 0 ],
[ Species.PELIPPER, "Pelipper", 3, 0, 0, 0, "Water Bird Pokémon", Type.WATER, Type.FLYING, 1.2, 28, "Keen Eye", "Drizzle", "Rain Dish", 440, 60, 50, 100, 95, 70, 65, 45, 70, 154, GrowthRate.MEDIUM_FAST, "Flying", "Water 1", 50, 20, 0 ],
[ Species.RALTS, "Ralts", 3, 0, 0, 0, "Feeling Pokémon", Type.PSYCHIC, Type.FAIRY, 0.4, 6.6, "Synchronize", "Trace", "Telepathy", 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, "Amorphous", "Human-Like", 50, 20, 0 ],
[ Species.KIRLIA, "Kirlia", 3, 0, 0, 0, "Emotion Pokémon", Type.PSYCHIC, Type.FAIRY, 0.8, 20.2, "Synchronize", "Trace", "Telepathy", 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, "Amorphous", "Human-Like", 50, 20, 0 ],
[ Species.GARDEVOIR, "Gardevoir", 3, 0, 0, 0, "Embrace Pokémon", Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, "Synchronize", "Trace", "Telepathy", 518, 68, 65, 65, 125, 115, 80, 45, 35, 233, GrowthRate.SLOW, "Amorphous", "Human-Like", 50, 20, 0 ],
[ Species.SURSKIT, "Surskit", 3, 0, 0, 0, "Pond Skater Pokémon", Type.BUG, Type.WATER, 0.5, 1.7, "Swift Swim", null, "Rain Dish", 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, "Bug", "Water 1", 50, 15, 0 ],
[ Species.MASQUERAIN, "Masquerain", 3, 0, 0, 0, "Eyeball Pokémon", Type.BUG, Type.FLYING, 0.8, 3.6, "Intimidate", null, "Unnerve", 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, "Bug", "Water 1", 50, 15, 0 ],
[ Species.SHROOMISH, "Shroomish", 3, 0, 0, 0, "Mushroom Pokémon", Type.GRASS, -1, 0.4, 4.5, "Effect Spore", "Poison Heal", "Quick Feet", 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 2, "Fairy", "Grass", 50, 15, 0 ],
[ Species.BRELOOM, "Breloom", 3, 0, 0, 0, "Mushroom Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 39.2, "Effect Spore", "Poison Heal", "Technician", 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 2, "Fairy", "Grass", 50, 15, 0 ],
[ Species.SLAKOTH, "Slakoth", 3, 0, 0, 0, "Slacker Pokémon", Type.NORMAL, -1, 0.8, 24, "Truant", null, null, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, "Field", null, 50, 15, 0 ],
[ Species.VIGOROTH, "Vigoroth", 3, 0, 0, 0, "Wild Monkey Pokémon", Type.NORMAL, -1, 1.4, 46.5, "Vital Spirit", null, null, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, "Field", null, 50, 15, 0 ],
[ Species.SLAKING, "Slaking", 3, 0, 0, 0, "Lazy Pokémon", Type.NORMAL, -1, 2, 130.5, "Truant", null, null, 670, 150, 160, 100, 95, 65, 100, 45, 70, 252, GrowthRate.SLOW, "Field", null, 50, 15, 0 ],
[ Species.NINCADA, "Nincada", 3, 0, 0, 0, "Trainee Pokémon", Type.BUG, Type.GROUND, 0.5, 5.5, "Compound Eyes", null, "Run Away", 266, 31, 45, 90, 30, 30, 40, 255, 70, 53, GrowthRate.ERRATIC, "Bug", null, 50, 15, 0 ],
[ Species.NINJASK, "Ninjask", 3, 0, 0, 0, "Ninja Pokémon", Type.BUG, Type.FLYING, 0.8, 12, "Speed Boost", null, "Infiltrator", 456, 61, 90, 45, 50, 50, 160, 120, 70, 160, GrowthRate.ERRATIC, "Bug", null, 50, 15, 0 ],
[ Species.SHEDINJA, "Shedinja", 3, 0, 0, 0, "Shed Pokémon", Type.BUG, Type.GHOST, 0.8, 1.2, "Wonder Guard", null, null, 236, 1, 90, 45, 30, 30, 40, 45, 70, 83, GrowthRate.ERRATIC, "Mineral", null, null, 15, 0 ],
[ Species.WHISMUR, "Whismur", 3, 0, 0, 0, "Whisper Pokémon", Type.NORMAL, -1, 0.6, 16.3, "Soundproof", null, "Rattled", 240, 64, 51, 23, 51, 23, 28, 190, 70, 48, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 50, 20, 0 ],
[ Species.LOUDRED, "Loudred", 3, 0, 0, 0, "Big Voice Pokémon", Type.NORMAL, -1, 1, 40.5, "Soundproof", null, "Scrappy", 360, 84, 71, 43, 71, 43, 48, 120, 70, 126, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 50, 20, 0 ],
[ Species.EXPLOUD, "Exploud", 3, 0, 0, 0, "Loud Noise Pokémon", Type.NORMAL, -1, 1.5, 84, "Soundproof", null, "Scrappy", 490, 104, 91, 63, 91, 73, 68, 45, 70, 221, GrowthRate.MEDIUM_SLOW, "Field", "Monster", 50, 20, 0 ],
[ Species.MAKUHITA, "Makuhita", 3, 0, 0, 0, "Guts Pokémon", Type.FIGHTING, -1, 1, 86.4, "Thick Fat", "Guts", "Sheer Force", 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, "Human-Like", null, 75, 20, 0 ],
[ Species.HARIYAMA, "Hariyama", 3, 0, 0, 0, "Arm Thrust Pokémon", Type.FIGHTING, -1, 2.3, 253.8, "Thick Fat", "Guts", "Sheer Force", 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, "Human-Like", null, 75, 20, 0 ],
[ Species.AZURILL, "Azurill", 3, 0, 0, 0, "Polka Dot Pokémon", Type.NORMAL, Type.FAIRY, 0.2, 2, "Thick Fat", "Huge Power", "Sap Sipper", 190, 50, 20, 40, 20, 40, 20, 150, 70, 38, GrowthRate.FAST, "Undiscovered", null, 25, 10, 0 ],
[ Species.NOSEPASS, "Nosepass", 3, 0, 0, 0, "Compass Pokémon", Type.ROCK, -1, 1, 97, "Sturdy", "Magnet Pull", "Sand Force", 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 20, 0 ],
[ Species.SKITTY, "Skitty", 3, 0, 0, 0, "Kitten Pokémon", Type.NORMAL, -1, 0.6, 11, "Cute Charm", "Normalize", "Wonder Skin", 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, "Fairy", "Field", 25, 15, 0 ],
[ Species.DELCATTY, "Delcatty", 3, 0, 0, 0, "Prim Pokémon", Type.NORMAL, -1, 1.1, 32.6, "Cute Charm", "Normalize", "Wonder Skin", 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, "Fairy", "Field", 25, 15, 0 ],
[ Species.SABLEYE, "Sableye", 3, 0, 0, 0, "Darkness Pokémon", Type.DARK, Type.GHOST, 0.5, 11, "Keen Eye", "Stall", "Prankster", 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 50, 25, 0 ],
[ Species.MAWILE, "Mawile", 3, 0, 0, 0, "Deceiver Pokémon", Type.STEEL, Type.FAIRY, 0.6, 11.5, "Hyper Cutter", "Intimidate", "Sheer Force", 380, 50, 85, 85, 55, 55, 50, 45, 70, 133, GrowthRate.FAST, "Fairy", "Field", 50, 20, 0 ],
[ Species.ARON, "Aron", 3, 0, 0, 0, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 0.4, 60, "Sturdy", "Rock Head", "Heavy Metal", 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, "Monster", null, 50, 35, 0 ],
[ Species.LAIRON, "Lairon", 3, 0, 0, 0, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 0.9, 120, "Sturdy", "Rock Head", "Heavy Metal", 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, "Monster", null, 50, 35, 0 ],
[ Species.AGGRON, "Aggron", 3, 0, 0, 0, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 2.1, 360, "Sturdy", "Rock Head", "Heavy Metal", 530, 70, 110, 180, 60, 60, 50, 45, 35, 239, GrowthRate.SLOW, "Monster", null, 50, 35, 0 ],
[ Species.MEDITITE, "Meditite", 3, 0, 0, 0, "Meditate Pokémon", Type.FIGHTING, Type.PSYCHIC, 0.6, 11.2, "Pure Power", null, "Telepathy", 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 1 ],
[ Species.MEDICHAM, "Medicham", 3, 0, 0, 0, "Meditate Pokémon", Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, "Pure Power", null, "Telepathy", 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 1 ],
[ Species.ELECTRIKE, "Electrike", 3, 0, 0, 0, "Lightning Pokémon", Type.ELECTRIC, -1, 0.6, 15.2, "Static", "Lightning Rod", "Minus", 295, 40, 45, 40, 65, 40, 65, 120, 70, 59, GrowthRate.SLOW, "Field", null, 50, 20, 0 ],
[ Species.MANECTRIC, "Manectric", 3, 0, 0, 0, "Discharge Pokémon", Type.ELECTRIC, -1, 1.5, 40.2, "Static", "Lightning Rod", "Minus", 475, 70, 75, 60, 105, 60, 105, 45, 70, 166, GrowthRate.SLOW, "Field", null, 50, 20, 0 ],
[ Species.PLUSLE, "Plusle", 3, 0, 0, 0, "Cheering Pokémon", Type.ELECTRIC, -1, 0.4, 4.2, "Plus", null, "Lightning Rod", 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, "Fairy", null, 50, 20, 0 ],
[ Species.MINUN, "Minun", 3, 0, 0, 0, "Cheering Pokémon", Type.ELECTRIC, -1, 0.4, 4.2, "Minus", null, "Volt Absorb", 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, "Fairy", null, 50, 20, 0 ],
[ Species.VOLBEAT, "Volbeat", 3, 0, 0, 0, "Firefly Pokémon", Type.BUG, -1, 0.7, 17.7, "Illuminate", "Swarm", "Prankster", 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, "Bug", "Human-Like", 100, 15, 0 ],
[ Species.ILLUMISE, "Illumise", 3, 0, 0, 0, "Firefly Pokémon", Type.BUG, -1, 0.6, 17.7, "Oblivious", "Tinted Lens", "Prankster", 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 2, "Bug", "Human-Like", 0, 15, 0 ],
[ Species.ROSELIA, "Roselia", 3, 0, 0, 0, "Thorn Pokémon", Type.GRASS, Type.POISON, 0.3, 2, "Natural Cure", "Poison Point", "Leaf Guard", 400, 50, 60, 45, 100, 80, 65, 150, 70, 140, GrowthRate.MEDIUM_SLOW, "Fairy", "Grass", 50, 20, 1 ],
[ Species.GULPIN, "Gulpin", 3, 0, 0, 0, "Stomach Pokémon", Type.POISON, -1, 0.4, 10.3, "Liquid Ooze", "Sticky Hold", "Gluttony", 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, "Amorphous", null, 50, 20, 1 ],
[ Species.SWALOT, "Swalot", 3, 0, 0, 0, "Poison Bag Pokémon", Type.POISON, -1, 1.7, 80, "Liquid Ooze", "Sticky Hold", "Gluttony", 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, "Amorphous", null, 50, 20, 1 ],
[ Species.CARVANHA, "Carvanha", 3, 0, 0, 0, "Savage Pokémon", Type.WATER, Type.DARK, 0.8, 20.8, "Rough Skin", null, "Speed Boost", 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, "Water 2", null, 50, 20, 0 ],
[ Species.SHARPEDO, "Sharpedo", 3, 0, 0, 0, "Brutal Pokémon", Type.WATER, Type.DARK, 1.8, 88.8, "Rough Skin", null, "Speed Boost", 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, GrowthRate.SLOW, "Water 2", null, 50, 20, 0 ],
[ Species.WAILMER, "Wailmer", 3, 0, 0, 0, "Ball Whale Pokémon", Type.WATER, -1, 2, 130, "Water Veil", "Oblivious", "Pressure", 400, 130, 70, 35, 70, 35, 60, 125, 70, 80, GrowthRate.FLUCTUATING, 2, "Field", "Water 2", 50, 40, 0 ],
[ Species.WAILORD, "Wailord", 3, 0, 0, 0, "Float Whale Pokémon", Type.WATER, -1, 14.5, 398, "Water Veil", "Oblivious", "Pressure", 500, 170, 90, 45, 90, 45, 60, 60, 70, 175, GrowthRate.FLUCTUATING, 2, "Field", "Water 2", 50, 40, 0 ],
[ Species.NUMEL, "Numel", 3, 0, 0, 0, "Numb Pokémon", Type.FIRE, Type.GROUND, 0.7, 24, "Oblivious", "Simple", "Own Tempo", 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 1 ],
[ Species.CAMERUPT, "Camerupt", 3, 0, 0, 0, "Eruption Pokémon", Type.FIRE, Type.GROUND, 1.9, 220, "Magma Armor", "Solid Rock", "Anger Point", 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 1 ],
[ Species.TORKOAL, "Torkoal", 3, 0, 0, 0, "Coal Pokémon", Type.FIRE, -1, 0.5, 80.4, "White Smoke", "Drought", "Shell Armor", 470, 70, 85, 140, 85, 70, 20, 90, 70, 165, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.SPOINK, "Spoink", 3, 0, 0, 0, "Bounce Pokémon", Type.PSYCHIC, -1, 0.7, 30.6, "Thick Fat", "Own Tempo", "Gluttony", 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, "Field", null, 50, 20, 0 ],
[ Species.GRUMPIG, "Grumpig", 3, 0, 0, 0, "Manipulate Pokémon", Type.PSYCHIC, -1, 0.9, 71.5, "Thick Fat", "Own Tempo", "Gluttony", 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, "Field", null, 50, 20, 0 ],
[ Species.SPINDA, "Spinda", 3, 0, 0, 0, "Spot Panda Pokémon", Type.NORMAL, -1, 1.1, 5, "Own Tempo", "Tangled Feet", "Contrary", 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, "Field", "Human-Like", 50, 15, 0 ],
[ Species.TRAPINCH, "Trapinch", 3, 0, 0, 0, "Ant Pit Pokémon", Type.GROUND, -1, 0.7, 15, "Hyper Cutter", "Arena Trap", "Sheer Force", 290, 45, 100, 45, 45, 45, 10, 255, 70, 58, GrowthRate.MEDIUM_SLOW, "Bug", "Dragon", 50, 20, 0 ],
[ Species.VIBRAVA, "Vibrava", 3, 0, 0, 0, "Vibration Pokémon", Type.GROUND, Type.DRAGON, 1.1, 15.3, "Levitate", null, null, 340, 50, 70, 50, 50, 50, 70, 120, 70, 119, GrowthRate.MEDIUM_SLOW, "Bug", "Dragon", 50, 20, 0 ],
[ Species.FLYGON, "Flygon", 3, 0, 0, 0, "Mystic Pokémon", Type.GROUND, Type.DRAGON, 2, 82, "Levitate", null, null, 520, 80, 100, 80, 80, 80, 100, 45, 70, 234, GrowthRate.MEDIUM_SLOW, "Bug", "Dragon", 50, 20, 0 ],
[ Species.CACNEA, "Cacnea", 3, 0, 0, 0, "Cactus Pokémon", Type.GRASS, -1, 0.4, 51.3, "Sand Veil", null, "Water Absorb", 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, "Grass", "Human-Like", 50, 20, 0 ],
[ Species.CACTURNE, "Cacturne", 3, 0, 0, 0, "Scarecrow Pokémon", Type.GRASS, Type.DARK, 1.3, 77.4, "Sand Veil", null, "Water Absorb", 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, "Grass", "Human-Like", 50, 20, 1 ],
[ Species.SWABLU, "Swablu", 3, 0, 0, 0, "Cotton Bird Pokémon", Type.NORMAL, Type.FLYING, 0.4, 1.2, "Natural Cure", null, "Cloud Nine", 310, 45, 40, 60, 40, 75, 50, 255, 70, 62, GrowthRate.ERRATIC, "Dragon", "Flying", 50, 20, 0 ],
[ Species.ALTARIA, "Altaria", 3, 0, 0, 0, "Humming Pokémon", Type.DRAGON, Type.FLYING, 1.1, 20.6, "Natural Cure", null, "Cloud Nine", 490, 75, 70, 90, 70, 105, 80, 45, 70, 172, GrowthRate.ERRATIC, "Dragon", "Flying", 50, 20, 0 ],
[ Species.ZANGOOSE, "Zangoose", 3, 0, 0, 0, "Cat Ferret Pokémon", Type.NORMAL, -1, 1.3, 40.3, "Immunity", null, "Toxic Boost", 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, "Field", null, 50, 20, 0 ],
[ Species.SEVIPER, "Seviper", 3, 0, 0, 0, "Fang Snake Pokémon", Type.POISON, -1, 2.7, 52.5, "Shed Skin", null, "Infiltrator", 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 2, "Dragon", "Field", 50, 20, 0 ],
[ Species.LUNATONE, "Lunatone", 3, 0, 0, 0, "Meteorite Pokémon", Type.ROCK, Type.PSYCHIC, 1, 168, "Levitate", null, null, 460, 90, 55, 65, 95, 85, 70, 45, 70, 161, GrowthRate.FAST, "Mineral", null, null, 25, 0 ],
[ Species.SOLROCK, "Solrock", 3, 0, 0, 0, "Meteorite Pokémon", Type.ROCK, Type.PSYCHIC, 1.2, 154, "Levitate", null, null, 460, 90, 95, 85, 55, 65, 70, 45, 70, 161, GrowthRate.FAST, "Mineral", null, null, 25, 0 ],
[ Species.BARBOACH, "Barboach", 3, 0, 0, 0, "Whiskers Pokémon", Type.WATER, Type.GROUND, 0.4, 1.9, "Oblivious", "Anticipation", "Hydration", 288, 50, 48, 43, 46, 41, 60, 190, 70, 58, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 20, 0 ],
[ Species.WHISCASH, "Whiscash", 3, 0, 0, 0, "Whiskers Pokémon", Type.WATER, Type.GROUND, 0.9, 23.6, "Oblivious", "Anticipation", "Hydration", 468, 110, 78, 73, 76, 71, 60, 75, 70, 164, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 20, 0 ],
[ Species.CORPHISH, "Corphish", 3, 0, 0, 0, "Ruffian Pokémon", Type.WATER, -1, 0.6, 11.5, "Hyper Cutter", "Shell Armor", "Adaptability", 308, 43, 80, 65, 50, 35, 35, 205, 70, 62, GrowthRate.FLUCTUATING, 2, "Water 1", "Water 3", 50, 15, 0 ],
[ Species.CRAWDAUNT, "Crawdaunt", 3, 0, 0, 0, "Rogue Pokémon", Type.WATER, Type.DARK, 1.1, 32.8, "Hyper Cutter", "Shell Armor", "Adaptability", 468, 63, 120, 85, 90, 55, 55, 155, 70, 164, GrowthRate.FLUCTUATING, 2, "Water 1", "Water 3", 50, 15, 0 ],
[ Species.BALTOY, "Baltoy", 3, 0, 0, 0, "Clay Doll Pokémon", Type.GROUND, Type.PSYCHIC, 0.5, 21.5, "Levitate", null, null, 300, 40, 40, 55, 40, 70, 55, 255, 70, 60, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.CLAYDOL, "Claydol", 3, 0, 0, 0, "Clay Doll Pokémon", Type.GROUND, Type.PSYCHIC, 1.5, 108, "Levitate", null, null, 500, 60, 70, 105, 70, 120, 75, 90, 70, 175, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.LILEEP, "Lileep", 3, 0, 0, 0, "Sea Lily Pokémon", Type.ROCK, Type.GRASS, 1, 23.8, "Suction Cups", null, "Storm Drain", 355, 66, 41, 77, 61, 87, 23, 45, 70, 71, GrowthRate.ERRATIC, "Water 3", null, 87.5, 30, 0 ],
[ Species.CRADILY, "Cradily", 3, 0, 0, 0, "Barnacle Pokémon", Type.ROCK, Type.GRASS, 1.5, 60.4, "Suction Cups", null, "Storm Drain", 495, 86, 81, 97, 81, 107, 43, 45, 70, 173, GrowthRate.ERRATIC, "Water 3", null, 87.5, 30, 0 ],
[ Species.ANORITH, "Anorith", 3, 0, 0, 0, "Old Shrimp Pokémon", Type.ROCK, Type.BUG, 0.7, 12.5, "Battle Armor", null, "Swift Swim", 355, 45, 95, 50, 40, 50, 75, 45, 70, 71, GrowthRate.ERRATIC, "Water 3", null, 87.5, 30, 0 ],
[ Species.ARMALDO, "Armaldo", 3, 0, 0, 0, "Plate Pokémon", Type.ROCK, Type.BUG, 1.5, 68.2, "Battle Armor", null, "Swift Swim", 495, 75, 125, 100, 70, 80, 45, 45, 70, 173, GrowthRate.ERRATIC, "Water 3", null, 87.5, 30, 0 ],
[ Species.FEEBAS, "Feebas", 3, 0, 0, 0, "Fish Pokémon", Type.WATER, -1, 0.6, 7.4, "Swift Swim", "Oblivious", "Adaptability", 200, 20, 15, 20, 10, 55, 80, 255, 70, 40, GrowthRate.ERRATIC, "Dragon", "Water 1", 50, 20, 0 ],
[ Species.MILOTIC, "Milotic", 3, 0, 0, 0, "Tender Pokémon", Type.WATER, -1, 6.2, 162, "Marvel Scale", "Competitive", "Cute Charm", 540, 95, 60, 79, 100, 125, 81, 60, 70, 189, GrowthRate.ERRATIC, "Dragon", "Water 1", 50, 20, 1 ],
[ Species.CASTFORM, "Castform", 3, 0, 0, 0, "Weather Pokémon", Type.NORMAL, -1, 0.3, 0.8, "Forecast", null, null, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, "Amorphous", "Fairy", 50, 25, 0,
[
[ "Sunny Form", 3, 0, 0, 0, "Weather Pokémon", Type.FIRE, -1, 0.3, 0.8, "Forecast", null, null, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, "Amorphous", "Fairy", 50, 25, 0 ],
[ "Rainy Form", 3, 0, 0, 0, "Weather Pokémon", Type.WATER, -1, 0.3, 0.8, "Forecast", null, null, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, "Amorphous", "Fairy", 50, 25, 0 ],
[ "Snowy Form", 3, 0, 0, 0, "Weather Pokémon", Type.ICE, -1, 0.3, 0.8, "Forecast", null, null, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, "Amorphous", "Fairy", 50, 25, 0 ]
]
],
[ Species.KECLEON, "Kecleon", 3, 0, 0, 0, "Color Swap Pokémon", Type.NORMAL, -1, 1, 22, "Color Change", null, "Protean", 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ],
[ Species.SHUPPET, "Shuppet", 3, 0, 0, 0, "Puppet Pokémon", Type.GHOST, -1, 0.6, 2.3, "Insomnia", "Frisk", "Cursed Body", 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.BANETTE, "Banette", 3, 0, 0, 0, "Marionette Pokémon", Type.GHOST, -1, 1.1, 12.5, "Insomnia", "Frisk", "Cursed Body", 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.DUSKULL, "Duskull", 3, 0, 0, 0, "Requiem Pokémon", Type.GHOST, -1, 0.8, 15, "Levitate", null, "Frisk", 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.DUSCLOPS, "Dusclops", 3, 0, 0, 0, "Beckon Pokémon", Type.GHOST, -1, 1.6, 30.6, "Pressure", null, "Frisk", 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.TROPIUS, "Tropius", 3, 0, 0, 0, "Fruit Pokémon", Type.GRASS, Type.FLYING, 2, 100, "Chlorophyll", "Solar Power", "Harvest", 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, "Grass", "Monster", 50, 25, 0 ],
[ Species.CHIMECHO, "Chimecho", 3, 0, 0, 0, "Wind Chime Pokémon", Type.PSYCHIC, -1, 0.6, 1, "Levitate", null, null, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.ABSOL, "Absol", 3, 0, 0, 0, "Disaster Pokémon", Type.DARK, -1, 1.2, 47, "Pressure", "Super Luck", "Justified", 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 25, 0 ],
[ Species.WYNAUT, "Wynaut", 3, 0, 0, 0, "Bright Pokémon", Type.PSYCHIC, -1, 0.6, 14, "Shadow Tag", null, "Telepathy", 260, 95, 23, 48, 23, 48, 23, 125, 70, 52, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 50, 20, 0 ],
[ Species.SNORUNT, "Snorunt", 3, 0, 0, 0, "Snow Hat Pokémon", Type.ICE, -1, 0.7, 16.8, "Inner Focus", "Ice Body", "Moody", 300, 50, 50, 50, 50, 50, 50, 190, 70, 60, GrowthRate.MEDIUM_FAST, "Fairy", "Mineral", 50, 20, 0 ],
[ Species.GLALIE, "Glalie", 3, 0, 0, 0, "Face Pokémon", Type.ICE, -1, 1.5, 256.5, "Inner Focus", "Ice Body", "Moody", 480, 80, 80, 80, 80, 80, 80, 75, 70, 168, GrowthRate.MEDIUM_FAST, "Fairy", "Mineral", 50, 20, 0 ],
[ Species.SPHEAL, "Spheal", 3, 0, 0, 0, "Clap Pokémon", Type.ICE, Type.WATER, 0.8, 39.5, "Thick Fat", "Ice Body", "Oblivious", 290, 70, 40, 50, 55, 50, 25, 255, 70, 58, GrowthRate.MEDIUM_SLOW, "Field", "Water 1", 50, 20, 0 ],
[ Species.SEALEO, "Sealeo", 3, 0, 0, 0, "Ball Roll Pokémon", Type.ICE, Type.WATER, 1.1, 87.6, "Thick Fat", "Ice Body", "Oblivious", 410, 90, 60, 70, 75, 70, 45, 120, 70, 144, GrowthRate.MEDIUM_SLOW, "Field", "Water 1", 50, 20, 0 ],
[ Species.WALREIN, "Walrein", 3, 0, 0, 0, "Ice Break Pokémon", Type.ICE, Type.WATER, 1.4, 150.6, "Thick Fat", "Ice Body", "Oblivious", 530, 110, 80, 90, 95, 90, 65, 45, 70, 239, GrowthRate.MEDIUM_SLOW, "Field", "Water 1", 50, 20, 0 ],
[ Species.CLAMPERL, "Clamperl", 3, 0, 0, 0, "Bivalve Pokémon", Type.WATER, -1, 0.4, 52.5, "Shell Armor", null, "Rattled", 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, "Water 1", null, 50, 20, 0 ],
[ Species.HUNTAIL, "Huntail", 3, 0, 0, 0, "Deep Sea Pokémon", Type.WATER, -1, 1.7, 27, "Swift Swim", null, "Water Veil", 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, "Water 1", null, 50, 20, 0 ],
[ Species.GOREBYSS, "Gorebyss", 3, 0, 0, 0, "South Sea Pokémon", Type.WATER, -1, 1.8, 22.6, "Swift Swim", null, "Hydration", 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, "Water 1", null, 50, 20, 0 ],
[ Species.RELICANTH, "Relicanth", 3, 0, 0, 0, "Longevity Pokémon", Type.WATER, Type.ROCK, 1, 23.4, "Swift Swim", "Rock Head", "Sturdy", 485, 100, 90, 130, 45, 65, 55, 25, 70, 170, GrowthRate.SLOW, "Water 1", "Water 2", 87.5, 40, 1 ],
[ Species.LUVDISC, "Luvdisc", 3, 0, 0, 0, "Rendezvous Pokémon", Type.WATER, -1, 0.6, 8.7, "Swift Swim", null, "Hydration", 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, "Water 2", null, 25, 20, 0 ],
[ Species.BAGON, "Bagon", 3, 0, 0, 0, "Rock Head Pokémon", Type.DRAGON, -1, 0.6, 42.1, "Rock Head", null, "Sheer Force", 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, "Dragon", null, 50, 40, 0 ],
[ Species.SHELGON, "Shelgon", 3, 0, 0, 0, "Endurance Pokémon", Type.DRAGON, -1, 1.1, 110.5, "Rock Head", null, "Overcoat", 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, "Dragon", null, 50, 40, 0 ],
[ Species.SALAMENCE, "Salamence", 3, 0, 0, 0, "Dragon Pokémon", Type.DRAGON, Type.FLYING, 1.5, 102.6, "Intimidate", null, "Moxie", 600, 95, 135, 80, 110, 80, 100, 45, 35, 270, GrowthRate.SLOW, "Dragon", null, 50, 40, 0 ],
[ Species.BELDUM, "Beldum", 3, 0, 0, 0, "Iron Ball Pokémon", Type.STEEL, Type.PSYCHIC, 0.6, 95.2, "Clear Body", null, "Light Metal", 300, 40, 55, 80, 35, 60, 30, 3, 35, 60, GrowthRate.SLOW, "Mineral", null, null, 40, 0 ],
[ Species.METANG, "Metang", 3, 0, 0, 0, "Iron Claw Pokémon", Type.STEEL, Type.PSYCHIC, 1.2, 202.5, "Clear Body", null, "Light Metal", 420, 60, 75, 100, 55, 80, 50, 3, 35, 147, GrowthRate.SLOW, "Mineral", null, null, 40, 0 ],
[ Species.METAGROSS, "Metagross", 3, 0, 0, 0, "Iron Leg Pokémon", Type.STEEL, Type.PSYCHIC, 1.6, 550, "Clear Body", null, "Light Metal", 600, 80, 135, 130, 95, 90, 70, 3, 35, 270, GrowthRate.SLOW, "Mineral", null, null, 40, 0 ],
[ Species.REGIROCK, "Regirock", 3, 1, 0, 0, "Rock Peak Pokémon", Type.ROCK, -1, 1.7, 230, "Clear Body", null, "Sturdy", 580, 80, 100, 200, 50, 100, 50, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.REGICE, "Regice", 3, 1, 0, 0, "Iceberg Pokémon", Type.ICE, -1, 1.8, 175, "Clear Body", null, "Ice Body", 580, 80, 50, 100, 100, 200, 50, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.REGISTEEL, "Registeel", 3, 1, 0, 0, "Iron Pokémon", Type.STEEL, -1, 1.9, 205, "Clear Body", null, "Light Metal", 580, 80, 75, 150, 75, 150, 50, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.LATIAS, "Latias", 3, 1, 0, 0, "Eon Pokémon", Type.DRAGON, Type.PSYCHIC, 1.4, 40, "Levitate", null, null, 600, 80, 80, 90, 110, 130, 110, 3, 90, 270, GrowthRate.SLOW, "Undiscovered", null, 0, 120, 0 ],
[ Species.LATIOS, "Latios", 3, 1, 0, 0, "Eon Pokémon", Type.DRAGON, Type.PSYCHIC, 2, 60, "Levitate", null, null, 600, 80, 90, 80, 130, 110, 110, 3, 90, 270, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ],
[ Species.KYOGRE, "Kyogre", 3, 0, 1, 0, "Sea Basin Pokémon", Type.WATER, -1, 4.5, 352, "Drizzle", null, null, 670, 100, 100, 90, 150, 140, 90, 3, 0, 302, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.GROUDON, "Groudon", 3, 0, 1, 0, "Continent Pokémon", Type.GROUND, -1, 3.5, 950, "Drought", null, null, 670, 100, 150, 140, 100, 90, 90, 3, 0, 302, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.RAYQUAZA, "Rayquaza", 3, 0, 1, 0, "Sky High Pokémon", Type.DRAGON, Type.FLYING, 7, 206.5, "Air Lock", null, null, 680, 105, 150, 90, 150, 90, 95, 45, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.JIRACHI, "Jirachi", 3, 0, 0, 1, "Wish Pokémon", Type.STEEL, Type.PSYCHIC, 0.3, 1.1, "Serene Grace", null, null, 600, 100, 100, 100, 100, 100, 100, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.DEOXYS, "Deoxys", 3, 0, 0, 1, "DNA Pokémon", Type.PSYCHIC, -1, 1.7, 60.8, "Pressure", null, null, 600, 50, 150, 50, 150, 50, 150, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0,
[
[ "Normal Forme", 3, 0, 0, 1, "DNA Pokémon", Type.PSYCHIC, -1, 1.7, 60.8, "Pressure", null, null, 600, 50, 150, 50, 150, 50, 150, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Attack Forme", 3, 0, 0, 1, "DNA Pokémon", Type.PSYCHIC, -1, 1.7, 60.8, "Pressure", null, null, 600, 50, 180, 20, 180, 20, 150, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Defense Forme", 3, 0, 0, 1, "DNA Pokémon", Type.PSYCHIC, -1, 1.7, 60.8, "Pressure", null, null, 600, 50, 70, 160, 70, 160, 90, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Speed Forme", 3, 0, 0, 1, "DNA Pokémon", Type.PSYCHIC, -1, 1.7, 60.8, "Pressure", null, null, 600, 50, 95, 90, 95, 90, 180, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ]
]
],
[ Species.TURTWIG, "Turtwig", 4, 0, 0, 0, "Tiny Leaf Pokémon", Type.GRASS, -1, 0.4, 10.2, "Overgrow", null, "Shell Armor", 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.GROTLE, "Grotle", 4, 0, 0, 0, "Grove Pokémon", Type.GRASS, -1, 1.1, 97, "Overgrow", null, "Shell Armor", 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.TORTERRA, "Torterra", 4, 0, 0, 0, "Continent Pokémon", Type.GRASS, Type.GROUND, 2.2, 310, "Overgrow", null, "Shell Armor", 525, 95, 109, 105, 75, 85, 56, 45, 70, 236, GrowthRate.MEDIUM_SLOW, "Grass", "Monster", 87.5, 20, 0 ],
[ Species.CHIMCHAR, "Chimchar", 4, 0, 0, 0, "Chimp Pokémon", Type.FIRE, -1, 0.5, 6.2, "Blaze", null, "Iron Fist", 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", "Human-Like", 87.5, 20, 0 ],
[ Species.MONFERNO, "Monferno", 4, 0, 0, 0, "Playful Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 22, "Blaze", null, "Iron Fist", 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Field", "Human-Like", 87.5, 20, 0 ],
[ Species.INFERNAPE, "Infernape", 4, 0, 0, 0, "Flame Pokémon", Type.FIRE, Type.FIGHTING, 1.2, 55, "Blaze", null, "Iron Fist", 534, 76, 104, 71, 104, 71, 108, 45, 70, 240, GrowthRate.MEDIUM_SLOW, "Field", "Human-Like", 87.5, 20, 0 ],
[ Species.PIPLUP, "Piplup", 4, 0, 0, 0, "Penguin Pokémon", Type.WATER, -1, 0.4, 5.2, "Torrent", null, "Defiant", 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, "Field", "Water 1", 87.5, 20, 0 ],
[ Species.PRINPLUP, "Prinplup", 4, 0, 0, 0, "Penguin Pokémon", Type.WATER, -1, 0.8, 23, "Torrent", null, "Defiant", 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, "Field", "Water 1", 87.5, 20, 0 ],
[ Species.EMPOLEON, "Empoleon", 4, 0, 0, 0, "Emperor Pokémon", Type.WATER, Type.STEEL, 1.7, 84.5, "Torrent", null, "Defiant", 530, 84, 86, 88, 111, 101, 60, 45, 70, 239, GrowthRate.MEDIUM_SLOW, "Field", "Water 1", 87.5, 20, 0 ],
[ Species.STARLY, "Starly", 4, 0, 0, 0, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, "Keen Eye", null, "Reckless", 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 1 ],
[ Species.STARAVIA, "Staravia", 4, 0, 0, 0, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15.5, "Intimidate", null, "Reckless", 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 1 ],
[ Species.STARAPTOR, "Staraptor", 4, 0, 0, 0, "Predator Pokémon", Type.NORMAL, Type.FLYING, 1.2, 24.9, "Intimidate", null, "Reckless", 485, 85, 120, 70, 50, 60, 100, 45, 70, 218, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 1 ],
[ Species.BIDOOF, "Bidoof", 4, 0, 0, 0, "Plump Mouse Pokémon", Type.NORMAL, -1, 0.5, 20, "Simple", "Unaware", "Moody", 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 15, 1 ],
[ Species.BIBAREL, "Bibarel", 4, 0, 0, 0, "Beaver Pokémon", Type.NORMAL, Type.WATER, 1, 31.5, "Simple", "Unaware", "Moody", 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 15, 1 ],
[ Species.KRICKETOT, "Kricketot", 4, 0, 0, 0, "Cricket Pokémon", Type.BUG, -1, 0.3, 2.2, "Shed Skin", null, "Run Away", 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 1 ],
[ Species.KRICKETUNE, "Kricketune", 4, 0, 0, 0, "Cricket Pokémon", Type.BUG, -1, 1, 25.5, "Swarm", null, "Technician", 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 1 ],
[ Species.SHINX, "Shinx", 4, 0, 0, 0, "Flash Pokémon", Type.ELECTRIC, -1, 0.5, 9.5, "Rivalry", "Intimidate", "Guts", 263, 45, 65, 34, 40, 34, 45, 235, 70, 53, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 1 ],
[ Species.LUXIO, "Luxio", 4, 0, 0, 0, "Spark Pokémon", Type.ELECTRIC, -1, 0.9, 30.5, "Rivalry", "Intimidate", "Guts", 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 1 ],
[ Species.LUXRAY, "Luxray", 4, 0, 0, 0, "Gleam Eyes Pokémon", Type.ELECTRIC, -1, 1.4, 42, "Rivalry", "Intimidate", "Guts", 523, 80, 120, 79, 95, 79, 70, 45, 70, 235, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 1 ],
[ Species.BUDEW, "Budew", 4, 0, 0, 0, "Bud Pokémon", Type.GRASS, Type.POISON, 0.2, 1.2, "Natural Cure", "Poison Point", "Leaf Guard", 280, 40, 30, 35, 50, 70, 55, 255, 70, 56, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, 50, 20, 0 ],
[ Species.ROSERADE, "Roserade", 4, 0, 0, 0, "Bouquet Pokémon", Type.GRASS, Type.POISON, 0.9, 14.5, "Natural Cure", "Poison Point", "Technician", 515, 60, 70, 65, 125, 105, 90, 75, 70, 232, GrowthRate.MEDIUM_SLOW, "Fairy", "Grass", 50, 20, 1 ],
[ Species.CRANIDOS, "Cranidos", 4, 0, 0, 0, "Head Butt Pokémon", Type.ROCK, -1, 0.9, 31.5, "Mold Breaker", null, "Sheer Force", 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, "Monster", null, 87.5, 30, 0 ],
[ Species.RAMPARDOS, "Rampardos", 4, 0, 0, 0, "Head Butt Pokémon", Type.ROCK, -1, 1.6, 102.5, "Mold Breaker", null, "Sheer Force", 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, "Monster", null, 87.5, 30, 0 ],
[ Species.SHIELDON, "Shieldon", 4, 0, 0, 0, "Shield Pokémon", Type.ROCK, Type.STEEL, 0.5, 57, "Sturdy", null, "Soundproof", 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, "Monster", null, 87.5, 30, 0 ],
[ Species.BASTIODON, "Bastiodon", 4, 0, 0, 0, "Shield Pokémon", Type.ROCK, Type.STEEL, 1.3, 149.5, "Sturdy", null, "Soundproof", 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, "Monster", null, 87.5, 30, 0 ],
[ Species.BURMY, "Burmy", 4, 0, 0, 0, "Bagworm Pokémon", Type.BUG, -1, 0.2, 3.4, "Shed Skin", null, "Overcoat", 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.WORMADAM, "Wormadam", 4, 0, 0, 0, "Bagworm Pokémon", Type.BUG, Type.GRASS, 0.5, 6.5, "Anticipation", null, "Overcoat", 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, "Bug", null, 0, 15, 0,
[
[ "Plant Cloak", 4, 0, 0, 0, "Bagworm Pokémon", Type.BUG, Type.GRASS, 0.5, 6.5, "Anticipation", null, "Overcoat", 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, "Bug", null, 0, 15, 0 ],
[ "Sandy Cloak", 4, 0, 0, 0, "Bagworm Pokémon", Type.BUG, Type.GROUND, 0.5, 6.5, "Anticipation", null, "Overcoat", 424, 60, 79, 105, 59, 85, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, "Bug", null, 0, 15, 0 ],
[ "Trash Cloak", 4, 0, 0, 0, "Bagworm Pokémon", Type.BUG, Type.STEEL, 0.5, 6.5, "Anticipation", null, "Overcoat", 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, "Bug", null, 0, 15, 0 ]
]
],
[ Species.MOTHIM, "Mothim", 4, 0, 0, 0, "Moth Pokémon", Type.BUG, Type.FLYING, 0.9, 23.3, "Swarm", null, "Tinted Lens", 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, "Bug", null, 100, 15, 0 ],
[ Species.COMBEE, "Combee", 4, 0, 0, 0, "Tiny Bee Pokémon", Type.BUG, Type.FLYING, 0.3, 5.5, "Honey Gather", null, "Hustle", 244, 30, 30, 42, 30, 42, 70, 120, 70, 49, GrowthRate.MEDIUM_SLOW, "Bug", null, 87.5, 15, 1 ],
[ Species.VESPIQUEN, "Vespiquen", 4, 0, 0, 0, "Beehive Pokémon", Type.BUG, Type.FLYING, 1.2, 38.5, "Pressure", null, "Unnerve", 474, 70, 80, 102, 80, 102, 40, 45, 70, 166, GrowthRate.MEDIUM_SLOW, "Bug", null, 0, 15, 0 ],
[ Species.PACHIRISU, "Pachirisu", 4, 0, 0, 0, "EleSquirrel Pokémon", Type.ELECTRIC, -1, 0.4, 3.9, "Run Away", "Pickup", "Volt Absorb", 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, "Fairy", "Field", 50, 10, 1 ],
[ Species.BUIZEL, "Buizel", 4, 0, 0, 0, "Sea Weasel Pokémon", Type.WATER, -1, 0.7, 29.5, "Swift Swim", null, "Water Veil", 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 1 ],
[ Species.FLOATZEL, "Floatzel", 4, 0, 0, 0, "Sea Weasel Pokémon", Type.WATER, -1, 1.1, 33.5, "Swift Swim", null, "Water Veil", 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, "Field", "Water 1", 50, 20, 1 ],
[ Species.CHERUBI, "Cherubi", 4, 0, 0, 0, "Cherry Pokémon", Type.GRASS, -1, 0.4, 3.3, "Chlorophyll", null, null, 275, 45, 35, 45, 62, 53, 35, 190, 70, 55, GrowthRate.MEDIUM_FAST, "Fairy", "Grass", 50, 20, 0 ],
[ Species.CHERRIM, "Cherrim", 4, 0, 0, 0, "Blossom Pokémon", Type.GRASS, -1, 0.5, 9.3, "Flower Gift", null, null, 450, 70, 60, 70, 87, 78, 85, 75, 70, 158, GrowthRate.MEDIUM_FAST, "Fairy", "Grass", 50, 20, 0 ],
[ Species.SHELLOS, "Shellos", 4, 0, 0, 0, "Sea Slug Pokémon", Type.WATER, -1, 0.3, 6.3, "Sticky Hold", "Storm Drain", "Sand Force", 325, 76, 48, 48, 57, 62, 34, 190, 70, 65, GrowthRate.MEDIUM_FAST, "Amorphous", "Water 1", 50, 20, 0 ],
[ Species.GASTRODON, "Gastrodon", 4, 0, 0, 0, "Sea Slug Pokémon", Type.WATER, Type.GROUND, 0.9, 29.9, "Sticky Hold", "Storm Drain", "Sand Force", 475, 111, 83, 68, 92, 82, 39, 75, 70, 166, GrowthRate.MEDIUM_FAST, "Amorphous", "Water 1", 50, 20, 0,
[
[ "East", 4, 0, 0, 0, "Sea Slug Pokémon", Type.WATER, Type.GROUND, 0.9, 29.9, "Sticky Hold", "Storm Drain", "Sand Force", 475, 111, 83, 68, 92, 82, 39, 75, 70, 166, GrowthRate.MEDIUM_FAST, "Amorphous", "Water 1", 50, 20, 0 ],
[ "West", 4, 0, 0, 0, "Sea Slug Pokémon", Type.WATER, Type.GROUND, 0.9, 29.9, "Sticky Hold", "Storm Drain", "Sand Force", 475, 111, 83, 68, 92, 82, 39, 75, 70, 166, GrowthRate.MEDIUM_FAST, "Amorphous", "Water 1", 50, 20, 0 ]
]
],
[ Species.AMBIPOM, "Ambipom", 4, 0, 0, 0, "Long Tail Pokémon", Type.NORMAL, -1, 1.2, 20.3, "Technician", "Pickup", "Skill Link", 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, "Field", null, 50, 20, 1 ],
[ Species.DRIFLOON, "Drifloon", 4, 0, 0, 0, "Balloon Pokémon", Type.GHOST, Type.FLYING, 0.4, 1.2, "Aftermath", "Unburden", "Flare Boost", 348, 90, 50, 34, 60, 44, 70, 125, 70, 70, GrowthRate.FLUCTUATING, "Amorphous", null, 50, 30, 0 ],
[ Species.DRIFBLIM, "Drifblim", 4, 0, 0, 0, "Blimp Pokémon", Type.GHOST, Type.FLYING, 1.2, 15, "Aftermath", "Unburden", "Flare Boost", 498, 150, 80, 44, 90, 54, 80, 60, 70, 174, GrowthRate.FLUCTUATING, "Amorphous", null, 50, 30, 0 ],
[ Species.BUNEARY, "Buneary", 4, 0, 0, 0, "Rabbit Pokémon", Type.NORMAL, -1, 0.4, 5.5, "Run Away", "Klutz", "Limber", 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, "Field", "Human-Like", 50, 20, 0 ],
[ Species.LOPUNNY, "Lopunny", 4, 0, 0, 0, "Rabbit Pokémon", Type.NORMAL, -1, 1.2, 33.3, "Cute Charm", "Klutz", "Limber", 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, GrowthRate.MEDIUM_FAST, "Field", "Human-Like", 50, 20, 0 ],
[ Species.MISMAGIUS, "Mismagius", 4, 0, 0, 0, "Magical Pokémon", Type.GHOST, -1, 0.9, 4.4, "Levitate", null, null, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.HONCHKROW, "Honchkrow", 4, 0, 0, 0, "Big Boss Pokémon", Type.DARK, Type.FLYING, 0.9, 27.3, "Insomnia", "Super Luck", "Moxie", 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 20, 0 ],
[ Species.GLAMEOW, "Glameow", 4, 0, 0, 0, "Catty Pokémon", Type.NORMAL, -1, 0.5, 3.9, "Limber", "Own Tempo", "Keen Eye", 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, "Field", null, 25, 20, 0 ],
[ Species.PURUGLY, "Purugly", 4, 0, 0, 0, "Tiger Cat Pokémon", Type.NORMAL, -1, 1, 43.8, "Thick Fat", "Own Tempo", "Defiant", 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, "Field", null, 25, 20, 0 ],
[ Species.CHINGLING, "Chingling", 4, 0, 0, 0, "Bell Pokémon", Type.PSYCHIC, -1, 0.2, 0.6, "Levitate", null, null, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, "Undiscovered", null, 50, 25, 0 ],
[ Species.STUNKY, "Stunky", 4, 0, 0, 0, "Skunk Pokémon", Type.POISON, Type.DARK, 0.4, 19.2, "Stench", "Aftermath", "Keen Eye", 329, 63, 63, 47, 41, 41, 74, 225, 70, 66, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.SKUNTANK, "Skuntank", 4, 0, 0, 0, "Skunk Pokémon", Type.POISON, Type.DARK, 1, 38, "Stench", "Aftermath", "Keen Eye", 479, 103, 93, 67, 71, 61, 84, 60, 70, 168, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.BRONZOR, "Bronzor", 4, 0, 0, 0, "Bronze Pokémon", Type.STEEL, Type.PSYCHIC, 0.5, 60.5, "Levitate", "Heatproof", "Heavy Metal", 300, 57, 24, 86, 24, 86, 23, 255, 70, 60, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.BRONZONG, "Bronzong", 4, 0, 0, 0, "Bronze Bell Pokémon", Type.STEEL, Type.PSYCHIC, 1.3, 187, "Levitate", "Heatproof", "Heavy Metal", 500, 67, 89, 116, 79, 116, 33, 90, 70, 175, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.BONSLY, "Bonsly", 4, 0, 0, 0, "Bonsai Pokémon", Type.ROCK, -1, 0.5, 15, "Sturdy", "Rock Head", "Rattled", 290, 50, 80, 95, 10, 45, 10, 255, 70, 58, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 50, 20, 0 ],
[ Species.MIME_JR, "Mime Jr.", 4, 0, 0, 0, "Mime Pokémon", Type.PSYCHIC, Type.FAIRY, 0.6, 13, "Soundproof", "Filter", "Technician", 310, 20, 25, 45, 70, 90, 60, 145, 70, 62, GrowthRate.MEDIUM_FAST, "Undiscovered", null, 50, 25, 0 ],
[ Species.HAPPINY, "Happiny", 4, 0, 0, 0, "Playhouse Pokémon", Type.NORMAL, -1, 0.6, 24.4, "Natural Cure", "Serene Grace", "Friend Guard", 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, "Undiscovered", null, 0, 40, 0 ],
[ Species.CHATOT, "Chatot", 4, 0, 0, 0, "Music Note Pokémon", Type.NORMAL, Type.FLYING, 0.5, 1.9, "Keen Eye", "Tangled Feet", "Big Pecks", 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 20, 0 ],
[ Species.SPIRITOMB, "Spiritomb", 4, 0, 0, 0, "Forbidden Pokémon", Type.GHOST, Type.DARK, 1, 108, "Pressure", null, "Infiltrator", 485, 50, 92, 108, 92, 108, 35, 100, 70, 170, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 30, 0 ],
[ Species.GIBLE, "Gible", 4, 0, 0, 0, "Land Shark Pokémon", Type.DRAGON, Type.GROUND, 0.7, 20.5, "Sand Veil", null, "Rough Skin", 300, 58, 70, 45, 40, 45, 42, 45, 70, 60, GrowthRate.SLOW, "Dragon", "Monster", 50, 40, 1 ],
[ Species.GABITE, "Gabite", 4, 0, 0, 0, "Cave Pokémon", Type.DRAGON, Type.GROUND, 1.4, 56, "Sand Veil", null, "Rough Skin", 410, 68, 90, 65, 50, 55, 82, 45, 70, 144, GrowthRate.SLOW, "Dragon", "Monster", 50, 40, 1 ],
[ Species.GARCHOMP, "Garchomp", 4, 0, 0, 0, "Mach Pokémon", Type.DRAGON, Type.GROUND, 1.9, 95, "Sand Veil", null, "Rough Skin", 600, 108, 130, 95, 80, 85, 102, 45, 70, 270, GrowthRate.SLOW, "Dragon", "Monster", 50, 40, 1 ],
[ Species.MUNCHLAX, "Munchlax", 4, 0, 0, 0, "Big Eater Pokémon", Type.NORMAL, -1, 0.6, 105, "Pickup", "Thick Fat", "Gluttony", 390, 135, 85, 40, 40, 85, 5, 50, 70, 78, GrowthRate.SLOW, "Undiscovered", null, 87.5, 40, 0 ],
[ Species.RIOLU, "Riolu", 4, 0, 0, 0, "Emanation Pokémon", Type.FIGHTING, -1, 0.7, 20.2, "Steadfast", "Inner Focus", "Prankster", 285, 40, 70, 40, 35, 40, 60, 75, 70, 57, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, 87.5, 25, 0 ],
[ Species.LUCARIO, "Lucario", 4, 0, 0, 0, "Aura Pokémon", Type.FIGHTING, Type.STEEL, 1.2, 54, "Steadfast", "Inner Focus", "Justified", 525, 70, 110, 70, 115, 70, 90, 45, 70, 184, GrowthRate.MEDIUM_SLOW, "Field", "Human-Like", 87.5, 25, 0 ],
[ Species.HIPPOPOTAS, "Hippopotas", 4, 0, 0, 0, "Hippo Pokémon", Type.GROUND, -1, 0.8, 49.5, "Sand Stream", null, "Sand Force", 330, 68, 72, 78, 38, 42, 32, 140, 70, 66, GrowthRate.SLOW, "Field", null, 50, 30, 1 ],
[ Species.HIPPOWDON, "Hippowdon", 4, 0, 0, 0, "Heavyweight Pokémon", Type.GROUND, -1, 2, 300, "Sand Stream", null, "Sand Force", 525, 108, 112, 118, 68, 72, 47, 60, 70, 184, GrowthRate.SLOW, "Field", null, 50, 30, 1 ],
[ Species.SKORUPI, "Skorupi", 4, 0, 0, 0, "Scorpion Pokémon", Type.POISON, Type.BUG, 0.8, 12, "Battle Armor", "Sniper", "Keen Eye", 330, 40, 50, 90, 30, 55, 65, 120, 70, 66, GrowthRate.SLOW, "Bug", "Water 3", 50, 20, 0 ],
[ Species.DRAPION, "Drapion", 4, 0, 0, 0, "Ogre Scorp Pokémon", Type.POISON, Type.DARK, 1.3, 61.5, "Battle Armor", "Sniper", "Keen Eye", 500, 70, 90, 110, 60, 75, 95, 45, 70, 175, GrowthRate.SLOW, "Bug", "Water 3", 50, 20, 0 ],
[ Species.CROAGUNK, "Croagunk", 4, 0, 0, 0, "Toxic Mouth Pokémon", Type.POISON, Type.FIGHTING, 0.7, 23, "Anticipation", "Dry Skin", "Poison Touch", 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 10, 1 ],
[ Species.TOXICROAK, "Toxicroak", 4, 0, 0, 0, "Toxic Mouth Pokémon", Type.POISON, Type.FIGHTING, 1.3, 44.4, "Anticipation", "Dry Skin", "Poison Touch", 490, 83, 106, 65, 86, 65, 85, 75, 70, 172, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 1 ],
[ Species.CARNIVINE, "Carnivine", 4, 0, 0, 0, "Bug Catcher Pokémon", Type.GRASS, -1, 1.4, 27, "Levitate", null, null, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, "Grass", null, 50, 25, 0 ],
[ Species.FINNEON, "Finneon", 4, 0, 0, 0, "Wing Fish Pokémon", Type.WATER, -1, 0.4, 7, "Swift Swim", "Storm Drain", "Water Veil", 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, "Water 2", null, 50, 20, 1 ],
[ Species.LUMINEON, "Lumineon", 4, 0, 0, 0, "Neon Pokémon", Type.WATER, -1, 1.2, 24, "Swift Swim", "Storm Drain", "Water Veil", 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, "Water 2", null, 50, 20, 1 ],
[ Species.MANTYKE, "Mantyke", 4, 0, 0, 0, "Kite Pokémon", Type.WATER, Type.FLYING, 1, 65, "Swift Swim", "Water Absorb", "Water Veil", 345, 45, 20, 50, 60, 120, 50, 25, 70, 69, GrowthRate.SLOW, "Undiscovered", null, 50, 25, 0 ],
[ Species.SNOVER, "Snover", 4, 0, 0, 0, "Frost Tree Pokémon", Type.GRASS, Type.ICE, 1, 50.5, "Snow Warning", null, "Soundproof", 334, 60, 62, 50, 62, 60, 40, 120, 70, 67, GrowthRate.SLOW, "Grass", "Monster", 50, 20, 1 ],
[ Species.ABOMASNOW, "Abomasnow", 4, 0, 0, 0, "Frost Tree Pokémon", Type.GRASS, Type.ICE, 2.2, 135.5, "Snow Warning", null, "Soundproof", 494, 90, 92, 75, 92, 85, 60, 60, 70, 173, GrowthRate.SLOW, "Grass", "Monster", 50, 20, 1 ],
[ Species.WEAVILE, "Weavile", 4, 0, 0, 0, "Sharp Claw Pokémon", Type.DARK, Type.ICE, 1.1, 34, "Pressure", null, "Pickpocket", 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 1 ],
[ Species.MAGNEZONE, "Magnezone", 4, 0, 0, 0, "Magnet Area Pokémon", Type.ELECTRIC, Type.STEEL, 1.2, 180, "Magnet Pull", "Sturdy", "Analytic", 535, 70, 70, 115, 130, 90, 60, 30, 70, 241, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.LICKILICKY, "Lickilicky", 4, 0, 0, 0, "Licking Pokémon", Type.NORMAL, -1, 1.7, 140, "Own Tempo", "Oblivious", "Cloud Nine", 515, 110, 85, 95, 80, 95, 50, 30, 70, 180, GrowthRate.MEDIUM_FAST, "Monster", null, 50, 20, 0 ],
[ Species.RHYPERIOR, "Rhyperior", 4, 0, 0, 0, "Drill Pokémon", Type.GROUND, Type.ROCK, 2.4, 282.8, "Lightning Rod", "Solid Rock", "Reckless", 535, 115, 140, 130, 55, 55, 40, 30, 70, 241, GrowthRate.SLOW, "Field", "Monster", 50, 20, 1 ],
[ Species.TANGROWTH, "Tangrowth", 4, 0, 0, 0, "Vine Pokémon", Type.GRASS, -1, 2, 128.6, "Chlorophyll", "Leaf Guard", "Regenerator", 535, 100, 100, 125, 110, 50, 50, 30, 70, 187, GrowthRate.MEDIUM_FAST, "Grass", null, 50, 20, 1 ],
[ Species.ELECTIVIRE, "Electivire", 4, 0, 0, 0, "Thunderbolt Pokémon", Type.ELECTRIC, -1, 1.8, 138.6, "Motor Drive", null, "Vital Spirit", 540, 75, 123, 67, 95, 85, 95, 30, 70, 243, GrowthRate.MEDIUM_FAST, "Human-Like", null, 75, 25, 0 ],
[ Species.MAGMORTAR, "Magmortar", 4, 0, 0, 0, "Blast Pokémon", Type.FIRE, -1, 1.6, 68, "Flame Body", null, "Vital Spirit", 540, 75, 95, 67, 125, 95, 83, 30, 70, 243, GrowthRate.MEDIUM_FAST, "Human-Like", null, 75, 25, 0 ],
[ Species.TOGEKISS, "Togekiss", 4, 0, 0, 0, "Jubilee Pokémon", Type.FAIRY, Type.FLYING, 1.5, 38, "Hustle", "Serene Grace", "Super Luck", 545, 85, 50, 95, 120, 115, 80, 30, 70, 245, GrowthRate.FAST, "Fairy", "Flying", 87.5, 10, 0 ],
[ Species.YANMEGA, "Yanmega", 4, 0, 0, 0, "Ogre Darner Pokémon", Type.BUG, Type.FLYING, 1.9, 51.5, "Speed Boost", "Tinted Lens", "Frisk", 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.LEAFEON, "Leafeon", 4, 0, 0, 0, "Verdant Pokémon", Type.GRASS, -1, 1, 25.5, "Leaf Guard", null, "Chlorophyll", 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.GLACEON, "Glaceon", 4, 0, 0, 0, "Fresh Snow Pokémon", Type.ICE, -1, 0.8, 25.9, "Snow Cloak", null, "Ice Body", 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 35, 0 ],
[ Species.GLISCOR, "Gliscor", 4, 0, 0, 0, "Fang Scorp Pokémon", Type.GROUND, Type.FLYING, 2, 42.5, "Hyper Cutter", "Sand Veil", "Poison Heal", 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 20, 0 ],
[ Species.MAMOSWINE, "Mamoswine", 4, 0, 0, 0, "Twin Tusk Pokémon", Type.ICE, Type.GROUND, 2.5, 291, "Oblivious", "Snow Cloak", "Thick Fat", 530, 110, 130, 80, 70, 60, 80, 50, 70, 239, GrowthRate.SLOW, "Field", null, 50, 20, 1 ],
[ Species.PORYGON_Z, "Porygon-Z", 4, 0, 0, 0, "Virtual Pokémon", Type.NORMAL, -1, 0.9, 34, "Adaptability", "Download", "Analytic", 535, 85, 80, 70, 135, 75, 90, 30, 70, 241, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 20, 0 ],
[ Species.GALLADE, "Gallade", 4, 0, 0, 0, "Blade Pokémon", Type.PSYCHIC, Type.FIGHTING, 1.6, 52, "Steadfast", null, "Justified", 518, 68, 125, 65, 65, 115, 80, 45, 35, 233, GrowthRate.SLOW, "Amorphous", "Human-Like", 100, 20, 0 ],
[ Species.PROBOPASS, "Probopass", 4, 0, 0, 0, "Compass Pokémon", Type.ROCK, Type.STEEL, 1.4, 340, "Sturdy", "Magnet Pull", "Sand Force", 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 20, 0 ],
[ Species.DUSKNOIR, "Dusknoir", 4, 0, 0, 0, "Gripper Pokémon", Type.GHOST, -1, 2.2, 106.6, "Pressure", null, "Frisk", 525, 45, 100, 135, 65, 135, 45, 45, 35, 236, GrowthRate.FAST, "Amorphous", null, 50, 25, 0 ],
[ Species.FROSLASS, "Froslass", 4, 0, 0, 0, "Snow Land Pokémon", Type.ICE, Type.GHOST, 1.3, 26.6, "Snow Cloak", null, "Cursed Body", 480, 70, 80, 70, 80, 70, 110, 75, 70, 168, GrowthRate.MEDIUM_FAST, "Fairy", "Mineral", 0, 20, 0 ],
[ Species.ROTOM, "Rotom", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, "Levitate", null, null, 440, 50, 50, 77, 95, 77, 91, 45, 70, 154, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1,
[
[ "Normal", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, "Levitate", null, null, 440, 50, 50, 77, 95, 77, 91, 45, 70, 154, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1 ],
[ "Heat", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.FIRE, 0.3, 0.3, "Levitate", null, null, 520, 50, 65, 107, 105, 107, 86, 45, 70, 182, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1 ],
[ "Wash", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.WATER, 0.3, 0.3, "Levitate", null, null, 520, 50, 65, 107, 105, 107, 86, 45, 70, 182, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1 ],
[ "Frost", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.ICE, 0.3, 0.3, "Levitate", null, null, 520, 50, 65, 107, 105, 107, 86, 45, 70, 182, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1 ],
[ "Fan", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.FLYING, 0.3, 0.3, "Levitate", null, null, 520, 50, 65, 107, 105, 107, 86, 45, 70, 182, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1 ],
[ "Mow", 4, 0, 0, 0, "Plasma Pokémon", Type.ELECTRIC, Type.GRASS, 0.3, 0.3, "Levitate", null, null, 520, 50, 65, 107, 105, 107, 86, 45, 70, 182, GrowthRate.MEDIUM_FAST, "Amorphous", null, null, 20, 1 ]
]
],
[ Species.UXIE, "Uxie", 4, 1, 0, 0, "Knowledge Pokémon", Type.PSYCHIC, -1, 0.3, 0.3, "Levitate", null, null, 580, 75, 75, 130, 75, 130, 95, 3, 140, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.MESPRIT, "Mesprit", 4, 1, 0, 0, "Emotion Pokémon", Type.PSYCHIC, -1, 0.3, 0.3, "Levitate", null, null, 580, 80, 105, 105, 105, 105, 80, 3, 140, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.AZELF, "Azelf", 4, 1, 0, 0, "Willpower Pokémon", Type.PSYCHIC, -1, 0.3, 0.3, "Levitate", null, null, 580, 75, 125, 70, 125, 70, 115, 3, 140, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.DIALGA, "Dialga", 4, 0, 1, 0, "Temporal Pokémon", Type.STEEL, Type.DRAGON, 5.4, 683, "Pressure", null, "Telepathy", 680, 100, 120, 120, 150, 100, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.PALKIA, "Palkia", 4, 0, 1, 0, "Spatial Pokémon", Type.WATER, Type.DRAGON, 4.2, 336, "Pressure", null, "Telepathy", 680, 90, 120, 100, 150, 120, 100, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.HEATRAN, "Heatran", 4, 1, 0, 0, "Lava Dome Pokémon", Type.FIRE, Type.STEEL, 1.7, 430, "Flash Fire", null, "Flame Body", 600, 91, 90, 106, 130, 106, 77, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, 50, 10, 0 ],
[ Species.REGIGIGAS, "Regigigas", 4, 1, 0, 0, "Colossal Pokémon", Type.NORMAL, -1, 3.7, 420, "Slow Start", null, null, 670, 110, 160, 110, 80, 110, 100, 3, 0, 302, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.GIRATINA, "Giratina", 4, 0, 1, 0, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, "Pressure", null, "Telepathy", 680, 150, 100, 120, 100, 120, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0,
[
[ "Altered Forme", 4, 0, 1, 0, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, "Pressure", null, "Telepathy", 680, 150, 100, 120, 100, 120, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Origin Forme", 4, 0, 1, 0, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 6.9, 650, "Levitate", null, null, 680, 150, 120, 100, 120, 100, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ]
]
],
[ Species.CRESSELIA, "Cresselia", 4, 1, 0, 0, "Lunar Pokémon", Type.PSYCHIC, -1, 1.5, 85.6, "Levitate", null, null, 600, 120, 70, 120, 75, 130, 85, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, 0, 120, 0 ],
[ Species.PHIONE, "Phione", 4, 0, 0, 1, "Sea Drifter Pokémon", Type.WATER, -1, 0.4, 3.1, "Hydration", null, null, 480, 80, 80, 80, 80, 80, 80, 30, 70, 216, GrowthRate.SLOW, "Fairy", "Water 1", null, 40, 0 ],
[ Species.MANAPHY, "Manaphy", 4, 0, 0, 1, "Seafaring Pokémon", Type.WATER, -1, 0.3, 1.4, "Hydration", null, null, 600, 100, 100, 100, 100, 100, 100, 3, 70, 270, GrowthRate.SLOW, "Fairy", "Water 1", null, 10, 0 ],
[ Species.DARKRAI, "Darkrai", 4, 0, 0, 1, "Pitch-Black Pokémon", Type.DARK, -1, 1.5, 50.5, "Bad Dreams", null, null, 600, 70, 90, 90, 135, 90, 125, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.SHAYMIN, "Shaymin", 4, 0, 0, 1, "Gratitude Pokémon", Type.GRASS, -1, 0.2, 2.1, "Natural Cure", null, null, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, null, 120, 0,
[
[ "Land Forme", 4, 0, 0, 1, "Gratitude Pokémon", Type.GRASS, -1, 0.2, 2.1, "Natural Cure", null, null, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Sky Forme", 4, 0, 0, 1, "Gratitude Pokémon", Type.GRASS, Type.FLYING, 0.4, 5.2, "Serene Grace", null, null, 600, 100, 103, 75, 120, 75, 127, 45, 100, 270, GrowthRate.MEDIUM_SLOW, "Undiscovered", null, null, 120, 0 ]
]
],
[ Species.ARCEUS, "Arceus", 4, 0, 0, 1, "Alpha Pokémon", Type.NORMAL, -1, 3.2, 320, "Multitype", null, null, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.VICTINI, "Victini", 5, 0, 0, 1, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, "Victory Star", null, null, 600, 100, 100, 100, 100, 100, 100, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.SNIVY, "Snivy", 5, 0, 0, 0, "Grass Snake Pokémon", Type.GRASS, -1, 0.6, 8.1, "Overgrow", null, "Contrary", 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 87.5, 20, 0 ],
[ Species.SERVINE, "Servine", 5, 0, 0, 0, "Grass Snake Pokémon", Type.GRASS, -1, 0.8, 16, "Overgrow", null, "Contrary", 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 87.5, 20, 0 ],
[ Species.SERPERIOR, "Serperior", 5, 0, 0, 0, "Regal Pokémon", Type.GRASS, -1, 3.3, 63, "Overgrow", null, "Contrary", 528, 75, 75, 95, 75, 95, 113, 45, 70, 238, GrowthRate.MEDIUM_SLOW, "Field", "Grass", 87.5, 20, 0 ],
[ Species.TEPIG, "Tepig", 5, 0, 0, 0, "Fire Pig Pokémon", Type.FIRE, -1, 0.5, 9.9, "Blaze", null, "Thick Fat", 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.PIGNITE, "Pignite", 5, 0, 0, 0, "Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1, 55.5, "Blaze", null, "Thick Fat", 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.EMBOAR, "Emboar", 5, 0, 0, 0, "Mega Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1.6, 150, "Blaze", null, "Reckless", 528, 110, 123, 65, 100, 65, 65, 45, 70, 238, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.OSHAWOTT, "Oshawott", 5, 0, 0, 0, "Sea Otter Pokémon", Type.WATER, -1, 0.5, 5.9, "Torrent", null, "Shell Armor", 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.DEWOTT, "Dewott", 5, 0, 0, 0, "Discipline Pokémon", Type.WATER, -1, 0.8, 24.5, "Torrent", null, "Shell Armor", 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.SAMUROTT, "Samurott", 5, 0, 0, 0, "Formidable Pokémon", Type.WATER, -1, 1.5, 94.6, "Torrent", null, "Shell Armor", 528, 95, 100, 85, 108, 70, 70, 45, 70, 238, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.PATRAT, "Patrat", 5, 0, 0, 0, "Scout Pokémon", Type.NORMAL, -1, 0.5, 11.6, "Run Away", "Keen Eye", "Analytic", 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, "Field", null, 50, 15, 0 ],
[ Species.WATCHOG, "Watchog", 5, 0, 0, 0, "Lookout Pokémon", Type.NORMAL, -1, 1.1, 27, "Illuminate", "Keen Eye", "Analytic", 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.LILLIPUP, "Lillipup", 5, 0, 0, 0, "Puppy Pokémon", Type.NORMAL, -1, 0.4, 4.1, "Vital Spirit", "Pickup", "Run Away", 275, 45, 60, 45, 25, 45, 55, 255, 70, 55, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 15, 0 ],
[ Species.HERDIER, "Herdier", 5, 0, 0, 0, "Loyal Dog Pokémon", Type.NORMAL, -1, 0.9, 14.7, "Intimidate", "Sand Rush", "Scrappy", 370, 65, 80, 65, 35, 65, 60, 120, 70, 130, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 15, 0 ],
[ Species.STOUTLAND, "Stoutland", 5, 0, 0, 0, "Big-Hearted Pokémon", Type.NORMAL, -1, 1.2, 61, "Intimidate", "Sand Rush", "Scrappy", 500, 85, 110, 90, 45, 90, 80, 45, 70, 225, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 15, 0 ],
[ Species.PURRLOIN, "Purrloin", 5, 0, 0, 0, "Devious Pokémon", Type.DARK, -1, 0.4, 10.1, "Limber", "Unburden", "Prankster", 281, 41, 50, 37, 50, 37, 66, 255, 70, 56, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.LIEPARD, "Liepard", 5, 0, 0, 0, "Cruel Pokémon", Type.DARK, -1, 1.1, 37.5, "Limber", "Unburden", "Prankster", 446, 64, 88, 50, 88, 50, 106, 90, 70, 156, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.PANSAGE, "Pansage", 5, 0, 0, 0, "Grass Monkey Pokémon", Type.GRASS, -1, 0.6, 10.5, "Gluttony", null, "Overgrow", 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 20, 0 ],
[ Species.SIMISAGE, "Simisage", 5, 0, 0, 0, "Thorn Monkey Pokémon", Type.GRASS, -1, 1.1, 30.5, "Gluttony", null, "Overgrow", 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 20, 0 ],
[ Species.PANSEAR, "Pansear", 5, 0, 0, 0, "High Temp Pokémon", Type.FIRE, -1, 0.6, 11, "Gluttony", null, "Blaze", 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 20, 0 ],
[ Species.SIMISEAR, "Simisear", 5, 0, 0, 0, "Ember Pokémon", Type.FIRE, -1, 1, 28, "Gluttony", null, "Blaze", 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 20, 0 ],
[ Species.PANPOUR, "Panpour", 5, 0, 0, 0, "Spray Pokémon", Type.WATER, -1, 0.6, 13.5, "Gluttony", null, "Torrent", 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 20, 0 ],
[ Species.SIMIPOUR, "Simipour", 5, 0, 0, 0, "Geyser Pokémon", Type.WATER, -1, 1, 29, "Gluttony", null, "Torrent", 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, "Field", null, 87.5, 20, 0 ],
[ Species.MUNNA, "Munna", 5, 0, 0, 0, "Dream Eater Pokémon", Type.PSYCHIC, -1, 0.6, 23.3, "Forewarn", "Synchronize", "Telepathy", 292, 76, 25, 45, 67, 55, 24, 190, 70, 58, GrowthRate.FAST, "Field", null, 50, 10, 0 ],
[ Species.MUSHARNA, "Musharna", 5, 0, 0, 0, "Drowsing Pokémon", Type.PSYCHIC, -1, 1.1, 60.5, "Forewarn", "Synchronize", "Telepathy", 487, 116, 55, 85, 107, 95, 29, 75, 70, 170, GrowthRate.FAST, "Field", null, 50, 10, 0 ],
[ Species.PIDOVE, "Pidove", 5, 0, 0, 0, "Tiny Pigeon Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2.1, "Big Pecks", "Super Luck", "Rivalry", 264, 50, 55, 50, 36, 30, 43, 255, 70, 53, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.TRANQUILL, "Tranquill", 5, 0, 0, 0, "Wild Pigeon Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15, "Big Pecks", "Super Luck", "Rivalry", 358, 62, 77, 62, 50, 42, 65, 120, 70, 125, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 0 ],
[ Species.UNFEZANT, "Unfezant", 5, 0, 0, 0, "Proud Pokémon", Type.NORMAL, Type.FLYING, 1.2, 29, "Big Pecks", "Super Luck", "Rivalry", 488, 80, 115, 80, 65, 55, 93, 45, 70, 220, GrowthRate.MEDIUM_SLOW, "Flying", null, 50, 15, 1 ],
[ Species.BLITZLE, "Blitzle", 5, 0, 0, 0, "Electrified Pokémon", Type.ELECTRIC, -1, 0.8, 29.8, "Lightning Rod", "Motor Drive", "Sap Sipper", 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.ZEBSTRIKA, "Zebstrika", 5, 0, 0, 0, "Thunderbolt Pokémon", Type.ELECTRIC, -1, 1.6, 79.5, "Lightning Rod", "Motor Drive", "Sap Sipper", 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.ROGGENROLA, "Roggenrola", 5, 0, 0, 0, "Mantle Pokémon", Type.ROCK, -1, 0.4, 18, "Sturdy", "Weak Armor", "Sand Force", 280, 55, 75, 85, 25, 25, 15, 255, 70, 56, GrowthRate.MEDIUM_SLOW, "Mineral", null, 50, 15, 0 ],
[ Species.BOLDORE, "Boldore", 5, 0, 0, 0, "Ore Pokémon", Type.ROCK, -1, 0.9, 102, "Sturdy", "Weak Armor", "Sand Force", 390, 70, 105, 105, 50, 40, 20, 120, 70, 137, GrowthRate.MEDIUM_SLOW, "Mineral", null, 50, 15, 0 ],
[ Species.GIGALITH, "Gigalith", 5, 0, 0, 0, "Compressed Pokémon", Type.ROCK, -1, 1.7, 260, "Sturdy", "Sand Stream", "Sand Force", 515, 85, 135, 130, 60, 80, 25, 45, 70, 232, GrowthRate.MEDIUM_SLOW, "Mineral", null, 50, 15, 0 ],
[ Species.WOOBAT, "Woobat", 5, 0, 0, 0, "Bat Pokémon", Type.PSYCHIC, Type.FLYING, 0.4, 2.1, "Unaware", "Klutz", "Simple", 323, 65, 45, 43, 55, 43, 72, 190, 70, 65, GrowthRate.MEDIUM_FAST, "Field", "Flying", 50, 15, 0 ],
[ Species.SWOOBAT, "Swoobat", 5, 0, 0, 0, "Courting Pokémon", Type.PSYCHIC, Type.FLYING, 0.9, 10.5, "Unaware", "Klutz", "Simple", 425, 67, 57, 55, 77, 55, 114, 45, 70, 149, GrowthRate.MEDIUM_FAST, "Field", "Flying", 50, 15, 0 ],
[ Species.DRILBUR, "Drilbur", 5, 0, 0, 0, "Mole Pokémon", Type.GROUND, -1, 0.3, 8.5, "Sand Rush", "Sand Force", "Mold Breaker", 328, 60, 85, 40, 30, 45, 68, 120, 70, 66, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.EXCADRILL, "Excadrill", 5, 0, 0, 0, "Subterrene Pokémon", Type.GROUND, Type.STEEL, 0.7, 40.4, "Sand Rush", "Sand Force", "Mold Breaker", 508, 110, 135, 60, 50, 65, 88, 60, 70, 178, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.AUDINO, "Audino", 5, 0, 0, 0, "Hearing Pokémon", Type.NORMAL, -1, 1.1, 31, "Healer", "Regenerator", "Klutz", 445, 103, 60, 86, 60, 86, 50, 255, 70, 390, GrowthRate.FAST, "Fairy", null, 50, 20, 0 ],
[ Species.TIMBURR, "Timburr", 5, 0, 0, 0, "Muscular Pokémon", Type.FIGHTING, -1, 0.6, 12.5, "Guts", "Sheer Force", "Iron Fist", 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.GURDURR, "Gurdurr", 5, 0, 0, 0, "Muscular Pokémon", Type.FIGHTING, -1, 1.2, 40, "Guts", "Sheer Force", "Iron Fist", 405, 85, 105, 85, 40, 50, 40, 90, 70, 142, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.CONKELDURR, "Conkeldurr", 5, 0, 0, 0, "Muscular Pokémon", Type.FIGHTING, -1, 1.4, 87, "Guts", "Sheer Force", "Iron Fist", 505, 105, 140, 95, 55, 65, 45, 45, 70, 227, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 75, 20, 0 ],
[ Species.TYMPOLE, "Tympole", 5, 0, 0, 0, "Tadpole Pokémon", Type.WATER, -1, 0.5, 4.5, "Swift Swim", "Hydration", "Water Absorb", 294, 50, 50, 40, 50, 40, 64, 255, 70, 59, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 0 ],
[ Species.PALPITOAD, "Palpitoad", 5, 0, 0, 0, "Vibration Pokémon", Type.WATER, Type.GROUND, 0.8, 17, "Swift Swim", "Hydration", "Water Absorb", 384, 75, 65, 55, 65, 55, 69, 120, 70, 134, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 0 ],
[ Species.SEISMITOAD, "Seismitoad", 5, 0, 0, 0, "Vibration Pokémon", Type.WATER, Type.GROUND, 1.5, 62, "Swift Swim", "Poison Touch", "Water Absorb", 509, 105, 95, 75, 85, 75, 74, 45, 70, 229, GrowthRate.MEDIUM_SLOW, "Water 1", null, 50, 20, 0 ],
[ Species.THROH, "Throh", 5, 0, 0, 0, "Judo Pokémon", Type.FIGHTING, -1, 1.3, 55.5, "Guts", "Inner Focus", "Mold Breaker", 465, 120, 100, 85, 30, 85, 45, 45, 70, 163, GrowthRate.MEDIUM_FAST, "Human-Like", null, 100, 20, 0 ],
[ Species.SAWK, "Sawk", 5, 0, 0, 0, "Karate Pokémon", Type.FIGHTING, -1, 1.4, 51, "Sturdy", "Inner Focus", "Mold Breaker", 465, 75, 125, 75, 30, 75, 85, 45, 70, 163, GrowthRate.MEDIUM_FAST, "Human-Like", null, 100, 20, 0 ],
[ Species.SEWADDLE, "Sewaddle", 5, 0, 0, 0, "Sewing Pokémon", Type.BUG, Type.GRASS, 0.3, 2.5, "Swarm", "Chlorophyll", "Overcoat", 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 0 ],
[ Species.SWADLOON, "Swadloon", 5, 0, 0, 0, "Leaf-Wrapped Pokémon", Type.BUG, Type.GRASS, 0.5, 7.3, "Leaf Guard", "Chlorophyll", "Overcoat", 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 0 ],
[ Species.LEAVANNY, "Leavanny", 5, 0, 0, 0, "Nurturing Pokémon", Type.BUG, Type.GRASS, 1.2, 20.5, "Swarm", "Chlorophyll", "Overcoat", 500, 75, 103, 80, 70, 80, 92, 45, 70, 225, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 0 ],
[ Species.VENIPEDE, "Venipede", 5, 0, 0, 0, "Centipede Pokémon", Type.BUG, Type.POISON, 0.4, 5.3, "Poison Point", "Swarm", "Speed Boost", 260, 30, 45, 59, 30, 39, 57, 255, 70, 52, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 0 ],
[ Species.WHIRLIPEDE, "Whirlipede", 5, 0, 0, 0, "Curlipede Pokémon", Type.BUG, Type.POISON, 1.2, 58.5, "Poison Point", "Swarm", "Speed Boost", 360, 40, 55, 99, 40, 79, 47, 120, 70, 126, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 15, 0 ],
[ Species.SCOLIPEDE, "Scolipede", 5, 0, 0, 0, "Megapede Pokémon", Type.BUG, Type.POISON, 2.5, 200.5, "Poison Point", "Swarm", "Speed Boost", 485, 60, 100, 89, 55, 69, 112, 45, 70, 218, GrowthRate.MEDIUM_SLOW, "Bug", null, 50, 20, 0 ],
[ Species.COTTONEE, "Cottonee", 5, 0, 0, 0, "Cotton Puff Pokémon", Type.GRASS, Type.FAIRY, 0.3, 0.6, "Prankster", "Infiltrator", "Chlorophyll", 280, 40, 27, 60, 37, 50, 66, 190, 70, 56, GrowthRate.MEDIUM_FAST, "Fairy", "Grass", 50, 20, 0 ],
[ Species.WHIMSICOTT, "Whimsicott", 5, 0, 0, 0, "Windveiled Pokémon", Type.GRASS, Type.FAIRY, 0.7, 6.6, "Prankster", "Infiltrator", "Chlorophyll", 480, 60, 67, 85, 77, 75, 116, 75, 70, 168, GrowthRate.MEDIUM_FAST, "Fairy", "Grass", 50, 20, 0 ],
[ Species.PETILIL, "Petilil", 5, 0, 0, 0, "Bulb Pokémon", Type.GRASS, -1, 0.5, 6.6, "Chlorophyll", "Own Tempo", "Leaf Guard", 280, 45, 35, 50, 70, 50, 30, 190, 70, 56, GrowthRate.MEDIUM_FAST, "Grass", null, 0, 20, 0 ],
[ Species.LILLIGANT, "Lilligant", 5, 0, 0, 0, "Flowering Pokémon", Type.GRASS, -1, 1.1, 16.3, "Chlorophyll", "Own Tempo", "Leaf Guard", 480, 70, 60, 75, 110, 75, 90, 75, 70, 168, GrowthRate.MEDIUM_FAST, "Grass", null, 0, 20, 0 ],
[ Species.BASCULIN, "Basculin", 5, 0, 0, 0, "Hostile Pokémon", Type.WATER, -1, 1, 18, "Reckless", "Adaptability", "Mold Breaker", 460, 70, 92, 65, 80, 55, 98, 25, 70, 161, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 40, 0,
[
[ "Red-Striped Form", 5, 0, 0, 0, "Hostile Pokémon", Type.WATER, -1, 1, 18, "Reckless", "Adaptability", "Mold Breaker", 460, 70, 92, 65, 80, 55, 98, 25, 70, 161, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 40, 0 ],
[ "Blue-Striped Form", 5, 0, 0, 0, "Hostile Pokémon", Type.WATER, -1, 1, 18, "Rock Head", "Adaptability", "Mold Breaker", 460, 70, 92, 65, 80, 55, 98, 25, 70, 161, GrowthRate.MEDIUM_FAST, "Water 2", null, 50, 40, 0 ]
]
],
[ Species.SANDILE, "Sandile", 5, 0, 0, 0, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 0.7, 15.2, "Intimidate", "Moxie", "Anger Point", 292, 50, 72, 35, 35, 35, 65, 180, 70, 58, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ],
[ Species.KROKOROK, "Krokorok", 5, 0, 0, 0, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 1, 33.4, "Intimidate", "Moxie", "Anger Point", 351, 60, 82, 45, 45, 45, 74, 90, 70, 123, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ],
[ Species.KROOKODILE, "Krookodile", 5, 0, 0, 0, "Intimidation Pokémon", Type.GROUND, Type.DARK, 1.5, 96.3, "Intimidate", "Moxie", "Anger Point", 519, 95, 117, 80, 65, 70, 92, 45, 70, 234, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ],
[ Species.DARUMAKA, "Darumaka", 5, 0, 0, 0, "Zen Charm Pokémon", Type.FIRE, -1, 0.6, 37.5, "Hustle", null, "Inner Focus", 315, 70, 90, 45, 15, 45, 50, 120, 70, 63, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ],
[ Species.DARMANITAN, "Darmanitan", 5, 0, 0, 0, "Blazing Pokémon", Type.FIRE, -1, 1.3, 92.9, "Sheer Force", null, "Zen Mode", 480, 105, 140, 55, 30, 55, 95, 60, 70, 168, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0,
[
[ "Standard Mode", 5, 0, 0, 0, "Blazing Pokémon", Type.FIRE, -1, 1.3, 92.9, "Sheer Force", null, "Zen Mode", 480, 105, 140, 55, 30, 55, 95, 60, 70, 168, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ],
[ "Zen Mode", 5, 0, 0, 0, "Blazing Pokémon", Type.FIRE, Type.PSYCHIC, 1.3, 92.9, "Sheer Force", null, "Zen Mode", 540, 105, 30, 105, 140, 105, 55, 60, 70, 189, GrowthRate.MEDIUM_SLOW, "Field", null, 50, 20, 0 ]
]
],
[ Species.MARACTUS, "Maractus", 5, 0, 0, 0, "Cactus Pokémon", Type.GRASS, -1, 1, 28, "Water Absorb", "Chlorophyll", "Storm Drain", 461, 75, 86, 67, 106, 67, 60, 255, 70, 161, GrowthRate.MEDIUM_FAST, "Grass", null, 50, 20, 0 ],
[ Species.DWEBBLE, "Dwebble", 5, 0, 0, 0, "Rock Inn Pokémon", Type.BUG, Type.ROCK, 0.3, 14.5, "Sturdy", "Shell Armor", "Weak Armor", 325, 50, 65, 85, 35, 35, 55, 190, 70, 65, GrowthRate.MEDIUM_FAST, "Bug", "Mineral", 50, 20, 0 ],
[ Species.CRUSTLE, "Crustle", 5, 0, 0, 0, "Stone Home Pokémon", Type.BUG, Type.ROCK, 1.4, 200, "Sturdy", "Shell Armor", "Weak Armor", 485, 70, 105, 125, 65, 75, 45, 75, 70, 170, GrowthRate.MEDIUM_FAST, "Bug", "Mineral", 50, 20, 0 ],
[ Species.SCRAGGY, "Scraggy", 5, 0, 0, 0, "Shedding Pokémon", Type.DARK, Type.FIGHTING, 0.6, 11.8, "Shed Skin", "Moxie", "Intimidate", 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, "Dragon", "Field", 50, 15, 0 ],
[ Species.SCRAFTY, "Scrafty", 5, 0, 0, 0, "Hoodlum Pokémon", Type.DARK, Type.FIGHTING, 1.1, 30, "Shed Skin", "Moxie", "Intimidate", 488, 65, 90, 115, 45, 115, 58, 90, 70, 171, GrowthRate.MEDIUM_FAST, "Dragon", "Field", 50, 15, 0 ],
[ Species.SIGILYPH, "Sigilyph", 5, 0, 0, 0, "Avianoid Pokémon", Type.PSYCHIC, Type.FLYING, 1.4, 14, "Wonder Skin", "Magic Guard", "Tinted Lens", 490, 72, 58, 80, 103, 80, 97, 45, 70, 172, GrowthRate.MEDIUM_FAST, "Flying", null, 50, 20, 0 ],
[ Species.YAMASK, "Yamask", 5, 0, 0, 0, "Spirit Pokémon", Type.GHOST, -1, 0.5, 1.5, "Mummy", null, null, 303, 38, 30, 85, 55, 65, 30, 190, 70, 61, GrowthRate.MEDIUM_FAST, "Amorphous", "Mineral", 50, 25, 0 ],
[ Species.COFAGRIGUS, "Cofagrigus", 5, 0, 0, 0, "Coffin Pokémon", Type.GHOST, -1, 1.7, 76.5, "Mummy", null, null, 483, 58, 50, 145, 95, 105, 30, 90, 70, 169, GrowthRate.MEDIUM_FAST, "Amorphous", "Mineral", 50, 25, 0 ],
[ Species.TIRTOUGA, "Tirtouga", 5, 0, 0, 0, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 0.7, 16.5, "Solid Rock", "Sturdy", "Swift Swim", 355, 54, 78, 103, 53, 45, 22, 45, 70, 71, GrowthRate.MEDIUM_FAST, "Water 1", "Water 3", 87.5, 30, 0 ],
[ Species.CARRACOSTA, "Carracosta", 5, 0, 0, 0, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 1.2, 81, "Solid Rock", "Sturdy", "Swift Swim", 495, 74, 108, 133, 83, 65, 32, 45, 70, 173, GrowthRate.MEDIUM_FAST, "Water 1", "Water 3", 87.5, 30, 0 ],
[ Species.ARCHEN, "Archen", 5, 0, 0, 0, "First Bird Pokémon", Type.ROCK, Type.FLYING, 0.5, 9.5, "Defeatist", null, null, 401, 55, 112, 45, 74, 45, 70, 45, 70, 71, GrowthRate.MEDIUM_FAST, "Flying", "Water 3", 87.5, 30, 0 ],
[ Species.ARCHEOPS, "Archeops", 5, 0, 0, 0, "First Bird Pokémon", Type.ROCK, Type.FLYING, 1.4, 32, "Defeatist", null, null, 567, 75, 140, 65, 112, 65, 110, 45, 70, 177, GrowthRate.MEDIUM_FAST, "Flying", "Water 3", 87.5, 30, 0 ],
[ Species.TRUBBISH, "Trubbish", 5, 0, 0, 0, "Trash Bag Pokémon", Type.POISON, -1, 0.6, 31, "Stench", "Sticky Hold", "Aftermath", 329, 50, 50, 62, 40, 62, 65, 190, 70, 66, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 20, 0 ],
[ Species.GARBODOR, "Garbodor", 5, 0, 0, 0, "Trash Heap Pokémon", Type.POISON, -1, 1.9, 107.3, "Stench", "Weak Armor", "Aftermath", 474, 80, 95, 82, 60, 82, 75, 60, 70, 166, GrowthRate.MEDIUM_FAST, "Mineral", null, 50, 20, 0 ],
[ Species.ZORUA, "Zorua", 5, 0, 0, 0, "Tricky Fox Pokémon", Type.DARK, -1, 0.7, 12.5, "Illusion", null, null, 330, 40, 65, 40, 80, 40, 65, 75, 70, 66, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 25, 0 ],
[ Species.ZOROARK, "Zoroark", 5, 0, 0, 0, "Illusion Fox Pokémon", Type.DARK, -1, 1.6, 81.1, "Illusion", null, null, 510, 60, 105, 60, 120, 60, 105, 45, 70, 179, GrowthRate.MEDIUM_SLOW, "Field", null, 87.5, 20, 0 ],
[ Species.MINCCINO, "Minccino", 5, 0, 0, 0, "Chinchilla Pokémon", Type.NORMAL, -1, 0.4, 5.8, "Cute Charm", "Technician", "Skill Link", 300, 55, 50, 40, 40, 40, 75, 255, 70, 60, GrowthRate.FAST, "Field", null, 25, 15, 0 ],
[ Species.CINCCINO, "Cinccino", 5, 0, 0, 0, "Scarf Pokémon", Type.NORMAL, -1, 0.5, 7.5, "Cute Charm", "Technician", "Skill Link", 470, 75, 95, 60, 65, 60, 115, 60, 70, 165, GrowthRate.FAST, "Field", null, 25, 15, 0 ],
[ Species.GOTHITA, "Gothita", 5, 0, 0, 0, "Fixation Pokémon", Type.PSYCHIC, -1, 0.4, 5.8, "Frisk", "Competitive", "Shadow Tag", 290, 45, 30, 50, 55, 65, 45, 200, 70, 58, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 25, 20, 0 ],
[ Species.GOTHORITA, "Gothorita", 5, 0, 0, 0, "Manipulate Pokémon", Type.PSYCHIC, -1, 0.7, 18, "Frisk", "Competitive", "Shadow Tag", 390, 60, 45, 70, 75, 85, 55, 100, 70, 137, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 25, 20, 0 ],
[ Species.GOTHITELLE, "Gothitelle", 5, 0, 0, 0, "Astral Body Pokémon", Type.PSYCHIC, -1, 1.5, 44, "Frisk", "Competitive", "Shadow Tag", 490, 70, 55, 95, 95, 110, 65, 50, 70, 221, GrowthRate.MEDIUM_SLOW, "Human-Like", null, 25, 20, 0 ],
[ Species.SOLOSIS, "Solosis", 5, 0, 0, 0, "Cell Pokémon", Type.PSYCHIC, -1, 0.3, 1, "Overcoat", "Magic Guard", "Regenerator", 290, 45, 30, 40, 105, 50, 20, 200, 70, 58, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.DUOSION, "Duosion", 5, 0, 0, 0, "Mitosis Pokémon", Type.PSYCHIC, -1, 0.6, 8, "Overcoat", "Magic Guard", "Regenerator", 370, 65, 40, 50, 125, 60, 30, 100, 70, 130, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.REUNICLUS, "Reuniclus", 5, 0, 0, 0, "Multiplying Pokémon", Type.PSYCHIC, -1, 1, 20.1, "Overcoat", "Magic Guard", "Regenerator", 490, 110, 65, 75, 125, 85, 30, 50, 70, 221, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.DUCKLETT, "Ducklett", 5, 0, 0, 0, "Water Bird Pokémon", Type.WATER, Type.FLYING, 0.5, 5.5, "Keen Eye", "Big Pecks", "Hydration", 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, "Flying", "Water 1", 50, 20, 0 ],
[ Species.SWANNA, "Swanna", 5, 0, 0, 0, "White Bird Pokémon", Type.WATER, Type.FLYING, 1.3, 24.2, "Keen Eye", "Big Pecks", "Hydration", 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, "Flying", "Water 1", 50, 20, 0 ],
[ Species.VANILLITE, "Vanillite", 5, 0, 0, 0, "Fresh Snow Pokémon", Type.ICE, -1, 0.4, 5.7, "Ice Body", "Snow Cloak", "Weak Armor", 305, 36, 50, 50, 65, 60, 44, 255, 70, 61, GrowthRate.SLOW, "Mineral", null, 50, 20, 0 ],
[ Species.VANILLISH, "Vanillish", 5, 0, 0, 0, "Icy Snow Pokémon", Type.ICE, -1, 1.1, 41, "Ice Body", "Snow Cloak", "Weak Armor", 395, 51, 65, 65, 80, 75, 59, 120, 70, 138, GrowthRate.SLOW, "Mineral", null, 50, 20, 0 ],
[ Species.VANILLUXE, "Vanilluxe", 5, 0, 0, 0, "Snowstorm Pokémon", Type.ICE, -1, 1.3, 57.5, "Ice Body", "Snow Warning", "Weak Armor", 535, 71, 95, 85, 110, 95, 79, 45, 70, 241, GrowthRate.SLOW, "Mineral", null, 50, 20, 0 ],
[ Species.DEERLING, "Deerling", 5, 0, 0, 0, "Season Pokémon", Type.NORMAL, Type.GRASS, 0.6, 19.5, "Chlorophyll", "Sap Sipper", "Serene Grace", 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.SAWSBUCK, "Sawsbuck", 5, 0, 0, 0, "Season Pokémon", Type.NORMAL, Type.GRASS, 1.9, 92.5, "Chlorophyll", "Sap Sipper", "Serene Grace", 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.EMOLGA, "Emolga", 5, 0, 0, 0, "Sky Squirrel Pokémon", Type.ELECTRIC, Type.FLYING, 0.4, 5, "Static", null, "Motor Drive", 428, 55, 75, 60, 75, 60, 103, 200, 70, 150, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.KARRABLAST, "Karrablast", 5, 0, 0, 0, "Clamping Pokémon", Type.BUG, -1, 0.5, 5.9, "Swarm", "Shed Skin", "No Guard", 315, 50, 75, 45, 40, 45, 60, 200, 70, 63, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.ESCAVALIER, "Escavalier", 5, 0, 0, 0, "Cavalry Pokémon", Type.BUG, Type.STEEL, 1, 33, "Swarm", "Shell Armor", "Overcoat", 495, 70, 135, 105, 60, 105, 20, 75, 70, 173, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.FOONGUS, "Foongus", 5, 0, 0, 0, "Mushroom Pokémon", Type.GRASS, Type.POISON, 0.2, 1, "Effect Spore", null, "Regenerator", 294, 69, 55, 45, 55, 55, 15, 190, 70, 59, GrowthRate.MEDIUM_FAST, "Grass", null, 50, 20, 0 ],
[ Species.AMOONGUSS, "Amoonguss", 5, 0, 0, 0, "Mushroom Pokémon", Type.GRASS, Type.POISON, 0.6, 10.5, "Effect Spore", null, "Regenerator", 464, 114, 85, 70, 85, 80, 30, 75, 70, 162, GrowthRate.MEDIUM_FAST, "Grass", null, 50, 20, 0 ],
[ Species.FRILLISH, "Frillish", 5, 0, 0, 0, "Floating Pokémon", Type.WATER, Type.GHOST, 1.2, 33, "Water Absorb", "Cursed Body", "Damp", 335, 55, 40, 50, 65, 85, 40, 190, 70, 67, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 1 ],
[ Species.JELLICENT, "Jellicent", 5, 0, 0, 0, "Floating Pokémon", Type.WATER, Type.GHOST, 2.2, 135, "Water Absorb", "Cursed Body", "Damp", 480, 100, 60, 70, 85, 105, 60, 60, 70, 168, GrowthRate.MEDIUM_FAST, "Amorphous", null, 50, 20, 1 ],
[ Species.ALOMOMOLA, "Alomomola", 5, 0, 0, 0, "Caring Pokémon", Type.WATER, -1, 1.2, 31.6, "Healer", "Hydration", "Regenerator", 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, "Water 1", "Water 2", 50, 40, 0 ],
[ Species.JOLTIK, "Joltik", 5, 0, 0, 0, "Attaching Pokémon", Type.BUG, Type.ELECTRIC, 0.1, 0.6, "Compound Eyes", "Unnerve", "Swarm", 319, 50, 47, 50, 57, 50, 65, 190, 70, 64, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.GALVANTULA, "Galvantula", 5, 0, 0, 0, "EleSpider Pokémon", Type.BUG, Type.ELECTRIC, 0.8, 14.3, "Compound Eyes", "Unnerve", "Swarm", 472, 70, 77, 60, 97, 60, 108, 75, 70, 165, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.FERROSEED, "Ferroseed", 5, 0, 0, 0, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, "Iron Barbs", null, "Anticipation", 305, 44, 50, 91, 24, 86, 10, 255, 70, 61, GrowthRate.MEDIUM_FAST, "Grass", "Mineral", 50, 20, 0 ],
[ Species.FERROTHORN, "Ferrothorn", 5, 0, 0, 0, "Thorn Pod Pokémon", Type.GRASS, Type.STEEL, 1, 110, "Iron Barbs", null, "Anticipation", 489, 74, 94, 131, 54, 116, 20, 90, 70, 171, GrowthRate.MEDIUM_FAST, "Grass", "Mineral", 50, 20, 0 ],
[ Species.KLINK, "Klink", 5, 0, 0, 0, "Gear Pokémon", Type.STEEL, -1, 0.3, 21, "Plus", "Minus", "Clear Body", 300, 40, 55, 70, 45, 60, 30, 130, 70, 60, GrowthRate.MEDIUM_SLOW, "Mineral", null, null, 20, 0 ],
[ Species.KLANG, "Klang", 5, 0, 0, 0, "Gear Pokémon", Type.STEEL, -1, 0.6, 51, "Plus", "Minus", "Clear Body", 440, 60, 80, 95, 70, 85, 50, 60, 70, 154, GrowthRate.MEDIUM_SLOW, "Mineral", null, null, 20, 0 ],
[ Species.KLINKLANG, "Klinklang", 5, 0, 0, 0, "Gear Pokémon", Type.STEEL, -1, 0.6, 81, "Plus", "Minus", "Clear Body", 520, 60, 100, 115, 70, 85, 90, 30, 70, 234, GrowthRate.MEDIUM_SLOW, "Mineral", null, null, 20, 0 ],
[ Species.TYNAMO, "Tynamo", 5, 0, 0, 0, "EleFish Pokémon", Type.ELECTRIC, -1, 0.2, 0.3, "Levitate", null, null, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.EELEKTRIK, "Eelektrik", 5, 0, 0, 0, "EleFish Pokémon", Type.ELECTRIC, -1, 1.2, 22, "Levitate", null, null, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.EELEKTROSS, "Eelektross", 5, 0, 0, 0, "EleFish Pokémon", Type.ELECTRIC, -1, 2.1, 80.5, "Levitate", null, null, 515, 85, 115, 80, 105, 80, 50, 30, 70, 232, GrowthRate.SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.ELGYEM, "Elgyem", 5, 0, 0, 0, "Cerebral Pokémon", Type.PSYCHIC, -1, 0.5, 9, "Telepathy", "Synchronize", "Analytic", 335, 55, 55, 55, 85, 55, 30, 255, 70, 67, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 0 ],
[ Species.BEHEEYEM, "Beheeyem", 5, 0, 0, 0, "Cerebral Pokémon", Type.PSYCHIC, -1, 1, 34.5, "Telepathy", "Synchronize", "Analytic", 485, 75, 75, 75, 125, 95, 40, 90, 70, 170, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 0 ],
[ Species.LITWICK, "Litwick", 5, 0, 0, 0, "Candle Pokémon", Type.GHOST, Type.FIRE, 0.3, 3.1, "Flash Fire", "Flame Body", "Infiltrator", 275, 50, 30, 55, 65, 55, 20, 190, 70, 55, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.LAMPENT, "Lampent", 5, 0, 0, 0, "Lamp Pokémon", Type.GHOST, Type.FIRE, 0.6, 13, "Flash Fire", "Flame Body", "Infiltrator", 370, 60, 40, 60, 95, 60, 55, 90, 70, 130, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.CHANDELURE, "Chandelure", 5, 0, 0, 0, "Luring Pokémon", Type.GHOST, Type.FIRE, 1, 34.3, "Flash Fire", "Flame Body", "Infiltrator", 520, 60, 55, 90, 145, 90, 80, 45, 70, 234, GrowthRate.MEDIUM_SLOW, "Amorphous", null, 50, 20, 0 ],
[ Species.AXEW, "Axew", 5, 0, 0, 0, "Tusk Pokémon", Type.DRAGON, -1, 0.6, 18, "Rivalry", "Mold Breaker", "Unnerve", 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, "Dragon", "Monster", 50, 40, 0 ],
[ Species.FRAXURE, "Fraxure", 5, 0, 0, 0, "Axe Jaw Pokémon", Type.DRAGON, -1, 1, 36, "Rivalry", "Mold Breaker", "Unnerve", 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, "Dragon", "Monster", 50, 40, 0 ],
[ Species.HAXORUS, "Haxorus", 5, 0, 0, 0, "Axe Jaw Pokémon", Type.DRAGON, -1, 1.8, 105.5, "Rivalry", "Mold Breaker", "Unnerve", 540, 76, 147, 90, 60, 70, 97, 45, 35, 243, GrowthRate.SLOW, "Dragon", "Monster", 50, 40, 0 ],
[ Species.CUBCHOO, "Cubchoo", 5, 0, 0, 0, "Chill Pokémon", Type.ICE, -1, 0.5, 8.5, "Snow Cloak", "Slush Rush", "Rattled", 305, 55, 70, 40, 60, 40, 40, 120, 70, 61, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.BEARTIC, "Beartic", 5, 0, 0, 0, "Freezing Pokémon", Type.ICE, -1, 2.6, 260, "Snow Cloak", "Slush Rush", "Swift Swim", 505, 95, 130, 80, 70, 80, 50, 60, 70, 177, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.CRYOGONAL, "Cryogonal", 5, 0, 0, 0, "Crystallizing Pokémon", Type.ICE, -1, 1.1, 148, "Levitate", null, null, 515, 80, 50, 50, 95, 135, 105, 25, 70, 180, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 25, 0 ],
[ Species.SHELMET, "Shelmet", 5, 0, 0, 0, "Snail Pokémon", Type.BUG, -1, 0.4, 7.7, "Hydration", "Shell Armor", "Overcoat", 305, 50, 40, 85, 40, 65, 25, 200, 70, 61, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.ACCELGOR, "Accelgor", 5, 0, 0, 0, "Shell Out Pokémon", Type.BUG, -1, 0.8, 25.3, "Hydration", "Sticky Hold", "Unburden", 495, 80, 70, 40, 100, 60, 145, 75, 70, 173, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 15, 0 ],
[ Species.STUNFISK, "Stunfisk", 5, 0, 0, 0, "Trap Pokémon", Type.GROUND, Type.ELECTRIC, 0.7, 11, "Static", "Limber", "Sand Veil", 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, "Amorphous", "Water 1", 50, 20, 0 ],
[ Species.MIENFOO, "Mienfoo", 5, 0, 0, 0, "Martial Arts Pokémon", Type.FIGHTING, -1, 0.9, 20, "Inner Focus", "Regenerator", "Reckless", 350, 45, 85, 50, 55, 50, 65, 180, 70, 70, GrowthRate.MEDIUM_SLOW, "Field", "Human-Like", 50, 25, 0 ],
[ Species.MIENSHAO, "Mienshao", 5, 0, 0, 0, "Martial Arts Pokémon", Type.FIGHTING, -1, 1.4, 35.5, "Inner Focus", "Regenerator", "Reckless", 510, 65, 125, 60, 95, 60, 105, 45, 70, 179, GrowthRate.MEDIUM_SLOW, "Field", "Human-Like", 50, 25, 0 ],
[ Species.DRUDDIGON, "Druddigon", 5, 0, 0, 0, "Cave Pokémon", Type.DRAGON, -1, 1.6, 139, "Rough Skin", "Sheer Force", "Mold Breaker", 485, 77, 120, 90, 60, 90, 48, 45, 70, 170, GrowthRate.MEDIUM_FAST, "Dragon", "Monster", 50, 30, 0 ],
[ Species.GOLETT, "Golett", 5, 0, 0, 0, "Automaton Pokémon", Type.GROUND, Type.GHOST, 1, 92, "Iron Fist", "Klutz", "No Guard", 303, 59, 74, 50, 35, 50, 35, 190, 70, 61, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 25, 0 ],
[ Species.GOLURK, "Golurk", 5, 0, 0, 0, "Automaton Pokémon", Type.GROUND, Type.GHOST, 2.8, 330, "Iron Fist", "Klutz", "No Guard", 483, 89, 124, 80, 55, 80, 55, 90, 70, 169, GrowthRate.MEDIUM_FAST, "Mineral", null, null, 25, 0 ],
[ Species.PAWNIARD, "Pawniard", 5, 0, 0, 0, "Sharp Blade Pokémon", Type.DARK, Type.STEEL, 0.5, 10.2, "Defiant", "Inner Focus", "Pressure", 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 0 ],
[ Species.BISHARP, "Bisharp", 5, 0, 0, 0, "Sword Blade Pokémon", Type.DARK, Type.STEEL, 1.6, 70, "Defiant", "Inner Focus", "Pressure", 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, "Human-Like", null, 50, 20, 0 ],
[ Species.BOUFFALANT, "Bouffalant", 5, 0, 0, 0, "Bash Buffalo Pokémon", Type.NORMAL, -1, 1.6, 94.6, "Reckless", "Sap Sipper", "Soundproof", 490, 95, 110, 95, 40, 95, 55, 45, 70, 172, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.RUFFLET, "Rufflet", 5, 0, 0, 0, "Eaglet Pokémon", Type.NORMAL, Type.FLYING, 0.5, 10.5, "Keen Eye", "Sheer Force", "Hustle", 350, 70, 83, 50, 37, 50, 60, 190, 70, 70, GrowthRate.SLOW, "Flying", null, 100, 20, 0 ],
[ Species.BRAVIARY, "Braviary", 5, 0, 0, 0, "Valiant Pokémon", Type.NORMAL, Type.FLYING, 1.5, 41, "Keen Eye", "Sheer Force", "Defiant", 510, 100, 123, 75, 57, 75, 80, 60, 70, 179, GrowthRate.SLOW, "Flying", null, 100, 20, 0 ],
[ Species.VULLABY, "Vullaby", 5, 0, 0, 0, "Diapered Pokémon", Type.DARK, Type.FLYING, 0.5, 9, "Big Pecks", "Overcoat", "Weak Armor", 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, "Flying", null, 0, 20, 0 ],
[ Species.MANDIBUZZ, "Mandibuzz", 5, 0, 0, 0, "Bone Vulture Pokémon", Type.DARK, Type.FLYING, 1.2, 39.5, "Big Pecks", "Overcoat", "Weak Armor", 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, "Flying", null, 0, 20, 0 ],
[ Species.HEATMOR, "Heatmor", 5, 0, 0, 0, "Anteater Pokémon", Type.FIRE, -1, 1.4, 58, "Gluttony", "Flash Fire", "White Smoke", 484, 85, 97, 66, 105, 66, 65, 90, 70, 169, GrowthRate.MEDIUM_FAST, "Field", null, 50, 20, 0 ],
[ Species.DURANT, "Durant", 5, 0, 0, 0, "Iron Ant Pokémon", Type.BUG, Type.STEEL, 0.3, 33, "Swarm", "Hustle", "Truant", 484, 58, 109, 112, 48, 48, 109, 90, 70, 169, GrowthRate.MEDIUM_FAST, "Bug", null, 50, 20, 0 ],
[ Species.DEINO, "Deino", 5, 0, 0, 0, "Irate Pokémon", Type.DARK, Type.DRAGON, 0.8, 17.3, "Hustle", null, null, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, "Dragon", null, 50, 40, 0 ],
[ Species.ZWEILOUS, "Zweilous", 5, 0, 0, 0, "Hostile Pokémon", Type.DARK, Type.DRAGON, 1.4, 50, "Hustle", null, null, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, "Dragon", null, 50, 40, 0 ],
[ Species.HYDREIGON, "Hydreigon", 5, 0, 0, 0, "Brutal Pokémon", Type.DARK, Type.DRAGON, 1.8, 160, "Levitate", null, null, 600, 92, 105, 90, 125, 90, 98, 45, 35, 270, GrowthRate.SLOW, "Dragon", null, 50, 40, 0 ],
[ Species.LARVESTA, "Larvesta", 5, 0, 0, 0, "Torch Pokémon", Type.BUG, Type.FIRE, 1.1, 28.8, "Flame Body", null, "Swarm", 360, 55, 85, 55, 50, 55, 60, 45, 70, 72, GrowthRate.SLOW, "Bug", null, 50, 40, 0 ],
[ Species.VOLCARONA, "Volcarona", 5, 0, 0, 0, "Sun Pokémon", Type.BUG, Type.FIRE, 1.6, 46, "Flame Body", null, "Swarm", 550, 85, 60, 65, 135, 105, 100, 15, 70, 248, GrowthRate.SLOW, "Bug", null, 50, 40, 0 ],
[ Species.COBALION, "Cobalion", 5, 1, 0, 0, "Iron Will Pokémon", Type.STEEL, Type.FIGHTING, 2.1, 250, "Justified", null, null, 580, 91, 90, 129, 90, 72, 108, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.TERRAKION, "Terrakion", 5, 1, 0, 0, "Cavern Pokémon", Type.ROCK, Type.FIGHTING, 1.9, 260, "Justified", null, null, 580, 91, 129, 90, 72, 90, 108, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.VIRIZION, "Virizion", 5, 1, 0, 0, "Grassland Pokémon", Type.GRASS, Type.FIGHTING, 2, 200, "Justified", null, null, 580, 91, 90, 72, 90, 129, 108, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ Species.TORNADUS, "Tornadus", 5, 1, 0, 0, "Cyclone Pokémon", Type.FLYING, -1, 1.5, 63, "Prankster", null, "Defiant", 580, 79, 115, 70, 125, 80, 111, 3, 90, 261, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0,
[
[ "Incarnate Forme", 5, 1, 0, 0, "Cyclone Pokémon", Type.FLYING, -1, 1.5, 63, "Prankster", null, "Defiant", 580, 79, 115, 70, 125, 80, 111, 3, 90, 261, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ],
[ "Therian Forme", 5, 1, 0, 0, "Cyclone Pokémon", Type.FLYING, -1, 1.4, 63, "Regenerator", null, null, 580, 79, 100, 80, 110, 90, 121, 3, 90, 261, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ]
]
],
[ Species.THUNDURUS, "Thundurus", 5, 1, 0, 0, "Bolt Strike Pokémon", Type.ELECTRIC, Type.FLYING, 1.5, 61, "Prankster", null, "Defiant", 580, 79, 115, 70, 125, 80, 111, 3, 90, 261, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0,
[
[ "Incarnate Forme", 5, 1, 0, 0, "Bolt Strike Pokémon", Type.ELECTRIC, Type.FLYING, 1.5, 61, "Prankster", null, "Defiant", 580, 79, 115, 70, 125, 80, 111, 3, 90, 261, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ],
[ "Therian Forme", 5, 1, 0, 0, "Bolt Strike Pokémon", Type.ELECTRIC, Type.FLYING, 3, 61, "Volt Absorb", null, null, 580, 79, 105, 70, 145, 80, 101, 3, 90, 261, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ]
]
],
[ Species.RESHIRAM, "Reshiram", 5, 0, 1, 0, "Vast White Pokémon", Type.DRAGON, Type.FIRE, 3.2, 330, "Turboblaze", null, null, 680, 100, 120, 100, 150, 120, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.ZEKROM, "Zekrom", 5, 0, 1, 0, "Deep Black Pokémon", Type.DRAGON, Type.ELECTRIC, 2.9, 345, "Teravolt", null, null, 680, 100, 150, 120, 120, 100, 90, 3, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.LANDORUS, "Landorus", 5, 1, 0, 0, "Abundance Pokémon", Type.GROUND, Type.FLYING, 1.5, 68, "Sand Force", null, "Sheer Force", 600, 89, 125, 90, 115, 80, 101, 3, 90, 270, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0,
[
[ "Incarnate Forme", 5, 1, 0, 0, "Abundance Pokémon", Type.GROUND, Type.FLYING, 1.5, 68, "Sand Force", null, "Sheer Force", 600, 89, 125, 90, 115, 80, 101, 3, 90, 270, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ],
[ "Therian Forme", 5, 1, 0, 0, "Abundance Pokémon", Type.GROUND, Type.FLYING, 1.3, 68, "Intimidate", null, null, 600, 89, 145, 90, 105, 80, 91, 3, 90, 270, GrowthRate.SLOW, "Undiscovered", null, 100, 120, 0 ]
]
],
[ Species.KYUREM, "Kyurem", 5, 0, 1, 0, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3, 325, "Pressure", null, null, 660, 125, 130, 90, 130, 90, 95, 3, 0, 297, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0,
[
[ "Normal", 5, 0, 1, 0, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3, 325, "Pressure", null, null, 660, 125, 130, 90, 130, 90, 95, 3, 0, 297, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Black", 5, 0, 1, 0, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3.3, 325, "Teravolt", null, null, 700, 125, 170, 100, 120, 90, 95, 3, 0, 315, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "White", 5, 0, 1, 0, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3.6, 325, "Turboblaze", null, null, 700, 125, 120, 90, 170, 100, 95, 3, 0, 315, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ]
]
],
[ Species.KELDEO, "Keldeo", 5, 0, 0, 1, "Colt Pokémon", Type.WATER, Type.FIGHTING, 1.4, 48.5, "Justified", null, null, 580, 91, 72, 90, 129, 90, 108, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0,
[
[ "Ordinary Forme", 5, 0, 0, 1, "Colt Pokémon", Type.WATER, Type.FIGHTING, 1.4, 48.5, "Justified", null, null, 580, 91, 72, 90, 129, 90, 108, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ],
[ "Resolute Forme", 5, 0, 0, 1, "Colt Pokémon", Type.WATER, Type.FIGHTING, 1.4, 48.5, "Justified", null, null, 580, 91, 72, 90, 129, 90, 108, 3, 35, 261, GrowthRate.SLOW, "Undiscovered", null, null, 80, 0 ]
]
],
[ Species.MELOETTA, "Meloetta", 5, 0, 0, 1, "Melody Pokémon", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, "Serene Grace", null, null, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0,
[
[ "Aria Forme", 5, 0, 0, 1, "Melody Pokémon", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, "Serene Grace", null, null, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ "Pirouette Forme", 5, 0, 0, 1, "Melody Pokémon", Type.NORMAL, Type.FIGHTING, 0.6, 6.5, "Serene Grace", null, null, 600, 100, 128, 90, 77, 77, 128, 3, 100, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ]
]
],
[ Species.GENESECT, "Genesect", 5, 0, 0, 1, "Paleozoic Pokémon", Type.BUG, Type.STEEL, 1.5, 82.5, "Download", null, null, 600, 71, 120, 95, 120, 95, 99, 3, 0, 270, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.XERNEAS, "Xerneas", 6, 0, 1, 0, "Life Pokémon", Type.FAIRY, -1, 3, 215, "Fairy Aura", null, null, 680, 126, 131, 95, 131, 98, 99, 45, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ],
[ Species.YVELTAL, "Yveltal", 6, 0, 1, 0, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, "Dark Aura", null, null, 680, 126, 131, 95, 131, 98, 99, 45, 0, 306, GrowthRate.SLOW, "Undiscovered", null, null, 120, 0 ]
].map(p => {
let i = 0;
return new PokemonSpecies(p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++], p[i++]);
});
console.log(
Species[getPokemonSpecies(Species.PICHU).getSpeciesForLevel(5)],
Species[getPokemonSpecies(Species.PICHU).getSpeciesForLevel(20)],
Species[getPokemonSpecies(Species.PICHU).getSpeciesForLevel(50)],
Species[getPokemonSpecies(Species.EXEGGUTOR).getSpeciesForLevel(5)],
Species[getPokemonSpecies(Species.EXEGGUTOR).getSpeciesForLevel(20)],
Species[getPokemonSpecies(Species.EXEGGUTOR).getSpeciesForLevel(50)]
);
+35
View File
@@ -0,0 +1,35 @@
import { toPokemonUpperCase } from "./utils";
export enum Stat {
HP = 0,
ATK,
DEF,
SPATK,
SPDEF,
SPD
};
export function getStatName(stat: Stat) {
let ret;
switch (stat) {
case Stat.HP:
ret = 'Max. HP';
break;
case Stat.ATK:
ret = 'Attack';
break;
case Stat.DEF:
ret = 'Defense';
break;
case Stat.SPATK:
ret = 'Sp. Atk';
break;
case Stat.SPDEF:
ret = 'Sp. Def';
break;
case Stat.SPD:
ret = 'Speed';
break;
}
return toPokemonUpperCase(ret);
}
+640
View File
@@ -0,0 +1,640 @@
import Phaser from 'phaser';
import BattleScene from './battle-scene';
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from './battle-info';
import { MessagePhase } from './battle-phase';
import { default as Move, allMoves, MOVE_CATEGORY as MoveCategory, Moves } from './move';
import { pokemonLevelMoves } from './pokemon-level-moves';
import { default as PokemonSpecies } from './pokemon-species';
import * as Utils from './utils';
import { getTypeDamageMultiplier } from './type';
import { getLevelTotalExp } from './exp';
import { Stat } from './pokemon-stat';
import { PokemonBaseStatModifier as PokemonBaseStatBoosterModifier, ShinyRateBoosterModifier } from './modifier';
import { PokeballType } from './pokeball';
export default abstract class Pokemon extends Phaser.GameObjects.Container {
public id: integer;
public name: string;
public species: PokemonSpecies;
public shiny: boolean;
public pokeball: PokeballType;
protected battleInfo: BattleInfo;
public level: integer;
public exp: integer;
public levelExp: integer;
public gender: integer;
public hp: integer;
public stats: integer[];
public ivs: integer[];
public moveset: PokemonMove[];
public winCount: integer;
private shinySparkle: Phaser.GameObjects.Sprite;
constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, dataSource?: Pokemon) {
super(scene, x, y);
this.name = Utils.toPokemonUpperCase(species.name);
this.species = species;
this.battleInfo = this.isPlayer()
? new PlayerBattleInfo(scene)
: new EnemyBattleInfo(scene);
this.pokeball = dataSource?.pokeball || PokeballType.POKEBALL;
this.level = level;//Utils.randInt(player ? 100 : 30, player ? 41 : 1);
this.exp = dataSource?.exp || getLevelTotalExp(this.level, species.growthRate);
this.levelExp = dataSource?.levelExp || 0;
if (dataSource) {
this.id = dataSource.id;
this.shiny = dataSource.shiny;
this.gender = dataSource.gender;
this.hp = dataSource.hp;
this.stats = dataSource.stats;
this.ivs = dataSource.ivs;
this.moveset = dataSource.moveset;
this.winCount = dataSource.winCount;
} else {
this.generateAndPopulateMoveset();
this.id = Utils.randInt(4294967295);
this.ivs = [
Utils.binToDec(Utils.decToBin(this.id).substring(0, 5)),
Utils.binToDec(Utils.decToBin(this.id).substring(5, 10)),
Utils.binToDec(Utils.decToBin(this.id).substring(10, 15)),
Utils.binToDec(Utils.decToBin(this.id).substring(15, 20)),
Utils.binToDec(Utils.decToBin(this.id).substring(20, 25)),
Utils.binToDec(Utils.decToBin(this.id).substring(25, 30))
];
//} else
//this.id = parseInt(Utils.decToBin(this.ivs[Stat.HP]) + Utils.decToBin(this.ivs[Stat.ATK]) + Utils.decToBin(this.ivs[Stat.DEF]) + Utils.decToBin(this.ivs[Stat.SPATK]) + Utils.decToBin(this.ivs[Stat.SPDEF]) + Utils.decToBin(this.ivs[Stat.SPD]) + this.id.toString(2).slice(30));
if (this.species.malePercent === null)
this.gender = -1;
else {
const genderChance = (this.id % 256) / 32;
if (genderChance < this.species.malePercent)
this.gender = 0;
else
this.gender = 1;
}
const rand1 = Utils.binToDec(Utils.decToBin(this.id).substring(0, 16));
const rand2 = Utils.binToDec(Utils.decToBin(this.id).substring(16, 32));
const E = (this.scene as BattleScene).trainerId ^ (this.scene as BattleScene).secretId;
const F = rand1 ^ rand2;
let shinyThreshold = new Utils.IntegerHolder(32);
(this.scene as BattleScene).applyModifiers(ShinyRateBoosterModifier, shinyThreshold);
console.log(shinyThreshold.value);
this.shiny = (E ^ F) < shinyThreshold.value;
if ((E ^ F) < 32)
console.log('REAL SHINY!!');
if (this.shiny)
console.log((E ^ F), shinyThreshold.value);
/*else
this.shiny = Utils.randInt(16) === 0;*/
this.winCount = 0;
}
this.calculateStats();
(scene as BattleScene).fieldUI.add(this.battleInfo);
this.battleInfo.initInfo(this);
const getSprite = () => {
const ret = this.scene.add.sprite(0, 0, `pkmn__${this.isPlayer() ? 'back__' : ''}sub`);
ret.setOrigin(0.5, 1);
return ret;
};
const sprite = getSprite();
const tintSprite = getSprite();
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);
if (this.shiny) {
const shinySparkle = this.scene.add.sprite(0, 0, 'shiny');
shinySparkle.setVisible(false);
shinySparkle.setOrigin(0.5, 1);
const frameNames = this.scene.anims.generateFrameNames('shiny', { suffix: '.png', end: 34 });
this.scene.anims.create({
key: 'sparkle',
frames: frameNames,
frameRate: 32,
showOnStart: true,
hideOnComplete: true,
});
this.add(shinySparkle);
this.shinySparkle = shinySparkle;
}
}
abstract isPlayer(): boolean;
getAtlasPath() {
return this.getSpriteId().replace(/\_{2}/g, '/');
}
getSpriteId() {
return `${this.isPlayer() ? 'back__' : ''}${this.shiny ? 'shiny__' : ''}${this.species.genderDiffs && !this.gender ? 'female__' : ''}${this.species.speciesId}`;
}
getSpriteKey() {
return `pkmn__${this.getSpriteId()}`;
}
getIconAtlasKey() {
return `pokemon_icons_${this.species.generation}`;
}
getIconId() {
return `${Utils.padInt(this.species.speciesId, 3)}`;
}
getIconKey() {
return `pkmn_icon__${this.getIconId()}`;
}
getSprite() {
return this.getAt(0) as Phaser.GameObjects.Sprite;
}
getTintSprite() {
return this.getAt(1) as Phaser.GameObjects.Sprite;
}
calculateStats() {
if (!this.stats)
this.stats = [ 0, 0, 0, 0, 0, 0 ];
const baseStats = this.species.baseStats.slice(0);
console.log(this.id);
(this.scene as BattleScene).applyModifiers(PokemonBaseStatBoosterModifier, this.id, baseStats);
const stats = Utils.getEnumValues(Stat);
for (let s of stats) {
const isHp = s === Stat.HP;
let baseStat = baseStats[s];
let value = Math.floor(((2 * baseStat + this.ivs[s] + (0 / 4)) * this.level) * 0.01);
if (isHp) {
value = Math.min(value + this.level + 10, 99999);
if (this.hp > value || this.hp === undefined)
this.hp = value;
else {
const lastMaxHp = this.getMaxHp();
if (lastMaxHp && value > lastMaxHp)
this.hp += value - lastMaxHp;
}
} else
value = Math.min(value + 5, 99999);
this.stats[s] = value;
}
}
getMaxHp() {
return this.stats[Stat.HP];
}
generateAndPopulateMoveset() {
this.moveset = [];
const movePool = [];
const allLevelMoves = pokemonLevelMoves[this.species.speciesId];
if (!allLevelMoves) {
console.log(this.species.speciesId, 'ERROR')
return;
}
for (let m = 0; m < allLevelMoves.length; m++) {
const levelMove = allLevelMoves[m];
if (this.level < levelMove[0])
break;
if (movePool.indexOf(levelMove[1]) === -1)
movePool.push(levelMove[1]);
}
const attackMovePool = movePool.filter(m => {
const move = allMoves[m - 1];
return move.category !== MoveCategory.STATUS;
});
if (attackMovePool.length) {
const moveIndex = Utils.randInt(attackMovePool.length);
this.moveset.push(new PokemonMove(attackMovePool[moveIndex], 0, 0));
console.log(allMoves[attackMovePool[moveIndex] - 1]);
movePool.splice(movePool.findIndex(m => m === attackMovePool[moveIndex]), 1);
}
while (movePool.length && this.moveset.length < 4) {
const moveIndex = Utils.randInt(movePool.length);
this.moveset.push(new PokemonMove(movePool[moveIndex], 0, 0));
console.log(allMoves[movePool[moveIndex] - 1]);
movePool.splice(moveIndex, 1);
}
}
trySelectMove(moveIndex: integer): boolean {
const move = this.moveset.length > moveIndex
? this.moveset[moveIndex]
: null;
return move?.isUsable();
}
showInfo() {
if (!this.battleInfo.visible) {
this.battleInfo.setX(this.battleInfo.x + (this.isPlayer() ? 150 : -150));
this.battleInfo.setVisible(true);
this.scene.tweens.add({
targets: this.battleInfo,
x: this.isPlayer() ? '-=150' : '+=150',
duration: 1000,
ease: 'Sine.easeOut'
});
}
}
hideInfo() {
if (this.battleInfo.visible) {
this.scene.tweens.add({
targets: this.battleInfo,
x: this.isPlayer() ? '+=150' : '-=150',
duration: 500,
ease: 'Sine.easeIn',
onComplete: () => {
this.battleInfo.setVisible(false);
this.battleInfo.setX(this.battleInfo.x - (this.isPlayer() ? 150 : -150));
}
});
}
}
updateInfo(callback?: Function) {
this.battleInfo.updateInfo(this, callback);
}
addExp(exp: integer) {
this.exp += exp;
while (this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate))
this.level++;
this.levelExp = this.exp - getLevelTotalExp(this.level, this.species.growthRate);
}
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;
let damage = 0;
switch (moveCategory) {
case MoveCategory.PHYSICAL:
case MoveCategory.SPECIAL:
const isPhysical = moveCategory === MoveCategory.PHYSICAL;
const isCritical = Utils.randInt(4) === 0;
const sourceAtk = source.stats[isPhysical ? Stat.ATK : Stat.SPATK];
const targetDef = this.stats[isPhysical ? Stat.DEF : Stat.SPDEF];
const stabMultiplier = source.species.type1 === move.type || (source.species.type2 > -1 && source.species.type2 === move.type) ? 1.5 : 1;
const typeMultiplier = getTypeDamageMultiplier(move.type, this.species.type1) * (this.species.type2 > -1 ? getTypeDamageMultiplier(move.type, this.species.type2) : 1);
const criticalMultiplier = isCritical ? 2 : 1;
damage = Math.ceil(((((2 * source.level / 5 + 2) * move.power * sourceAtk / targetDef) / 50) + 2) * stabMultiplier * typeMultiplier * ((Utils.randInt(15) + 85) / 100)) * criticalMultiplier;
console.log('damage', damage, move.name, move.power, sourceAtk, targetDef);
if (damage) {
this.hp = Math.max(this.hp - damage, 0);
if (isCritical)
battleScene.unshiftPhase(new MessagePhase(battleScene, 'A critical hit!'));
}
if (typeMultiplier >= 2)
result = MoveResult.SUPER_EFFECTIVE;
else if (typeMultiplier >= 1)
result = MoveResult.EFFECTIVE;
else if (typeMultiplier > 0)
result = MoveResult.NOT_VERY_EFFECTIVE;
else
result = MoveResult.NO_EFFECT;
switch (result) {
case MoveResult.EFFECTIVE:
this.scene.sound.play('hit');
success = true;
break;
case MoveResult.SUPER_EFFECTIVE:
this.scene.sound.play('hit_strong');
battleScene.unshiftPhase(new MessagePhase(battleScene, 'It\'s super effective!'));
success = true;
break;
case MoveResult.NOT_VERY_EFFECTIVE:
this.scene.sound.play('hit_weak');
battleScene.unshiftPhase(new MessagePhase(battleScene, 'It\'s not very effective!'))
success = true;
break;
case MoveResult.NO_EFFECT:
battleScene.unshiftPhase(new MessagePhase(battleScene, `It doesn\'t affect ${this.name}!`))
success = true;
break;
case MoveCategory.STATUS:
result = MoveResult.OTHER;
success = true;
break;
}
}
if (success) {
if (result <= MoveResult.NOT_VERY_EFFECTIVE) {
const flashTimer = this.scene.time.addEvent({
delay: 100,
repeat: 5,
startAt: 200,
callback: () => {
this.getSprite().setVisible(flashTimer.repeatCount % 2 === 0);
if (!flashTimer.repeatCount) {
this.battleInfo.updateInfo(this, () => {
if (callback)
callback();
});
}
}
});
} else {
this.battleInfo.updateInfo(this, () => {
if (callback)
callback();
});
}
} else
callback();
}
cry() {
this.scene.sound.play(this.species.speciesId.toString());
}
faintCry(callback) {
const key = this.species.speciesId.toString();
let i = 0;
let rate = 0.85;
this.scene.sound.play(key, {
rate: rate
});
const sprite = this.getSprite();
const delay = Math.max(this.scene.sound.get(key).totalDuration * 50, 25);
let frameProgress = 0;
let frameThreshold: number;
sprite.anims.pause();
let faintCryTimer = this.scene.time.addEvent({
delay: delay,
repeat: -1,
callback: () => {
++i;
frameThreshold = sprite.anims.msPerFrame / rate;
frameProgress += delay;
while (frameProgress > frameThreshold) {
if (sprite.anims.duration)
sprite.anims.nextFrame();
frameProgress -= frameThreshold;
}
const crySound = this.scene.sound.get(key);
if (crySound) {
rate *= 0.99;
crySound.play({
rate: rate,
seek: (i * delay * 0.001) * rate
});
}
else {
faintCryTimer.destroy();
faintCryTimer = null;
if (callback)
callback();
}
}
});
// Failsafe
this.scene.time.delayedCall(5000, () => {
if (!faintCryTimer || !this.scene)
return;
const crySound = this.scene.sound.get(key);
if (crySound?.isPlaying)
crySound.stop();
faintCryTimer.destroy();
if (callback)
callback();
});
}
getExpValue(victorLevel: integer): integer {
// Gen 1-4 formula
// return ((this.pokemon.baseExp * this.level) / 7) * (1 / 1)
// TODO: Update for exp share
return Math.floor(((this.species.baseExp * this.level) / 5) * (1 / 1) * ((Math.round(Math.sqrt(2 * this.level + 10)) * Math.pow(2 * this.level + 10, 2)) / (Math.round(Math.sqrt(this.level + victorLevel + 10)) * Math.pow(this.level + victorLevel + 10, 2)))) + 1;
}
tint(color: number, alpha?: number, duration?: integer, ease?: string) {
const tintSprite = this.getTintSprite();
tintSprite.setTintFill(color);
tintSprite.setVisible(true);
if (duration) {
tintSprite.setAlpha(0);
this.scene.tweens.add({
targets: tintSprite,
alpha: alpha || 1,
duration: duration,
ease: ease || 'Linear'
});
} else
tintSprite.setAlpha(alpha);
}
untint(duration: integer, ease?: string) {
const tintSprite = this.getTintSprite();
if (duration) {
this.scene.tweens.add({
targets: tintSprite,
alpha: 0,
duration: duration,
ease: ease || 'Linear',
onComplete: () => tintSprite.setVisible(false)
});
} else
tintSprite.setVisible(false);
}
sparkle(): void {
if (this.shinySparkle) {
this.shinySparkle.play('sparkle');
this.scene.sound.play('shiny');
}
}
}
export class PlayerPokemon extends Pokemon {
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, dataSource?: Pokemon) {
super(scene, 106, 148, species, level, dataSource);
this.generateIconAnim();
}
isPlayer() {
return true;
}
generateIconAnim() {
const frameNames = this.scene.anims.generateFrameNames(this.getIconAtlasKey(), { prefix: `${this.getIconId()}_`, zeroPad: 2, suffix: '.png', start: 1, end: 34 });
this.scene.anims.create({
key: this.getIconKey(),
frames: frameNames,
frameRate: 128,
repeat: -1
});
}
}
export class EnemyPokemon extends Pokemon {
public aiType: AiType;
constructor(scene: BattleScene, species: PokemonSpecies, level: integer) {
super(scene, -63, 86, species, level);
this.aiType = AiType.SMART;
}
getNextMove(): PokemonMove {
const movePool = this.moveset.filter(m => m.isUsable());
if (movePool.length) {
if (movePool.length === 1)
return movePool[0];
switch (this.aiType) {
case AiType.RANDOM:
return movePool[Utils.randInt(movePool.length)];
case AiType.SMART:
const target = (this.scene as BattleScene).getPlayerPokemon();
const moveScores = movePool.map(() => 0);
for (let m in movePool) {
const pokemonMove = movePool[m];
const move = pokemonMove.getMove();
let score = moveScores[m];
if (move.category === MoveCategory.STATUS) {
score++;
} else {
const effectiveness = getTypeDamageMultiplier(move.type, target.species.type1) * (target.species.type2 > -1 ? getTypeDamageMultiplier(move.type, target.species.type2) : 1);
let score = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2;
if (score) {
if (move.category === MoveCategory.PHYSICAL) {
if (this.stats[Stat.ATK] > this.stats[Stat.SPATK]) {
const statRatio = this.stats[Stat.SPATK] / this.stats[Stat.ATK];
if (statRatio <= 0.75)
score *= 2;
else if (statRatio <= 0.875)
score *= 1.5;
}
} else {
if (this.stats[Stat.SPATK] > this.stats[Stat.ATK]) {
const statRatio = this.stats[Stat.ATK] / this.stats[Stat.SPATK];
if (statRatio <= 0.75)
score *= 2;
else if (statRatio <= 0.875)
score *= 1.5;
}
}
score += Math.floor(move.power / 5);
}
// could make smarter by checking opponent def/spdef
moveScores[m] = score;
}
}
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 r = 0;
while (r < sortedMovePool.length - 1 && (randomBool = Utils.randInt(2)))
r++;
console.log(movePool.map(m => m.getName()), moveScores, r, sortedMovePool.map(m => m.getName()));
return sortedMovePool[r]
}
}
return new PokemonMove(Moves.STRUGGLE, 0, 0);
}
isPlayer() {
return false;
}
addToParty() {
const party = (this.scene as BattleScene).getParty();
if (party.length < 6)
party.push(new PlayerPokemon(this.scene as BattleScene, this.species, this.level, this));
this.hp = 0;
}
}
enum AiType {
RANDOM,
SMART
};
export enum MoveResult {
EFFECTIVE,
SUPER_EFFECTIVE,
NOT_VERY_EFFECTIVE,
NO_EFFECT,
OTHER
};
export class PokemonMove {
public moveId: integer;
public ppUsed: integer;
public ppUp: integer;
public disableTurns: integer;
constructor(moveId: integer, ppUsed: integer, ppUp: integer) {
this.moveId = moveId;
this.ppUsed = ppUsed;
this.ppUp = ppUp;
this.disableTurns = 0;
}
isUsable(): boolean {
if (this.disableTurns > 0)
return false;
return this.ppUsed < this.getMove().pp + this.ppUp;
}
getMove(): Move {
return allMoves[this.moveId - 1];
}
getName(): string {
return this.getMove().name.toUpperCase();
}
}
+653
View File
@@ -0,0 +1,653 @@
export enum Species {
BULBASAUR = 1,
IVYSAUR,
VENUSAUR,
CHARMANDER,
CHARMELEON,
CHARIZARD,
SQUIRTLE,
WARTORTLE,
BLASTOISE,
CATERPIE,
METAPOD,
BUTTERFREE,
WEEDLE,
KAKUNA,
BEEDRILL,
PIDGEY,
PIDGEOTTO,
PIDGEOT,
RATTATA,
RATICATE,
SPEAROW,
FEAROW,
EKANS,
ARBOK,
PIKACHU,
RAICHU,
SANDSHREW,
SANDSLASH,
NIDORAN_F,
NIDORINA,
NIDOQUEEN,
NIDORAN_M,
NIDORINO,
NIDOKING,
CLEFAIRY,
CLEFABLE,
VULPIX,
NINETALES,
JIGGLYPUFF,
WIGGLYTUFF,
ZUBAT,
GOLBAT,
ODDISH,
GLOOM,
VILEPLUME,
PARAS,
PARASECT,
VENONAT,
VENOMOTH,
DIGLETT,
DUGTRIO,
MEOWTH,
PERSIAN,
PSYDUCK,
GOLDUCK,
MANKEY,
PRIMEAPE,
GROWLITHE,
ARCANINE,
POLIWAG,
POLIWHIRL,
POLIWRATH,
ABRA,
KADABRA,
ALAKAZAM,
MACHOP,
MACHOKE,
MACHAMP,
BELLSPROUT,
WEEPINBELL,
VICTREEBEL,
TENTACOOL,
TENTACRUEL,
GEODUDE,
GRAVELER,
GOLEM,
PONYTA,
RAPIDASH,
SLOWPOKE,
SLOWBRO,
MAGNEMITE,
MAGNETON,
FARFETCHD,
DODUO,
DODRIO,
SEEL,
DEWGONG,
GRIMER,
MUK,
SHELLDER,
CLOYSTER,
GASTLY,
HAUNTER,
GENGAR,
ONIX,
DROWZEE,
HYPNO,
KRABBY,
KINGLER,
VOLTORB,
ELECTRODE,
EXEGGCUTE,
EXEGGUTOR,
CUBONE,
MAROWAK,
HITMONLEE,
HITMONCHAN,
LICKITUNG,
KOFFING,
WEEZING,
RHYHORN,
RHYDON,
CHANSEY,
TANGELA,
KANGASKHAN,
HORSEA,
SEADRA,
GOLDEEN,
SEAKING,
STARYU,
STARMIE,
MR_MIME,
SCYTHER,
JYNX,
ELECTABUZZ,
MAGMAR,
PINSIR,
TAUROS,
MAGIKARP,
GYARADOS,
LAPRAS,
DITTO,
EEVEE,
VAPOREON,
JOLTEON,
FLAREON,
PORYGON,
OMANYTE,
OMASTAR,
KABUTO,
KABUTOPS,
AERODACTYL,
SNORLAX,
ARTICUNO,
ZAPDOS,
MOLTRES,
DRATINI,
DRAGONAIR,
DRAGONITE,
MEWTWO,
MEW,
CHIKORITA,
BAYLEEF,
MEGANIUM,
CYNDAQUIL,
QUILAVA,
TYPHLOSION,
TOTODILE,
CROCONAW,
FERALIGATR,
SENTRET,
FURRET,
HOOTHOOT,
NOCTOWL,
LEDYBA,
LEDIAN,
SPINARAK,
ARIADOS,
CROBAT,
CHINCHOU,
LANTURN,
PICHU,
CLEFFA,
IGGLYBUFF,
TOGEPI,
TOGETIC,
NATU,
XATU,
MAREEP,
FLAAFFY,
AMPHAROS,
BELLOSSOM,
MARILL,
AZUMARILL,
SUDOWOODO,
POLITOED,
HOPPIP,
SKIPLOOM,
JUMPLUFF,
AIPOM,
SUNKERN,
SUNFLORA,
YANMA,
WOOPER,
QUAGSIRE,
ESPEON,
UMBREON,
MURKROW,
SLOWKING,
MISDREAVUS,
UNOWN,
WOBBUFFET,
GIRAFARIG,
PINECO,
FORRETRESS,
DUNSPARCE,
GLIGAR,
STEELIX,
SNUBBULL,
GRANBULL,
QWILFISH,
SCIZOR,
SHUCKLE,
HERACROSS,
SNEASEL,
TEDDIURSA,
URSARING,
SLUGMA,
MAGCARGO,
SWINUB,
PILOSWINE,
CORSOLA,
REMORAID,
OCTILLERY,
DELIBIRD,
MANTINE,
SKARMORY,
HOUNDOUR,
HOUNDOOM,
KINGDRA,
PHANPY,
DONPHAN,
PORYGON2,
STANTLER,
SMEARGLE,
TYROGUE,
HITMONTOP,
SMOOCHUM,
ELEKID,
MAGBY,
MILTANK,
BLISSEY,
RAIKOU,
ENTEI,
SUICUNE,
LARVITAR,
PUPITAR,
TYRANITAR,
LUGIA,
HO_OH,
CELEBI,
TREECKO,
GROVYLE,
SCEPTILE,
TORCHIC,
COMBUSKEN,
BLAZIKEN,
MUDKIP,
MARSHTOMP,
SWAMPERT,
POOCHYENA,
MIGHTYENA,
ZIGZAGOON,
LINOONE,
WURMPLE,
SILCOON,
BEAUTIFLY,
CASCOON,
DUSTOX,
LOTAD,
LOMBRE,
LUDICOLO,
SEEDOT,
NUZLEAF,
SHIFTRY,
TAILLOW,
SWELLOW,
WINGULL,
PELIPPER,
RALTS,
KIRLIA,
GARDEVOIR,
SURSKIT,
MASQUERAIN,
SHROOMISH,
BRELOOM,
SLAKOTH,
VIGOROTH,
SLAKING,
NINCADA,
NINJASK,
SHEDINJA,
WHISMUR,
LOUDRED,
EXPLOUD,
MAKUHITA,
HARIYAMA,
AZURILL,
NOSEPASS,
SKITTY,
DELCATTY,
SABLEYE,
MAWILE,
ARON,
LAIRON,
AGGRON,
MEDITITE,
MEDICHAM,
ELECTRIKE,
MANECTRIC,
PLUSLE,
MINUN,
VOLBEAT,
ILLUMISE,
ROSELIA,
GULPIN,
SWALOT,
CARVANHA,
SHARPEDO,
WAILMER,
WAILORD,
NUMEL,
CAMERUPT,
TORKOAL,
SPOINK,
GRUMPIG,
SPINDA,
TRAPINCH,
VIBRAVA,
FLYGON,
CACNEA,
CACTURNE,
SWABLU,
ALTARIA,
ZANGOOSE,
SEVIPER,
LUNATONE,
SOLROCK,
BARBOACH,
WHISCASH,
CORPHISH,
CRAWDAUNT,
BALTOY,
CLAYDOL,
LILEEP,
CRADILY,
ANORITH,
ARMALDO,
FEEBAS,
MILOTIC,
CASTFORM,
KECLEON,
SHUPPET,
BANETTE,
DUSKULL,
DUSCLOPS,
TROPIUS,
CHIMECHO,
ABSOL,
WYNAUT,
SNORUNT,
GLALIE,
SPHEAL,
SEALEO,
WALREIN,
CLAMPERL,
HUNTAIL,
GOREBYSS,
RELICANTH,
LUVDISC,
BAGON,
SHELGON,
SALAMENCE,
BELDUM,
METANG,
METAGROSS,
REGIROCK,
REGICE,
REGISTEEL,
LATIAS,
LATIOS,
KYOGRE,
GROUDON,
RAYQUAZA,
JIRACHI,
DEOXYS,
TURTWIG,
GROTLE,
TORTERRA,
CHIMCHAR,
MONFERNO,
INFERNAPE,
PIPLUP,
PRINPLUP,
EMPOLEON,
STARLY,
STARAVIA,
STARAPTOR,
BIDOOF,
BIBAREL,
KRICKETOT,
KRICKETUNE,
SHINX,
LUXIO,
LUXRAY,
BUDEW,
ROSERADE,
CRANIDOS,
RAMPARDOS,
SHIELDON,
BASTIODON,
BURMY,
WORMADAM,
MOTHIM,
COMBEE,
VESPIQUEN,
PACHIRISU,
BUIZEL,
FLOATZEL,
CHERUBI,
CHERRIM,
SHELLOS,
GASTRODON,
AMBIPOM,
DRIFLOON,
DRIFBLIM,
BUNEARY,
LOPUNNY,
MISMAGIUS,
HONCHKROW,
GLAMEOW,
PURUGLY,
CHINGLING,
STUNKY,
SKUNTANK,
BRONZOR,
BRONZONG,
BONSLY,
MIME_JR,
HAPPINY,
CHATOT,
SPIRITOMB,
GIBLE,
GABITE,
GARCHOMP,
MUNCHLAX,
RIOLU,
LUCARIO,
HIPPOPOTAS,
HIPPOWDON,
SKORUPI,
DRAPION,
CROAGUNK,
TOXICROAK,
CARNIVINE,
FINNEON,
LUMINEON,
MANTYKE,
SNOVER,
ABOMASNOW,
WEAVILE,
MAGNEZONE,
LICKILICKY,
RHYPERIOR,
TANGROWTH,
ELECTIVIRE,
MAGMORTAR,
TOGEKISS,
YANMEGA,
LEAFEON,
GLACEON,
GLISCOR,
MAMOSWINE,
PORYGON_Z,
GALLADE,
PROBOPASS,
DUSKNOIR,
FROSLASS,
ROTOM,
UXIE,
MESPRIT,
AZELF,
DIALGA,
PALKIA,
HEATRAN,
REGIGIGAS,
GIRATINA,
CRESSELIA,
PHIONE,
MANAPHY,
DARKRAI,
SHAYMIN,
ARCEUS,
VICTINI,
SNIVY,
SERVINE,
SERPERIOR,
TEPIG,
PIGNITE,
EMBOAR,
OSHAWOTT,
DEWOTT,
SAMUROTT,
PATRAT,
WATCHOG,
LILLIPUP,
HERDIER,
STOUTLAND,
PURRLOIN,
LIEPARD,
PANSAGE,
SIMISAGE,
PANSEAR,
SIMISEAR,
PANPOUR,
SIMIPOUR,
MUNNA,
MUSHARNA,
PIDOVE,
TRANQUILL,
UNFEZANT,
BLITZLE,
ZEBSTRIKA,
ROGGENROLA,
BOLDORE,
GIGALITH,
WOOBAT,
SWOOBAT,
DRILBUR,
EXCADRILL,
AUDINO,
TIMBURR,
GURDURR,
CONKELDURR,
TYMPOLE,
PALPITOAD,
SEISMITOAD,
THROH,
SAWK,
SEWADDLE,
SWADLOON,
LEAVANNY,
VENIPEDE,
WHIRLIPEDE,
SCOLIPEDE,
COTTONEE,
WHIMSICOTT,
PETILIL,
LILLIGANT,
BASCULIN,
SANDILE,
KROKOROK,
KROOKODILE,
DARUMAKA,
DARMANITAN,
MARACTUS,
DWEBBLE,
CRUSTLE,
SCRAGGY,
SCRAFTY,
SIGILYPH,
YAMASK,
COFAGRIGUS,
TIRTOUGA,
CARRACOSTA,
ARCHEN,
ARCHEOPS,
TRUBBISH,
GARBODOR,
ZORUA,
ZOROARK,
MINCCINO,
CINCCINO,
GOTHITA,
GOTHORITA,
GOTHITELLE,
SOLOSIS,
DUOSION,
REUNICLUS,
DUCKLETT,
SWANNA,
VANILLITE,
VANILLISH,
VANILLUXE,
DEERLING,
SAWSBUCK,
EMOLGA,
KARRABLAST,
ESCAVALIER,
FOONGUS,
AMOONGUSS,
FRILLISH,
JELLICENT,
ALOMOMOLA,
JOLTIK,
GALVANTULA,
FERROSEED,
FERROTHORN,
KLINK,
KLANG,
KLINKLANG,
TYNAMO,
EELEKTRIK,
EELEKTROSS,
ELGYEM,
BEHEEYEM,
LITWICK,
LAMPENT,
CHANDELURE,
AXEW,
FRAXURE,
HAXORUS,
CUBCHOO,
BEARTIC,
CRYOGONAL,
SHELMET,
ACCELGOR,
STUNFISK,
MIENFOO,
MIENSHAO,
DRUDDIGON,
GOLETT,
GOLURK,
PAWNIARD,
BISHARP,
BOUFFALANT,
RUFFLET,
BRAVIARY,
VULLABY,
MANDIBUZZ,
HEATMOR,
DURANT,
DEINO,
ZWEILOUS,
HYDREIGON,
LARVESTA,
VOLCARONA,
COBALION,
TERRAKION,
VIRIZION,
TORNADUS,
THUNDURUS,
RESHIRAM,
ZEKROM,
LANDORUS,
KYUREM,
KELDEO,
MELOETTA,
GENESECT,
XERNEAS = 716,
YVELTAL
};
File diff suppressed because it is too large. Load diff
+56
View File
@@ -0,0 +1,56 @@
export enum TextStyle {
MESSAGE,
WINDOW,
PARTY
};
export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle) {
let styleOptions;
let shadowColor;
switch (style) {
case TextStyle.WINDOW:
styleOptions = {
fontFamily: 'emerald',
fontSize: '96px',
color: '#484848',
padding: {
bottom: 6
}
};
shadowColor = '#d0d0c8';
break;
case TextStyle.MESSAGE:
styleOptions = {
fontFamily: 'emerald',
fontSize: '96px',
color: '#f8f8f8',
padding: {
bottom: 6
}
};
shadowColor = '#6b5a73';
break;
case TextStyle.PARTY:
styleOptions = {
fontFamily: 'pkmnems',
fontSize: '66px',
color: '#f8f8f8',
padding: {
bottom: 6
}
};
shadowColor = '#707070';
break;
}
if (extraStyleOptions)
styleOptions = Object.assign(styleOptions, extraStyleOptions);
const ret = scene.add.text(x, y, content, styleOptions);
ret.setScale(0.1666666667);
ret.setShadow(6, 6, shadowColor);
ret.setLineSpacing(5);
return ret;
}
+492
View File
@@ -0,0 +1,492 @@
export enum Type {
NORMAL = 0,
FIGHTING,
FLYING,
POISON,
GROUND,
ROCK,
BUG,
GHOST,
STEEL,
FIRE,
WATER,
GRASS,
ELECTRIC,
PSYCHIC,
ICE,
DRAGON,
DARK,
FAIRY
};
export function getTypeDamageMultiplier(attackType: integer, defType: integer) {
switch (defType) {
case Type.NORMAL:
switch (attackType) {
case Type.FIGHTING:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.GROUND:
case Type.ROCK:
case Type.BUG:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.ICE:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.GHOST:
default:
return 0;
}
case Type.FIGHTING:
switch (attackType) {
case Type.FLYING:
case Type.PSYCHIC:
case Type.FAIRY:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.POISON:
case Type.GROUND:
case Type.GHOST:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.ICE:
case Type.DRAGON:
case Type.DARK:
return 1;
case Type.ROCK:
case Type.BUG:
return 0.5;
default:
return 0;
}
case Type.FLYING:
switch (attackType) {
case Type.ROCK:
case Type.ELECTRIC:
case Type.ICE:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.GHOST:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.PSYCHIC:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.FIGHTING:
case Type.BUG:
case Type.GRASS:
return 0.5;
case Type.GROUND:
default:
return 0;
}
case Type.POISON:
switch (attackType) {
case Type.GROUND:
case Type.PSYCHIC:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.ROCK:
case Type.GHOST:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.ELECTRIC:
case Type.ICE:
case Type.DRAGON:
case Type.DARK:
return 1;
case Type.FIGHTING:
case Type.POISON:
case Type.BUG:
case Type.GRASS:
case Type.FAIRY:
return 0.5;
default:
return 0;
}
case Type.GROUND:
switch (attackType) {
case Type.WATER:
case Type.GRASS:
case Type.ICE:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.FLYING:
case Type.GROUND:
case Type.BUG:
case Type.GHOST:
case Type.STEEL:
case Type.FIRE:
case Type.PSYCHIC:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.POISON:
case Type.ROCK:
return 0.5;
case Type.ELECTRIC:
default:
return 0;
}
case Type.ROCK:
switch (attackType) {
case Type.FIGHTING:
case Type.GROUND:
case Type.STEEL:
case Type.WATER:
case Type.GRASS:
return 2;
case Type.ROCK:
case Type.BUG:
case Type.GHOST:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.ICE:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.FIRE:
return 0.5;
default:
return 0;
}
case Type.BUG:
switch (attackType) {
case Type.FLYING:
case Type.ROCK:
case Type.FIRE:
return 2;
case Type.NORMAL:
case Type.POISON:
case Type.BUG:
case Type.GHOST:
case Type.STEEL:
case Type.WATER:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.ICE:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.FIGHTING:
case Type.GROUND:
case Type.GRASS:
return 0.5;
default:
return 0;
}
case Type.GHOST:
switch (attackType) {
case Type.GHOST:
case Type.DARK:
return 2;
case Type.FLYING:
case Type.GROUND:
case Type.ROCK:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.ICE:
case Type.DRAGON:
case Type.FAIRY:
return 1;
case Type.POISON:
case Type.BUG:
return 0.5;
case Type.NORMAL:
case Type.FIGHTING:
default:
return 0;
}
case Type.STEEL:
switch (attackType) {
case Type.FIGHTING:
case Type.GROUND:
case Type.FIRE:
return 2;
case Type.GHOST:
case Type.WATER:
case Type.ELECTRIC:
case Type.DARK:
return 1;
case Type.NORMAL:
case Type.FLYING:
case Type.ROCK:
case Type.BUG:
case Type.STEEL:
case Type.GRASS:
case Type.PSYCHIC:
case Type.ICE:
case Type.DRAGON:
case Type.FAIRY:
return 0.5;
case Type.POISON:
default:
return 0;
}
case Type.FIRE:
switch (attackType) {
case Type.GROUND:
case Type.ROCK:
case Type.WATER:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.FLYING:
case Type.POISON:
case Type.GHOST:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.DRAGON:
case Type.DARK:
return 1;
case Type.BUG:
case Type.STEEL:
case Type.FIRE:
case Type.GRASS:
case Type.ICE:
case Type.FAIRY:
return 0.5;
default:
return 0;
}
case Type.WATER:
switch (attackType) {
case Type.GRASS:
case Type.ELECTRIC:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.FLYING:
case Type.POISON:
case Type.GROUND:
case Type.ROCK:
case Type.BUG:
case Type.GHOST:
case Type.PSYCHIC:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.ICE:
return 0.5;
default:
return 0;
}
case Type.GRASS:
switch (attackType) {
case Type.FLYING:
case Type.POISON:
case Type.BUG:
case Type.FIRE:
case Type.ICE:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.ROCK:
case Type.GHOST:
case Type.STEEL:
case Type.PSYCHIC:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.GROUND:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
return 0.5;
default:
return 0;
}
case Type.ELECTRIC:
switch (attackType) {
case Type.GROUND:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.POISON:
case Type.ROCK:
case Type.BUG:
case Type.GHOST:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.PSYCHIC:
case Type.ICE:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.FLYING:
case Type.STEEL:
case Type.ELECTRIC:
return 0.5;
default:
return 0;
}
case Type.PSYCHIC:
switch (attackType) {
case Type.BUG:
case Type.GHOST:
case Type.DARK:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.GROUND:
case Type.ROCK:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.ICE:
case Type.DRAGON:
case Type.FAIRY:
return 1;
case Type.FIGHTING:
case Type.PSYCHIC:
return 0.5;
default:
return 0;
}
case Type.ICE:
switch (attackType) {
case Type.FIGHTING:
case Type.ROCK:
case Type.STEEL:
case Type.FIRE:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.GROUND:
case Type.BUG:
case Type.GHOST:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.DRAGON:
case Type.DARK:
case Type.FAIRY:
return 1;
case Type.ICE:
return 0.5;
default:
return 0;
}
case Type.DRAGON:
switch (attackType) {
case Type.ICE:
case Type.DRAGON:
case Type.FAIRY:
return 2;
case Type.NORMAL:
case Type.FIGHTING:
case Type.FLYING:
case Type.POISON:
case Type.GROUND:
case Type.ROCK:
case Type.BUG:
case Type.GHOST:
case Type.STEEL:
case Type.PSYCHIC:
case Type.DARK:
return 1;
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
return 0.5;
default:
return 0;
}
case Type.DARK:
switch (attackType) {
case Type.FIGHTING:
case Type.BUG:
case Type.FAIRY:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.GROUND:
case Type.ROCK:
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.ICE:
case Type.DRAGON:
return 1;
case Type.GHOST:
case Type.DARK:
return 0.5;
case Type.PSYCHIC:
default:
return 0;
}
case Type.FAIRY:
switch (attackType) {
case Type.POISON:
case Type.STEEL:
return 2;
case Type.NORMAL:
case Type.FLYING:
case Type.GROUND:
case Type.ROCK:
case Type.GHOST:
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
case Type.PSYCHIC:
case Type.ICE:
case Type.FAIRY:
return 1;
case Type.FIGHTING:
case Type.BUG:
case Type.DARK:
return 0.5;
case Type.DRAGON:
default:
return 0;
}
}
}
+12
View File
@@ -0,0 +1,12 @@
import BattleScene from "../battle-scene";
import { Mode } from "./ui";
import UiHandler from "./uiHandler";
export default abstract class AwaitableUiHandler extends UiHandler {
protected awaitingActionInput: boolean;
protected onActionInput: Function;
constructor(scene: BattleScene, mode: Mode) {
super(scene, mode);
}
}
+129
View File
@@ -0,0 +1,129 @@
import BattleScene from "../battle-scene";
import { addTextObject, TextStyle } from "../text";
import UI, { Mode } from "./ui";
import * as Utils from "../utils";
import MessageUiHandler from "./message-ui-handler";
import { getStatName, Stat } from "../pokemon-stat";
export default class BattleMessageUiHandler extends MessageUiHandler {
private levelUpStatsContainer: Phaser.GameObjects.Container;
private levelUpStatsIncrContent: Phaser.GameObjects.Text;
private levelUpStatsValuesContent: Phaser.GameObjects.Text;
public bg: Phaser.GameObjects.Image;
constructor(scene: BattleScene) {
super(scene, Mode.MESSAGE);
}
setup() {
const ui = this.getUi();
this.textTimer = null;
this.textCallbackTimer = null;
const bg = this.scene.add.image(0, 0, 'bg');
bg.setOrigin(0, 1);
ui.add(bg);
this.bg = bg;
const messageContainer = this.scene.add.container(12, -39);
ui.add(messageContainer);
const message = addTextObject(this.scene, 0, 0, '', TextStyle.MESSAGE, {
maxLines: 2,
wordWrap: {
width: 1780
}
});
messageContainer.add(message);
this.message = message;
const prompt = this.scene.add.sprite(0, 0, 'prompt');
prompt.setVisible(false);
prompt.setOrigin(0, 0);
messageContainer.add(prompt);
this.prompt = prompt;
const levelUpStatsContainer = this.scene.add.container(0, 0);
levelUpStatsContainer.setVisible(false);
ui.add(levelUpStatsContainer);
this.levelUpStatsContainer = levelUpStatsContainer;
const levelUpStatsBg = this.scene.add.image((this.scene.game.canvas.width / 6), -100, 'level_up_stats');
levelUpStatsBg.setOrigin(1, 0);
levelUpStatsContainer.add(levelUpStatsBg);
const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 111, -94, '', TextStyle.WINDOW, { maxLines: 6 });
let levelUpStatsLabelText = '';
const stats = Utils.getEnumValues(Stat);
for (let s of stats)
levelUpStatsLabelText += `${getStatName(s)}\n`;
levelUpStatsLabelsContent.text = levelUpStatsLabelText;
levelUpStatsContainer.add(levelUpStatsLabelsContent);
const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, '+\n+\n+\n+\n+\n+', TextStyle.WINDOW, { maxLines: 6 });
levelUpStatsContainer.add(levelUpStatsIncrContent);
this.levelUpStatsIncrContent = levelUpStatsIncrContent;
const levelUpStatsValuesContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, '', TextStyle.WINDOW, { maxLines: 6 });
levelUpStatsValuesContent.setOrigin(1, 0);
levelUpStatsContainer.add(levelUpStatsValuesContent);
this.levelUpStatsValuesContent = levelUpStatsValuesContent;
}
show(args: any[]) {
super.show(args);
this.bg.setTexture('bg');
this.message.setWordWrapWidth(1780);
}
processInput(keyCode: integer) {
const ui = this.getUi();
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
if (this.awaitingActionInput) {
if (keyCode === keyCodes.X || keyCode === keyCodes.Z) {
if (this.onActionInput) {
ui.playSelect();
const originalOnActionInput = this.onActionInput;
this.onActionInput = null;
originalOnActionInput();
}
}
}
}
clear() {
super.clear();
}
promptLevelUpStats(prevStats: integer[], showTotals: boolean, callback?: Function) {
const newStats = (this.scene as BattleScene).getPlayerPokemon().stats;
let levelUpStatsValuesText = '';
const stats = Utils.getEnumValues(Stat);
for (let s of stats)
levelUpStatsValuesText += `${showTotals ? newStats[s] : newStats[s] - prevStats[s]}\n`;
this.levelUpStatsValuesContent.text = levelUpStatsValuesText;
this.levelUpStatsIncrContent.setVisible(!showTotals);
this.levelUpStatsContainer.setVisible(true);
this.awaitingActionInput = true;
this.onActionInput = () => {
if (!showTotals)
this.promptLevelUpStats(null, true, callback);
else {
this.levelUpStatsContainer.setVisible(false);
if (callback)
callback();
}
};
}
}
+124
View File
@@ -0,0 +1,124 @@
import { CommandPhase } from "../battle-phase";
import BattleScene from "../battle-scene";
import { addTextObject, TextStyle } from "../text";
import { toPokemonUpperCase } from "../utils";
import UI, { Mode } from "./ui";
import UiHandler from "./uiHandler";
export enum Command {
FIGHT = 0,
BALL,
POKEMON,
RUN
};
export default class CommandUiHandler extends UiHandler {
private commandsContainer: Phaser.GameObjects.Container;
private cursorObj: Phaser.GameObjects.Image;
constructor(scene: BattleScene) {
super(scene, Mode.COMMAND);
}
setup() {
const ui = this.getUi();
const commands = [ 'Fight', 'Ball', 'Pokémon', 'Run' ].map(s => toPokemonUpperCase(s));
this.commandsContainer = this.scene.add.container(216, -38.7);
this.commandsContainer.setVisible(false);
ui.add(this.commandsContainer);
for (let c = 0; c < commands.length; c++) {
const commandText = addTextObject(this.scene, c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW);
this.commandsContainer.add(commandText);
}
}
show(args: any[]) {
super.show(args);
this.commandsContainer.setVisible(true);
const messageHandler = this.getUi().getMessageHandler();
messageHandler.bg.setTexture('bg_command');
messageHandler.message.setWordWrapWidth(1110);
messageHandler.showText(`What will\n${(this.scene as BattleScene).getPlayerPokemon().name} do?`, 0);
this.setCursor(this.cursor);
}
processInput(keyCode: integer) {
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
const ui = this.getUi();
let success = false;
if (keyCode === keyCodes.X || keyCode === keyCodes.Z) {
if (keyCode === keyCodes.Z) {
switch (this.cursor) {
case 0:
ui.setMode(Mode.FIGHT);
success = true;
break;
case 1:
(this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.BALL, this.cursor);
success = true;
break;
case 2:
ui.setMode(Mode.PARTY);
success = true;
break;
}
}
} else {
switch (keyCode) {
case keyCodes.UP:
if (this.cursor >= 2)
success = this.setCursor(this.cursor - 2);
break;
case keyCodes.DOWN:
if (this.cursor < 2)
success = this.setCursor(this.cursor + 2);
break;
case keyCodes.LEFT:
if (this.cursor % 2 === 1)
success = this.setCursor(this.cursor - 1);
break;
case keyCodes.RIGHT:
if (this.cursor % 2 === 0)
success = this.setCursor(this.cursor + 1);
break;
}
}
if (success)
ui.playSelect();
}
setCursor(cursor: integer): boolean {
const ui = this.getUi();
const ret = super.setCursor(cursor);
if (!this.cursorObj) {
this.cursorObj = this.scene.add.image(0, 0, 'cursor');
ui.add(this.cursorObj);
}
this.cursorObj.setPosition(211 + (cursor % 2 === 1 ? 56 : 0), -31 + (cursor >= 2 ? 16 : 0));
return ret;
}
clear() {
super.clear();
this.commandsContainer.setVisible(false);
this.getUi().getMessageHandler().clearText();
this.eraseCursor();
}
eraseCursor() {
if (this.cursorObj)
this.cursorObj.destroy();
this.cursorObj = null;
}
}
+113
View File
@@ -0,0 +1,113 @@
import { CommandPhase } from "../battle-phase";
import BattleScene from "../battle-scene";
import { addTextObject, TextStyle } from "../text";
import { Command } from "./command-ui-handler";
import BattleMessageUiHandler from "./battle-message-ui-handler";
import UI, { Mode } from "./ui";
import UiHandler from "./uiHandler";
export default class FightUiHandler extends UiHandler {
private movesContainer: Phaser.GameObjects.Container;
private cursorObj: Phaser.GameObjects.Image;
constructor(scene: BattleScene) {
super(scene, Mode.FIGHT);
}
setup() {
const ui = this.getUi();
const movesContainer = this.scene.add.container(18, -38.7);
ui.add(movesContainer);
this.movesContainer = movesContainer;
}
show(args: any[]) {
super.show(args);
const messageHandler = this.getUi().getMessageHandler();
messageHandler.bg.setTexture('bg_fight');
this.setCursor(this.cursor);
this.displayMoves();
}
processInput(keyCode: integer) {
const ui = this.getUi();
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
let success = false;
if (keyCode === keyCodes.X || keyCode === keyCodes.Z) {
if (keyCode === keyCodes.Z) {
if (((this.scene as BattleScene).getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, this.cursor))
success = true;
} else {
ui.setMode(Mode.COMMAND);
success = true;
}
} else {
switch (keyCode) {
case keyCodes.UP:
if (this.cursor >= 2)
success = this.setCursor(this.cursor - 2);
break;
case keyCodes.DOWN:
if (this.cursor < 2)
success = this.setCursor(this.cursor + 2);
break;
case keyCodes.LEFT:
if (this.cursor % 2 === 1)
success = this.setCursor(this.cursor - 1);
break;
case keyCodes.RIGHT:
if (this.cursor % 2 === 0)
success = this.setCursor(this.cursor + 1);
break;
}
}
if (success)
ui.playSelect();
}
setCursor(cursor: integer): boolean {
const ui = this.getUi();
const ret = super.setCursor(cursor);
if (!this.cursorObj) {
this.cursorObj = this.scene.add.image(0, 0, 'cursor');
ui.add(this.cursorObj);
}
this.cursorObj.setPosition(13 + (cursor % 2 === 1 ? 100 : 0), -31 + (cursor >= 2 ? 15 : 0));
return ret;
}
displayMoves() {
const moveset = (this.scene as BattleScene).getPlayerPokemon().moveset;
for (let m = 0; m < 4; m++) {
const moveText = addTextObject(this.scene, m % 2 === 0 ? 0 : 100, m < 2 ? 0 : 16, '-', TextStyle.WINDOW);
if (m < moveset.length)
moveText.setText(moveset[m].getName());
this.movesContainer.add(moveText);
}
}
clear() {
super.clear();
this.clearMoves();
this.eraseCursor();
}
clearMoves() {
this.movesContainer.removeAll(true);
}
eraseCursor() {
if (this.cursorObj)
this.cursorObj.destroy();
this.cursorObj = null;
}
}
+105
View File
@@ -0,0 +1,105 @@
import BattleScene from "../battle-scene";
import AwaitableUiHandler from "./awaitable-ui-handler";
import { Mode } from "./ui";
export default abstract class MessageUiHandler extends AwaitableUiHandler {
protected textTimer: Phaser.Time.TimerEvent;
protected textCallbackTimer: Phaser.Time.TimerEvent;
protected pendingPrompt: boolean;
public message: Phaser.GameObjects.Text;
public prompt: Phaser.GameObjects.Sprite;
constructor(scene: BattleScene, mode: Mode) {
super(scene, mode);
this.pendingPrompt = false;
}
showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean) {
if (delay === null || delay === undefined)
delay = 20;
if (this.textTimer) {
this.textTimer.remove();
if (this.textCallbackTimer)
this.textCallbackTimer.callback();
};
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();
}
};
};
}
if (delay) {
this.clearText();
if (prompt)
this.pendingPrompt = true;
this.textTimer = this.scene.time.addEvent({
delay: delay,
callback: () => {
this.message.setText(text.slice(0, text.length - this.textTimer.repeatCount));
if (callback && !this.textTimer.repeatCount) {
if (callbackDelay && !prompt) {
this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => {
if (this.textCallbackTimer) {
this.textCallbackTimer.destroy();
this.textCallbackTimer = null;
}
callback();
});
} else
callback();
}
},
repeat: text.length
});
} else {
this.message.setText(text);
if (prompt)
this.pendingPrompt = true;
if (callback)
callback();
}
}
clearText() {
this.message.setText('');
this.pendingPrompt = false;
}
clear() {
super.clear();
}
}
+3
View File
@@ -0,0 +1,3 @@
import BattleScene from "../battle-scene";
import { Modifier } from "../modifier";
+290
View File
@@ -0,0 +1,290 @@
import { SwitchPhase, SwitchSummonPhase } from "../battle-phase";
import BattleScene from "../battle-scene";
import { ModifierTier, ModifierType } from "../modifier";
import { getPokeballAtlasKey, PokeballType } from "../pokeball";
import { addTextObject, TextStyle } from "../text";
import AwaitableUiHandler from "./awaitable-ui-handler";
import { Mode } from "./ui";
export default class ModifierSelectUiHandler extends AwaitableUiHandler {
private overlayBg: Phaser.GameObjects.Rectangle;
private modifierContainer: Phaser.GameObjects.Container;
private options: ModifierOption[];
private cursorObj: Phaser.GameObjects.Image;
constructor(scene: BattleScene) {
super(scene, Mode.SWITCH_CHECK);
this.options = [];
}
setup() {
const ui = this.getUi();
const overlayWidth = this.scene.game.canvas.width / 6;
const overlayHeight = (this.scene.game.canvas.height / 6) - 48;
this.overlayBg = this.scene.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242);
this.overlayBg.setOrigin(0, 0);
this.overlayBg.setAlpha(0);
ui.add(this.overlayBg);
this.modifierContainer = this.scene.add.container(0, 0);
ui.add(this.modifierContainer);
}
show(args: any[]) {
if (this.active || args.length !== 2 || !(args[0] instanceof Array) || !args[0].length || !(args[1] instanceof Function))
return;
super.show(args);
this.getUi().clearText();
const types = args[0] as ModifierType[];
for (let m = 0; m < types.length; m++) {
const sliceWidth = (this.scene.game.canvas.width / 6) / (types.length + 2);
const option = new ModifierOption(this.scene, sliceWidth * (m + 1) + (sliceWidth * 0.5), -this.scene.game.canvas.height / 12 - 24, types[m]);
option.setScale(0.5);
this.scene.add.existing(option);
this.modifierContainer.add(option);
this.options.push(option);
}
this.scene.tweens.add({
targets: this.overlayBg,
alpha: 0.5,
ease: 'Sine.easeOut',
duration: 750
});
let i = 0;
this.scene.tweens.addCounter({
ease: 'Sine.easeIn',
duration: 1250,
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);
}
});
this.scene.time.delayedCall(4000, () => {
this.setCursor(0);
this.awaitingActionInput = true;
this.onActionInput = args[1];
});
}
processInput(keyCode: integer) {
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
const ui = this.getUi();
if (!this.awaitingActionInput)
return;
let success = false;
if (keyCode === keyCodes.Z) {
success = true;
if (this.onActionInput)
this.onActionInput(this.cursor);
} else if (keyCode === keyCodes.X) {
success = true;
if (this.onActionInput)
this.onActionInput(-1);
} else {
switch (keyCode) {
case keyCodes.LEFT:
if (this.cursor)
success = this.setCursor(this.cursor - 1);
break;
case keyCodes.RIGHT:
if (this.cursor < this.options.length - 1)
success = this.setCursor(this.cursor + 1);
break;
}
}
if (success)
ui.playSelect();
}
setCursor(cursor: integer): boolean {
const ui = this.getUi();
const ret = super.setCursor(cursor);
if (!this.cursorObj) {
this.cursorObj = this.scene.add.image(0, 0, 'cursor');
this.cursorObj.setScale(2);
this.modifierContainer.add(this.cursorObj);
}
const sliceWidth = (this.scene.game.canvas.width / 6) / (this.options.length + 2);
this.cursorObj.setPosition(sliceWidth * (cursor + 1) + (sliceWidth * 0.5) - 20, -this.scene.game.canvas.height / 12 - 20);
ui.showText(this.options[this.cursor].modifierType.description);
return ret;
}
clear() {
super.clear();
this.awaitingActionInput = false;
this.onActionInput = null;
this.getUi().clearText();
this.eraseCursor();
this.scene.tweens.add({
targets: this.overlayBg,
alpha: 0,
duration: 250,
ease: 'Cubic.easeIn'
});
this.scene.tweens.add({
targets: this.options,
scale: 0.01,
duration: 250,
east: 'Elastic.easeIn',
onComplete: () => {
this.options.forEach(o => o.destroy());
this.options.splice(0, this.options.length);
}
});
}
eraseCursor() {
if (this.cursorObj)
this.cursorObj.destroy();
this.cursorObj = null;
}
}
class ModifierOption extends Phaser.GameObjects.Container {
public modifierType: ModifierType;
private pb: Phaser.GameObjects.Sprite;
private itemContainer: Phaser.GameObjects.Container;
private item: Phaser.GameObjects.Sprite;
private itemTint: Phaser.GameObjects.Sprite;
private itemText: Phaser.GameObjects.Text;
constructor(scene: BattleScene, x: number, y: number, modifierType: ModifierType) {
super(scene, x, y);
this.modifierType = modifierType;
this.setup();
}
setup() {
this.pb = this.scene.add.sprite(0, -150, 'pb', this.getPbAtlasKey());
this.pb.setScale(2);
this.add(this.pb);
this.itemContainer = this.scene.add.container(0, 0);
this.itemContainer.setScale(0.5);
this.itemContainer.setAlpha(0);
this.add(this.itemContainer);
const getItem = () => {
const item = this.scene.add.sprite(0, 0, 'items', this.modifierType.iconImage);
return item;
};
this.item = getItem();
this.itemContainer.add(this.item);
this.itemTint = getItem();
this.itemTint.setTintFill(Phaser.Display.Color.GetColor(255, 192, 255));
this.itemContainer.add(this.itemTint);
this.itemText = addTextObject(this.scene, 0, 35, this.modifierType.name, TextStyle.PARTY, { align: 'center' });
this.itemText.setOrigin(0.5, 0);
this.itemText.setAlpha(0);
this.itemText.setTint(this.getTextTint());
this.add(this.itemText);
}
show(remainingDuration: integer) {
this.scene.tweens.add({
targets: this.pb,
y: 0,
duration: 1250,
ease: 'Bounce.Out'
});
let lastValue = 1;
let bounceCount = 0;
let bounce = false;
this.scene.tweens.addCounter({
from: 1,
to: 0,
duration: 1250,
ease: 'Bounce.Out',
onUpdate: t => {
const value = t.getValue();
if (!bounce && value > lastValue) {
this.scene.sound.play('pb_bounce_1', { volume: 1 / ++bounceCount });
bounce = true;
} else if (bounce && value < lastValue)
bounce = false;
lastValue = value;
}
});
this.scene.time.delayedCall(remainingDuration + 2000, () => {
this.pb.setTexture('pb', `${this.getPbAtlasKey()}_open`);
this.scene.sound.play('pb_rel');
this.scene.tweens.add({
targets: this.pb,
duration: 500,
delay: 250,
ease: 'Sine.easeIn',
alpha: 0,
onComplete: () => this.pb.destroy()
})
this.scene.tweens.add({
targets: this.itemContainer,
duration: 500,
ease: 'Elastic.Out',
scale: 2,
alpha: 1
});
this.scene.tweens.add({
targets: this.itemTint,
alpha: 0,
duration: 500,
ease: 'Sine.easeIn',
onComplete: () => this.itemTint.destroy()
});
this.scene.tweens.add({
targets: this.itemText,
duration: 500,
alpha: 1,
y: 25,
ease: 'Cubic.easeInOut'
});
})
}
getPbAtlasKey() {
return getPokeballAtlasKey(this.modifierType.tier as unknown as PokeballType);
}
getTextTint(): integer {
switch (this.modifierType.tier) {
case ModifierTier.COMMON:
return 0xffffff
case ModifierTier.GREAT:
return 0x3890f8;
case ModifierTier.ULTRA:
return 0xf8d038
case ModifierTier.MASTER:
return 0xe020c0;
}
}
}
+372
View File
@@ -0,0 +1,372 @@
import { CommandPhase } from "../battle-phase";
import BattleScene from "../battle-scene";
import { PlayerPokemon } from "../pokemon";
import { addTextObject, TextStyle } from "../text";
import { Command } from "./command-ui-handler";
import MessageUiHandler from "./message-ui-handler";
import UI, { Mode } from "./ui";
const defaultMessage = 'Choose a Pokémon.';
export default class PartyUiHandler extends MessageUiHandler {
private partyContainer: Phaser.GameObjects.Container;
private partySlotsContainer: Phaser.GameObjects.Container;
private partySlots: PartySlot[];
private partyCancelButton: PartyCancelButton;
private partyMessageBox: Phaser.GameObjects.Image;
private lastCursor: integer = 0;
private isModal: boolean;
private selectCallback: Function;
private selectFilter: Function;
private static FilterAll = (_pokemon: PlayerPokemon) => null;
public static FilterNonFainted = (pokemon: PlayerPokemon) => {
if (!pokemon.hp)
return `${pokemon.name} has no energy\nleft to battle!`;
return null;
};
public static NoEffectMessage = 'It won\'t have any effect.';
constructor(scene: BattleScene) {
super(scene, Mode.PARTY);
}
setup() {
const ui = this.getUi();
const partyContainer = this.scene.add.container(0, 0);
partyContainer.setVisible(false);
ui.add(partyContainer);
this.partyContainer = partyContainer;
const partyBg = this.scene.add.image(0, 0, 'party_bg');
partyContainer.add(partyBg);
partyBg.setOrigin(0, 1);
const partySlotsContainer = this.scene.add.container(0, 0);
partyContainer.add(partySlotsContainer);
this.partySlotsContainer = partySlotsContainer;
const partyMessageBoxContainer = this.scene.add.container(0, -32);
partyContainer.add(partyMessageBoxContainer);
const partyMessageBox = this.scene.add.image(1, 31, 'party_message');
partyMessageBox.setOrigin(0, 1);
partyMessageBoxContainer.add(partyMessageBox);
this.partyMessageBox = partyMessageBox;
const partyMessageText = addTextObject(this.scene, 8, 10, defaultMessage, TextStyle.WINDOW, { maxLines: 2 });
partyMessageText.setPositionRelative
partyMessageText.setOrigin(0, 0);
partyMessageBoxContainer.add(partyMessageText);
this.message = partyMessageText;
const partyCancelButton = new PartyCancelButton(this.scene, 291, -16);
partyContainer.add(partyCancelButton);
this.partyCancelButton = partyCancelButton;
this.partySlots = [];
}
show(args: any[]) {
super.show(args);
this.partyContainer.setVisible(true);
this.populatePartySlots();
this.setCursor(this.cursor < 6 ? this.cursor : 0);
this.isModal = args.length && args[0];
if (args.length > 1 && args[1] instanceof Function)
this.selectCallback = args[1];
this.selectFilter = args.length > 2 && args[2] instanceof Function
? args[2]
: PartyUiHandler.FilterAll;
}
processInput(keyCode: integer) {
const ui = this.getUi();
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
if (this.pendingPrompt)
return;
if (this.awaitingActionInput) {
if (keyCode === keyCodes.Z || keyCode === keyCodes.X) {
if (this.onActionInput) {
ui.playSelect();
const originalOnActionInput = this.onActionInput;
this.onActionInput = null;
originalOnActionInput();
this.awaitingActionInput = false;
}
}
return;
}
if (keyCode === keyCodes.Z) {
if (this.cursor < 6) {
let filterResult: string = this.selectFilter(this.scene.getParty()[this.cursor]);
if (filterResult === null) {
if (this.selectCallback) {
const selectCallback = this.selectCallback;
this.selectCallback = null;
selectCallback(this.cursor);
return;
} else if (this.cursor)
(this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor);
else
this.processInput(keyCodes.X);
} else {
this.partyMessageBox.setTexture('party_message_large');
this.message.y -= 15;
this.showText(filterResult as string, null, () => {
this.partyMessageBox.setTexture('party_message');
this.message.text = defaultMessage;
this.message.y += 15;
}, null, true);
}
} else if (this.isModal)
ui.playError();
else
this.processInput(keyCodes.X);
return;
} else if (keyCode === keyCodes.X) {
if (!this.isModal) {
if (this.selectCallback) {
const selectCallback = this.selectCallback;
this.selectCallback = null;
selectCallback(6);
ui.playSelect();
} else {
ui.setMode(Mode.COMMAND);
ui.playSelect();
}
}
return;
}
const slotCount = this.partySlots.length;
let success = false;
switch (keyCode) {
case keyCodes.UP:
success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6);
break;
case keyCodes.DOWN:
success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0);
break;
case keyCodes.LEFT:
if (this.cursor && this.cursor < 6)
success = this.setCursor(0);
break;
case keyCodes.RIGHT:
if (!this.cursor)
success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || 1 : 1);
break;
}
if (success)
ui.playSelect();
}
setCursor(cursor: integer): boolean {
const changed = this.cursor !== cursor;
if (changed) {
this.lastCursor = this.cursor;
this.cursor = cursor;
if (this.lastCursor < 6)
this.partySlots[this.lastCursor].deselect();
else if (this.lastCursor === 6)
this.partyCancelButton.deselect();
if (cursor < 6)
this.partySlots[cursor].select();
else if (cursor === 6)
this.partyCancelButton.select();
}
return changed;
}
populatePartySlots() {
const party = (this.scene as BattleScene).getParty();
if (this.cursor < 6 && this.cursor >= party.length)
this.cursor = party.length - 1;
else if (this.cursor === 6)
this.partyCancelButton.select();
for (let p in party) {
const slotIndex = parseInt(p);
const partySlot = new PartySlot(this.scene as BattleScene, slotIndex, party[p]);
this.scene.add.existing(partySlot);
this.partySlotsContainer.add(partySlot);
this.partySlots.push(partySlot);
if (this.cursor === slotIndex)
partySlot.select();
}
}
clear() {
super.clear();
this.partyContainer.setVisible(false);
this.clearPartySlots();
}
clearPartySlots() {
this.partySlots.splice(0, this.partySlots.length);
this.partySlotsContainer.removeAll(true);
}
}
class PartySlot extends Phaser.GameObjects.Container {
private selected: boolean;
private slotIndex: integer;
private pokemon: PlayerPokemon;
private slotBg: Phaser.GameObjects.Image;
private slotPb: Phaser.GameObjects.Sprite;
private slotPokemonIcon: Phaser.GameObjects.Sprite;
private slotHpOverlay: Phaser.GameObjects.Sprite;
constructor(scene: BattleScene, slotIndex: integer, pokemon: PlayerPokemon) {
super(scene, slotIndex ? 230.5 : 64, slotIndex ? -184 + 28 * slotIndex : -124);
this.slotIndex = slotIndex;
this.pokemon = pokemon;
this.setup();
}
setup() {
const slotKey = `party_slot${this.slotIndex ? '' : '_main'}`;
const slotBg = this.scene.add.sprite(0, 0, slotKey, `${slotKey}${this.pokemon.hp ? '' : '_fnt'}`);
this.slotBg = slotBg;
this.add(slotBg);
const slotPb = this.scene.add.sprite(this.slotIndex ? -85.5 : -51, this.slotIndex ? 0 : -20.5, 'party_pb');
this.slotPb = slotPb;
this.add(slotPb);
const pokemonIcon = this.scene.add.sprite(slotPb.x, slotPb.y, this.pokemon.getIconAtlasKey());
console.log(pokemonIcon)
pokemonIcon.play(this.pokemon.getIconKey());
this.slotPokemonIcon = pokemonIcon;
this.add(pokemonIcon);
const slotInfoContainer = this.scene.add.container(0, 0);
this.add(slotInfoContainer);
const slotName = addTextObject(this.scene, 0, 0, this.pokemon.name, TextStyle.PARTY);
slotName.setPositionRelative(slotBg, this.slotIndex ? 21 : 24, this.slotIndex ? 3 : 10);
slotName.setOrigin(0, 0);
const slotLevelLabel = this.scene.add.image(0, 0, 'party_slot_overlay_lv');
slotLevelLabel.setPositionRelative(slotName, 8, 12);
slotLevelLabel.setOrigin(0, 0);
const slotLevelText = addTextObject(this.scene, 0, 0, this.pokemon.level.toString(), TextStyle.PARTY);
slotLevelText.setPositionRelative(slotLevelLabel, 9, 0);
slotLevelText.setOrigin(0, 0.25);
const slotHpBar = this.scene.add.image(0, 0, 'party_slot_hp_bar');
slotHpBar.setPositionRelative(slotBg, this.slotIndex ? 72 : 8, this.slotIndex ? 7 : 31);
slotHpBar.setOrigin(0, 0);
const hpRatio = this.pokemon.hp / this.pokemon.getMaxHp();
const slotHpOverlay = this.scene.add.sprite(0, 0, 'party_slot_hp_overlay', hpRatio > 0.5 ? 'high' : hpRatio > 0.25 ? 'medium' : 'low');
slotHpOverlay.setPositionRelative(slotHpBar, 16, 2);
slotHpOverlay.setOrigin(0, 0);
slotHpOverlay.setScale(hpRatio, 1);
const slotHpText = addTextObject(this.scene, 0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY);
slotHpText.setPositionRelative(slotHpBar, slotHpBar.width - 3, slotHpBar.height - 2);
slotHpText.setOrigin(1, 0);
slotInfoContainer.add([ slotName, slotLevelLabel, slotLevelText, slotHpBar, slotHpOverlay, slotHpText ]);
this.slotHpOverlay = slotHpOverlay;
}
select() {
if (this.selected)
return;
this.selected = true;
this.slotBg.setTexture(`party_slot${this.slotIndex ? '' : '_main'}`, `party_slot${this.slotIndex ? '' : '_main'}${this.pokemon.hp ? '' : '_fnt'}_sel`);
this.slotPb.setFrame('party_pb_sel');
}
deselect() {
if (!this.selected)
return;
this.selected = false;
this.slotBg.setTexture(`party_slot${this.slotIndex ? '' : '_main'}`, `party_slot${this.slotIndex ? '' : '_main'}${this.pokemon.hp ? '' : '_fnt'}`);
this.slotPb.setFrame('party_pb');
}
}
class PartyCancelButton extends Phaser.GameObjects.Container {
private selected: boolean;
private partyCancelBg: Phaser.GameObjects.Sprite;
private partyCancelPb: Phaser.GameObjects.Sprite;
constructor(scene: BattleScene, x: number, y: number) {
super(scene, x, y);
this.setup();
}
setup() {
const partyCancelBg = this.scene.add.sprite(0, 0, 'party_cancel');
this.add(partyCancelBg);
this.partyCancelBg = partyCancelBg;
const partyCancelPb = this.scene.add.sprite(-17, 0, 'party_pb');
this.add(partyCancelPb);
this.partyCancelPb = partyCancelPb;
const partyCancelText = addTextObject(this.scene, -7, -6, 'CANCEL', TextStyle.PARTY);
this.add(partyCancelText);
}
select() {
if (this.selected)
return;
this.selected = true;
this.partyCancelBg.setFrame(`party_cancel_sel`);
this.partyCancelPb.setFrame('party_pb_sel');
}
deselect() {
if (!this.selected)
return;
this.selected = false;
this.partyCancelBg.setFrame('party_cancel');
this.partyCancelPb.setFrame('party_pb');
}
}
+115
View File
@@ -0,0 +1,115 @@
import { SwitchPhase, SwitchSummonPhase } from "../battle-phase";
import BattleScene from "../battle-scene";
import { addTextObject, TextStyle } from "../text";
import AwaitableUiHandler from "./awaitable-ui-handler";
import { Mode } from "./ui";
export default class SwitchCheckUiHandler extends AwaitableUiHandler {
private switchCheckContainer: Phaser.GameObjects.Container;
private switchCheckBg: Phaser.GameObjects.Image;
private cursorObj: Phaser.GameObjects.Image;
constructor(scene: BattleScene) {
super(scene, Mode.SWITCH_CHECK);
}
setup() {
const ui = this.getUi();
const switchCheckContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 49, -49);
switchCheckContainer.setVisible(false);
ui.add(switchCheckContainer);
this.switchCheckContainer = switchCheckContainer;
const switchCheckBg = this.scene.add.image(0, 0, 'boolean_window');
switchCheckBg.setOrigin(0, 1);
switchCheckContainer.add(switchCheckBg);
this.switchCheckBg = switchCheckBg;
const switchCheckText = addTextObject(this.scene, 0, 0, 'Yes\nNo', TextStyle.WINDOW, { maxLines: 2 });
switchCheckText.setPositionRelative(switchCheckBg, 16, 9);
switchCheckText.setLineSpacing(12);
switchCheckContainer.add(switchCheckText);
this.setCursor(0)
}
show(args: any[]) {
if (args.length && args[0] instanceof Function) {
super.show(args);
this.awaitingActionInput = true;
this.onActionInput = args[0] as Function;
this.switchCheckContainer.setVisible(true);
this.setCursor(this.cursor);
}
}
processInput(keyCode: integer) {
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
const ui = this.getUi();
if (!this.awaitingActionInput)
return;
let success = false;
if (keyCode === keyCodes.Z || keyCode === keyCodes.X) {
success = true;
if (keyCode === keyCodes.X)
this.cursor = 1;
if (this.onActionInput) {
if (!this.cursor)
this.scene.unshiftPhase(new SwitchPhase(this.scene, false, true));
const originalOnActionInput = this.onActionInput;
this.onActionInput = null;
originalOnActionInput();
this.clear();
}
} else {
switch (keyCode) {
case keyCodes.UP:
if (this.cursor)
success = this.setCursor(0);
break;
case keyCodes.DOWN:
if (!this.cursor)
success = this.setCursor(1);
break;
}
}
if (success)
ui.playSelect();
}
setCursor(cursor: integer): boolean {
const ui = this.getUi();
const ret = super.setCursor(cursor);
if (!this.cursorObj) {
this.cursorObj = this.scene.add.image(0, 0, 'cursor');
this.switchCheckContainer.add(this.cursorObj);
}
this.cursorObj.setPositionRelative(this.switchCheckBg, 12, this.cursor ? 33 : 17);
return ret;
}
clear() {
super.clear();
this.switchCheckContainer.setVisible(false);
this.eraseCursor();
}
eraseCursor() {
if (this.cursorObj)
this.cursorObj.destroy();
this.cursorObj = null;
}
}
+102
View File
@@ -0,0 +1,102 @@
import { default as BattleScene } from '../battle-scene';
import UiHandler from './uiHandler';
import BattleMessageUiHandler from './battle-message-ui-handler';
import CommandUiHandler from './command-ui-handler';
import PartyUiHandler from './party-ui-handler';
import FightUiHandler from './fight-ui-handler';
import MessageUiHandler from './message-ui-handler';
import SwitchCheckUiHandler from './switch-check-ui-handler';
import ModifierSelectUiHandler from './modifier-select-ui-handler';
export enum Mode {
MESSAGE = 0,
COMMAND,
FIGHT,
SWITCH_CHECK,
MODIFIER_SELECT,
PARTY
};
export default class UI extends Phaser.GameObjects.Container {
private mode: Mode;
private handlers: UiHandler[];
constructor(scene: BattleScene) {
super(scene, 0, scene.game.canvas.height / 6);
this.mode = Mode.MESSAGE;
this.handlers = [
new BattleMessageUiHandler(scene),
new CommandUiHandler(scene),
new FightUiHandler(scene),
new SwitchCheckUiHandler(scene),
new ModifierSelectUiHandler(scene),
new PartyUiHandler(scene)
];
}
setup() {
for (let handler of this.handlers) {
handler.setup();
}
}
getHandler() {
return this.handlers[this.mode];
}
getMessageHandler() {
return this.handlers[Mode.MESSAGE] as BattleMessageUiHandler;
}
processInput(keyCode: integer) {
this.getHandler().processInput(keyCode);
}
showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean) {
const handler = this.getHandler();
if (handler instanceof MessageUiHandler)
(handler as MessageUiHandler).showText(text, delay, callback, callbackDelay, prompt);
else
this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt);
}
clearText() {
const handler = this.getHandler();
if (handler instanceof MessageUiHandler)
(handler as MessageUiHandler).clearText();
else
this.getMessageHandler().clearText();
}
setCursor(cursor: integer): boolean {
const changed = this.getHandler().setCursor(cursor);
if (changed)
this.playSelect();
return changed;
}
playSelect() {
this.scene.sound.play('select');
}
playError() {
this.scene.sound.play('error');
}
setMode(mode: Mode, ...args: any[]) {
if (this.mode === mode)
return;
this.getHandler().clear();
this.mode = mode;
this.getHandler().show(args);
}
setModeWithoutClear(mode: Mode, ...args: any[]) {
if (this.mode === mode)
return;
this.mode = mode;
this.getHandler().show(args);
}
}
+38
View File
@@ -0,0 +1,38 @@
import BattleScene from "../battle-scene";
import UI, { Mode } from "./ui";
export default abstract class UiHandler {
protected scene: BattleScene;
protected mode: integer;
protected cursor: integer = 0;
protected active: boolean = false;
constructor(scene: BattleScene, mode: Mode) {
this.scene = scene;
this.mode = mode;
}
abstract setup(): void;
show(_args: any[]): void {
this.active = true;
}
abstract processInput(keyCode: integer);
getUi() {
return this.scene.ui;
}
setCursor(cursor: integer): boolean {
const changed = this.cursor !== cursor;
if (changed)
this.cursor = cursor;
return changed;
}
clear() {
this.active = false;
}
}
+67
View File
@@ -0,0 +1,67 @@
export function toPokemonUpperCase(input: string): string {
return input.replace(/([a-z]+)/g, s => s.toUpperCase());
}
export function clampInt(value: integer, min: integer, max: integer): integer {
return Math.min(Math.max(value, min), max);
}
export function randGauss(value: number): number {
let rand = 0;
for(var i = value; i > 0; i--)
rand += Math.random();
return rand / value;
}
export function padInt(value: integer, length: integer, padWith?: string): string {
if (!padWith)
padWith = '0';
let valueStr = value.toString();
while (valueStr.length < length)
valueStr = `${padWith}${valueStr}`;
return valueStr;
}
export function randInt(range: integer, min?: integer): integer {
if (!min)
min = 0;
return Math.floor(Math.random() * range) + min;
}
export function binToDec(input: string): integer {
let place:integer[] = [];
let binary:string[] = [];
let decimalNum = 0;
for (let i = 0; i < input.length; i++) {
binary.push(input[i]);
place.push(Math.pow(2, i));
decimalNum += place[i] * parseInt(binary[i]);
}
return decimalNum;
}
export function decToBin(input: integer): string {
let bin = '';
let intNum = input;
while (intNum > 0) {
bin = intNum % 2 ? `1${bin}` : `0${bin}`;
intNum = Math.floor(intNum * 0.5);
}
return bin;
}
export function getEnumValues(enumType) {
return Object.values(enumType).filter(v => !isNaN(parseInt(v.toString()))).map(v => parseInt(v.toString()));
}
export class IntegerHolder {
public value: integer;
constructor(value: integer) {
this.value = value;
}
}