xenua
1 year ago
commit
78255939e3
3 changed files with 288 additions and 0 deletions
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
[package] |
||||
name = "pokedata" |
||||
version = "0.1.0" |
||||
edition = "2021" |
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||
|
||||
[dependencies] |
@ -0,0 +1,278 @@
@@ -0,0 +1,278 @@
|
||||
use std::{ |
||||
fmt::Display, |
||||
ops::{Index, IndexMut}, |
||||
}; |
||||
|
||||
pub struct Pokemon { |
||||
species: u32, |
||||
trainer_id: TrainerId, |
||||
generation: Generation, |
||||
nickname: Option<String>, |
||||
language: Language, |
||||
gender: Gender, |
||||
isFatefulEncounter: bool, |
||||
} |
||||
|
||||
pub enum TrainerId { |
||||
/// used in gens 1-2. no secret id
|
||||
SixteenBitSingle(u16), |
||||
/// gens 3-6, and 1-2 transferred to 7+
|
||||
SixteenBit(u16, u16), |
||||
/// gens 7+
|
||||
SixDigit(u32), |
||||
} |
||||
|
||||
impl Display for TrainerId { |
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
||||
write!( |
||||
f, |
||||
"{:06}", |
||||
match self { |
||||
TrainerId::SixteenBitSingle(v) => *v as u32, |
||||
TrainerId::SixteenBit(v, _) => *v as u32, |
||||
TrainerId::SixDigit(v) => v % 100_000, |
||||
} |
||||
) |
||||
} |
||||
} |
||||
|
||||
pub enum Generation { |
||||
One = 1, |
||||
Two = 2, |
||||
Three = 3, |
||||
Four = 4, |
||||
Five = 5, |
||||
Six = 6, |
||||
Seven = 7, |
||||
Eight = 8, |
||||
Nine = 9, |
||||
|
||||
/// the Let's Go gamess
|
||||
Gen7b, |
||||
/// Legends Arceus
|
||||
Gen8a, |
||||
/// BDSP
|
||||
Gen8b, |
||||
} |
||||
|
||||
pub enum Nature { |
||||
Hardy = 0, |
||||
Lonely = 1, |
||||
Brave = 2, |
||||
Adamant = 3, |
||||
Naughty = 4, |
||||
Bold = 5, |
||||
Docile = 6, |
||||
Relaxed = 7, |
||||
Impish = 8, |
||||
Lax = 9, |
||||
Timid = 10, |
||||
Hasty = 11, |
||||
Serious = 12, |
||||
Jolly = 13, |
||||
Naive = 14, |
||||
Modest = 15, |
||||
Mild = 16, |
||||
Quiet = 17, |
||||
Bashful = 18, |
||||
Rash = 19, |
||||
Calm = 20, |
||||
Gentle = 21, |
||||
Sassy = 22, |
||||
Careful = 23, |
||||
Quirky = 24, |
||||
} |
||||
|
||||
impl From<Nature> for Option<(Stat, Stat)> { |
||||
fn from(value: Nature) -> Self { |
||||
use Nature::*; |
||||
use Stat::*; |
||||
|
||||
match value { |
||||
Hardy => None, |
||||
Lonely => Some((Attack, Defense)), |
||||
Brave => Some((Attack, Speed)), |
||||
Adamant => Some((Attack, SpAtk)), |
||||
Naughty => Some((Attack, SpDef)), |
||||
Bold => Some((Defense, Attack)), |
||||
Docile => None, |
||||
Relaxed => Some((Defense, Speed)), |
||||
Impish => Some((Defense, SpAtk)), |
||||
Lax => Some((Defense, SpDef)), |
||||
Timid => Some((Speed, Attack)), |
||||
Hasty => Some((Speed, Defense)), |
||||
Serious => None, |
||||
Jolly => Some((Speed, SpAtk)), |
||||
Naive => Some((Speed, SpDef)), |
||||
Modest => Some((SpAtk, Attack)), |
||||
Mild => Some((SpAtk, Defense)), |
||||
Quiet => Some((SpAtk, Speed)), |
||||
Bashful => None, |
||||
Rash => Some((SpAtk, SpDef)), |
||||
Calm => Some((SpDef, Attack)), |
||||
Gentle => Some((SpDef, Defense)), |
||||
Sassy => Some((SpDef, Speed)), |
||||
Careful => Some((SpDef, SpAtk)), |
||||
Quirky => None, |
||||
} |
||||
} |
||||
} |
||||
|
||||
pub enum Stat { |
||||
HitPoints, |
||||
Attack, |
||||
Defense, |
||||
SpAtk, |
||||
SpDef, |
||||
Speed, |
||||
} |
||||
|
||||
pub enum Flavor { |
||||
Spicy, |
||||
Sour, |
||||
Dry, |
||||
Bitter, |
||||
Sweet, |
||||
} |
||||
|
||||
impl From<Flavor> for Stat { |
||||
fn from(value: Flavor) -> Self { |
||||
use Flavor::*; |
||||
use Stat::*; |
||||
|
||||
match value { |
||||
Spicy => Attack, |
||||
Sour => Defense, |
||||
Dry => SpAtk, |
||||
Bitter => SpDef, |
||||
Sweet => Speed, |
||||
} |
||||
} |
||||
} |
||||
|
||||
impl From<Stat> for Option<Flavor> { |
||||
fn from(value: Stat) -> Self { |
||||
use Flavor::*; |
||||
use Stat::*; |
||||
|
||||
match value { |
||||
HitPoints => None, |
||||
Attack => Some(Spicy), |
||||
Defense => Some(Sour), |
||||
SpAtk => Some(Dry), |
||||
SpDef => Some(Bitter), |
||||
Speed => Some(Sweet), |
||||
} |
||||
} |
||||
} |
||||
|
||||
pub enum Language { |
||||
Hacked = 0, |
||||
Japanese = 1, |
||||
English = 2, |
||||
French = 3, |
||||
Italian = 4, |
||||
German = 5, |
||||
Unused6 = 6, |
||||
Spanish = 7, |
||||
Korean = 8, |
||||
ChineseS = 9, |
||||
ChineseT = 10, |
||||
} |
||||
|
||||
pub enum Gender { |
||||
Male = 0, |
||||
Female = 1, |
||||
Genderless = 2, |
||||
} |
||||
|
||||
pub struct IVs { |
||||
pub hp: u8, |
||||
pub atk: u8, |
||||
pub def: u8, |
||||
pub spa: u8, |
||||
pub spd: u8, |
||||
pub spe: u8, |
||||
} |
||||
|
||||
impl Index<Stat> for IVs { |
||||
type Output = u8; |
||||
|
||||
fn index(&self, index: Stat) -> &Self::Output { |
||||
use Stat::*; |
||||
|
||||
match index { |
||||
HitPoints => &self.hp, |
||||
Attack => &self.atk, |
||||
Defense => &self.def, |
||||
SpAtk => &self.spa, |
||||
SpDef => &self.spd, |
||||
Speed => &self.spe, |
||||
} |
||||
} |
||||
} |
||||
|
||||
impl IndexMut<Stat> for IVs { |
||||
fn index_mut(&mut self, index: Stat) -> &mut Self::Output { |
||||
use Stat::*; |
||||
|
||||
match index { |
||||
HitPoints => &mut self.hp, |
||||
Attack => &mut self.atk, |
||||
Defense => &mut self.def, |
||||
SpAtk => &mut self.spa, |
||||
SpDef => &mut self.spd, |
||||
Speed => &mut self.spe, |
||||
} |
||||
} |
||||
} |
||||
|
||||
pub struct EVs { |
||||
pub hp: u8, |
||||
pub atk: u8, |
||||
pub def: u8, |
||||
pub spa: u8, |
||||
pub spd: u8, |
||||
pub spe: u8, |
||||
} |
||||
|
||||
impl Index<Stat> for EVs { |
||||
type Output = u8; |
||||
|
||||
fn index(&self, index: Stat) -> &Self::Output { |
||||
use Stat::*; |
||||
|
||||
match index { |
||||
HitPoints => &self.hp, |
||||
Attack => &self.atk, |
||||
Defense => &self.def, |
||||
SpAtk => &self.spa, |
||||
SpDef => &self.spd, |
||||
Speed => &self.spe, |
||||
} |
||||
} |
||||
} |
||||
|
||||
impl IndexMut<Stat> for EVs { |
||||
fn index_mut(&mut self, index: Stat) -> &mut Self::Output { |
||||
use Stat::*; |
||||
|
||||
match index { |
||||
HitPoints => &mut self.hp, |
||||
Attack => &mut self.atk, |
||||
Defense => &mut self.def, |
||||
SpAtk => &mut self.spa, |
||||
SpDef => &mut self.spd, |
||||
Speed => &mut self.spe, |
||||
} |
||||
} |
||||
} |
||||
|
||||
pub struct CurrentMoveSet(LearnedMove, LearnedMove, LearnedMove, LearnedMove); |
||||
|
||||
pub struct LearnedMove { |
||||
inner: Move, |
||||
pp_up: u8, |
||||
} |
||||
|
||||
pub enum Move {} |
Loading…
Reference in new issue