use glc::{matrix::Angle, vector::Vector2f}; use serde::{Deserialize, Serialize}; use specs::{ error::NoError, saveload::{ConvertSaveload, Marker}, Component, Entity, VecStorage, }; #[derive(Clone, Debug)] pub struct Ship { pub type_: Type, pub fleet: Entity, pub agility: Angle, pub target_pos: Vector2f, pub target_dir: Vector2f, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum Type { Fighter, Bomber, Transporter, } #[derive(Serialize, Deserialize)] pub struct ShipData { pub type_: Type, pub fleet: M, pub agility: Angle, pub target_pos: Vector2f, pub target_dir: Vector2f, } impl Component for Ship { type Storage = VecStorage; } impl ConvertSaveload for Ship where for<'de> M: Marker + Serialize + Deserialize<'de>, { type Data = ShipData; type Error = NoError; fn convert_into(&self, mut ids: F) -> Result where F: FnMut(Entity) -> Option, { let Ship { type_, fleet, agility, target_pos, target_dir, } = self.clone(); let fleet = ids(fleet).unwrap(); Ok(ShipData { type_, fleet, agility, target_pos, target_dir, }) } fn convert_from(data: Self::Data, mut ids: F) -> Result where F: FnMut(M) -> Option, { let ShipData { type_, fleet, agility, target_pos, target_dir, } = data; let fleet = ids(fleet).unwrap(); Ok(Ship { type_, fleet, agility, target_pos, target_dir, }) } }