PokeDex/lib/pokemon.dart
2025-03-22 20:37:49 -07:00

236 lines
7.4 KiB
Dart

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);
}
class Evolution {
final int to;
final int level;
const Evolution(this.to, this.level);
}
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);
final int id;
final Generation generation;
final List<Type> types;
final Evolution? evolution;
bool get hasEvolutions => evolution != null;
const Pokemon(this.id, this.generation, this.types, this.evolution);
String toSpritePath() {
return '${generation.toSpritePath()}/${name.toLowerCase()}.png';
}
String toDexPath() {
return 'assets/sprites/gen8/${name.toLowerCase()}.png';
}
String toSpriteShinyPath() {
return '${generation.toSpritePath()}/${name.toLowerCase()}_shiny.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);
}
List<Widget> getEvolutions(int subID) {
if (!hasEvolutions) return [];
Pokemon ev = Pokemon.values.where((x) => x.id == evolution!.to).first;
List<Widget> 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("Level ${evolution!.level}", 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(
"Level ${ev.evolution!.level}",
style: TextStyle(fontSize: 24),
),
],
),
);
//sprites.add(Icon(Icons.arrow_forward, size: 48));
sprites.addAll(ev.getEvolutions(subID + 1));
}
return sprites;
}
}