use serde::{Serialize, Deserialize}; #[derive(Debug, Copy, Clone)] pub enum ItemParseError { InvalidShieldBytes, InvalidShieldType, } #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, enum_utils::FromStr, derive_more::Display)] pub enum ShieldType { Barrier, Shield, CoreShield, GigaShield, SoulBarrier, HardShield, BraveBarrier, SolidShield, FlameBarrier, PlasmaBarrier, FreezeBarrier, PsychicBarrier, GeneralShield, ProtectBarrier, GloriousShield, ImperialBarrier, GuardianShield, DivinityBarrier, UltimateShield, SpiritualShield, CelestialShield, InvisibleGuard, SacredGuard, SPartsVer116, SPartsVer201, LightRelief, ShieldOfDelsaber, ForceWall, RangerWall, HunterWall, AttributeWall, SecretGear, CombatGear, ProtoRegeneGear, RegenerateGear, RegeneGearAdv, FlowensShield, CustomBarrierVerOo, DbsShield, RedRing, TripolicShield, StandstillShield, SafetyHeart, KasamiBracer, GodsShieldSuzaku, GodsShieldGenbu, GodsShieldByakko, GodsShieldSeiryu, HuntersShell, RicosGlasses, RicosEarring, BlueRing, Barrier2, SecureFeet, Barrier3, Barrier4, Barrier5, Barrier6, RestaMerge, AntiMerge, ShiftaMerge, DebandMerge, FoieMerge, GifoieMerge, RafoieMerge, RedMerge, BartaMerge, GibartaMerge, RabartaMerge, BlueMerge, ZondeMerge, GizondeMerge, RazondeMerge, YellowMerge, RecoveryBarrier, AssistBarrier, RedBarrier, BlueBarrier, YellowBarrier, WeaponsGoldShield, BlackGear, WorksGuard, RagolRing, BlueRing2, BlueRing3, BlueRing4, BlueRing5, BlueRing6, BlueRing7, BlueRing8, BlueRing9, GreenRing, GreenRing2, GreenRing3, GreenRing4, GreenRing5, GreenRing6, GreenRing7, GreenRing8, YellowRing, YellowRing2, YellowRing3, YellowRing4, YellowRing5, YellowRing6, YellowRing7, YellowRing8, PurpleRing, PurpleRing2, PurpleRing3, PurpleRing4, PurpleRing5, PurpleRing6, PurpleRing7, PurpleRing8, WhiteRing, WhiteRing2, WhiteRing3, WhiteRing4, WhiteRing5, WhiteRing6, WhiteRing7, WhiteRing8, BlackRing, BlackRing2, BlackRing3, BlackRing4, BlackRing5, BlackRing6, BlackRing7, BlackRing8, WeaponsSilverShield, WeaponsCopperShield, Gratia, TripolicReflector, StrikerPlus, RegenerateGearBP, Rupika, YataMirror, BunnyEars, CatEars, ThreeSeals, GodsShieldKouryu, DfShield, FromTheDepths, DeRolLeShield, HoneycombReflector, Epsiguard, AngelRing, UnionGuard, UnionGuard2, UnionGuard3, UnionGuard4, StinkShield, Unknownb, Genpei, Genpei2, Genpei3, Genpei4, Genpei5, Genpei6, Genpei7, Genpei8, Genpei9, Genpei10, } impl ShieldType { pub fn value(&self) -> [u8; 3] { match self { ShieldType::Barrier => [0x01, 0x02, 0x00], ShieldType::Shield => [0x01, 0x02, 0x01], ShieldType::CoreShield => [0x01, 0x02, 0x02], ShieldType::GigaShield => [0x01, 0x02, 0x03], ShieldType::SoulBarrier => [0x01, 0x02, 0x04], ShieldType::HardShield => [0x01, 0x02, 0x05], ShieldType::BraveBarrier => [0x01, 0x02, 0x06], ShieldType::SolidShield => [0x01, 0x02, 0x07], ShieldType::FlameBarrier => [0x01, 0x02, 0x08], ShieldType::PlasmaBarrier => [0x01, 0x02, 0x09], ShieldType::FreezeBarrier => [0x01, 0x02, 0x0A], ShieldType::PsychicBarrier => [0x01, 0x02, 0x0B], ShieldType::GeneralShield => [0x01, 0x02, 0x0C], ShieldType::ProtectBarrier => [0x01, 0x02, 0x0D], ShieldType::GloriousShield => [0x01, 0x02, 0x0E], ShieldType::ImperialBarrier => [0x01, 0x02, 0x0F], ShieldType::GuardianShield => [0x01, 0x02, 0x10], ShieldType::DivinityBarrier => [0x01, 0x02, 0x11], ShieldType::UltimateShield => [0x01, 0x02, 0x12], ShieldType::SpiritualShield => [0x01, 0x02, 0x13], ShieldType::CelestialShield => [0x01, 0x02, 0x14], ShieldType::InvisibleGuard => [0x01, 0x02, 0x15], ShieldType::SacredGuard => [0x01, 0x02, 0x16], ShieldType::SPartsVer116 => [0x01, 0x02, 0x17], ShieldType::SPartsVer201 => [0x01, 0x02, 0x18], ShieldType::LightRelief => [0x01, 0x02, 0x19], ShieldType::ShieldOfDelsaber => [0x01, 0x02, 0x1A], ShieldType::ForceWall => [0x01, 0x02, 0x1B], ShieldType::RangerWall => [0x01, 0x02, 0x1C], ShieldType::HunterWall => [0x01, 0x02, 0x1D], ShieldType::AttributeWall => [0x01, 0x02, 0x1E], ShieldType::SecretGear => [0x01, 0x02, 0x1F], ShieldType::CombatGear => [0x01, 0x02, 0x20], ShieldType::ProtoRegeneGear => [0x01, 0x02, 0x21], ShieldType::RegenerateGear => [0x01, 0x02, 0x22], ShieldType::RegeneGearAdv => [0x01, 0x02, 0x23], ShieldType::FlowensShield => [0x01, 0x02, 0x24], ShieldType::CustomBarrierVerOo => [0x01, 0x02, 0x25], ShieldType::DbsShield => [0x01, 0x02, 0x26], ShieldType::RedRing => [0x01, 0x02, 0x27], ShieldType::TripolicShield => [0x01, 0x02, 0x28], ShieldType::StandstillShield => [0x01, 0x02, 0x29], ShieldType::SafetyHeart => [0x01, 0x02, 0x2A], ShieldType::KasamiBracer => [0x01, 0x02, 0x2B], ShieldType::GodsShieldSuzaku => [0x01, 0x02, 0x2C], ShieldType::GodsShieldGenbu => [0x01, 0x02, 0x2D], ShieldType::GodsShieldByakko => [0x01, 0x02, 0x2E], ShieldType::GodsShieldSeiryu => [0x01, 0x02, 0x2F], ShieldType::HuntersShell => [0x01, 0x02, 0x30], ShieldType::RicosGlasses => [0x01, 0x02, 0x31], ShieldType::RicosEarring => [0x01, 0x02, 0x32], ShieldType::BlueRing => [0x01, 0x02, 0x33], ShieldType::Barrier2 => [0x01, 0x02, 0x34], ShieldType::SecureFeet => [0x01, 0x02, 0x35], ShieldType::Barrier3 => [0x01, 0x02, 0x36], ShieldType::Barrier4 => [0x01, 0x02, 0x37], ShieldType::Barrier5 => [0x01, 0x02, 0x38], ShieldType::Barrier6 => [0x01, 0x02, 0x39], ShieldType::RestaMerge => [0x01, 0x02, 0x3A], ShieldType::AntiMerge => [0x01, 0x02, 0x3B], ShieldType::ShiftaMerge => [0x01, 0x02, 0x3C], ShieldType::DebandMerge => [0x01, 0x02, 0x3D], ShieldType::FoieMerge => [0x01, 0x02, 0x3E], ShieldType::GifoieMerge => [0x01, 0x02, 0x3F], ShieldType::RafoieMerge => [0x01, 0x02, 0x40], ShieldType::RedMerge => [0x01, 0x02, 0x41], ShieldType::BartaMerge => [0x01, 0x02, 0x42], ShieldType::GibartaMerge => [0x01, 0x02, 0x43], ShieldType::RabartaMerge => [0x01, 0x02, 0x44], ShieldType::BlueMerge => [0x01, 0x02, 0x45], ShieldType::ZondeMerge => [0x01, 0x02, 0x46], ShieldType::GizondeMerge => [0x01, 0x02, 0x47], ShieldType::RazondeMerge => [0x01, 0x02, 0x48], ShieldType::YellowMerge => [0x01, 0x02, 0x49], ShieldType::RecoveryBarrier => [0x01, 0x02, 0x4A], ShieldType::AssistBarrier => [0x01, 0x02, 0x4B], ShieldType::RedBarrier => [0x01, 0x02, 0x4C], ShieldType::BlueBarrier => [0x01, 0x02, 0x4D], ShieldType::YellowBarrier => [0x01, 0x02, 0x4E], ShieldType::WeaponsGoldShield => [0x01, 0x02, 0x4F], ShieldType::BlackGear => [0x01, 0x02, 0x50], ShieldType::WorksGuard => [0x01, 0x02, 0x51], ShieldType::RagolRing => [0x01, 0x02, 0x52], ShieldType::BlueRing2 => [0x01, 0x02, 0x53], ShieldType::BlueRing3 => [0x01, 0x02, 0x54], ShieldType::BlueRing4 => [0x01, 0x02, 0x55], ShieldType::BlueRing5 => [0x01, 0x02, 0x56], ShieldType::BlueRing6 => [0x01, 0x02, 0x57], ShieldType::BlueRing7 => [0x01, 0x02, 0x58], ShieldType::BlueRing8 => [0x01, 0x02, 0x59], ShieldType::BlueRing9 => [0x01, 0x02, 0x5A], ShieldType::GreenRing => [0x01, 0x02, 0x5B], ShieldType::GreenRing2 => [0x01, 0x02, 0x5C], ShieldType::GreenRing3 => [0x01, 0x02, 0x5D], ShieldType::GreenRing4 => [0x01, 0x02, 0x5E], ShieldType::GreenRing5 => [0x01, 0x02, 0x5F], ShieldType::GreenRing6 => [0x01, 0x02, 0x60], ShieldType::GreenRing7 => [0x01, 0x02, 0x61], ShieldType::GreenRing8 => [0x01, 0x02, 0x62], ShieldType::YellowRing => [0x01, 0x02, 0x63], ShieldType::YellowRing2 => [0x01, 0x02, 0x64], ShieldType::YellowRing3 => [0x01, 0x02, 0x65], ShieldType::YellowRing4 => [0x01, 0x02, 0x66], ShieldType::YellowRing5 => [0x01, 0x02, 0x67], ShieldType::YellowRing6 => [0x01, 0x02, 0x68], ShieldType::YellowRing7 => [0x01, 0x02, 0x69], ShieldType::YellowRing8 => [0x01, 0x02, 0x6A], ShieldType::PurpleRing => [0x01, 0x02, 0x6B], ShieldType::PurpleRing2 => [0x01, 0x02, 0x6C], ShieldType::PurpleRing3 => [0x01, 0x02, 0x6D], ShieldType::PurpleRing4 => [0x01, 0x02, 0x6E], ShieldType::PurpleRing5 => [0x01, 0x02, 0x6F], ShieldType::PurpleRing6 => [0x01, 0x02, 0x70], ShieldType::PurpleRing7 => [0x01, 0x02, 0x71], ShieldType::PurpleRing8 => [0x01, 0x02, 0x72], ShieldType::WhiteRing => [0x01, 0x02, 0x73], ShieldType::WhiteRing2 => [0x01, 0x02, 0x74], ShieldType::WhiteRing3 => [0x01, 0x02, 0x75], ShieldType::WhiteRing4 => [0x01, 0x02, 0x76], ShieldType::WhiteRing5 => [0x01, 0x02, 0x77], ShieldType::WhiteRing6 => [0x01, 0x02, 0x78], ShieldType::WhiteRing7 => [0x01, 0x02, 0x79], ShieldType::WhiteRing8 => [0x01, 0x02, 0x7A], ShieldType::BlackRing => [0x01, 0x02, 0x7B], ShieldType::BlackRing2 => [0x01, 0x02, 0x7C], ShieldType::BlackRing3 => [0x01, 0x02, 0x7D], ShieldType::BlackRing4 => [0x01, 0x02, 0x7E], ShieldType::BlackRing5 => [0x01, 0x02, 0x7F], ShieldType::BlackRing6 => [0x01, 0x02, 0x80], ShieldType::BlackRing7 => [0x01, 0x02, 0x81], ShieldType::BlackRing8 => [0x01, 0x02, 0x82], ShieldType::WeaponsSilverShield => [0x01, 0x02, 0x83], ShieldType::WeaponsCopperShield => [0x01, 0x02, 0x84], ShieldType::Gratia => [0x01, 0x02, 0x85], ShieldType::TripolicReflector => [0x01, 0x02, 0x86], ShieldType::StrikerPlus => [0x01, 0x02, 0x87], ShieldType::RegenerateGearBP => [0x01, 0x02, 0x88], ShieldType::Rupika => [0x01, 0x02, 0x89], ShieldType::YataMirror => [0x01, 0x02, 0x8A], ShieldType::BunnyEars => [0x01, 0x02, 0x8B], ShieldType::CatEars => [0x01, 0x02, 0x8C], ShieldType::ThreeSeals => [0x01, 0x02, 0x8D], ShieldType::GodsShieldKouryu => [0x01, 0x02, 0x8E], ShieldType::DfShield => [0x01, 0x02, 0x8F], ShieldType::FromTheDepths => [0x01, 0x02, 0x90], ShieldType::DeRolLeShield => [0x01, 0x02, 0x91], ShieldType::HoneycombReflector => [0x01, 0x02, 0x92], ShieldType::Epsiguard => [0x01, 0x02, 0x93], ShieldType::AngelRing => [0x01, 0x02, 0x94], ShieldType::UnionGuard => [0x01, 0x02, 0x95], ShieldType::UnionGuard2 => [0x01, 0x02, 0x96], ShieldType::UnionGuard3 => [0x01, 0x02, 0x97], ShieldType::UnionGuard4 => [0x01, 0x02, 0x98], ShieldType::StinkShield => [0x01, 0x02, 0x99], ShieldType::Unknownb => [0x01, 0x02, 0x9A], ShieldType::Genpei => [0x01, 0x02, 0x9B], ShieldType::Genpei2 => [0x01, 0x02, 0x9C], ShieldType::Genpei3 => [0x01, 0x02, 0x9D], ShieldType::Genpei4 => [0x01, 0x02, 0x9E], ShieldType::Genpei5 => [0x01, 0x02, 0x9F], ShieldType::Genpei6 => [0x01, 0x02, 0xA0], ShieldType::Genpei7 => [0x01, 0x02, 0xA1], ShieldType::Genpei8 => [0x01, 0x02, 0xA2], ShieldType::Genpei9 => [0x01, 0x02, 0xA3], ShieldType::Genpei10 => [0x01, 0x02, 0xA4], } } pub fn parse_type(data: [u8; 3]) -> Result { match data { [0x01, 0x02, 0x00] => Ok(ShieldType::Barrier), [0x01, 0x02, 0x01] => Ok(ShieldType::Shield), [0x01, 0x02, 0x02] => Ok(ShieldType::CoreShield), [0x01, 0x02, 0x03] => Ok(ShieldType::GigaShield), [0x01, 0x02, 0x04] => Ok(ShieldType::SoulBarrier), [0x01, 0x02, 0x05] => Ok(ShieldType::HardShield), [0x01, 0x02, 0x06] => Ok(ShieldType::BraveBarrier), [0x01, 0x02, 0x07] => Ok(ShieldType::SolidShield), [0x01, 0x02, 0x08] => Ok(ShieldType::FlameBarrier), [0x01, 0x02, 0x09] => Ok(ShieldType::PlasmaBarrier), [0x01, 0x02, 0x0A] => Ok(ShieldType::FreezeBarrier), [0x01, 0x02, 0x0B] => Ok(ShieldType::PsychicBarrier), [0x01, 0x02, 0x0C] => Ok(ShieldType::GeneralShield), [0x01, 0x02, 0x0D] => Ok(ShieldType::ProtectBarrier), [0x01, 0x02, 0x0E] => Ok(ShieldType::GloriousShield), [0x01, 0x02, 0x0F] => Ok(ShieldType::ImperialBarrier), [0x01, 0x02, 0x10] => Ok(ShieldType::GuardianShield), [0x01, 0x02, 0x11] => Ok(ShieldType::DivinityBarrier), [0x01, 0x02, 0x12] => Ok(ShieldType::UltimateShield), [0x01, 0x02, 0x13] => Ok(ShieldType::SpiritualShield), [0x01, 0x02, 0x14] => Ok(ShieldType::CelestialShield), [0x01, 0x02, 0x15] => Ok(ShieldType::InvisibleGuard), [0x01, 0x02, 0x16] => Ok(ShieldType::SacredGuard), [0x01, 0x02, 0x17] => Ok(ShieldType::SPartsVer116), [0x01, 0x02, 0x18] => Ok(ShieldType::SPartsVer201), [0x01, 0x02, 0x19] => Ok(ShieldType::LightRelief), [0x01, 0x02, 0x1A] => Ok(ShieldType::ShieldOfDelsaber), [0x01, 0x02, 0x1B] => Ok(ShieldType::ForceWall), [0x01, 0x02, 0x1C] => Ok(ShieldType::RangerWall), [0x01, 0x02, 0x1D] => Ok(ShieldType::HunterWall), [0x01, 0x02, 0x1E] => Ok(ShieldType::AttributeWall), [0x01, 0x02, 0x1F] => Ok(ShieldType::SecretGear), [0x01, 0x02, 0x20] => Ok(ShieldType::CombatGear), [0x01, 0x02, 0x21] => Ok(ShieldType::ProtoRegeneGear), [0x01, 0x02, 0x22] => Ok(ShieldType::RegenerateGear), [0x01, 0x02, 0x23] => Ok(ShieldType::RegeneGearAdv), [0x01, 0x02, 0x24] => Ok(ShieldType::FlowensShield), [0x01, 0x02, 0x25] => Ok(ShieldType::CustomBarrierVerOo), [0x01, 0x02, 0x26] => Ok(ShieldType::DbsShield), [0x01, 0x02, 0x27] => Ok(ShieldType::RedRing), [0x01, 0x02, 0x28] => Ok(ShieldType::TripolicShield), [0x01, 0x02, 0x29] => Ok(ShieldType::StandstillShield), [0x01, 0x02, 0x2A] => Ok(ShieldType::SafetyHeart), [0x01, 0x02, 0x2B] => Ok(ShieldType::KasamiBracer), [0x01, 0x02, 0x2C] => Ok(ShieldType::GodsShieldSuzaku), [0x01, 0x02, 0x2D] => Ok(ShieldType::GodsShieldGenbu), [0x01, 0x02, 0x2E] => Ok(ShieldType::GodsShieldByakko), [0x01, 0x02, 0x2F] => Ok(ShieldType::GodsShieldSeiryu), [0x01, 0x02, 0x30] => Ok(ShieldType::HuntersShell), [0x01, 0x02, 0x31] => Ok(ShieldType::RicosGlasses), [0x01, 0x02, 0x32] => Ok(ShieldType::RicosEarring), [0x01, 0x02, 0x33] => Ok(ShieldType::BlueRing), [0x01, 0x02, 0x34] => Ok(ShieldType::Barrier2), [0x01, 0x02, 0x35] => Ok(ShieldType::SecureFeet), [0x01, 0x02, 0x36] => Ok(ShieldType::Barrier3), [0x01, 0x02, 0x37] => Ok(ShieldType::Barrier4), [0x01, 0x02, 0x38] => Ok(ShieldType::Barrier5), [0x01, 0x02, 0x39] => Ok(ShieldType::Barrier6), [0x01, 0x02, 0x3A] => Ok(ShieldType::RestaMerge), [0x01, 0x02, 0x3B] => Ok(ShieldType::AntiMerge), [0x01, 0x02, 0x3C] => Ok(ShieldType::ShiftaMerge), [0x01, 0x02, 0x3D] => Ok(ShieldType::DebandMerge), [0x01, 0x02, 0x3E] => Ok(ShieldType::FoieMerge), [0x01, 0x02, 0x3F] => Ok(ShieldType::GifoieMerge), [0x01, 0x02, 0x40] => Ok(ShieldType::RafoieMerge), [0x01, 0x02, 0x41] => Ok(ShieldType::RedMerge), [0x01, 0x02, 0x42] => Ok(ShieldType::BartaMerge), [0x01, 0x02, 0x43] => Ok(ShieldType::GibartaMerge), [0x01, 0x02, 0x44] => Ok(ShieldType::RabartaMerge), [0x01, 0x02, 0x45] => Ok(ShieldType::BlueMerge), [0x01, 0x02, 0x46] => Ok(ShieldType::ZondeMerge), [0x01, 0x02, 0x47] => Ok(ShieldType::GizondeMerge), [0x01, 0x02, 0x48] => Ok(ShieldType::RazondeMerge), [0x01, 0x02, 0x49] => Ok(ShieldType::YellowMerge), [0x01, 0x02, 0x4A] => Ok(ShieldType::RecoveryBarrier), [0x01, 0x02, 0x4B] => Ok(ShieldType::AssistBarrier), [0x01, 0x02, 0x4C] => Ok(ShieldType::RedBarrier), [0x01, 0x02, 0x4D] => Ok(ShieldType::BlueBarrier), [0x01, 0x02, 0x4E] => Ok(ShieldType::YellowBarrier), [0x01, 0x02, 0x4F] => Ok(ShieldType::WeaponsGoldShield), [0x01, 0x02, 0x50] => Ok(ShieldType::BlackGear), [0x01, 0x02, 0x51] => Ok(ShieldType::WorksGuard), [0x01, 0x02, 0x52] => Ok(ShieldType::RagolRing), [0x01, 0x02, 0x53] => Ok(ShieldType::BlueRing2), [0x01, 0x02, 0x54] => Ok(ShieldType::BlueRing3), [0x01, 0x02, 0x55] => Ok(ShieldType::BlueRing4), [0x01, 0x02, 0x56] => Ok(ShieldType::BlueRing5), [0x01, 0x02, 0x57] => Ok(ShieldType::BlueRing6), [0x01, 0x02, 0x58] => Ok(ShieldType::BlueRing7), [0x01, 0x02, 0x59] => Ok(ShieldType::BlueRing8), [0x01, 0x02, 0x5A] => Ok(ShieldType::BlueRing9), [0x01, 0x02, 0x5B] => Ok(ShieldType::GreenRing), [0x01, 0x02, 0x5C] => Ok(ShieldType::GreenRing2), [0x01, 0x02, 0x5D] => Ok(ShieldType::GreenRing3), [0x01, 0x02, 0x5E] => Ok(ShieldType::GreenRing4), [0x01, 0x02, 0x5F] => Ok(ShieldType::GreenRing5), [0x01, 0x02, 0x60] => Ok(ShieldType::GreenRing6), [0x01, 0x02, 0x61] => Ok(ShieldType::GreenRing7), [0x01, 0x02, 0x62] => Ok(ShieldType::GreenRing8), [0x01, 0x02, 0x63] => Ok(ShieldType::YellowRing), [0x01, 0x02, 0x64] => Ok(ShieldType::YellowRing2), [0x01, 0x02, 0x65] => Ok(ShieldType::YellowRing3), [0x01, 0x02, 0x66] => Ok(ShieldType::YellowRing4), [0x01, 0x02, 0x67] => Ok(ShieldType::YellowRing5), [0x01, 0x02, 0x68] => Ok(ShieldType::YellowRing6), [0x01, 0x02, 0x69] => Ok(ShieldType::YellowRing7), [0x01, 0x02, 0x6A] => Ok(ShieldType::YellowRing8), [0x01, 0x02, 0x6B] => Ok(ShieldType::PurpleRing), [0x01, 0x02, 0x6C] => Ok(ShieldType::PurpleRing2), [0x01, 0x02, 0x6D] => Ok(ShieldType::PurpleRing3), [0x01, 0x02, 0x6E] => Ok(ShieldType::PurpleRing4), [0x01, 0x02, 0x6F] => Ok(ShieldType::PurpleRing5), [0x01, 0x02, 0x70] => Ok(ShieldType::PurpleRing6), [0x01, 0x02, 0x71] => Ok(ShieldType::PurpleRing7), [0x01, 0x02, 0x72] => Ok(ShieldType::PurpleRing8), [0x01, 0x02, 0x73] => Ok(ShieldType::WhiteRing), [0x01, 0x02, 0x74] => Ok(ShieldType::WhiteRing2), [0x01, 0x02, 0x75] => Ok(ShieldType::WhiteRing3), [0x01, 0x02, 0x76] => Ok(ShieldType::WhiteRing4), [0x01, 0x02, 0x77] => Ok(ShieldType::WhiteRing5), [0x01, 0x02, 0x78] => Ok(ShieldType::WhiteRing6), [0x01, 0x02, 0x79] => Ok(ShieldType::WhiteRing7), [0x01, 0x02, 0x7A] => Ok(ShieldType::WhiteRing8), [0x01, 0x02, 0x7B] => Ok(ShieldType::BlackRing), [0x01, 0x02, 0x7C] => Ok(ShieldType::BlackRing2), [0x01, 0x02, 0x7D] => Ok(ShieldType::BlackRing3), [0x01, 0x02, 0x7E] => Ok(ShieldType::BlackRing4), [0x01, 0x02, 0x7F] => Ok(ShieldType::BlackRing5), [0x01, 0x02, 0x80] => Ok(ShieldType::BlackRing6), [0x01, 0x02, 0x81] => Ok(ShieldType::BlackRing7), [0x01, 0x02, 0x82] => Ok(ShieldType::BlackRing8), [0x01, 0x02, 0x83] => Ok(ShieldType::WeaponsSilverShield), [0x01, 0x02, 0x84] => Ok(ShieldType::WeaponsCopperShield), [0x01, 0x02, 0x85] => Ok(ShieldType::Gratia), [0x01, 0x02, 0x86] => Ok(ShieldType::TripolicReflector), [0x01, 0x02, 0x87] => Ok(ShieldType::StrikerPlus), [0x01, 0x02, 0x88] => Ok(ShieldType::RegenerateGearBP), [0x01, 0x02, 0x89] => Ok(ShieldType::Rupika), [0x01, 0x02, 0x8A] => Ok(ShieldType::YataMirror), [0x01, 0x02, 0x8B] => Ok(ShieldType::BunnyEars), [0x01, 0x02, 0x8C] => Ok(ShieldType::CatEars), [0x01, 0x02, 0x8D] => Ok(ShieldType::ThreeSeals), [0x01, 0x02, 0x8E] => Ok(ShieldType::GodsShieldKouryu), [0x01, 0x02, 0x8F] => Ok(ShieldType::DfShield), [0x01, 0x02, 0x90] => Ok(ShieldType::FromTheDepths), [0x01, 0x02, 0x91] => Ok(ShieldType::DeRolLeShield), [0x01, 0x02, 0x92] => Ok(ShieldType::HoneycombReflector), [0x01, 0x02, 0x93] => Ok(ShieldType::Epsiguard), [0x01, 0x02, 0x94] => Ok(ShieldType::AngelRing), [0x01, 0x02, 0x95] => Ok(ShieldType::UnionGuard), [0x01, 0x02, 0x96] => Ok(ShieldType::UnionGuard2), [0x01, 0x02, 0x97] => Ok(ShieldType::UnionGuard3), [0x01, 0x02, 0x98] => Ok(ShieldType::UnionGuard4), [0x01, 0x02, 0x99] => Ok(ShieldType::StinkShield), [0x01, 0x02, 0x9A] => Ok(ShieldType::Unknownb), [0x01, 0x02, 0x9B] => Ok(ShieldType::Genpei), [0x01, 0x02, 0x9C] => Ok(ShieldType::Genpei2), [0x01, 0x02, 0x9D] => Ok(ShieldType::Genpei3), [0x01, 0x02, 0x9E] => Ok(ShieldType::Genpei4), [0x01, 0x02, 0x9F] => Ok(ShieldType::Genpei5), [0x01, 0x02, 0xA0] => Ok(ShieldType::Genpei6), [0x01, 0x02, 0xA1] => Ok(ShieldType::Genpei7), [0x01, 0x02, 0xA2] => Ok(ShieldType::Genpei8), [0x01, 0x02, 0xA3] => Ok(ShieldType::Genpei9), [0x01, 0x02, 0xA4] => Ok(ShieldType::Genpei10), _ => Err(ItemParseError::InvalidShieldType), } } } #[derive(Debug, Copy, Clone, PartialEq)] pub struct Shield { pub shield: ShieldType, pub dfp: u8, pub evp: u8, } impl Shield { pub fn as_bytes(&self) -> [u8; 16] { let mut result = [0; 16]; result[0..3].copy_from_slice(&self.shield.value()); result[6] = self.dfp; result[8] = self.evp; result } pub fn from_bytes(data: [u8; 16]) -> Result { let s = ShieldType::parse_type([data[0], data[1], data[2]]); if s.is_ok() { Ok(Shield{ shield: s.unwrap(), dfp: data[6], evp: data[8], }) } else { Err(ItemParseError::InvalidShieldBytes) // TODO: error handling if wrong bytes are given } } }