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

View File

@ -1,4 +1,5 @@
use common::comp; use common::comp;
use hashbrown::HashMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::string::ToString; use std::string::ToString;
use vek::Vec3; 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)
}