use serde::{Serialize, Deserialize}; #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, enum_utils::FromStr, derive_more::Display)] pub enum ToolType { Monomate, Dimate, Trimate, Monofluid, Difluid, Trifluid, SolAtomizer, MoonAtomizer, StarAtomizer, Antidote, Antiparalysis, Telepipe, TrapVision, ScapeDoll, Monogrinder, Digrinder, Trigrinder, PowerMaterial, MindMaterial, EvadeMaterial, HpMaterial, TpMaterial, DefMaterial, LuckMaterial, CellofMag502, CellofMag213, PartsofRobochao, HeartofOpaOpa, HeartofPian, HeartofChao, SorcerersRightArm, SbeatsArms, ParmsArms, DelsabersRightArm, BringersRightArm, DelsabersLeftArm, SredsArms, DragonsClaw, HildebearsHead, HildebluesHead, PartsofBaranz, BelrasRightArm, GiGuesbody, SinowBerillsArms, GrassAssassinsArms, BoomasRightArm, GoboomasRightArm, GigoboomasRightArm, GalGryphonsWing, RappysWing, CladdingofEpsilon, DeRolLeShell, BerillPhoton, Parasiticgeneflow, MagicStoneiritista, Blueblackstone, Syncesta, MagicWater, ParasiticcellTypeD, MagicrockheartKey, Magicrockmoola, StarAmplifier, BookofHitogata, HeartofChuChu, PartsofEggBlaster, HeartofAngel, HeartofDevil, KitofHamburger, PanthersSpirit, KitofMark3, KitofMasterSystem, KitofGenesis, KitofSegaSaturn, KitofDreamcast, AmplifierofResta, AmplifierofAnti, AmplifierofShifta, AmplifierofDeband, AmplifierofFoie, AmplifierofGifoie, AmplifierofRafoie, AmplifierofBarta, AmplifierofGibarta, AmplifierofRabarta, AmplifierofZonde, AmplifierofGizonde, AmplifierofRazonde, AmplifierofRed, AmplifierofBlue, AmplifierofYellow, HeartofKapuKapu, PhotonBooster, Addslot, PhotonDrop, PhotonSphere, PhotonCrystal, SecretTicket, PhotonTicket, BookofKatana1, BookofKatana2, BookofKatana3, WeaponsBronzeBadge, WeaponsSilverBadge, WeaponsGoldBadge, WeaponsCrystalBadge, WeaponsSteelBadge, WeaponsAluminumBadge, WeaponsLeatherBadge, WeaponsBoneBadge, Letterofappreciation, ItemTicket, ValentinesChocolate, NewYearsCard, ChristmasCard, BirthdayCard, ProofofSonicTeam, SpecialEventTicket, FlowerBouquet, Cake, Accessories, MrnakasBusinessCard, Present, Chocolate, Candy, Cake2, WeaponsSilverBadge2, WeaponsGoldBadge2, WeaponsCrystalBadge2, WeaponsSteelBadge2, WeaponsAluminumBadge2, WeaponsLeatherBadge2, WeaponsBoneBadge2, Bouquet, Decoction, ChristmasPresent, EasterEgg, Jackolantern, DiskVol1weddingMarch, DiskVol2dayLight, DiskVol3burningRangers, DiskVol4openYourHeart, DiskVol5liveLearn, DiskVol6nights, DiskVol7endingThemepianover, DiskVol8hearttoHeart, DiskVol9strangeBlue, DiskVol10reunionSystem, DiskVol11pinnacles, DiskVol12fightinsidetheSpaceship, HuntersReport, HuntersReport2, HuntersReport3, HuntersReport4, HuntersReport5, Tablet, Unknown2, DragonScale, HeavenStrikerCoat, PioneerParts, AmitiesMemo, HeartofMorolian, RappysBeak, Yahoosengine, DPhotonCore, LibertaKit, CellofMag0503, CellofMag0504, CellofMag0505, CellofMag0506, CellofMag0507, TeamPoints500, TeamPoints1000, TeamPoints5000, TeamPoints10000, } impl ToolType { pub fn is_stackable(&self) -> bool { match self { ToolType::Monomate => true, ToolType::Dimate => true, ToolType::Trimate => true, ToolType::Monofluid => true, ToolType::Difluid => true, ToolType::Trifluid => true, ToolType::SolAtomizer => true, ToolType::MoonAtomizer => true, ToolType::StarAtomizer => true, ToolType::Antidote => true, ToolType::Antiparalysis => true, ToolType::Telepipe => true, ToolType::TrapVision => true, ToolType::Monogrinder => true, ToolType::Digrinder => true, ToolType::Trigrinder => true, ToolType::PowerMaterial => true, ToolType::MindMaterial => true, ToolType::EvadeMaterial => true, ToolType::HpMaterial => true, ToolType::TpMaterial => true, ToolType::DefMaterial => true, ToolType::LuckMaterial => true, ToolType::Addslot => true, ToolType::PhotonDrop => true, ToolType::PhotonSphere => true, ToolType::PhotonCrystal => true, _ => false, } } pub fn value(&self) -> [u8; 3] { match self { ToolType::Monomate => [0x03, 0x00, 0x00], ToolType::Dimate => [0x03, 0x00, 0x01], ToolType::Trimate => [0x03, 0x00, 0x02], ToolType::Monofluid => [0x03, 0x01, 0x00], ToolType::Difluid => [0x03, 0x01, 0x01], ToolType::Trifluid => [0x03, 0x01, 0x02], ToolType::SolAtomizer => [0x03, 0x03, 0x00], ToolType::MoonAtomizer => [0x03, 0x04, 0x00], ToolType::StarAtomizer => [0x03, 0x05, 0x00], ToolType::Antidote => [0x03, 0x06, 0x00], ToolType::Antiparalysis => [0x03, 0x06, 0x01], ToolType::Telepipe => [0x03, 0x07, 0x00], ToolType::TrapVision => [0x03, 0x08, 0x00], ToolType::ScapeDoll => [0x03, 0x09, 0x00], ToolType::Monogrinder => [0x03, 0x0A, 0x00], ToolType::Digrinder => [0x03, 0x0A, 0x01], ToolType::Trigrinder => [0x03, 0x0A, 0x02], ToolType::PowerMaterial => [0x03, 0x0B, 0x00], ToolType::MindMaterial => [0x03, 0x0B, 0x01], ToolType::EvadeMaterial => [0x03, 0x0B, 0x02], ToolType::HpMaterial => [0x03, 0x0B, 0x03], ToolType::TpMaterial => [0x03, 0x0B, 0x04], ToolType::DefMaterial => [0x03, 0x0B, 0x05], ToolType::LuckMaterial => [0x03, 0x0B, 0x06], ToolType::CellofMag502 => [0x03, 0x0C, 0x00], ToolType::CellofMag213 => [0x03, 0x0C, 0x01], ToolType::PartsofRobochao => [0x03, 0x0C, 0x02], ToolType::HeartofOpaOpa => [0x03, 0x0C, 0x03], ToolType::HeartofPian => [0x03, 0x0C, 0x04], ToolType::HeartofChao => [0x03, 0x0C, 0x05], ToolType::SorcerersRightArm => [0x03, 0x0D, 0x00], ToolType::SbeatsArms => [0x03, 0x0D, 0x01], ToolType::ParmsArms => [0x03, 0x0D, 0x02], ToolType::DelsabersRightArm => [0x03, 0x0D, 0x03], ToolType::BringersRightArm => [0x03, 0x0D, 0x04], ToolType::DelsabersLeftArm => [0x03, 0x0D, 0x05], ToolType::SredsArms => [0x03, 0x0D, 0x06], ToolType::DragonsClaw => [0x03, 0x0D, 0x07], ToolType::HildebearsHead => [0x03, 0x0D, 0x08], ToolType::HildebluesHead => [0x03, 0x0D, 0x09], ToolType::PartsofBaranz => [0x03, 0x0D, 0x0A], ToolType::BelrasRightArm => [0x03, 0x0D, 0x0B], ToolType::GiGuesbody => [0x03, 0x0D, 0x0C], ToolType::SinowBerillsArms => [0x03, 0x0D, 0x0D], ToolType::GrassAssassinsArms => [0x03, 0x0D, 0x0E], ToolType::BoomasRightArm => [0x03, 0x0D, 0x0F], ToolType::GoboomasRightArm => [0x03, 0x0D, 0x10], ToolType::GigoboomasRightArm => [0x03, 0x0D, 0x11], ToolType::GalGryphonsWing => [0x03, 0x0D, 0x12], ToolType::RappysWing => [0x03, 0x0D, 0x13], ToolType::CladdingofEpsilon => [0x03, 0x0D, 0x14], ToolType::DeRolLeShell => [0x03, 0x0D, 0x15], ToolType::BerillPhoton => [0x03, 0x0E, 0x00], ToolType::Parasiticgeneflow => [0x03, 0x0E, 0x01], ToolType::MagicStoneiritista => [0x03, 0x0E, 0x02], ToolType::Blueblackstone => [0x03, 0x0E, 0x03], ToolType::Syncesta => [0x03, 0x0E, 0x04], ToolType::MagicWater => [0x03, 0x0E, 0x05], ToolType::ParasiticcellTypeD => [0x03, 0x0E, 0x06], ToolType::MagicrockheartKey => [0x03, 0x0E, 0x07], ToolType::Magicrockmoola => [0x03, 0x0E, 0x08], ToolType::StarAmplifier => [0x03, 0x0E, 0x09], ToolType::BookofHitogata => [0x03, 0x0E, 0x0A], ToolType::HeartofChuChu => [0x03, 0x0E, 0x0B], ToolType::PartsofEggBlaster => [0x03, 0x0E, 0x0C], ToolType::HeartofAngel => [0x03, 0x0E, 0x0D], ToolType::HeartofDevil => [0x03, 0x0E, 0x0E], ToolType::KitofHamburger => [0x03, 0x0E, 0x0F], ToolType::PanthersSpirit => [0x03, 0x0E, 0x10], ToolType::KitofMark3 => [0x03, 0x0E, 0x11], ToolType::KitofMasterSystem => [0x03, 0x0E, 0x12], ToolType::KitofGenesis => [0x03, 0x0E, 0x13], ToolType::KitofSegaSaturn => [0x03, 0x0E, 0x14], ToolType::KitofDreamcast => [0x03, 0x0E, 0x15], ToolType::AmplifierofResta => [0x03, 0x0E, 0x16], ToolType::AmplifierofAnti => [0x03, 0x0E, 0x17], ToolType::AmplifierofShifta => [0x03, 0x0E, 0x18], ToolType::AmplifierofDeband => [0x03, 0x0E, 0x19], ToolType::AmplifierofFoie => [0x03, 0x0E, 0x1A], ToolType::AmplifierofGifoie => [0x03, 0x0E, 0x1B], ToolType::AmplifierofRafoie => [0x03, 0x0E, 0x1C], ToolType::AmplifierofBarta => [0x03, 0x0E, 0x1D], ToolType::AmplifierofGibarta => [0x03, 0x0E, 0x1E], ToolType::AmplifierofRabarta => [0x03, 0x0E, 0x1F], ToolType::AmplifierofZonde => [0x03, 0x0E, 0x20], ToolType::AmplifierofGizonde => [0x03, 0x0E, 0x21], ToolType::AmplifierofRazonde => [0x03, 0x0E, 0x22], ToolType::AmplifierofRed => [0x03, 0x0E, 0x23], ToolType::AmplifierofBlue => [0x03, 0x0E, 0x24], ToolType::AmplifierofYellow => [0x03, 0x0E, 0x25], ToolType::HeartofKapuKapu => [0x03, 0x0E, 0x26], ToolType::PhotonBooster => [0x03, 0x0E, 0x27], ToolType::Addslot => [0x03, 0x0F, 0x00], ToolType::PhotonDrop => [0x03, 0x10, 0x00], ToolType::PhotonSphere => [0x03, 0x10, 0x01], ToolType::PhotonCrystal => [0x03, 0x10, 0x02], ToolType::SecretTicket => [0x03, 0x10, 0x03], ToolType::PhotonTicket => [0x03, 0x10, 0x04], ToolType::BookofKatana1 => [0x03, 0x11, 0x00], ToolType::BookofKatana2 => [0x03, 0x11, 0x01], ToolType::BookofKatana3 => [0x03, 0x11, 0x02], ToolType::WeaponsBronzeBadge => [0x03, 0x12, 0x00], ToolType::WeaponsSilverBadge => [0x03, 0x12, 0x01], ToolType::WeaponsGoldBadge => [0x03, 0x12, 0x02], ToolType::WeaponsCrystalBadge => [0x03, 0x12, 0x03], ToolType::WeaponsSteelBadge => [0x03, 0x12, 0x04], ToolType::WeaponsAluminumBadge => [0x03, 0x12, 0x05], ToolType::WeaponsLeatherBadge => [0x03, 0x12, 0x06], ToolType::WeaponsBoneBadge => [0x03, 0x12, 0x07], ToolType::Letterofappreciation => [0x03, 0x12, 0x08], ToolType::ItemTicket => [0x03, 0x12, 0x09], ToolType::ValentinesChocolate => [0x03, 0x12, 0x0A], ToolType::NewYearsCard => [0x03, 0x12, 0x0B], ToolType::ChristmasCard => [0x03, 0x12, 0x0C], ToolType::BirthdayCard => [0x03, 0x12, 0x0D], ToolType::ProofofSonicTeam => [0x03, 0x12, 0x0E], ToolType::SpecialEventTicket => [0x03, 0x12, 0x0F], ToolType::FlowerBouquet => [0x03, 0x12, 0x10], ToolType::Cake => [0x03, 0x12, 0x11], ToolType::Accessories => [0x03, 0x12, 0x12], ToolType::MrnakasBusinessCard => [0x03, 0x12, 0x13], ToolType::Present => [0x03, 0x13, 0x00], ToolType::Chocolate => [0x03, 0x14, 0x00], ToolType::Candy => [0x03, 0x14, 0x01], ToolType::Cake2 => [0x03, 0x14, 0x02], ToolType::WeaponsSilverBadge2 => [0x03, 0x14, 0x03], ToolType::WeaponsGoldBadge2 => [0x03, 0x14, 0x04], ToolType::WeaponsCrystalBadge2 => [0x03, 0x14, 0x05], ToolType::WeaponsSteelBadge2 => [0x03, 0x14, 0x06], ToolType::WeaponsAluminumBadge2 => [0x03, 0x14, 0x07], ToolType::WeaponsLeatherBadge2 => [0x03, 0x14, 0x08], ToolType::WeaponsBoneBadge2 => [0x03, 0x14, 0x09], ToolType::Bouquet => [0x03, 0x14, 0x0A], ToolType::Decoction => [0x03, 0x14, 0x0B], ToolType::ChristmasPresent => [0x03, 0x15, 0x00], ToolType::EasterEgg => [0x03, 0x15, 0x01], ToolType::Jackolantern => [0x03, 0x15, 0x02], ToolType::DiskVol1weddingMarch => [0x03, 0x16, 0x00], ToolType::DiskVol2dayLight => [0x03, 0x16, 0x01], ToolType::DiskVol3burningRangers => [0x03, 0x16, 0x02], ToolType::DiskVol4openYourHeart => [0x03, 0x16, 0x03], ToolType::DiskVol5liveLearn => [0x03, 0x16, 0x04], ToolType::DiskVol6nights => [0x03, 0x16, 0x05], ToolType::DiskVol7endingThemepianover => [0x03, 0x16, 0x06], ToolType::DiskVol8hearttoHeart => [0x03, 0x16, 0x07], ToolType::DiskVol9strangeBlue => [0x03, 0x16, 0x08], ToolType::DiskVol10reunionSystem => [0x03, 0x16, 0x09], ToolType::DiskVol11pinnacles => [0x03, 0x16, 0x0A], ToolType::DiskVol12fightinsidetheSpaceship => [0x03, 0x16, 0x0B], ToolType::HuntersReport => [0x03, 0x17, 0x00], ToolType::HuntersReport2 => [0x03, 0x17, 0x01], ToolType::HuntersReport3 => [0x03, 0x17, 0x02], ToolType::HuntersReport4 => [0x03, 0x17, 0x03], ToolType::HuntersReport5 => [0x03, 0x17, 0x04], ToolType::Tablet => [0x03, 0x18, 0x00], ToolType::Unknown2 => [0x03, 0x18, 0x01], ToolType::DragonScale => [0x03, 0x18, 0x02], ToolType::HeavenStrikerCoat => [0x03, 0x18, 0x03], ToolType::PioneerParts => [0x03, 0x18, 0x04], ToolType::AmitiesMemo => [0x03, 0x18, 0x05], ToolType::HeartofMorolian => [0x03, 0x18, 0x06], ToolType::RappysBeak => [0x03, 0x18, 0x07], ToolType::Yahoosengine => [0x03, 0x18, 0x08], ToolType::DPhotonCore => [0x03, 0x18, 0x09], ToolType::LibertaKit => [0x03, 0x18, 0x0A], ToolType::CellofMag0503 => [0x03, 0x18, 0x0B], ToolType::CellofMag0504 => [0x03, 0x18, 0x0C], ToolType::CellofMag0505 => [0x03, 0x18, 0x0D], ToolType::CellofMag0506 => [0x03, 0x18, 0x0E], ToolType::CellofMag0507 => [0x03, 0x18, 0x0F], ToolType::TeamPoints500 => [0x03, 0x19, 0x00], ToolType::TeamPoints1000 => [0x03, 0x19, 0x01], ToolType::TeamPoints5000 => [0x03, 0x19, 0x02], ToolType::TeamPoints10000 => [0x03, 0x19, 0x03], _ => panic!() } } } #[derive(Clone, Debug, PartialEq)] pub struct Tool { pub tool: ToolType, } impl Tool { pub fn as_individual_bytes(&self) -> [u8; 16] { let mut result = [0; 16]; result[0..3].copy_from_slice(&self.tool.value()); result } pub fn as_stacked_bytes(&self, len: usize) -> [u8; 16] { let mut result = [0; 16]; result[0..3].copy_from_slice(&self.tool.value()); result[5] = len as u8; result } }