use common::comp; use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use std::string::ToString; use vek::Vec3; #[derive(Serialize, Deserialize)] pub struct HumanoidBody { pub species: u8, pub body_type: u8, pub hair_style: u8, pub beard: u8, pub eyes: u8, pub accessory: u8, pub hair_color: u8, pub skin: u8, pub eye_color: u8, } impl From<&comp::humanoid::Body> for HumanoidBody { fn from(body: &comp::humanoid::Body) -> Self { HumanoidBody { species: body.species as u8, body_type: body.body_type as u8, hair_style: body.hair_style, beard: body.beard, eyes: body.eyes, accessory: body.accessory, hair_color: body.hair_color, skin: body.skin, eye_color: body.eye_color, } } } /// A serializable model used to represent a generic Body. Since all variants /// of Body except Humanoid (currently) have the same struct layout, a single /// struct is used for persistence conversions. #[derive(Serialize, Deserialize)] pub struct GenericBody { pub species: String, pub body_type: String, } macro_rules! generic_body_from_impl { ($body_type:ty) => { impl From<&$body_type> for GenericBody { fn from(body: &$body_type) -> Self { GenericBody { species: body.species.to_string(), body_type: body.body_type.to_string(), } } } }; } generic_body_from_impl!(comp::quadruped_low::Body); generic_body_from_impl!(comp::quadruped_medium::Body); generic_body_from_impl!(comp::quadruped_small::Body); #[derive(Serialize, Deserialize)] pub struct CharacterPosition { pub waypoint: Vec3, } pub fn skill_group_to_db_string(skill_group: comp::skillset::SkillGroupKind) -> String { use comp::{item::tool::ToolKind, skillset::SkillGroupKind::*}; let skill_group_string = match skill_group { General => "General", Weapon(ToolKind::Sword) => "Weapon Sword", Weapon(ToolKind::Axe) => "Weapon Axe", Weapon(ToolKind::Hammer) => "Weapon Hammer", Weapon(ToolKind::Bow) => "Weapon Bow", Weapon(ToolKind::Staff) => "Weapon Staff", Weapon(ToolKind::Sceptre) => "Weapon Sceptre", Weapon(ToolKind::Pick) => "Weapon Pick", Weapon(ToolKind::Dagger) | Weapon(ToolKind::Shield) | Weapon(ToolKind::Spear) | Weapon(ToolKind::Blowgun) | Weapon(ToolKind::Debug) | Weapon(ToolKind::Farming) | Weapon(ToolKind::Empty) | Weapon(ToolKind::Natural) => panic!( "Tried to add unsupported skill group to database: {:?}", skill_group ), }; skill_group_string.to_string() } pub fn db_string_to_skill_group(skill_group_string: &str) -> comp::skillset::SkillGroupKind { use comp::{item::tool::ToolKind, skillset::SkillGroupKind::*}; match skill_group_string { "General" => General, "Weapon Sword" => Weapon(ToolKind::Sword), "Weapon Axe" => Weapon(ToolKind::Axe), "Weapon Hammer" => Weapon(ToolKind::Hammer), "Weapon Bow" => Weapon(ToolKind::Bow), "Weapon Staff" => Weapon(ToolKind::Staff), "Weapon Sceptre" => Weapon(ToolKind::Sceptre), "Weapon Pick" => Weapon(ToolKind::Pick), _ => panic!( "Tried to convert an unsupported string from the database: {}", skill_group_string ), } } #[derive(Serialize, Deserialize)] pub struct DatabaseAbilitySet { mainhand: Option, offhand: Option, abilities: Vec, } pub fn active_abilities_to_db_model( active_abilities: &comp::ability::ActiveAbilities, ) -> Vec { active_abilities .auxiliary_sets .iter() .map(|((mainhand, offhand), abilities)| DatabaseAbilitySet { mainhand: *mainhand, offhand: *offhand, abilities: abilities.to_vec(), }) .collect::>() } pub fn active_abilities_from_db_model( ability_sets: Vec, ) -> comp::ability::ActiveAbilities { let ability_sets = ability_sets .iter() .map( |DatabaseAbilitySet { mainhand, offhand, abilities, }| { let mut auxiliary_abilities = [comp::ability::AuxiliaryAbility::Empty; comp::ability::MAX_ABILITIES]; for (empty, ability) in auxiliary_abilities.iter_mut().zip(abilities.iter()) { *empty = *ability; } ((*mainhand, *offhand), auxiliary_abilities) }, ) .collect::>(); comp::ability::ActiveAbilities::new(ability_sets) }