uxie 0.5.1

Data fetching library for Pokemon Gen 4 romhacking - map headers, C parsing, and more
Documentation
use binrw::{BinRead, BinWrite};

#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, BinRead, BinWrite)]
#[brw(little)]
pub struct PersonalData {
    pub hp: u8,
    pub attack: u8,
    pub defense: u8,
    pub speed: u8,
    pub sp_attack: u8,
    pub sp_defense: u8,
    pub type1: u8,
    pub type2: u8,
    pub catch_rate: u8,
    pub base_exp: u8,
    pub ev_yield: u16,
    pub item1: u16,
    pub item2: u16,
    pub gender_ratio: u8,
    pub egg_cycles: u8,
    pub base_friendship: u8,
    pub growth_rate: u8,
    pub egg_group1: u8,
    pub egg_group2: u8,
    pub ability1: u8,
    pub ability2: u8,
    pub safari_flee_rate: u8,
    pub color_flip: u8,
    #[brw(pad_before = 2)]
    pub tm_compatibility: [u8; 16],
}

impl PersonalData {
    pub fn ev_yield_hp(&self) -> u8 {
        (self.ev_yield & 0b11) as u8
    }

    pub fn ev_yield_attack(&self) -> u8 {
        ((self.ev_yield >> 2) & 0b11) as u8
    }

    pub fn ev_yield_defense(&self) -> u8 {
        ((self.ev_yield >> 4) & 0b11) as u8
    }

    pub fn ev_yield_speed(&self) -> u8 {
        ((self.ev_yield >> 6) & 0b11) as u8
    }

    pub fn ev_yield_sp_attack(&self) -> u8 {
        ((self.ev_yield >> 8) & 0b11) as u8
    }

    pub fn ev_yield_sp_defense(&self) -> u8 {
        ((self.ev_yield >> 10) & 0b11) as u8
    }

    pub fn can_learn_tm(&self, tm_index: u8) -> bool {
        if tm_index >= 128 {
            return false;
        }
        let byte_idx = (tm_index / 8) as usize;
        let bit_idx = tm_index % 8;
        (self.tm_compatibility[byte_idx] & (1 << bit_idx)) != 0
    }
}