PokeDex/lib/pokemon.dart

680 lines
21 KiB
Dart

// ignore_for_file: constant_identifier_names
import 'package:flutter/material.dart';
import 'package:pokedex/Consts.dart';
enum Generation {
One,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine;
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), Colors.black),
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), Colors.black),
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,
MoonStone,
FireStone,
LeafStone,
Alola,
OutsideAlola,
Night,
Day,
AttackGreaterThanDefense,
AttackLessThanDefense,
AttackEqualDefense,
Galar,
OutsideGalar,
}
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() {
Pokemon pkmn = Pokemon.values.where((x) => x.id == to).first;
var arrow = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(
Constants.isMobile ? Icons.arrow_downward : Icons.arrow_forward,
size: 48,
),
Text(printEvolution(), style: TextStyle(fontSize: 24)),
],
);
Column col = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset(
pkmn.toDexPath(),
width: Constants.isMobile ? 64 : 128,
height: Constants.isMobile ? 64 : 128,
),
pkmn.getTypeWidgets(),
],
);
Column rw = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [arrow, col],
);
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.
Row arrowRow;
List<Widget> arrows = [];
List<Widget> pkmnRow = [];
Row rowPkmn;
for (var pkmn in alternates) {
int index = alternates.indexOf(pkmn);
Pokemon _pkmn = Pokemon.values.where((x) => x.id == pkmn).first;
arrows.add(
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(
Constants.isMobile ? Icons.arrow_downward : Icons.arrow_forward,
size: 48,
),
Text(
_prntEV(conditions[index], levels[index]),
style: TextStyle(fontSize: 24),
),
//Text(printEvolution(), style: TextStyle(fontSize: 24)),
],
),
);
pkmnRow.add(
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset(
_pkmn.toDexPath(),
width: Constants.isMobile ? 64 : 128,
height: Constants.isMobile ? 64 : 128,
),
_pkmn.getTypeWidgets(),
],
),
);
}
arrowRow = Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: arrows,
);
rowPkmn = Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: pkmnRow,
);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [arrowRow, rowPkmn],
);
}
}
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)),
Venusaur(3, Generation.One, [Type.Grass, Type.Poison], null),
Charmander(4, Generation.One, [Type.Fire], SingleEvolution(5, 16)),
Charmeleon(5, Generation.One, [Type.Fire], SingleEvolution(6, 36)),
Charizard(6, Generation.One, [Type.Fire, Type.Flying], null),
Squirtle(7, Generation.One, [Type.Water], SingleEvolution(8, 16)),
Wartortle(8, Generation.One, [Type.Water], SingleEvolution(9, 36)),
Blastoise(9, Generation.One, [Type.Water], null),
Caterpie(10, Generation.One, [Type.Bug], SingleEvolution(11, 7)),
Metapod(11, Generation.One, [Type.Bug], SingleEvolution(12, 10)),
Butterfree(12, Generation.One, [Type.Bug, Type.Flying], null),
Weedle(13, Generation.One, [Type.Bug, Type.Poison], SingleEvolution(14, 7)),
Kakuna(14, Generation.One, [Type.Bug, Type.Poison], SingleEvolution(15, 10)),
Beedrill(15, Generation.One, [Type.Bug, Type.Poison], null),
Pidgey(16, Generation.One, [
Type.Normal,
Type.Flying,
], SingleEvolution(17, 18)),
Pidgeotto(17, Generation.One, [
Type.Normal,
Type.Flying,
], SingleEvolution(18, 36)),
Pidgeot(18, Generation.One, [Type.Normal, Type.Flying], null),
Rattata(19, Generation.One, [Type.Normal], SingleEvolution(20, 20)),
Raticate(20, Generation.One, [Type.Normal], null),
Spearow(21, Generation.One, [
Type.Normal,
Type.Flying,
], SingleEvolution(22, 20)),
Fearow(22, Generation.One, [Type.Normal, Type.Flying], null),
Pikachu(
25,
Generation.One,
[Type.Electric],
SingleEvolution(26, -1, condition: [EvolutionCondition.ThunderStone]),
),
Raichu(26, Generation.One, [Type.Electric], null),
Sandshrew(27, Generation.One, [Type.Ground], SingleEvolution(28, 22)),
Sandslash(28, Generation.One, [Type.Ground], null),
NidoranF(29, Generation.One, [Type.Poison], SingleEvolution(30, 16)),
Nidorina(30, Generation.One, [Type.Poison], SingleEvolution(31, 36)),
NidoQueen(31, Generation.One, [Type.Poison, Type.Ground], null),
NidoranM(32, Generation.One, [Type.Poison], SingleEvolution(33, 16)),
Nidorino(33, Generation.One, [Type.Poison], SingleEvolution(34, 36)),
NidoKing(34, Generation.One, [Type.Poison, Type.Ground], null),
Clefairy(
35,
Generation.One,
[Type.Fairy],
SingleEvolution(36, -1, condition: [EvolutionCondition.MoonStone]),
),
Clefable(36, Generation.One, [Type.Fairy], null),
Vulpix(
37,
Generation.One,
[Type.Fire],
SingleEvolution(38, -1, condition: [EvolutionCondition.FireStone]),
),
NineTales(38, Generation.One, [Type.Fire], null),
Jigglypuff(
39,
Generation.One,
[Type.Fairy],
SingleEvolution(40, -1, condition: [EvolutionCondition.MoonStone]),
),
WigglyTuff(40, Generation.One, [Type.Fairy], null),
Zubat(41, Generation.One, [
Type.Poison,
Type.Flying,
], SingleEvolution(42, 22)),
Golbat(42, Generation.One, [Type.Poison, Type.Flying], null),
Oddish(43, Generation.One, [
Type.Poison,
Type.Grass,
], SingleEvolution(44, 21)),
Gloom(
44,
Generation.One,
[Type.Poison, Type.Grass],
SingleEvolution(45, -1, condition: [EvolutionCondition.LeafStone]),
),
Vileplume(45, Generation.One, [Type.Poison, Type.Grass], null),
Paras(46, Generation.One, [Type.Bug, Type.Grass], SingleEvolution(47, 24)),
Parasect(47, Generation.One, [Type.Bug, Type.Grass], null),
Venonat(48, Generation.One, [Type.Bug, Type.Poison], SingleEvolution(49, 31)),
Venomoth(49, Generation.One, [Type.Bug, Type.Poison], null),
Diglett(50, Generation.One, [Type.Ground], SingleEvolution(51, 26)),
Dugtrio(51, Generation.One, [Type.Ground], null),
Meowth(52, Generation.One, [Type.Normal], SingleEvolution(53, 28)),
Persian(53, Generation.One, [Type.Normal], null),
Psyduck(54, Generation.One, [Type.Water], SingleEvolution(55, 33)),
Golduck(55, Generation.One, [Type.Water], null),
Mankey(56, Generation.One, [Type.Fighting], SingleEvolution(57, 28)),
Primeape(57, Generation.One, [Type.Fighting], null),
Growlithe(
58,
Generation.One,
[Type.Fire],
SingleEvolution(59, -1, condition: [EvolutionCondition.FireStone]),
),
Arcanine(59, Generation.One, [Type.Fire], null),
Poliwag(60, Generation.One, [Type.Water], SingleEvolution(61, 25)),
Poliwhirl(
61,
Generation.One,
[Type.Water],
SingleEvolution(62, -1, condition: [EvolutionCondition.WaterStone]),
),
Poliwrath(62, Generation.One, [Type.Water], null),
Abra(63, Generation.One, [Type.Psychic], SingleEvolution(64, 16)),
Kadabra(64, Generation.One, [
Type.Psychic,
], SingleEvolution(65, -1, condition: [EvolutionCondition.Trading])),
Alakazam(65, Generation.One, [Type.Psychic], null),
Machop(66, Generation.One, [Type.Fighting], SingleEvolution(67, 28)),
Machoke(67, Generation.One, [
Type.Fighting,
], SingleEvolution(68, -1, condition: [EvolutionCondition.Trading])),
Machamp(68, Generation.One, [Type.Fighting], null),
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]),
),
Victreebel(71, Generation.One, [Type.Grass, Type.Poison], null),
Tentacool(72, Generation.One, [
Type.Water,
Type.Poison,
], SingleEvolution(73, 30)),
Tentacruel(73, Generation.One, [Type.Water, Type.Poison], null),
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])),
Golem(76, Generation.One, [Type.Rock, Type.Ground], null),
Ponyta(77, Generation.One, [Type.Fire], SingleEvolution(78, 40)),
Rapidash(78, Generation.One, [Type.Fire], null),
Slowpoke(79, Generation.One, [
Type.Water,
Type.Psychic,
], SingleEvolution(80, 37)),
Slowbro(80, Generation.One, [Type.Water, Type.Psychic], null),
Magnemite(81, Generation.One, [
Type.Electric,
Type.Steel,
], SingleEvolution(82, 30)),
Magneton(82, Generation.One, [Type.Electric, Type.Steel], null),
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),
Seel(86, Generation.One, [Type.Water], SingleEvolution(87, 34)),
Dewgong(87, Generation.One, [Type.Water, Type.Ice], null),
Grimer(88, Generation.One, [Type.Poison], SingleEvolution(89, 38)),
Muk(89, Generation.One, [Type.Poison], null),
Shellder(
90,
Generation.One,
[Type.Water],
SingleEvolution(91, -1, condition: [EvolutionCondition.WaterStone]),
),
Cloyster(91, Generation.One, [Type.Water, Type.Ice], null),
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])),
Gengar(94, Generation.One, [Type.Ghost, Type.Poison], null),
Onix(95, Generation.One, [Type.Rock, Type.Ground], null),
Drowzee(96, Generation.One, [Type.Psychic], SingleEvolution(97, 26)),
Hypno(97, Generation.One, [Type.Psychic], null),
Krabby(98, Generation.One, [Type.Water], SingleEvolution(99, 28)),
Kingler(99, Generation.One, [Type.Water], null),
Voltorb(100, Generation.One, [Type.Electric], SingleEvolution(101, 30)),
Electrode(101, Generation.One, [Type.Electric], null),
Exeggcute(
102,
Generation.One,
[Type.Grass, Type.Psychic],
SingleEvolution(103, -1, condition: [EvolutionCondition.LeafStone]),
),
Exeggutor(103, Generation.One, [Type.Grass, Type.Psychic], null),
Cubone(
104,
Generation.One,
[Type.Ground],
SingleEvolution(105, 28, condition: [EvolutionCondition.OutsideAlola]),
),
Marowak(105, Generation.One, [Type.Ground], null),
Hitmonlee(106, Generation.One, [Type.Fighting], null),
Hitmonchan(107, Generation.One, [Type.Fighting], null),
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),
Rhyhorn(111, Generation.One, [
Type.Ground,
Type.Rock,
], SingleEvolution(112, 42)),
Rhydon(112, Generation.One, [Type.Ground, Type.Rock], null),
Chansey(113, Generation.One, [Type.Normal], null),
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], null),
Goldeen(118, Generation.One, [Type.Water], SingleEvolution(119, 33)),
Seaking(119, Generation.One, [Type.Water], null),
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",
),
Scyther(123, Generation.One, [Type.Bug, Type.Flying], null),
Jynx(124, Generation.One, [Type.Ice, Type.Psychic], null),
Electabuzz(125, Generation.One, [Type.Electric], null),
Magmar(126, Generation.One, [Type.Fire], null),
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),
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], [-1, -1, -1], [
[EvolutionCondition.WaterStone],
[EvolutionCondition.ThunderStone],
[EvolutionCondition.FireStone],
]),
),
Vaporeon(134, Generation.One, [Type.Water], null),
Jolteon(135, Generation.One, [Type.Electric], null),
Flareon(136, Generation.One, [Type.Fire], null),
Porygon(137, Generation.One, [Type.Normal], null),
Omanyte(138, Generation.One, [
Type.Rock,
Type.Water,
], SingleEvolution(139, 40)),
Omastar(139, Generation.One, [Type.Rock, Type.Water], null),
Kabuto(140, Generation.One, [
Type.Rock,
Type.Water,
], SingleEvolution(141, 40)),
Kabutops(141, Generation.One, [Type.Rock, Type.Water], null),
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)),
Dragonite(149, Generation.One, [Type.Dragon, Type.Flying], null),
Mewtwo(150, Generation.One, [Type.Psychic], null),
Mew(151, Generation.One, [Type.Psychic], null);
final int id;
final String properName;
final Generation generation;
final List<Type> types;
final Evolution? evolution;
final int dexID;
bool get hasEvolutions => evolution != null;
const Pokemon(
this.id,
this.generation,
this.types,
this.evolution, {
this.dexID = -1,
this.properName = "",
});
String get pokemonName => properName == "" ? name : properName;
int get pokeDexID => dexID == -1 ? id : dexID;
String toDexPath() {
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;
}
List<Widget> getEvolutions(int subID) {
//print("SUBID ${subID}");
if (!hasEvolutions) return [];
List<Pokemon> Evs = [];
//print("Processing evolutions for ${pokemonName}");
if (evolution is SingleEvolution) {
//print("Single Evolution identified");
Evs.add(
Pokemon.values
.where((x) => x.id == (evolution! as SingleEvolution).to)
.first,
);
} else {
//print("Branching Evolution identified");
// Handle branched evolutions. Refactor below to accomodate a list of pokemon.
for (var ev in (evolution! as BranchedEvolution).alternates) {
Evs.add(Pokemon.values.where((x) => x.id == ev).first);
}
}
List<Widget> sprites = [];
if (subID == 0) {
sprites.add(Text("Evolutions: ", style: TextStyle(fontSize: 24)));
sprites.add(
Image.asset(
toDexPath(),
width: Constants.isMobile ? 64 : 128,
height: Constants.isMobile ? 64 : 128,
),
);
sprites.add(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;
}
}