use bevy_ecs::prelude::*; use crate::{ bundle::{ armour::PlayerArmour, passive::{DrugCooldown, Education, FactionUpgrades, Merits, PassiveBundle}, player::{PlayerBundle, PlayerStrategy, Weapons}, stat::{Defence, Dexterity, Speed, StatBundle, Strength}, }, dto::{armour::ArmourDto, draw_id, weapon::WeaponDto}, }; #[cfg_attr(feature = "json", derive(serde::Deserialize))] pub struct EquippedWeapons { pub primary: Option, pub secondary: Option, pub melee: Option, pub temporary: Option, } #[cfg_attr(feature = "json", derive(serde::Deserialize))] #[derive(Default)] pub struct EquippedArmour { pub helmet: Option, pub body: Option, pub pants: Option, pub gloves: Option, pub boots: Option, } #[cfg_attr(feature = "json", derive(serde::Deserialize))] pub struct Stats { pub str: f32, pub def: f32, pub spd: f32, pub dex: f32, } #[cfg_attr(feature = "json", derive(serde::Deserialize))] pub struct PlayerDto { pub name: String, pub level: u16, pub stats: Stats, pub merits: Option, pub education: Option, pub weapons: EquippedWeapons, pub armour: EquippedArmour, pub faction: Option, pub drug: Option, pub strategy: PlayerStrategy, } impl PlayerDto { pub fn spawn(self, world: &mut World) -> EntityWorldMut<'_> { let mut commands = world.spawn(draw_id()); commands.insert(( PlayerBundle::new(self.name, self.level, self.strategy), StatBundle::::new(self.stats.str), StatBundle::::new(self.stats.def), StatBundle::::new(self.stats.spd), StatBundle::::new(self.stats.dex), )); let education = self.education.unwrap_or_default(); let merits = self.merits.unwrap_or_default(); let faction = self.faction.unwrap_or_default(); commands.insert(PassiveBundle { education, merits, faction, }); let mut weapons = None; commands.with_children(|spawner| { let primary = self.weapons.primary.map(|p| p.spawn(spawner)); let secondary = self.weapons.secondary.map(|s| s.spawn(spawner)); let melee = self.weapons.melee.map(|m| m.spawn(spawner)); let temporary = self.weapons.temporary.map(|m| m.spawn(spawner)); let fists = WeaponDto::FISTS.spawn(spawner); let kick = WeaponDto::KICK.spawn(spawner); weapons = Some(Weapons { primary, secondary, melee, temporary, kick, fists, }); }); if let Some(weapons) = weapons { commands.insert(weapons); } let mut armour = None; commands.with_children(|spawner| { let head = self.armour.helmet.map(|a| a.spawn(spawner)); let torso = self.armour.body.map(|a| a.spawn(spawner)); let legs = self.armour.pants.map(|a| a.spawn(spawner)); let hands = self.armour.gloves.map(|a| a.spawn(spawner)); let feet = self.armour.boots.map(|a| a.spawn(spawner)); armour = Some(PlayerArmour { torso, head, legs, feet, hands, }) }); if let Some(armour) = armour { commands.insert(armour); } commands } }