use std::convert::{TryFrom, Into}; pub enum ArmorTypeError { UnknownArmor(String) } #[derive(Debug, Copy, Clone, PartialEq)] pub enum ArmorType { Frame, Armor, PsyArmor, GigaFrame, SoulFrame, CrossArmor, SolidFrame, BraveArmor, HyperFrame, GrandArmor, ShockFrame, KingsFrame, DragonFrame, AbsorbArmor, ProtectFrame, GeneralArmor, PerfectFrame, ValiantFrame, ImperialArmor, HolinessArmor, GuardianArmor, DivinityArmor, UltimateFrame, CelestialArmor, HunterField, RangerField, ForceField, RevivalGarment, SpiritGarment, StinkFrame, DPartsver101, DPartsver210, ParasiteWeardeRol, ParasiteWearnelgal, ParasiteWearvajulla, SensePlate, GravitonPlate, AttributePlate, FlowensFrame, CustomFrameveroo, DbsArmor, GuardWave, DfField, LuminousField, ChuChuFever, LoveHeart, FlameGarment, VirusArmorlafuteria, BrightnessCircle, AuraField, ElectroFrame, SacredCloth, SmokingPlate, StarCuirass, BlackHoundCuirass, MorningPrayer, BlackOdoshiDomaru, RedOdoshiDomaru, BlackOdoshiRedNimaidou, BlueOdoshiVioletNimaidou, DirtyLifejacket, KroesSweater, WeddingDress, SonicteamArmor, RedCoat, Thirteen, MotherGarb, MotherGarb2, DressPlate, Sweetheart, IgnitionCloak, CongealCloak, TempestCloak, CursedCloak, SelectCloak, SpiritCuirass, RevivalCuriass, AllianceUniform, OfficerUniform, CommanderUniform, CrimsonCoat, InfantryGear, LieutenantGear, InfantryMantle, LieutenantMantle, UnionField, SamuraiArmor, StealthSuit, } impl ArmorType { pub fn value(&self) -> [u8; 3] { match self { ArmorType::Frame => [0x01, 0x01, 0x00], ArmorType::Armor => [0x01, 0x01, 0x01], ArmorType::PsyArmor => [0x01, 0x01, 0x02], ArmorType::GigaFrame => [0x01, 0x01, 0x03], ArmorType::SoulFrame => [0x01, 0x01, 0x04], ArmorType::CrossArmor => [0x01, 0x01, 0x05], ArmorType::SolidFrame => [0x01, 0x01, 0x06], ArmorType::BraveArmor => [0x01, 0x01, 0x07], ArmorType::HyperFrame => [0x01, 0x01, 0x08], ArmorType::GrandArmor => [0x01, 0x01, 0x09], ArmorType::ShockFrame => [0x01, 0x01, 0x0A], ArmorType::KingsFrame => [0x01, 0x01, 0x0B], ArmorType::DragonFrame => [0x01, 0x01, 0x0C], ArmorType::AbsorbArmor => [0x01, 0x01, 0x0D], ArmorType::ProtectFrame => [0x01, 0x01, 0x0E], ArmorType::GeneralArmor => [0x01, 0x01, 0x0F], ArmorType::PerfectFrame => [0x01, 0x01, 0x10], ArmorType::ValiantFrame => [0x01, 0x01, 0x11], ArmorType::ImperialArmor => [0x01, 0x01, 0x12], ArmorType::HolinessArmor => [0x01, 0x01, 0x13], ArmorType::GuardianArmor => [0x01, 0x01, 0x14], ArmorType::DivinityArmor => [0x01, 0x01, 0x15], ArmorType::UltimateFrame => [0x01, 0x01, 0x16], ArmorType::CelestialArmor => [0x01, 0x01, 0x17], ArmorType::HunterField => [0x01, 0x01, 0x18], ArmorType::RangerField => [0x01, 0x01, 0x19], ArmorType::ForceField => [0x01, 0x01, 0x1A], ArmorType::RevivalGarment => [0x01, 0x01, 0x1B], ArmorType::SpiritGarment => [0x01, 0x01, 0x1C], ArmorType::StinkFrame => [0x01, 0x01, 0x1D], ArmorType::DPartsver101 => [0x01, 0x01, 0x1E], ArmorType::DPartsver210 => [0x01, 0x01, 0x1F], ArmorType::ParasiteWeardeRol => [0x01, 0x01, 0x20], ArmorType::ParasiteWearnelgal => [0x01, 0x01, 0x21], ArmorType::ParasiteWearvajulla => [0x01, 0x01, 0x22], ArmorType::SensePlate => [0x01, 0x01, 0x23], ArmorType::GravitonPlate => [0x01, 0x01, 0x24], ArmorType::AttributePlate => [0x01, 0x01, 0x25], ArmorType::FlowensFrame => [0x01, 0x01, 0x26], ArmorType::CustomFrameveroo => [0x01, 0x01, 0x27], ArmorType::DbsArmor => [0x01, 0x01, 0x28], ArmorType::GuardWave => [0x01, 0x01, 0x29], ArmorType::DfField => [0x01, 0x01, 0x2A], ArmorType::LuminousField => [0x01, 0x01, 0x2B], ArmorType::ChuChuFever => [0x01, 0x01, 0x2C], ArmorType::LoveHeart => [0x01, 0x01, 0x2D], ArmorType::FlameGarment => [0x01, 0x01, 0x2E], ArmorType::VirusArmorlafuteria => [0x01, 0x01, 0x2F], ArmorType::BrightnessCircle => [0x01, 0x01, 0x30], ArmorType::AuraField => [0x01, 0x01, 0x31], ArmorType::ElectroFrame => [0x01, 0x01, 0x32], ArmorType::SacredCloth => [0x01, 0x01, 0x33], ArmorType::SmokingPlate => [0x01, 0x01, 0x34], ArmorType::StarCuirass => [0x01, 0x01, 0x35], ArmorType::BlackHoundCuirass => [0x01, 0x01, 0x36], ArmorType::MorningPrayer => [0x01, 0x01, 0x37], ArmorType::BlackOdoshiDomaru => [0x01, 0x01, 0x38], ArmorType::RedOdoshiDomaru => [0x01, 0x01, 0x39], ArmorType::BlackOdoshiRedNimaidou => [0x01, 0x01, 0x3A], ArmorType::BlueOdoshiVioletNimaidou => [0x01, 0x01, 0x3B], ArmorType::DirtyLifejacket => [0x01, 0x01, 0x3C], ArmorType::KroesSweater => [0x01, 0x01, 0x3D], ArmorType::WeddingDress => [0x01, 0x01, 0x3E], ArmorType::SonicteamArmor => [0x01, 0x01, 0x3F], ArmorType::RedCoat => [0x01, 0x01, 0x40], ArmorType::Thirteen => [0x01, 0x01, 0x41], ArmorType::MotherGarb => [0x01, 0x01, 0x42], ArmorType::MotherGarb2 => [0x01, 0x01, 0x43], ArmorType::DressPlate => [0x01, 0x01, 0x44], ArmorType::Sweetheart => [0x01, 0x01, 0x45], ArmorType::IgnitionCloak => [0x01, 0x01, 0x46], ArmorType::CongealCloak => [0x01, 0x01, 0x47], ArmorType::TempestCloak => [0x01, 0x01, 0x48], ArmorType::CursedCloak => [0x01, 0x01, 0x49], ArmorType::SelectCloak => [0x01, 0x01, 0x4A], ArmorType::SpiritCuirass => [0x01, 0x01, 0x4B], ArmorType::RevivalCuriass => [0x01, 0x01, 0x4C], ArmorType::AllianceUniform => [0x01, 0x01, 0x4D], ArmorType::OfficerUniform => [0x01, 0x01, 0x4E], ArmorType::CommanderUniform => [0x01, 0x01, 0x4F], ArmorType::CrimsonCoat => [0x01, 0x01, 0x50], ArmorType::InfantryGear => [0x01, 0x01, 0x51], ArmorType::LieutenantGear => [0x01, 0x01, 0x52], ArmorType::InfantryMantle => [0x01, 0x01, 0x53], ArmorType::LieutenantMantle => [0x01, 0x01, 0x54], ArmorType::UnionField => [0x01, 0x01, 0x55], ArmorType::SamuraiArmor => [0x01, 0x01, 0x56], ArmorType::StealthSuit => [0x01, 0x01, 0x57], } } } impl TryFrom<&str> for ArmorType { type Error = ArmorTypeError; fn try_from(value: &str) -> Result { match value { "Frame" => Ok(ArmorType::Frame), "Armor" => Ok(ArmorType::Armor), "PsyArmor" => Ok(ArmorType::PsyArmor), "GigaFrame" => Ok(ArmorType::GigaFrame), "SoulFrame" => Ok(ArmorType::SoulFrame), "CrossArmor" => Ok(ArmorType::CrossArmor), "SolidFrame" => Ok(ArmorType::SolidFrame), "BraveArmor" => Ok(ArmorType::BraveArmor), "HyperFrame" => Ok(ArmorType::HyperFrame), "GrandArmor" => Ok(ArmorType::GrandArmor), "ShockFrame" => Ok(ArmorType::ShockFrame), "KingsFrame" => Ok(ArmorType::KingsFrame), "DragonFrame" => Ok(ArmorType::DragonFrame), "AbsorbArmor" => Ok(ArmorType::AbsorbArmor), "ProtectFrame" => Ok(ArmorType::ProtectFrame), "GeneralArmor" => Ok(ArmorType::GeneralArmor), "PerfectFrame" => Ok(ArmorType::PerfectFrame), "ValiantFrame" => Ok(ArmorType::ValiantFrame), "ImperialArmor" => Ok(ArmorType::ImperialArmor), "HolinessArmor" => Ok(ArmorType::HolinessArmor), "GuardianArmor" => Ok(ArmorType::GuardianArmor), "DivinityArmor" => Ok(ArmorType::DivinityArmor), "UltimateFrame" => Ok(ArmorType::UltimateFrame), "CelestialArmor" => Ok(ArmorType::CelestialArmor), "HunterField" => Ok(ArmorType::HunterField), "RangerField" => Ok(ArmorType::RangerField), "ForceField" => Ok(ArmorType::ForceField), "RevivalGarment" => Ok(ArmorType::RevivalGarment), "SpiritGarment" => Ok(ArmorType::SpiritGarment), "StinkFrame" => Ok(ArmorType::StinkFrame), "DPartsver101" => Ok(ArmorType::DPartsver101), "DPartsver210" => Ok(ArmorType::DPartsver210), "ParasiteWeardeRol" => Ok(ArmorType::ParasiteWeardeRol), "ParasiteWearnelgal" => Ok(ArmorType::ParasiteWearnelgal), "ParasiteWearvajulla" => Ok(ArmorType::ParasiteWearvajulla), "SensePlate" => Ok(ArmorType::SensePlate), "GravitonPlate" => Ok(ArmorType::GravitonPlate), "AttributePlate" => Ok(ArmorType::AttributePlate), "FlowensFrame" => Ok(ArmorType::FlowensFrame), "CustomFrameveroo" => Ok(ArmorType::CustomFrameveroo), "DbsArmor" => Ok(ArmorType::DbsArmor), "GuardWave" => Ok(ArmorType::GuardWave), "DfField" => Ok(ArmorType::DfField), "LuminousField" => Ok(ArmorType::LuminousField), "ChuChuFever" => Ok(ArmorType::ChuChuFever), "LoveHeart" => Ok(ArmorType::LoveHeart), "FlameGarment" => Ok(ArmorType::FlameGarment), "VirusArmorlafuteria" => Ok(ArmorType::VirusArmorlafuteria), "BrightnessCircle" => Ok(ArmorType::BrightnessCircle), "AuraField" => Ok(ArmorType::AuraField), "ElectroFrame" => Ok(ArmorType::ElectroFrame), "SacredCloth" => Ok(ArmorType::SacredCloth), "SmokingPlate" => Ok(ArmorType::SmokingPlate), "StarCuirass" => Ok(ArmorType::StarCuirass), "BlackHoundCuirass" => Ok(ArmorType::BlackHoundCuirass), "MorningPrayer" => Ok(ArmorType::MorningPrayer), "BlackOdoshiDomaru" => Ok(ArmorType::BlackOdoshiDomaru), "RedOdoshiDomaru" => Ok(ArmorType::RedOdoshiDomaru), "BlackOdoshiRedNimaidou" => Ok(ArmorType::BlackOdoshiRedNimaidou), "BlueOdoshiVioletNimaidou" => Ok(ArmorType::BlueOdoshiVioletNimaidou), "DirtyLifejacket" => Ok(ArmorType::DirtyLifejacket), "KroesSweater" => Ok(ArmorType::KroesSweater), "WeddingDress" => Ok(ArmorType::WeddingDress), "SonicteamArmor" => Ok(ArmorType::SonicteamArmor), "RedCoat" => Ok(ArmorType::RedCoat), "Thirteen" => Ok(ArmorType::Thirteen), "MotherGarb" => Ok(ArmorType::MotherGarb), "MotherGarb2" => Ok(ArmorType::MotherGarb2), "DressPlate" => Ok(ArmorType::DressPlate), "Sweetheart" => Ok(ArmorType::Sweetheart), "IgnitionCloak" => Ok(ArmorType::IgnitionCloak), "CongealCloak" => Ok(ArmorType::CongealCloak), "TempestCloak" => Ok(ArmorType::TempestCloak), "CursedCloak" => Ok(ArmorType::CursedCloak), "SelectCloak" => Ok(ArmorType::SelectCloak), "SpiritCuirass" => Ok(ArmorType::SpiritCuirass), "RevivalCuriass" => Ok(ArmorType::RevivalCuriass), "AllianceUniform" => Ok(ArmorType::AllianceUniform), "OfficerUniform" => Ok(ArmorType::OfficerUniform), "CommanderUniform" => Ok(ArmorType::CommanderUniform), "CrimsonCoat" => Ok(ArmorType::CrimsonCoat), "InfantryGear" => Ok(ArmorType::InfantryGear), "LieutenantGear" => Ok(ArmorType::LieutenantGear), "InfantryMantle" => Ok(ArmorType::InfantryMantle), "LieutenantMantle" => Ok(ArmorType::LieutenantMantle), "UnionField" => Ok(ArmorType::UnionField), "SamuraiArmor" => Ok(ArmorType::SamuraiArmor), "StealthSuit" => Ok(ArmorType::StealthSuit), _ => Err(ArmorTypeError::UnknownArmor(value.to_string())) } } } impl Into for ArmorType { fn into(self) -> String { match self { ArmorType::Frame => "Frame", ArmorType::Armor => "Armor", ArmorType::PsyArmor => "PsyArmor", ArmorType::GigaFrame => "GigaFrame", ArmorType::SoulFrame => "SoulFrame", ArmorType::CrossArmor => "CrossArmor", ArmorType::SolidFrame => "SolidFrame", ArmorType::BraveArmor => "BraveArmor", ArmorType::HyperFrame => "HyperFrame", ArmorType::GrandArmor => "GrandArmor", ArmorType::ShockFrame => "ShockFrame", ArmorType::KingsFrame => "KingsFrame", ArmorType::DragonFrame => "DragonFrame", ArmorType::AbsorbArmor => "AbsorbArmor", ArmorType::ProtectFrame => "ProtectFrame", ArmorType::GeneralArmor => "GeneralArmor", ArmorType::PerfectFrame => "PerfectFrame", ArmorType::ValiantFrame => "ValiantFrame", ArmorType::ImperialArmor => "ImperialArmor", ArmorType::HolinessArmor => "HolinessArmor", ArmorType::GuardianArmor => "GuardianArmor", ArmorType::DivinityArmor => "DivinityArmor", ArmorType::UltimateFrame => "UltimateFrame", ArmorType::CelestialArmor => "CelestialArmor", ArmorType::HunterField => "HunterField", ArmorType::RangerField => "RangerField", ArmorType::ForceField => "ForceField", ArmorType::RevivalGarment => "RevivalGarment", ArmorType::SpiritGarment => "SpiritGarment", ArmorType::StinkFrame => "StinkFrame", ArmorType::DPartsver101 => "DPartsver101", ArmorType::DPartsver210 => "DPartsver210", ArmorType::ParasiteWeardeRol => "ParasiteWeardeRol", ArmorType::ParasiteWearnelgal => "ParasiteWearnelgal", ArmorType::ParasiteWearvajulla => "ParasiteWearvajulla", ArmorType::SensePlate => "SensePlate", ArmorType::GravitonPlate => "GravitonPlate", ArmorType::AttributePlate => "AttributePlate", ArmorType::FlowensFrame => "FlowensFrame", ArmorType::CustomFrameveroo => "CustomFrameveroo", ArmorType::DbsArmor => "DbsArmor", ArmorType::GuardWave => "GuardWave", ArmorType::DfField => "DfField", ArmorType::LuminousField => "LuminousField", ArmorType::ChuChuFever => "ChuChuFever", ArmorType::LoveHeart => "LoveHeart", ArmorType::FlameGarment => "FlameGarment", ArmorType::VirusArmorlafuteria => "VirusArmorlafuteria", ArmorType::BrightnessCircle => "BrightnessCircle", ArmorType::AuraField => "AuraField", ArmorType::ElectroFrame => "ElectroFrame", ArmorType::SacredCloth => "SacredCloth", ArmorType::SmokingPlate => "SmokingPlate", ArmorType::StarCuirass => "StarCuirass", ArmorType::BlackHoundCuirass => "BlackHoundCuirass", ArmorType::MorningPrayer => "MorningPrayer", ArmorType::BlackOdoshiDomaru => "BlackOdoshiDomaru", ArmorType::RedOdoshiDomaru => "RedOdoshiDomaru", ArmorType::BlackOdoshiRedNimaidou => "BlackOdoshiRedNimaidou", ArmorType::BlueOdoshiVioletNimaidou => "BlueOdoshiVioletNimaidou", ArmorType::DirtyLifejacket => "DirtyLifejacket", ArmorType::KroesSweater => "KroesSweater", ArmorType::WeddingDress => "WeddingDress", ArmorType::SonicteamArmor => "SonicteamArmor", ArmorType::RedCoat => "RedCoat", ArmorType::Thirteen => "Thirteen", ArmorType::MotherGarb => "MotherGarb", ArmorType::MotherGarb2 => "MotherGarb2", ArmorType::DressPlate => "DressPlate", ArmorType::Sweetheart => "Sweetheart", ArmorType::IgnitionCloak => "IgnitionCloak", ArmorType::CongealCloak => "CongealCloak", ArmorType::TempestCloak => "TempestCloak", ArmorType::CursedCloak => "CursedCloak", ArmorType::SelectCloak => "SelectCloak", ArmorType::SpiritCuirass => "SpiritCuirass", ArmorType::RevivalCuriass => "RevivalCuriass", ArmorType::AllianceUniform => "AllianceUniform", ArmorType::OfficerUniform => "OfficerUniform", ArmorType::CommanderUniform => "CommanderUniform", ArmorType::CrimsonCoat => "CrimsonCoat", ArmorType::InfantryGear => "InfantryGear", ArmorType::LieutenantGear => "LieutenantGear", ArmorType::InfantryMantle => "InfantryMantle", ArmorType::LieutenantMantle => "LieutenantMantle", ArmorType::UnionField => "UnionField", ArmorType::SamuraiArmor => "SamuraiArmor", ArmorType::StealthSuit => "StealthSuit", }.to_string() } } // TODO: TryFrom<&str> maybe done check please // TODO Into ^^ #[derive(Debug, Copy, Clone, PartialEq)] pub struct Armor { pub armor: ArmorType, pub dfp: u8, pub evp: u8, pub slots: u8, } impl Armor { pub fn as_bytes(&self) -> [u8; 16] { let mut result = [0; 16]; result[0..3].copy_from_slice(&self.armor.value()); // TODO: other attrs result } }