2020-09-17 23:02:14 +00:00
|
|
|
use common::comp;
|
2021-12-20 18:05:26 +00:00
|
|
|
use hashbrown::HashMap;
|
2020-09-17 23:02:14 +00:00
|
|
|
use serde::{Deserialize, Serialize};
|
2021-07-28 22:36:41 +00:00
|
|
|
use std::string::ToString;
|
2020-11-03 00:12:49 +00:00
|
|
|
use vek::Vec3;
|
2020-09-17 23:02:14 +00:00
|
|
|
|
|
|
|
#[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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-03 00:12:49 +00:00
|
|
|
|
2021-07-28 22:36:41 +00:00
|
|
|
/// 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);
|
|
|
|
|
2020-11-03 00:12:49 +00:00
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
pub struct CharacterPosition {
|
|
|
|
pub waypoint: Vec3<f32>,
|
|
|
|
}
|
2021-01-13 08:11:31 +00:00
|
|
|
|
2021-10-17 04:28:39 +00:00
|
|
|
pub fn skill_group_to_db_string(skill_group: comp::skillset::SkillGroupKind) -> String {
|
|
|
|
use comp::{item::tool::ToolKind, skillset::SkillGroupKind::*};
|
2021-01-13 08:11:31 +00:00
|
|
|
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",
|
2021-06-09 05:14:20 +00:00
|
|
|
Weapon(ToolKind::Pick) => "Weapon Pick",
|
2021-01-13 08:11:31 +00:00
|
|
|
Weapon(ToolKind::Dagger)
|
|
|
|
| Weapon(ToolKind::Shield)
|
2021-01-21 06:50:46 +00:00
|
|
|
| Weapon(ToolKind::Spear)
|
2021-12-20 04:49:35 +00:00
|
|
|
| Weapon(ToolKind::Blowgun)
|
2021-01-13 08:11:31 +00:00
|
|
|
| Weapon(ToolKind::Debug)
|
|
|
|
| Weapon(ToolKind::Farming)
|
|
|
|
| Weapon(ToolKind::Empty)
|
2021-04-30 19:25:08 +00:00
|
|
|
| Weapon(ToolKind::Natural) => panic!(
|
2021-01-13 08:11:31 +00:00
|
|
|
"Tried to add unsupported skill group to database: {:?}",
|
|
|
|
skill_group
|
|
|
|
),
|
|
|
|
};
|
|
|
|
skill_group_string.to_string()
|
|
|
|
}
|
|
|
|
|
2021-10-17 04:28:39 +00:00
|
|
|
pub fn db_string_to_skill_group(skill_group_string: &str) -> comp::skillset::SkillGroupKind {
|
|
|
|
use comp::{item::tool::ToolKind, skillset::SkillGroupKind::*};
|
2021-01-13 08:11:31 +00:00
|
|
|
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),
|
2021-06-09 05:14:20 +00:00
|
|
|
"Weapon Pick" => Weapon(ToolKind::Pick),
|
2021-01-13 08:11:31 +00:00
|
|
|
_ => panic!(
|
|
|
|
"Tried to convert an unsupported string from the database: {}",
|
|
|
|
skill_group_string
|
|
|
|
),
|
|
|
|
}
|
|
|
|
}
|
2021-12-20 18:05:26 +00:00
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
pub struct DatabaseAbilitySet {
|
|
|
|
mainhand: Option<comp::item::tool::ToolKind>,
|
|
|
|
offhand: Option<comp::item::tool::ToolKind>,
|
|
|
|
abilities: Vec<comp::ability::AuxiliaryAbility>,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn active_abilities_to_db_model(
|
|
|
|
active_abilities: &comp::ability::ActiveAbilities,
|
|
|
|
) -> Vec<DatabaseAbilitySet> {
|
|
|
|
active_abilities
|
|
|
|
.auxiliary_sets
|
|
|
|
.iter()
|
|
|
|
.map(|((mainhand, offhand), abilities)| DatabaseAbilitySet {
|
|
|
|
mainhand: *mainhand,
|
|
|
|
offhand: *offhand,
|
|
|
|
abilities: abilities.to_vec(),
|
|
|
|
})
|
|
|
|
.collect::<Vec<_>>()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn active_abilities_from_db_model(
|
|
|
|
ability_sets: Vec<DatabaseAbilitySet>,
|
|
|
|
) -> 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::<HashMap<_, _>>();
|
|
|
|
comp::ability::ActiveAbilities::new(ability_sets)
|
|
|
|
}
|