veloren/server/src/persistence/json_models.rs

154 lines
4.8 KiB
Rust
Raw Normal View History

use common::comp;
use hashbrown::HashMap;
use serde::{Deserialize, Serialize};
use std::string::ToString;
2020-11-03 00:12:49 +00:00
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,
}
}
}
2020-11-03 00:12:49 +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>,
}
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",
2021-06-09 05:14:20 +00:00
Weapon(ToolKind::Pick) => "Weapon Pick",
Weapon(ToolKind::Dagger)
| Weapon(ToolKind::Shield)
2021-01-21 06:50:46 +00:00
| 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),
2021-06-09 05:14:20 +00:00
"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<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)
}