Changed persistence of abilities to go through an intermediate state in json models.

This commit is contained in:
Sam 2021-12-20 13:05:26 -05:00
parent 6d0913bb5e
commit fe80e365fa
2 changed files with 50 additions and 12 deletions

View File

@ -5,7 +5,7 @@ use crate::persistence::{
use crate::persistence::{
error::PersistenceError,
json_models::{self, CharacterPosition, GenericBody, HumanoidBody},
json_models::{self, CharacterPosition, DatabaseAbilitySet, GenericBody, HumanoidBody},
};
use common::{
character::CharacterId,
@ -607,11 +607,7 @@ pub fn convert_active_abilities_to_database(
entity_id: CharacterId,
active_abilities: &ability::ActiveAbilities,
) -> AbilitySets {
let ability_sets = active_abilities
.auxiliary_sets
.iter()
.filter_map(|set| serde_json::to_string(&set).ok())
.collect::<Vec<String>>();
let ability_sets = json_models::active_abilities_to_db_model(active_abilities);
AbilitySets {
entity_id,
ability_sets: serde_json::to_string(&ability_sets).unwrap_or_default(),
@ -621,10 +617,7 @@ pub fn convert_active_abilities_to_database(
pub fn convert_active_abilities_from_database(
ability_sets: &AbilitySets,
) -> ability::ActiveAbilities {
let ability_sets = core::iter::once(ability_sets)
.flat_map(|sets| serde_json::from_str::<Vec<String>>(&sets.ability_sets))
.flatten()
.filter_map(|set| serde_json::from_str::<(ability::AuxiliaryKey, [ability::AuxiliaryAbility; ability::MAX_ABILITIES])>(&set).ok())
.collect::<HashMap<ability::AuxiliaryKey, [ability::AuxiliaryAbility; ability::MAX_ABILITIES]>>();
ability::ActiveAbilities::new(ability_sets)
let ability_sets = serde_json::from_str::<Vec<DatabaseAbilitySet>>(&ability_sets.ability_sets)
.unwrap_or_default();
json_models::active_abilities_from_db_model(ability_sets)
}

View File

@ -1,4 +1,5 @@
use common::comp;
use hashbrown::HashMap;
use serde::{Deserialize, Serialize};
use std::string::ToString;
use vek::Vec3;
@ -106,3 +107,47 @@ pub fn db_string_to_skill_group(skill_group_string: &str) -> comp::skillset::Ski
),
}
}
#[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)
}