import 'package:flutter/material.dart'; import 'package:flutter/widgets.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), Colors.black), 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), Colors.black), 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), Colors.black), 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), Colors.black), 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, } class Evolution { final int to; final int level; final EvolutionCondition? condition; const Evolution(this.to, this.level, {this.condition = null}); String printEvolution() { String sRet = ""; if (level != -1) { sRet += "Level $level"; } if (condition != null) { if (sRet.isNotEmpty) { sRet += "\n"; } sRet += condition.toString().split('.').last; } return sRet; } } 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], Evolution(2, 16)), Ivysaur(2, Generation.One, [Type.Grass, Type.Poison], Evolution(3, 32)), Venusaur(3, Generation.One, [Type.Grass, Type.Poison], null), Charmander(4, Generation.One, [Type.Fire], Evolution(5, 16)), Charmeleon(5, Generation.One, [Type.Fire], Evolution(6, 36)), Charizard(6, Generation.One, [Type.Fire, Type.Flying], null), Squirtle(7, Generation.One, [Type.Water], Evolution(8, 16)), Wartortle(8, Generation.One, [Type.Water], Evolution(9, 36)), Blastoise(9, Generation.One, [Type.Water], null), Caterpie(10, Generation.One, [Type.Bug], Evolution(11, 7)), Metapod(11, Generation.One, [Type.Bug], Evolution(12, 10)), Butterfree(12, Generation.One, [Type.Bug, Type.Flying], null), Weedle(13, Generation.One, [Type.Bug, Type.Poison], Evolution(14, 7)), Kakuna(14, Generation.One, [Type.Bug, Type.Poison], Evolution(15, 10)), Beedrill(15, Generation.One, [Type.Bug, Type.Poison], null), Pidgey(16, Generation.One, [Type.Normal, Type.Flying], Evolution(17, 18)), Pidgeotto(17, Generation.One, [Type.Normal, Type.Flying], Evolution(18, 36)), Pidgeot(18, Generation.One, [Type.Normal, Type.Flying], null), Rattata(19, Generation.One, [Type.Normal], Evolution(20, 20)), Raticate(20, Generation.One, [Type.Normal], null), Spearow(21, Generation.One, [Type.Normal, Type.Flying], Evolution(22, 20)), Fearow(22, Generation.One, [Type.Normal, Type.Flying], null), Pikachu(25, Generation.One, [ Type.Electric, ], Evolution(26, -1, condition: EvolutionCondition.ThunderStone)), Raichu(26, Generation.One, [Type.Electric], null), Sandshrew(27, Generation.One, [Type.Ground], Evolution(28, 22)), Sandslash(28, Generation.One, [Type.Ground], null), NidoranF(29, Generation.One, [Type.Poison], Evolution(30, 16)), Nidorina(30, Generation.One, [Type.Poison], Evolution(31, 36)), NidoQueen(31, Generation.One, [Type.Poison, Type.Ground], null), NidoranM(32, Generation.One, [Type.Poison], Evolution(33, 16)), Nidorino(33, Generation.One, [Type.Poison], Evolution(34, 36)), NidoKing(34, Generation.One, [Type.Poison, Type.Ground], null), Clefairy(35, Generation.One, [ Type.Fairy, ], Evolution(36, -1, condition: EvolutionCondition.MoonStone)), Clefable(36, Generation.One, [Type.Fairy], null), Vulpix(37, Generation.One, [ Type.Fire, ], Evolution(38, -1, condition: EvolutionCondition.FireStone)), NineTales(38, Generation.One, [Type.Fire], null); final int id; final Generation generation; final List types; final Evolution? evolution; bool get hasEvolutions => evolution != null; const Pokemon(this.id, this.generation, this.types, this.evolution); String toDexPath() { 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() { String sRet = name.replaceAll("_", " "); 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 getEvolutions(int subID) { if (!hasEvolutions) return []; Pokemon ev = Pokemon.values.where((x) => x.id == evolution!.to).first; List sprites = []; if (subID == 0) { sprites.add(Text("Evolutions: ", style: TextStyle(fontSize: 24))); sprites.add( Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.asset( toDexPath(), width: Constants.isMobile ? 64 : 128, height: Constants.isMobile ? 64 : 128, ), getTypeWidgets(), ], ), ); sprites.add( Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Icon( Constants.isMobile ? Icons.arrow_downward : Icons.arrow_forward, size: 48, ), Text(evolution!.printEvolution(), style: TextStyle(fontSize: 24)), ], ), ); } sprites.add( Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Constants.isMobile ? Image.asset(ev.toDexPath(), width: 64, height: 64) : Image.asset(ev.toDexPath(), width: 128, height: 128), ev.getTypeWidgets(), ], ), ); if (ev.hasEvolutions) { sprites.add( Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Icon( Constants.isMobile ? Icons.arrow_downward : Icons.arrow_forward, size: 48, ), Text( ev.evolution!.printEvolution(), style: TextStyle(fontSize: 24), ), ], ), ); //sprites.add(Icon(Icons.arrow_forward, size: 48)); sprites.addAll(ev.getEvolutions(subID + 1)); } return sprites; } }