uxie 0.6.3

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

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, BinRead, BinWrite)]
#[brw(repr = u8)]
pub enum MoveSplit {
    Physical = 0,
    Special = 1,
    Status = 2,
}

impl From<u8> for MoveSplit {
    fn from(v: u8) -> Self {
        match v {
            0 => MoveSplit::Physical,
            1 => MoveSplit::Special,
            _ => MoveSplit::Status,
        }
    }
}

bitflags! {
    #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
    pub struct MoveFlags: u8 {
        const MAKES_CONTACT = 0b0000_0001;
        const AFFECTED_BY_PROTECT = 0b0000_0010;
        const AFFECTED_BY_MAGIC_COAT = 0b0000_0100;
        const AFFECTED_BY_SNATCH = 0b0000_1000;
        const USABLE_BY_MIRROR_MOVE = 0b0001_0000;
        const AFFECTED_BY_KINGS_ROCK = 0b0010_0000;
    }
}

impl MoveFlags {
    pub fn from_bits_strict(bits: u8) -> io::Result<Self> {
        Self::from_bits(bits).ok_or_else(|| {
            io::Error::new(
                io::ErrorKind::InvalidData,
                format!("Invalid move flags bits '{}'", bits),
            )
        })
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, BinRead, BinWrite)]
#[brw(little)]
pub struct MoveData {
    pub battle_effect: u16,
    pub split: MoveSplit,
    pub power: u8,
    pub move_type: u8,
    pub accuracy: u8,
    pub pp: u8,
    pub side_effect_chance: u8,
    pub target: u16,
    pub priority: i8,
    #[br(try_map = MoveFlags::from_bits_strict)]
    #[bw(map = |f: &MoveFlags| f.bits())]
    pub flags: MoveFlags,
    pub contest_appeal: u8,
    pub contest_condition: u8,
}