use glc::vector::Vector2f; use rand::random; use specs::{saveload::MarkedBuilder, Builder, Entity, World, WorldExt}; use crate::{ components::{FleetOwned, PlayerOwned, Position, Ship, ShipType}, misc::{Persistence, WorldPersistence}, }; use super::Error; #[derive(Clone)] pub struct ShipBuilder { player: Option, fleet: Option, position: Option, type_: Option, direction: Vector2f, } impl ShipBuilder { pub fn build(&self, world: &mut World) -> Result { let player = self.player.ok_or(Error::MissingValue("player"))?; let fleet = self.fleet.ok_or(Error::MissingValue("fleet"))?; let position = self.position.ok_or(Error::MissingValue("position"))?; let type_ = self.type_.ok_or(Error::MissingValue("type"))?; let direction = self.direction; let player_owned = PlayerOwned::new(player); let fleet_owned = FleetOwned::new(fleet); let position = Position::new(position); let ship = Ship::new(type_, direction); let entity = world .create_entity() .marked::<::Marker>() .with(player_owned) .with(fleet_owned) .with(position) .with(ship) .build(); Ok(entity) } pub fn player(mut self, value: Entity) -> Self { self.player = Some(value); self } pub fn fleet(mut self, value: Entity) -> Self { self.fleet = Some(value); self } pub fn position>(mut self, value: V) -> Self { self.position = Some(value.into()); self } pub fn direction>(mut self, value: V) -> Self { self.position = Some(value.into()); self } pub fn type_(mut self, value: ShipType) -> Self { self.type_ = Some(value); self } } impl Default for ShipBuilder { fn default() -> Self { Self { player: None, fleet: None, position: None, type_: None, direction: Vector2f::new(random::() - 0.5, random::() - 0.5).normalize(), } } }