PokeDex/lib/pokemon.dart

1942 lines
50 KiB
Dart

// ignore_for_file: constant_identifier_names
import 'package:flutter/material.dart';
import 'package:pokedex/Consts.dart';
import 'package:pokedex/Session.dart';
enum Generation {
One(1, 151),
Two(152, 251),
Three(252, 386),
Four(387, 493),
Five(494, 649),
Six(650, 721),
Seven(722, 809),
Eight(810, 905),
Nine(906, 1025);
final int idStart;
final int idEnd;
const Generation(this.idStart, this.idEnd);
toSpritePath() {
switch (this) {
case Generation.One:
return 'assets/sprites/gen1';
case Generation.Two:
return 'assets/sprites/gen2';
case Generation.Three:
return 'assets/sprites/gen3';
case Generation.Four:
return 'assets/sprites/gen4';
case Generation.Five:
return 'assets/sprites/gen5';
case Generation.Six:
return 'assets/sprites/gen6';
case Generation.Seven:
return 'assets/sprites/gen7';
case Generation.Eight:
return 'assets/sprites/gen8';
case Generation.Nine:
return 'assets/sprites/gen9';
}
}
}
enum Type {
Normal(Color.fromARGB(255, 192, 192, 192), Colors.black),
Fire(Color.fromARGB(255, 255, 0, 0), Color.fromARGB(255, 255, 255, 255)),
Water(Color.fromARGB(255, 0, 174, 255), Colors.black),
Electric(Color(0xffFFD700), Colors.black),
Grass(Color.fromARGB(255, 0, 255, 0), Colors.black),
Ice(Color.fromARGB(255, 0, 255, 255), Colors.black),
Fighting(Color.fromARGB(255, 255, 0, 0), Color.fromARGB(255, 255, 255, 255)),
Poison(Color.fromARGB(255, 128, 0, 128), Color.fromARGB(255, 255, 255, 255)),
Ground(Color.fromARGB(255, 128, 126, 0), Colors.black),
Flying(Color.fromARGB(255, 128, 128, 255), Colors.black),
Psychic(Color.fromARGB(255, 255, 0, 255), Color.fromARGB(255, 255, 255, 255)),
Bug(Color.fromARGB(255, 128, 128, 0), Colors.black),
Rock(Color.fromARGB(255, 128, 128, 128), Colors.black),
Ghost(Color.fromARGB(255, 128, 0, 128), Colors.black),
Dragon(Color.fromARGB(255, 85, 0, 102), Color.fromARGB(255, 255, 255, 255)),
Dark(Color.fromARGB(255, 51, 51, 51), Color.fromARGB(255, 255, 255, 255)),
Steel(Color.fromARGB(255, 192, 192, 192), Colors.black),
Fairy(Color.fromARGB(255, 255, 102, 255), Colors.black);
final Color backgroundColor;
final Color textColor;
const Type(this.backgroundColor, this.textColor);
}
enum EvolutionCondition {
HighFriendship,
ThunderStone,
WaterStone,
Trading,
Holding,
KingsRock,
MoonStone,
FireStone,
LeafStone,
Alola,
OutsideAlola,
Night,
Day,
AttackGreaterThanDefense,
AttackLessThanDefense,
AttackEqualDefense,
Galar,
OutsideGalar,
SunStone,
MetalCoat,
BlackAugurite,
DragonScale,
Upgrade,
Random,
Personality,
EmptySlot,
PokeballInBag,
ShinyStone,
PrismScale,
Or,
MaxBeauty,
DeepSeaTooth,
DeepSeaScale,
}
abstract class Evolution {
const Evolution();
String printEvolution();
Widget getEvolution();
}
class SingleEvolution extends Evolution {
final int to;
final int level;
final List<EvolutionCondition>? condition;
const SingleEvolution(this.to, this.level, {this.condition});
@override
String printEvolution() {
String sRet = "";
if (level != -1) {
sRet += "Level $level";
}
if (condition != null) {
if (sRet.isNotEmpty) {
sRet += "\n";
}
for (var cond in condition!) {
sRet += cond.name;
}
}
return sRet;
}
@override
Widget getEvolution() {
if (to >= SessionData.highestGenID() + 1) {
return Column();
}
Pokemon pkmn = Pokemon.values.where((x) => x.id == to).first;
List<Widget> cardRow = [];
cardRow.add(
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Constants.isMobile ? Icons.arrow_downward : Icons.arrow_forward,
size: 48,
),
Card(
elevation: 50,
child: SizedBox(
width: 256,
height: 256,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(printEvolution(), style: TextStyle(fontSize: 16)),
Image.asset(
pkmn.toDexPath(),
width: Constants.isMobile ? 64 : 128,
height: Constants.isMobile ? 64 : 128,
),
Text(pkmn.pokemonName, style: TextStyle(fontSize: 24)),
pkmn.getTypeWidgets(),
],
),
),
),
],
),
);
Column rw = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [Row(children: cardRow)],
);
return rw;
}
}
class BranchedEvolution extends Evolution {
final List<int> alternates;
final List<int> levels;
final List<List<EvolutionCondition>> conditions;
const BranchedEvolution(this.alternates, this.levels, this.conditions);
@override
String printEvolution() {
return "";
}
String _prntEV(List<EvolutionCondition> conds, int level) {
String sRet = "";
if (level != -1) {
sRet += "Level ${level}";
}
for (var condition in conds) {
sRet += condition.name + " ";
}
return sRet;
}
@override
Widget getEvolution() {
// This is a branched evolution. So first, we print the arrows, and conditions.
List<Widget> cardRow = [];
for (var pkmn in alternates) {
int index = alternates.indexOf(pkmn);
if (pkmn >= SessionData.highestGenID() + 1) {
print("Index too high");
continue;
}
Pokemon _pkmn = Pokemon.values.where((x) => x.id == pkmn).first;
cardRow.add(
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Constants.isMobile ? Icons.arrow_downward : Icons.arrow_forward,
size: 48,
),
Card(
elevation: 50,
child: SizedBox(
width: 256,
height: 256,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
_prntEV(conditions[index], levels[index]),
style: TextStyle(fontSize: 16),
),
Image.asset(
_pkmn.toDexPath(),
width: Constants.isMobile ? 64 : 128,
height: Constants.isMobile ? 64 : 128,
),
Text(_pkmn.pokemonName, style: TextStyle(fontSize: 24)),
_pkmn.getTypeWidgets(),
],
),
),
),
],
),
);
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [Row(children: cardRow)],
);
}
}
enum LearnType { TM, HM }
enum Move {
Growl(LearnType.TM, Type.Normal, "Growl", 0, 100, 40),
Tackle(LearnType.TM, Type.Normal, "Tackle", 40, 100, 35),
VineWhip(LearnType.TM, Type.Grass, "Vine Whip", 45, 100, 25),
RazorLeaf(LearnType.TM, Type.Grass, "Razor Leaf", 55, 95, 25),
SolarBeam(LearnType.TM, Type.Grass, "Solar Beam", 120, 100, 10),
PoisonPowder(LearnType.TM, Type.Poison, "Poison Powder", 0, 75, 35),
SleepPowder(LearnType.TM, Type.Grass, "Sleep Powder", 0, 75, 15),
TakeDown(LearnType.TM, Type.Normal, "Take Down", 90, 85, 20),
DoubleEdge(LearnType.TM, Type.Normal, "Double-Edge", 120, 100, 15),
LeechSeed(LearnType.TM, Type.Grass, "Leech Seed", 0, 90, 10),
Growth(LearnType.TM, Type.Normal, "Growth", 0, 0, 20),
PoisonSting(LearnType.TM, Type.Poison, "Poison Sting", 15, 100, 35),
StringShot(LearnType.TM, Type.Bug, "String Shot", 0, 95, 40),
BugBite(LearnType.TM, Type.Bug, "Bug Bite", 60, 100, 20),
Confusion(LearnType.TM, Type.Psychic, "Confusion", 50, 100, 25);
final LearnType type;
final Type moveType;
final String moveName;
final int power;
final int accuracy;
final int pp;
const Move(
this.type,
this.moveType,
this.moveName,
this.power,
this.accuracy,
this.pp,
);
}
enum Pokemon {
Bulbasaur(1, Generation.One, [
Type.Grass,
Type.Poison,
], SingleEvolution(2, 16)),
Ivysaur(
2,
Generation.One,
[Type.Grass, Type.Poison],
SingleEvolution(3, 32),
previousPokemon: 1,
),
Venusaur(
3,
Generation.One,
[Type.Grass, Type.Poison],
null,
previousPokemon: 2,
),
Charmander(4, Generation.One, [Type.Fire], SingleEvolution(5, 16)),
Charmeleon(
5,
Generation.One,
[Type.Fire],
SingleEvolution(6, 36),
previousPokemon: 4,
),
Charizard(
6,
Generation.One,
[Type.Fire, Type.Flying],
null,
previousPokemon: 5,
),
Squirtle(7, Generation.One, [Type.Water], SingleEvolution(8, 16)),
Wartortle(
8,
Generation.One,
[Type.Water],
SingleEvolution(9, 36),
previousPokemon: 7,
),
Blastoise(9, Generation.One, [Type.Water], null, previousPokemon: 8),
Caterpie(10, Generation.One, [Type.Bug], SingleEvolution(11, 7)),
Metapod(
11,
Generation.One,
[Type.Bug],
SingleEvolution(12, 10),
previousPokemon: 10,
),
Butterfree(
12,
Generation.One,
[Type.Bug, Type.Flying],
null,
previousPokemon: 11,
),
Weedle(13, Generation.One, [Type.Bug, Type.Poison], SingleEvolution(14, 7)),
Kakuna(
14,
Generation.One,
[Type.Bug, Type.Poison],
SingleEvolution(15, 10),
previousPokemon: 13,
),
Beedrill(
15,
Generation.One,
[Type.Bug, Type.Poison],
null,
previousPokemon: 14,
),
Pidgey(16, Generation.One, [
Type.Normal,
Type.Flying,
], SingleEvolution(17, 18)),
Pidgeotto(
17,
Generation.One,
[Type.Normal, Type.Flying],
SingleEvolution(18, 36),
previousPokemon: 16,
),
Pidgeot(
18,
Generation.One,
[Type.Normal, Type.Flying],
null,
previousPokemon: 17,
),
Rattata(19, Generation.One, [Type.Normal], SingleEvolution(20, 20)),
Raticate(20, Generation.One, [Type.Normal], null, previousPokemon: 19),
Spearow(21, Generation.One, [
Type.Normal,
Type.Flying,
], SingleEvolution(22, 20)),
Fearow(
22,
Generation.One,
[Type.Normal, Type.Flying],
null,
previousPokemon: 21,
),
Ekans(23, Generation.One, [Type.Poison], SingleEvolution(24, 22)),
Arbok(24, Generation.One, [Type.Poison], null, previousPokemon: 23),
Pikachu(
25,
Generation.One,
[Type.Electric],
SingleEvolution(26, -1, condition: [EvolutionCondition.ThunderStone]),
previousPokemon: 172,
),
Raichu(26, Generation.One, [Type.Electric], null, previousPokemon: 25),
Sandshrew(27, Generation.One, [Type.Ground], SingleEvolution(28, 22)),
Sandslash(28, Generation.One, [Type.Ground], null, previousPokemon: 27),
NidoranF(29, Generation.One, [Type.Poison], SingleEvolution(30, 16)),
Nidorina(
30,
Generation.One,
[Type.Poison],
SingleEvolution(31, 36),
previousPokemon: 29,
),
NidoQueen(
31,
Generation.One,
[Type.Poison, Type.Ground],
null,
previousPokemon: 30,
),
NidoranM(32, Generation.One, [Type.Poison], SingleEvolution(33, 16)),
Nidorino(
33,
Generation.One,
[Type.Poison],
SingleEvolution(34, 36),
previousPokemon: 32,
),
NidoKing(
34,
Generation.One,
[Type.Poison, Type.Ground],
null,
previousPokemon: 33,
),
Clefairy(
35,
Generation.One,
[Type.Fairy],
SingleEvolution(36, -1, condition: [EvolutionCondition.MoonStone]),
previousPokemon: 173,
),
Clefable(36, Generation.One, [Type.Fairy], null, previousPokemon: 35),
Vulpix(
37,
Generation.One,
[Type.Fire],
SingleEvolution(38, -1, condition: [EvolutionCondition.FireStone]),
),
NineTales(38, Generation.One, [Type.Fire], null, previousPokemon: 37),
Jigglypuff(
39,
Generation.One,
[Type.Fairy],
SingleEvolution(40, -1, condition: [EvolutionCondition.MoonStone]),
previousPokemon: 174,
),
WigglyTuff(40, Generation.One, [Type.Fairy], null, previousPokemon: 39),
Zubat(41, Generation.One, [
Type.Poison,
Type.Flying,
], SingleEvolution(42, 22)),
Golbat(
42,
Generation.One,
[Type.Poison, Type.Flying],
SingleEvolution(169, -1, condition: [EvolutionCondition.HighFriendship]),
previousPokemon: 41,
),
Oddish(43, Generation.One, [
Type.Poison,
Type.Grass,
], SingleEvolution(44, 21)),
Gloom(
44,
Generation.One,
[Type.Poison, Type.Grass],
BranchedEvolution([45, 182], [-1, -1], [
[EvolutionCondition.LeafStone],
[EvolutionCondition.SunStone],
]),
previousPokemon: 43,
),
Vileplume(
45,
Generation.One,
[Type.Poison, Type.Grass],
null,
previousPokemon: 44,
),
Paras(46, Generation.One, [Type.Bug, Type.Grass], SingleEvolution(47, 24)),
Parasect(
47,
Generation.One,
[Type.Bug, Type.Grass],
null,
previousPokemon: 46,
),
Venonat(48, Generation.One, [Type.Bug, Type.Poison], SingleEvolution(49, 31)),
Venomoth(
49,
Generation.One,
[Type.Bug, Type.Poison],
null,
previousPokemon: 48,
),
Diglett(50, Generation.One, [Type.Ground], SingleEvolution(51, 26)),
Dugtrio(51, Generation.One, [Type.Ground], null, previousPokemon: 50),
Meowth(52, Generation.One, [Type.Normal], SingleEvolution(53, 28)),
Persian(53, Generation.One, [Type.Normal], null, previousPokemon: 52),
Psyduck(54, Generation.One, [Type.Water], SingleEvolution(55, 33)),
Golduck(55, Generation.One, [Type.Water], null, previousPokemon: 54),
Mankey(56, Generation.One, [Type.Fighting], SingleEvolution(57, 28)),
Primeape(57, Generation.One, [Type.Fighting], null, previousPokemon: 56),
Growlithe(
58,
Generation.One,
[Type.Fire],
SingleEvolution(59, -1, condition: [EvolutionCondition.FireStone]),
),
Arcanine(59, Generation.One, [Type.Fire], null, previousPokemon: 58),
Poliwag(60, Generation.One, [Type.Water], SingleEvolution(61, 25)),
Poliwhirl(
61,
Generation.One,
[Type.Water],
BranchedEvolution([62, 186], [-1, -1], [
[EvolutionCondition.WaterStone],
[
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.KingsRock,
],
]),
previousPokemon: 60,
),
Poliwrath(62, Generation.One, [Type.Water], null, previousPokemon: 61),
Abra(63, Generation.One, [Type.Psychic], SingleEvolution(64, 16)),
Kadabra(
64,
Generation.One,
[Type.Psychic],
SingleEvolution(65, -1, condition: [EvolutionCondition.Trading]),
previousPokemon: 63,
),
Alakazam(65, Generation.One, [Type.Psychic], null, previousPokemon: 64),
Machop(66, Generation.One, [Type.Fighting], SingleEvolution(67, 28)),
Machoke(
67,
Generation.One,
[Type.Fighting],
SingleEvolution(68, -1, condition: [EvolutionCondition.Trading]),
previousPokemon: 66,
),
Machamp(68, Generation.One, [Type.Fighting], null, previousPokemon: 67),
Bellsprout(69, Generation.One, [
Type.Grass,
Type.Poison,
], SingleEvolution(70, 21)),
Weepinbell(
70,
Generation.One,
[Type.Grass, Type.Poison],
SingleEvolution(71, -1, condition: [EvolutionCondition.LeafStone]),
previousPokemon: 69,
),
Victreebel(
71,
Generation.One,
[Type.Grass, Type.Poison],
null,
previousPokemon: 70,
),
Tentacool(72, Generation.One, [
Type.Water,
Type.Poison,
], SingleEvolution(73, 30)),
Tentacruel(
73,
Generation.One,
[Type.Water, Type.Poison],
null,
previousPokemon: 72,
),
Geodude(74, Generation.One, [
Type.Rock,
Type.Ground,
], SingleEvolution(75, 25)),
Graveler(
75,
Generation.One,
[Type.Rock, Type.Ground],
SingleEvolution(76, -1, condition: [EvolutionCondition.Trading]),
previousPokemon: 74,
),
Golem(
76,
Generation.One,
[Type.Rock, Type.Ground],
null,
previousPokemon: 75,
),
Ponyta(77, Generation.One, [Type.Fire], SingleEvolution(78, 40)),
Rapidash(78, Generation.One, [Type.Fire], null, previousPokemon: 77),
Slowpoke(
79,
Generation.One,
[Type.Water, Type.Psychic],
BranchedEvolution([80, 199], [37, -1], [
[],
[
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.KingsRock,
],
]),
),
Slowbro(
80,
Generation.One,
[Type.Water, Type.Psychic],
null,
previousPokemon: 79,
),
Magnemite(81, Generation.One, [
Type.Electric,
Type.Steel,
], SingleEvolution(82, 30)),
Magneton(
82,
Generation.One,
[Type.Electric, Type.Steel],
null,
previousPokemon: 81,
),
Farfetchd(
83,
Generation.One,
[Type.Fighting],
null,
properName: "Farfetch'd",
),
Doduo(84, Generation.One, [
Type.Normal,
Type.Flying,
], SingleEvolution(85, 31)),
Dodrio(
85,
Generation.One,
[Type.Normal, Type.Flying],
null,
previousPokemon: 84,
),
Seel(86, Generation.One, [Type.Water], SingleEvolution(87, 34)),
Dewgong(
87,
Generation.One,
[Type.Water, Type.Ice],
null,
previousPokemon: 86,
),
Grimer(88, Generation.One, [Type.Poison], SingleEvolution(89, 38)),
Muk(89, Generation.One, [Type.Poison], null, previousPokemon: 88),
Shellder(
90,
Generation.One,
[Type.Water],
SingleEvolution(91, -1, condition: [EvolutionCondition.WaterStone]),
),
Cloyster(
91,
Generation.One,
[Type.Water, Type.Ice],
null,
previousPokemon: 90,
),
Gastly(92, Generation.One, [
Type.Ghost,
Type.Poison,
], SingleEvolution(93, 25)),
Haunter(
93,
Generation.One,
[Type.Ghost, Type.Poison],
SingleEvolution(94, -1, condition: [EvolutionCondition.Trading]),
previousPokemon: 92,
),
Gengar(
94,
Generation.One,
[Type.Ghost, Type.Poison],
null,
previousPokemon: 93,
),
Onix(
95,
Generation.One,
[Type.Rock, Type.Ground],
SingleEvolution(
208,
-1,
condition: [
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.MetalCoat,
],
),
),
Drowzee(96, Generation.One, [Type.Psychic], SingleEvolution(97, 26)),
Hypno(97, Generation.One, [Type.Psychic], null, previousPokemon: 96),
Krabby(98, Generation.One, [Type.Water], SingleEvolution(99, 28)),
Kingler(99, Generation.One, [Type.Water], null, previousPokemon: 98),
Voltorb(100, Generation.One, [Type.Electric], SingleEvolution(101, 30)),
Electrode(101, Generation.One, [Type.Electric], null, previousPokemon: 100),
Exeggcute(
102,
Generation.One,
[Type.Grass, Type.Psychic],
SingleEvolution(103, -1, condition: [EvolutionCondition.LeafStone]),
),
Exeggutor(
103,
Generation.One,
[Type.Grass, Type.Psychic],
null,
previousPokemon: 102,
),
Cubone(
104,
Generation.One,
[Type.Ground],
SingleEvolution(105, 28, condition: [EvolutionCondition.OutsideAlola]),
),
Marowak(105, Generation.One, [Type.Ground], null, previousPokemon: 104),
Hitmonlee(106, Generation.One, [Type.Fighting], null, previousPokemon: 236),
Hitmonchan(107, Generation.One, [Type.Fighting], null, previousPokemon: 236),
Lickitung(108, Generation.One, [Type.Normal], null),
Koffing(
109,
Generation.One,
[Type.Poison],
SingleEvolution(110, 35, condition: [EvolutionCondition.OutsideGalar]),
),
Weezing(110, Generation.One, [Type.Poison], null, previousPokemon: 109),
Rhyhorn(111, Generation.One, [
Type.Ground,
Type.Rock,
], SingleEvolution(112, 42)),
Rhydon(
112,
Generation.One,
[Type.Ground, Type.Rock],
null,
previousPokemon: 111,
),
Chansey(
113,
Generation.One,
[Type.Normal],
SingleEvolution(242, -1, condition: [EvolutionCondition.HighFriendship]),
),
Tangela(114, Generation.One, [Type.Grass], null),
Kangaskhan(115, Generation.One, [Type.Normal], null),
Horsea(116, Generation.One, [Type.Water], SingleEvolution(117, 32)),
Seadra(
117,
Generation.One,
[Type.Water],
SingleEvolution(
230,
-1,
condition: [
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.DragonScale,
],
),
previousPokemon: 116,
),
Goldeen(118, Generation.One, [Type.Water], SingleEvolution(119, 33)),
Seaking(119, Generation.One, [Type.Water], null, previousPokemon: 118),
Staryu(
120,
Generation.One,
[Type.Water],
SingleEvolution(121, -1, condition: [EvolutionCondition.WaterStone]),
),
Starmie(121, Generation.One, [Type.Water, Type.Psychic], null),
MrMime(
122,
Generation.One,
[Type.Psychic, Type.Fairy],
null,
properName: "Mr. Mime",
previousPokemon: 120,
),
Scyther(
123,
Generation.One,
[Type.Bug, Type.Flying],
BranchedEvolution([212, 900], [-1, -1], [
[
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.MetalCoat,
],
[EvolutionCondition.BlackAugurite],
]),
),
Jynx(
124,
Generation.One,
[Type.Ice, Type.Psychic],
null,
previousPokemon: 238,
),
Electabuzz(125, Generation.One, [Type.Electric], null, previousPokemon: 239),
Magmar(126, Generation.One, [Type.Fire], null, previousPokemon: 240),
Pinsir(127, Generation.One, [Type.Bug], null),
Tauros(128, Generation.One, [Type.Normal], null),
Magikarp(129, Generation.One, [Type.Water], SingleEvolution(130, 20)),
Gyarados(
130,
Generation.One,
[Type.Water, Type.Flying],
null,
previousPokemon: 129,
),
Lapras(131, Generation.One, [Type.Water, Type.Ice], null),
Ditto(132, Generation.One, [Type.Normal], null),
Eevee(
133,
Generation.One,
[Type.Normal],
BranchedEvolution([134, 135, 136, 196, 197], [-1, -1, -1, -1, -1], [
[EvolutionCondition.WaterStone],
[EvolutionCondition.ThunderStone],
[EvolutionCondition.FireStone],
[EvolutionCondition.Day, EvolutionCondition.HighFriendship],
[EvolutionCondition.Night, EvolutionCondition.HighFriendship],
]),
),
Vaporeon(134, Generation.One, [Type.Water], null, previousPokemon: 133),
Jolteon(135, Generation.One, [Type.Electric], null, previousPokemon: 133),
Flareon(136, Generation.One, [Type.Fire], null, previousPokemon: 133),
Porygon(
137,
Generation.One,
[Type.Normal],
SingleEvolution(
233,
-1,
condition: [
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.Upgrade,
],
),
),
Omanyte(138, Generation.One, [
Type.Rock,
Type.Water,
], SingleEvolution(139, 40)),
Omastar(
139,
Generation.One,
[Type.Rock, Type.Water],
null,
previousPokemon: 138,
),
Kabuto(140, Generation.One, [
Type.Rock,
Type.Water,
], SingleEvolution(141, 40)),
Kabutops(
141,
Generation.One,
[Type.Rock, Type.Water],
null,
previousPokemon: 140,
),
Aerodactyl(142, Generation.One, [Type.Rock, Type.Flying], null),
Snorlax(143, Generation.One, [Type.Normal], null),
Articuno(144, Generation.One, [Type.Ice, Type.Flying], null),
Zapdos(145, Generation.One, [Type.Electric, Type.Flying], null),
Moltres(146, Generation.One, [Type.Fire, Type.Flying], null),
Dratini(147, Generation.One, [Type.Dragon], SingleEvolution(148, 30)),
Dragonair(
148,
Generation.One,
[Type.Dragon],
SingleEvolution(149, 55),
previousPokemon: 147,
),
Dragonite(
149,
Generation.One,
[Type.Dragon, Type.Flying],
null,
previousPokemon: 148,
),
Mewtwo(150, Generation.One, [Type.Psychic], null),
Mew(151, Generation.One, [Type.Psychic], null),
Chikorita(152, Generation.Two, [Type.Grass], SingleEvolution(153, 16)),
Bayleef(
153,
Generation.Two,
[Type.Grass],
SingleEvolution(154, 32),
previousPokemon: 152,
),
Meganium(154, Generation.Two, [Type.Grass], null, previousPokemon: 153),
Cyndaquil(155, Generation.Two, [Type.Fire], SingleEvolution(156, 14)),
Quilava(
156,
Generation.Two,
[Type.Fire],
SingleEvolution(157, 36),
previousPokemon: 155,
),
Typhlosion(157, Generation.Two, [Type.Fire], null, previousPokemon: 156),
Totodile(158, Generation.Two, [Type.Water], SingleEvolution(159, 18)),
Croconaw(
159,
Generation.Two,
[Type.Water],
SingleEvolution(160, 30),
previousPokemon: 158,
),
Feraligatr(160, Generation.Two, [Type.Water], null, previousPokemon: 159),
Sentret(161, Generation.Two, [Type.Normal], SingleEvolution(162, 15)),
Furret(162, Generation.Two, [Type.Normal], null, previousPokemon: 161),
Hoothoot(163, Generation.Two, [
Type.Normal,
Type.Flying,
], SingleEvolution(164, 20)),
Noctowl(
164,
Generation.Two,
[Type.Normal, Type.Flying],
null,
previousPokemon: 163,
),
Ledyba(165, Generation.Two, [
Type.Bug,
Type.Flying,
], SingleEvolution(166, 18)),
Ledian(
166,
Generation.Two,
[Type.Bug, Type.Flying],
null,
previousPokemon: 165,
),
Spinarak(167, Generation.Two, [
Type.Bug,
Type.Poison,
], SingleEvolution(168, 22)),
Ariados(
168,
Generation.Two,
[Type.Bug, Type.Poison],
null,
previousPokemon: 167,
),
Crobat(
169,
Generation.Two,
[Type.Poison, Type.Flying],
null,
previousPokemon: 42,
),
Chinchou(170, Generation.Two, [
Type.Water,
Type.Electric,
], SingleEvolution(171, 27)),
Lanturn(
171,
Generation.Two,
[Type.Water, Type.Electric],
null,
previousPokemon: 170,
),
Pichu(
172,
Generation.Two,
[Type.Electric],
SingleEvolution(25, -1, condition: [EvolutionCondition.HighFriendship]),
),
Cleffa(
173,
Generation.Two,
[Type.Fairy],
SingleEvolution(35, -1, condition: [EvolutionCondition.HighFriendship]),
),
Igglybuff(
174,
Generation.Two,
[Type.Normal, Type.Fairy],
SingleEvolution(39, -1, condition: [EvolutionCondition.HighFriendship]),
),
Togepi(
175,
Generation.Two,
[Type.Fairy],
SingleEvolution(176, -1, condition: [EvolutionCondition.HighFriendship]),
),
Togetic(
176,
Generation.Two,
[Type.Fairy, Type.Flying],
null,
previousPokemon: 175,
),
Natu(177, Generation.Two, [
Type.Psychic,
Type.Flying,
], SingleEvolution(178, 25)),
Xatu(
178,
Generation.Two,
[Type.Psychic, Type.Flying],
null,
previousPokemon: 177,
),
Mareep(179, Generation.Two, [Type.Electric], SingleEvolution(180, 15)),
Flaaffy(
180,
Generation.Two,
[Type.Electric],
SingleEvolution(181, 30),
previousPokemon: 179,
),
Ampharos(181, Generation.Two, [Type.Electric], null, previousPokemon: 180),
Bellossom(182, Generation.Two, [Type.Grass], null, previousPokemon: 44),
Marill(
183,
Generation.Two,
[Type.Water, Type.Fairy],
SingleEvolution(184, 18),
previousPokemon: 298,
),
Azumarill(
184,
Generation.Two,
[Type.Water, Type.Fairy],
null,
previousPokemon: 183,
),
Sudowoodo(185, Generation.Two, [Type.Rock], null, previousPokemon: 438),
Politoed(186, Generation.Two, [Type.Water], null, previousPokemon: 61),
Hoppip(187, Generation.Two, [
Type.Grass,
Type.Flying,
], SingleEvolution(188, 18)),
Skiploom(
188,
Generation.Two,
[Type.Grass, Type.Flying],
SingleEvolution(189, 27),
previousPokemon: 187,
),
Jumpluff(
189,
Generation.Two,
[Type.Grass, Type.Flying],
null,
previousPokemon: 188,
),
Aipom(190, Generation.Two, [Type.Normal], null),
Sunkern(
191,
Generation.Two,
[Type.Grass],
SingleEvolution(192, -1, condition: [EvolutionCondition.SunStone]),
),
Sunflora(192, Generation.Two, [Type.Grass], null, previousPokemon: 191),
Yanma(193, Generation.Two, [Type.Bug, Type.Flying], null),
Wooper(194, Generation.Two, [
Type.Water,
Type.Ground,
], SingleEvolution(195, 20)),
Quagsire(
195,
Generation.Two,
[Type.Water, Type.Ground],
null,
previousPokemon: 194,
),
Espeon(196, Generation.Two, [Type.Psychic], null, previousPokemon: 133),
Umbreon(197, Generation.Two, [Type.Dark], null, previousPokemon: 133),
Murkrow(198, Generation.Two, [Type.Dark, Type.Flying], null),
Slowking(
199,
Generation.Two,
[Type.Water, Type.Psychic],
null,
previousPokemon: 79,
),
Misdreavus(200, Generation.Two, [Type.Ghost], null),
Unown(201, Generation.Two, [Type.Psychic], null, extraVariants: ["abc"]),
Wobbuffet(202, Generation.Two, [Type.Psychic], null, previousPokemon: 360),
Girafarig(203, Generation.Two, [Type.Normal, Type.Psychic], null),
Pineco(204, Generation.Two, [Type.Bug], SingleEvolution(205, 31)),
Forretress(
205,
Generation.Two,
[Type.Bug, Type.Steel],
null,
previousPokemon: 204,
),
Dunsparce(206, Generation.Two, [Type.Normal], null),
Gligar(207, Generation.Two, [Type.Ground, Type.Flying], null),
Steelix(
208,
Generation.Two,
[Type.Steel, Type.Ground],
null,
previousPokemon: 95,
),
Snubbull(209, Generation.Two, [Type.Fairy], SingleEvolution(210, 23)),
Granbull(210, Generation.Two, [Type.Fairy], null, previousPokemon: 209),
Qwilfish(211, Generation.Two, [Type.Dark, Type.Poison], null),
Scizor(
212,
Generation.Two,
[Type.Bug, Type.Steel],
null,
previousPokemon: 123,
),
Shuckle(213, Generation.Two, [Type.Bug, Type.Rock], null),
Heracross(214, Generation.Two, [Type.Bug, Type.Fighting], null),
Sneasel(215, Generation.Two, [Type.Dark, Type.Ice], null),
Teddiursa(216, Generation.Two, [Type.Normal], SingleEvolution(217, 30)),
Ursaring(217, Generation.Two, [Type.Normal], null, previousPokemon: 216),
Slugma(218, Generation.Two, [Type.Fire], SingleEvolution(219, 38)),
Magcargo(219, Generation.Two, [Type.Fire], null, previousPokemon: 218),
Swinub(220, Generation.Two, [
Type.Ice,
Type.Ground,
], SingleEvolution(221, 33)),
Piloswine(
221,
Generation.Two,
[Type.Ice, Type.Ground],
null,
previousPokemon: 220,
),
Corsola(222, Generation.Two, [Type.Ghost], null),
Remoraid(223, Generation.Two, [Type.Water], SingleEvolution(224, 25)),
Octillery(224, Generation.Two, [Type.Water], null, previousPokemon: 223),
Delibird(225, Generation.Two, [Type.Ice, Type.Flying], null),
Mantine(
226,
Generation.Two,
[Type.Water, Type.Flying],
null,
previousPokemon: 458,
),
Skarmory(227, Generation.Two, [Type.Steel, Type.Flying], null),
Houndour(228, Generation.Two, [
Type.Dark,
Type.Fire,
], SingleEvolution(229, 24)),
Houndoom(
229,
Generation.Two,
[Type.Dark, Type.Fire],
null,
previousPokemon: 228,
),
Kingdra(
230,
Generation.Two,
[Type.Water, Type.Dragon],
null,
previousPokemon: 117,
),
Phanpy(231, Generation.Two, [Type.Ground], SingleEvolution(232, 25)),
Donphan(232, Generation.Two, [Type.Ground], null, previousPokemon: 231),
Porygon2(233, Generation.Two, [Type.Normal], null, previousPokemon: 137),
Stantler(234, Generation.Two, [Type.Normal], null),
Smeargle(235, Generation.Two, [Type.Normal], null),
Tyrogue(
236,
Generation.Two,
[Type.Fighting],
BranchedEvolution([106, 107, 237], [20, 20, 20], [
[EvolutionCondition.AttackGreaterThanDefense],
[EvolutionCondition.AttackLessThanDefense],
[EvolutionCondition.AttackEqualDefense],
]),
),
Hitmontop(237, Generation.Two, [Type.Fighting], null, previousPokemon: 236),
Smoochum(238, Generation.Two, [
Type.Ice,
Type.Psychic,
], SingleEvolution(124, 30)),
Elekid(239, Generation.Two, [Type.Electric], SingleEvolution(125, 30)),
Magby(240, Generation.Two, [Type.Fire], SingleEvolution(126, 30)),
Miltank(241, Generation.Two, [Type.Normal], null),
Blissey(242, Generation.Two, [Type.Normal], null, previousPokemon: 113),
Raikou(243, Generation.Two, [Type.Electric], null),
Entei(244, Generation.Two, [Type.Fire], null),
Suicune(245, Generation.Two, [Type.Water], null),
Larvitar(246, Generation.Two, [
Type.Rock,
Type.Ground,
], SingleEvolution(247, 30)),
Pupitar(
247,
Generation.Two,
[Type.Rock, Type.Ground],
SingleEvolution(248, 55),
previousPokemon: 246,
),
Tyranitar(
248,
Generation.Two,
[Type.Rock, Type.Dark],
null,
previousPokemon: 247,
),
Lugia(249, Generation.Two, [Type.Psychic, Type.Flying], null),
Hooh(
250,
Generation.Two,
[Type.Fire, Type.Flying],
null,
properName: "Ho-Oh",
),
Celebi(251, Generation.Two, [Type.Psychic, Type.Grass], null),
Treecko(252, Generation.Three, [Type.Grass], SingleEvolution(253, 16)),
Grovyle(
253,
Generation.Three,
[Type.Grass],
SingleEvolution(254, 36),
previousPokemon: 252,
),
Sceptile(254, Generation.Three, [Type.Grass], null, previousPokemon: 253),
Torchic(255, Generation.Three, [Type.Fire], SingleEvolution(256, 16)),
Combusken(
256,
Generation.Three,
[Type.Fire, Type.Fighting],
SingleEvolution(257, 36),
previousPokemon: 255,
),
Blaziken(
257,
Generation.Three,
[Type.Fire, Type.Fighting],
null,
previousPokemon: 256,
),
Mudkip(258, Generation.Three, [Type.Water], SingleEvolution(259, 16)),
Marshtomp(
259,
Generation.Three,
[Type.Water, Type.Ground],
SingleEvolution(260, 36),
previousPokemon: 258,
),
Swampert(
260,
Generation.Three,
[Type.Water, Type.Ground],
null,
previousPokemon: 259,
),
Poochyena(261, Generation.Three, [Type.Dark], SingleEvolution(262, 18)),
Mightyena(262, Generation.Three, [Type.Dark], null, previousPokemon: 261),
Zigzagoon(263, Generation.Three, [Type.Normal], SingleEvolution(264, 20)),
Linoone(264, Generation.Three, [Type.Normal], null, previousPokemon: 263),
Wurmple(
265,
Generation.Three,
[Type.Bug],
BranchedEvolution([266, 268], [7, 7], [
[EvolutionCondition.Random, EvolutionCondition.Personality],
[EvolutionCondition.Random, EvolutionCondition.Personality],
]),
),
Silcoon(
266,
Generation.Three,
[Type.Bug],
SingleEvolution(267, 10),
previousPokemon: 265,
),
Beautifly(
267,
Generation.Three,
[Type.Bug, Type.Flying],
null,
previousPokemon: 266,
),
Cascoon(
268,
Generation.Three,
[Type.Bug],
SingleEvolution(269, 10),
previousPokemon: 265,
),
Dustox(
269,
Generation.Three,
[Type.Bug, Type.Poison],
null,
previousPokemon: 268,
),
Lotad(270, Generation.Three, [
Type.Water,
Type.Grass,
], SingleEvolution(271, 14)),
Lombre(
271,
Generation.Three,
[Type.Water, Type.Grass],
SingleEvolution(272, -1, condition: [EvolutionCondition.WaterStone]),
previousPokemon: 270,
),
Ludicolo(
272,
Generation.Three,
[Type.Water, Type.Grass],
null,
previousPokemon: 271,
),
Seedot(273, Generation.Three, [Type.Grass], SingleEvolution(274, 14)),
Nuzleaf(
274,
Generation.Three,
[Type.Grass, Type.Dark],
SingleEvolution(275, -1, condition: [EvolutionCondition.LeafStone]),
previousPokemon: 273,
),
Shiftry(
275,
Generation.Three,
[Type.Grass, Type.Dark],
null,
previousPokemon: 274,
),
Taillow(276, Generation.Three, [
Type.Normal,
Type.Flying,
], SingleEvolution(277, 22)),
Swellow(
277,
Generation.Three,
[Type.Normal, Type.Flying],
null,
previousPokemon: 276,
),
Wingull(278, Generation.Three, [
Type.Water,
Type.Flying,
], SingleEvolution(279, 25)),
Pelipper(
279,
Generation.Three,
[Type.Water, Type.Flying],
null,
previousPokemon: 278,
),
Ralts(280, Generation.Three, [
Type.Psychic,
Type.Fairy,
], SingleEvolution(281, 20)),
Kirlia(
281,
Generation.Three,
[Type.Psychic, Type.Fairy],
SingleEvolution(282, 30),
previousPokemon: 280,
),
Gardevoir(
282,
Generation.Three,
[Type.Psychic, Type.Fairy],
null,
previousPokemon: 281,
),
Surskit(283, Generation.Three, [
Type.Bug,
Type.Water,
], SingleEvolution(284, 22)),
Masquerain(
284,
Generation.Three,
[Type.Bug, Type.Flying],
null,
previousPokemon: 283,
),
Shroomish(285, Generation.Three, [Type.Grass], SingleEvolution(286, 23)),
Breloom(
286,
Generation.Three,
[Type.Grass, Type.Fighting],
null,
previousPokemon: 285,
),
Slakoth(287, Generation.Three, [Type.Normal], SingleEvolution(288, 18)),
Vigoroth(
288,
Generation.Three,
[Type.Normal],
SingleEvolution(289, 36),
previousPokemon: 287,
),
Slaking(289, Generation.Three, [Type.Normal], null, previousPokemon: 288),
Nincada(
290,
Generation.Three,
[Type.Bug, Type.Ground],
BranchedEvolution([291, 292], [20, 20], [
[],
[EvolutionCondition.EmptySlot, EvolutionCondition.PokeballInBag],
]),
),
Ninjask(
291,
Generation.Three,
[Type.Bug, Type.Flying],
null,
previousPokemon: 290,
),
Shedinja(
292,
Generation.Three,
[Type.Bug, Type.Ghost],
null,
previousPokemon: 290,
),
Whismur(293, Generation.Three, [Type.Normal], SingleEvolution(294, 20)),
Loudred(
294,
Generation.Three,
[Type.Normal],
SingleEvolution(295, 40),
previousPokemon: 293,
),
Exploud(295, Generation.Three, [Type.Normal], null, previousPokemon: 294),
Makuhita(296, Generation.Three, [Type.Fighting], SingleEvolution(297, 24)),
Hariyama(297, Generation.Three, [Type.Fighting], null, previousPokemon: 296),
Azurill(
298,
Generation.Three,
[Type.Normal, Type.Fairy],
SingleEvolution(183, -1, condition: [EvolutionCondition.HighFriendship]),
),
Nosepass(299, Generation.Three, [Type.Rock], null),
Skitty(
300,
Generation.Three,
[Type.Normal],
SingleEvolution(301, -1, condition: [EvolutionCondition.MoonStone]),
),
Delcatty(301, Generation.Three, [Type.Normal], null, previousPokemon: 300),
Sableye(302, Generation.Three, [Type.Dark, Type.Ghost], null),
Mawile(303, Generation.Three, [Type.Steel, Type.Fairy], null),
Aron(304, Generation.Three, [
Type.Steel,
Type.Rock,
], SingleEvolution(305, 32)),
Lairon(
305,
Generation.Three,
[Type.Steel, Type.Rock],
SingleEvolution(306, 42),
previousPokemon: 304,
),
Aggron(
306,
Generation.Three,
[Type.Steel, Type.Rock],
null,
previousPokemon: 305,
),
Meditite(307, Generation.Three, [
Type.Fighting,
Type.Psychic,
], SingleEvolution(308, 37)),
Medicham(
308,
Generation.Three,
[Type.Fighting, Type.Psychic],
null,
previousPokemon: 307,
),
Electrike(309, Generation.Three, [Type.Electric], SingleEvolution(310, 26)),
Manectric(310, Generation.Three, [Type.Electric], null, previousPokemon: 309),
Plusle(311, Generation.Three, [Type.Electric], null),
Minun(312, Generation.Three, [Type.Electric], null),
Volbeat(313, Generation.Three, [Type.Bug], null),
Illumise(314, Generation.Three, [Type.Bug], null),
Roselia(
315,
Generation.Three,
[Type.Grass, Type.Poison],
null,
previousPokemon: 406,
),
Gulpin(316, Generation.Three, [Type.Poison], SingleEvolution(317, 26)),
Swalot(317, Generation.Three, [Type.Poison], null, previousPokemon: 316),
Carvanha(318, Generation.Three, [
Type.Water,
Type.Dark,
], SingleEvolution(319, 30)),
Sharpedo(
319,
Generation.Three,
[Type.Water, Type.Dark],
null,
previousPokemon: 318,
),
Wailmer(320, Generation.Three, [Type.Water], SingleEvolution(321, 40)),
Wailord(321, Generation.Three, [Type.Water], null, previousPokemon: 320),
Numel(322, Generation.Three, [
Type.Fire,
Type.Ground,
], SingleEvolution(323, 33)),
Camerupt(
323,
Generation.Three,
[Type.Fire, Type.Ground],
null,
previousPokemon: 322,
),
Torkoal(324, Generation.Three, [Type.Fire], null),
Spoink(325, Generation.Three, [Type.Psychic], SingleEvolution(326, 32)),
Grumpig(326, Generation.Three, [Type.Psychic], null, previousPokemon: 325),
Spinda(327, Generation.Three, [Type.Normal], null),
Trapinch(328, Generation.Three, [Type.Ground], SingleEvolution(329, 35)),
Vibrava(
329,
Generation.Three,
[Type.Ground, Type.Dragon],
SingleEvolution(330, 45),
previousPokemon: 328,
),
Flygon(
330,
Generation.Three,
[Type.Ground, Type.Dragon],
null,
previousPokemon: 329,
),
Cacnea(331, Generation.Three, [Type.Grass], SingleEvolution(332, 32)),
Cacturne(
332,
Generation.Three,
[Type.Grass, Type.Dark],
null,
previousPokemon: 331,
),
Swablu(333, Generation.Three, [
Type.Normal,
Type.Flying,
], SingleEvolution(334, 35)),
Altaria(
334,
Generation.Three,
[Type.Dragon, Type.Flying],
null,
previousPokemon: 333,
),
Zangoose(335, Generation.Three, [Type.Normal], null),
Seviper(336, Generation.Three, [Type.Poison], null),
Lunatone(337, Generation.Three, [Type.Rock, Type.Psychic], null),
Solrock(338, Generation.Three, [Type.Rock, Type.Psychic], null),
Barboach(339, Generation.Three, [
Type.Water,
Type.Ground,
], SingleEvolution(340, 30)),
Whiscash(
340,
Generation.Three,
[Type.Water, Type.Ground],
null,
previousPokemon: 339,
),
Corphish(341, Generation.Three, [Type.Water], SingleEvolution(342, 30)),
Crawdaunt(
342,
Generation.Three,
[Type.Water, Type.Dark],
null,
previousPokemon: 341,
),
Baltoy(343, Generation.Three, [
Type.Ground,
Type.Psychic,
], SingleEvolution(344, 36)),
Claydol(
344,
Generation.Three,
[Type.Ground, Type.Psychic],
null,
previousPokemon: 343,
),
Lileep(345, Generation.Three, [
Type.Rock,
Type.Grass,
], SingleEvolution(346, 40)),
Cradily(
346,
Generation.Three,
[Type.Rock, Type.Grass],
null,
previousPokemon: 345,
),
Anorith(347, Generation.Three, [
Type.Rock,
Type.Bug,
], SingleEvolution(348, 40)),
Armaldo(
348,
Generation.Three,
[Type.Rock, Type.Bug],
null,
previousPokemon: 347,
),
Feebas(
349,
Generation.Three,
[Type.Water],
SingleEvolution(
350,
-1,
condition: [
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.PrismScale,
EvolutionCondition.Or,
EvolutionCondition.MaxBeauty,
],
),
),
Milotic(350, Generation.Three, [Type.Water], null, previousPokemon: 349),
Castform(
351,
Generation.Three,
[Type.Normal],
null,
extraVariants: ["castform_rainy", "castform_snowy", "castform_sunny"],
),
Kecleon(352, Generation.Three, [Type.Normal], null),
Shuppet(353, Generation.Three, [Type.Ghost], SingleEvolution(354, 37)),
Banette(354, Generation.Three, [Type.Ghost], null, previousPokemon: 353),
Duskull(355, Generation.Three, [Type.Ghost], SingleEvolution(356, 37)),
Dusclops(356, Generation.Three, [Type.Ghost], null, previousPokemon: 355),
Tropius(357, Generation.Three, [Type.Grass, Type.Flying], null),
Chimecho(358, Generation.Three, [Type.Psychic], null),
Absol(359, Generation.Three, [Type.Dark], null),
Wynaut(360, Generation.Three, [Type.Psychic], SingleEvolution(202, 15)),
Snorunt(361, Generation.Three, [
Type.Ice,
], BranchedEvolution([362], [42], [[]])),
Glalie(362, Generation.Three, [Type.Ice], null, previousPokemon: 361),
Spheal(363, Generation.Three, [
Type.Ice,
Type.Water,
], SingleEvolution(364, 32)),
Sealeo(
364,
Generation.Three,
[Type.Ice, Type.Water],
SingleEvolution(365, 44),
previousPokemon: 363,
),
Walrein(
365,
Generation.Three,
[Type.Ice, Type.Water],
null,
previousPokemon: 364,
),
Clamperl(
366,
Generation.Three,
[Type.Water],
BranchedEvolution([367, 368], [-1, -1], [
[
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.DeepSeaTooth,
],
[
EvolutionCondition.Trading,
EvolutionCondition.Holding,
EvolutionCondition.DeepSeaScale,
],
]),
),
Huntail(367, Generation.Three, [Type.Water], null, previousPokemon: 366),
Gorebyss(368, Generation.Three, [Type.Water], null, previousPokemon: 366),
Relicanth(369, Generation.Three, [Type.Water, Type.Rock], null),
Luvdisc(370, Generation.Three, [Type.Water], null),
Bagon(371, Generation.Three, [Type.Dragon], SingleEvolution(372, 30)),
Shelgon(
372,
Generation.Three,
[Type.Dragon],
SingleEvolution(373, 50),
previousPokemon: 371,
),
Salamence(
373,
Generation.Three,
[Type.Dragon, Type.Flying],
null,
previousPokemon: 372,
),
Beldum(374, Generation.Three, [
Type.Steel,
Type.Psychic,
], SingleEvolution(375, 20)),
Metang(
375,
Generation.Three,
[Type.Steel, Type.Psychic],
SingleEvolution(376, 45),
previousPokemon: 374,
),
Metagross(
376,
Generation.Three,
[Type.Steel, Type.Psychic],
null,
previousPokemon: 375,
),
Regirock(377, Generation.Three, [Type.Rock], null),
Regice(378, Generation.Three, [Type.Ice], null),
Registeel(379, Generation.Three, [Type.Steel], null),
Latias(380, Generation.Three, [Type.Dragon, Type.Psychic], null),
Latios(381, Generation.Three, [Type.Dragon, Type.Psychic], null),
Kyogre(382, Generation.Three, [Type.Water], null),
Groudon(383, Generation.Three, [Type.Ground], null),
Rayquaza(384, Generation.Three, [Type.Dragon, Type.Flying], null),
Jirachi(385, Generation.Three, [Type.Steel, Type.Psychic], null),
Deoxys(
386,
Generation.Three,
[Type.Psychic],
null,
extraVariants: ["deoxys-attack", "deoxys-defense", "deoxys-speed"],
);
final int id;
final String properName;
final Generation generation;
final List<Type> types;
final Evolution? evolution;
final int dexID;
final int previousPokemon;
final List<String> extraVariants;
bool get hasEvolutions => evolution != null;
const Pokemon(
this.id,
this.generation,
this.types,
this.evolution, {
this.dexID = -1,
this.properName = "",
this.previousPokemon = -1,
this.extraVariants = const [],
});
String get pokemonName => properName == "" ? name : properName;
int get pokeDexID => dexID == -1 ? id : dexID;
String toDexPath() {
if (this.id == Pokemon.Unown.id) return SessionData.getRandomUnownSprite();
return 'assets/sprites/${printName().replaceAll("", "-f").replaceAll("", "-m").toLowerCase()}.png';
}
Widget getTypeWidgets() {
List<Widget> widgets = [];
for (Type type in types) {
widgets.add(
ElevatedButton(
onPressed: () {},
style: ButtonStyle(
backgroundColor: WidgetStatePropertyAll(type.backgroundColor),
foregroundColor: WidgetStatePropertyAll(type.textColor),
),
child: Text(
type.name,
style: TextStyle(fontSize: Constants.isMobile ? 16 : 32),
),
),
);
}
return Row(children: widgets);
}
String printName({var proper = false}) {
String sRet;
if (!proper) {
sRet = name.replaceAll("_", " ");
} else {
sRet = pokemonName;
}
if (sRet.endsWith("F")) sRet = "${sRet.substring(0, sRet.length - 1)}";
if (sRet.endsWith("M")) sRet = "${sRet.substring(0, sRet.length - 1)}";
return sRet;
}
Widget getVariations() {
List<Widget> variants = [];
if (id == Pokemon.Unown.id)
variants = SessionData.getUnownList();
else {
List<Widget> tmpRow = [];
int i = 0;
int row = Constants.isMobile ? 3 : 4;
for (var variant in extraVariants) {
tmpRow.add(Image.asset("assets/sprites/${variant}.png"));
i++;
if (i >= row) {
variants.add(Row(children: tmpRow));
tmpRow = [];
i = 0;
}
}
if (tmpRow.isNotEmpty) variants.add(Row(children: tmpRow));
}
return Column(children: variants);
}
List<Widget> getEvolutions(int subID) {
//print("SUBID ${subID}");
List<Pokemon> Evs = [];
// ID must be in inclusive range of 1...MAXGeneration
if (previousPokemon != -1 &&
previousPokemon <= SessionData.highestGenID()) {
if (previousPokemon != -1 && subID == 0) {
Pokemon pkmn =
Pokemon.values.where((x) => x.id == previousPokemon).first;
return pkmn.getEvolutions(0);
}
}
if (!hasEvolutions) return [];
//print("Processing evolutions for ${pokemonName}");
if (evolution is SingleEvolution) {
//print("Single Evolution identified");
var pokemon =
Pokemon.values
.where((x) => x.id == (evolution! as SingleEvolution).to)
.first;
if (pokemon.id <= SessionData.highestGenID()) Evs.add(pokemon);
} else {
//print("Branching Evolution identified");
// Handle branched evolutions. Refactor below to accomodate a list of pokemon.
for (var ev in (evolution! as BranchedEvolution).alternates) {
if (!(ev >= SessionData.highestGenID())) {
var pokemon = Pokemon.values.where((x) => x.id == ev).first;
if (pokemon.id <= SessionData.highestGenID()) Evs.add(pokemon);
}
}
}
List<Widget> sprites = [];
if (subID == 0) {
sprites.add(Text("Evolutions: ", style: TextStyle(fontSize: 24)));
sprites.add(
Card(
elevation: 50,
child: SizedBox(
width: 256,
height: 256,
child: Column(
children: [
Image.asset(
toDexPath(),
width: Constants.isMobile ? 64 : 128,
height: Constants.isMobile ? 64 : 128,
),
Text(pokemonName, style: TextStyle(fontSize: 24)),
getTypeWidgets(),
],
),
),
),
);
sprites.add(evolution!.getEvolution());
//print("Main page EV.");
} else {
sprites.add(evolution!.getEvolution());
}
List<Widget> afterEvs = [];
for (var ev in Evs) {
afterEvs.addAll(ev.getEvolutions(subID + 1));
//print("Processing evolution: ${ev.properName}");
}
sprites.add(
Row(crossAxisAlignment: CrossAxisAlignment.start, children: afterEvs),
);
return sprites;
}
}