// 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? 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 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 alternates; final List levels; final List> conditions; const BranchedEvolution(this.alternates, this.levels, this.conditions); @override String printEvolution() { return ""; } String _prntEV(List 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 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 types; final Evolution? evolution; final int dexID; final int previousPokemon; final List 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 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 variants = []; if (id == Pokemon.Unown.id) variants = SessionData.getUnownList(); else { List 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 getEvolutions(int subID) { //print("SUBID ${subID}"); List 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 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 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; } }