| @@ -10,7 +10,7 @@ use glc::{ | |||
| }; | |||
| use shrev::{EventChannel, ReaderId}; | |||
| use space_crush_common::{ | |||
| components::{Fleet, MeetingPoint, MeetingPointOwned, Position, Shape, ShipCount}, | |||
| components::{Fleet, FleetOrbiting, MeetingPoint, Position, Shape, ShipCount}, | |||
| constants::VECTOR_2F_POS_X, | |||
| continue_if_none, | |||
| misc::{LogResult, WorldHelper as _}, | |||
| @@ -80,44 +80,12 @@ pub struct FleetSelectData<'a> { | |||
| global: ReadExpect<'a, Global>, | |||
| config: ReadExpect<'a, Config>, | |||
| meeting_point_owned: ReadStorage<'a, MeetingPointOwned>, | |||
| positions: ReadStorage<'a, Position>, | |||
| shapes: ReadStorage<'a, Shape>, | |||
| meeting_points: ReadStorage<'a, MeetingPoint>, | |||
| fleets: ReadStorage<'a, Fleet>, | |||
| } | |||
| macro_rules! selection { | |||
| (&$data:expr) => { | |||
| return_if_none!($data.game_state.selection()) | |||
| }; | |||
| (&mut $data:expr) => { | |||
| return_if_none!($data.game_state.selection_mut()) | |||
| }; | |||
| } | |||
| macro_rules! fleet { | |||
| (&$data:expr, $id:expr) => { | |||
| return_if_none!($data.fleets.get($id)) | |||
| }; | |||
| } | |||
| macro_rules! position { | |||
| (&$data:expr, $id:expr) => { | |||
| return_if_none!($data.positions.get($id)) | |||
| }; | |||
| } | |||
| macro_rules! shape { | |||
| (&$data:expr, $id:expr) => { | |||
| return_if_none!($data.shapes.get($id)) | |||
| }; | |||
| } | |||
| macro_rules! meeting_point_owned { | |||
| (&$data:expr, $id:expr) => { | |||
| return_if_none!($data.meeting_point_owned.get($id)) | |||
| }; | |||
| fleets: ReadStorage<'a, Fleet>, | |||
| fleets_orbiting: ReadStorage<'a, FleetOrbiting>, | |||
| } | |||
| impl FleetSelect { | |||
| @@ -215,8 +183,8 @@ impl FleetSelect { | |||
| } | |||
| }; | |||
| let selection = selection!(&d); | |||
| let fleet = fleet!(&d, selection.fleet); | |||
| let selection = d.game_state.selection().as_ref().unwrap(); | |||
| let fleet = d.fleets.get(selection.fleet).unwrap(); | |||
| let timeout = Instant::now() + FLEET_SELECT_DETAIL_TIMEOUT; | |||
| self.mouse_pos = d.input_state.mouse_pos; | |||
| @@ -231,21 +199,22 @@ impl FleetSelect { | |||
| MouseEvent::ButtonUp(button) if button == &d.config.input.fleet_select_button => { | |||
| self.select_mode = match self.select_mode { | |||
| SelectMode::Simple(progress) => { | |||
| selection!(&mut d).count = self.count; | |||
| continue_if_none!(d.game_state.selection_mut()).count = self.count; | |||
| self.mouse_pos = d.input_state.mouse_pos; | |||
| SelectMode::SimpleClose(progress) | |||
| } | |||
| SelectMode::Detail(progress) => { | |||
| selection!(&mut d).count = self.count; | |||
| continue_if_none!(d.game_state.selection_mut()).count = self.count; | |||
| self.mouse_pos = d.input_state.mouse_pos; | |||
| SelectMode::DetailClose(progress) | |||
| } | |||
| SelectMode::Init(_) if self.is_new_selection => { | |||
| selection!(&mut d).count = ShipCount::all(); | |||
| continue_if_none!(d.game_state.selection_mut()).count = | |||
| ShipCount::all(); | |||
| SelectMode::None | |||
| } | |||
| @@ -277,11 +246,13 @@ impl FleetSelect { | |||
| } | |||
| /* calculate values */ | |||
| let selection = selection!(&d); | |||
| let meeting_point_owned = meeting_point_owned!(&d, selection.fleet); | |||
| let position = position!(&d, meeting_point_owned.owner()); | |||
| let shape = shape!(&d, meeting_point_owned.owner()); | |||
| let fleet = fleet!(&d, selection.fleet); | |||
| let selection = return_if_none!(d.game_state.selection()); | |||
| let fleet_id = selection.fleet; | |||
| let fleet = d.fleets.get(fleet_id).unwrap(); | |||
| let fleet_orbiting = d.fleets_orbiting.get(fleet_id).unwrap(); | |||
| let meeting_point_id = fleet_orbiting.meeting_point(); | |||
| let position = d.positions.get(meeting_point_id).unwrap(); | |||
| let shape = d.shapes.get(meeting_point_id).unwrap(); | |||
| self.marker = d.camera.view_to_world(self.mouse_pos) - position.get(); | |||
| self.zoom = d.camera.view().axis_x.as_vec3().length(); | |||
| @@ -432,9 +403,14 @@ impl FleetSelect { | |||
| }; | |||
| /* extract system data */ | |||
| let selection = selection!(&d); | |||
| let meeting_point_owned = meeting_point_owned!(&d, selection.fleet); | |||
| let position = position!(&d, meeting_point_owned.owner()); | |||
| let selection = return_if_none!(d.game_state.selection()); | |||
| let fleet_id = selection.fleet; | |||
| let fleet_orbiting = d | |||
| .fleets_orbiting | |||
| .get(fleet_id) | |||
| .expect("Selection contains invalid fleet!"); | |||
| let meeting_point_id = fleet_orbiting.meeting_point(); | |||
| let position = d.positions.get(meeting_point_id).unwrap(); | |||
| /* calculate shared values */ | |||
| let size = self.ring1 + 50.0; | |||
| @@ -1,7 +1,7 @@ | |||
| use specs::{saveload::MarkedBuilder, Builder, Entity, World, WorldExt}; | |||
| use crate::{ | |||
| components::{Fleet, MeetingPointOwned, PlayerOwned}, | |||
| components::{Fleet, FleetOrbiting, PlayerOwned}, | |||
| misc::{Persistence, WorldPersistence}, | |||
| }; | |||
| @@ -21,14 +21,14 @@ impl FleetBuilder { | |||
| .ok_or(Error::MissingValue("meeting_point"))?; | |||
| let player_owned = PlayerOwned::new(player); | |||
| let meeting_point_owned = MeetingPointOwned::new(meeting_point); | |||
| let fleet_orbiting = FleetOrbiting::new(meeting_point); | |||
| let fleet = Fleet::new(); | |||
| let entity = world | |||
| .create_entity() | |||
| .marked::<<WorldPersistence as Persistence>::Marker>() | |||
| .with(meeting_point_owned) | |||
| .with(player_owned) | |||
| .with(fleet_orbiting) | |||
| .with(fleet) | |||
| .build(); | |||
| @@ -14,24 +14,32 @@ use crate::{ | |||
| misc::FlaggedStorage, | |||
| }; | |||
| /// A fleet is a group of ships that share the same operation | |||
| #[derive(Debug, Clone)] | |||
| pub struct Fleet { | |||
| owned: BitSet, | |||
| count: ShipCount, | |||
| } | |||
| /// Entities with this component are owned by a certain fleet entity | |||
| #[derive(Copy, Clone, Debug)] | |||
| pub struct FleetOwned { | |||
| owner: Entity, | |||
| } | |||
| #[derive(Debug, Clone)] | |||
| pub struct FleetOrbiting { | |||
| meeting_point: Entity, | |||
| } | |||
| #[derive(Serialize, Deserialize)] | |||
| pub struct FleetOwnedData<M> { | |||
| pub owner: M, | |||
| } | |||
| #[derive(Serialize, Deserialize)] | |||
| pub struct FleetOrbitingData<M> { | |||
| pub meeting_point: M, | |||
| } | |||
| /* Fleet */ | |||
| impl Fleet { | |||
| @@ -125,3 +133,47 @@ where | |||
| Ok(FleetOwned { owner }) | |||
| } | |||
| } | |||
| /* FleetOrbiting */ | |||
| impl FleetOrbiting { | |||
| pub fn meeting_point(&self) -> Entity { | |||
| self.meeting_point | |||
| } | |||
| } | |||
| impl FleetOrbiting { | |||
| pub(crate) fn new(meeting_point: Entity) -> Self { | |||
| Self { meeting_point } | |||
| } | |||
| } | |||
| impl Component for FleetOrbiting { | |||
| type Storage = FlaggedStorage<Self, HashMapStorage<Self>>; | |||
| } | |||
| impl<M> ConvertSaveload<M> for FleetOrbiting | |||
| where | |||
| for<'de> M: Marker + Serialize + Deserialize<'de>, | |||
| { | |||
| type Data = FleetOrbitingData<M>; | |||
| type Error = NoError; | |||
| fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error> | |||
| where | |||
| F: FnMut(Entity) -> Option<M>, | |||
| { | |||
| let meeting_point = ids(self.meeting_point).unwrap(); | |||
| Ok(FleetOrbitingData { meeting_point }) | |||
| } | |||
| fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error> | |||
| where | |||
| F: FnMut(M) -> Option<Entity>, | |||
| { | |||
| let meeting_point = ids(data.meeting_point).unwrap(); | |||
| Ok(FleetOrbiting { meeting_point }) | |||
| } | |||
| } | |||
| @@ -84,7 +84,7 @@ impl MeetingPoint { | |||
| } | |||
| impl Component for MeetingPoint { | |||
| type Storage = HashMapStorage<Self>; | |||
| type Storage = FlaggedStorage<Self, HashMapStorage<Self>>; | |||
| } | |||
| impl<M> ConvertSaveload<M> for MeetingPoint | |||
| @@ -121,47 +121,3 @@ where | |||
| Ok(MeetingPoint { min, max, fleets }) | |||
| } | |||
| } | |||
| /* MeetingPointOwned */ | |||
| impl MeetingPointOwned { | |||
| pub fn owner(&self) -> Entity { | |||
| self.owner | |||
| } | |||
| } | |||
| impl MeetingPointOwned { | |||
| pub(crate) fn new(owner: Entity) -> Self { | |||
| Self { owner } | |||
| } | |||
| } | |||
| impl Component for MeetingPointOwned { | |||
| type Storage = FlaggedStorage<Self, HashMapStorage<Self>>; | |||
| } | |||
| impl<M> ConvertSaveload<M> for MeetingPointOwned | |||
| where | |||
| for<'de> M: Marker + Serialize + Deserialize<'de>, | |||
| { | |||
| type Data = MeetingPointOwnedData<M>; | |||
| type Error = NoError; | |||
| fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error> | |||
| where | |||
| F: FnMut(Entity) -> Option<M>, | |||
| { | |||
| let owner = ids(self.owner).unwrap(); | |||
| Ok(MeetingPointOwnedData { owner }) | |||
| } | |||
| fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error> | |||
| where | |||
| F: FnMut(M) -> Option<Entity>, | |||
| { | |||
| let owner = ids(data.owner).unwrap(); | |||
| Ok(MeetingPointOwned { owner }) | |||
| } | |||
| } | |||
| @@ -9,8 +9,8 @@ mod shape; | |||
| mod ship; | |||
| pub use asteroid::{Asteroid, Type as AsteroidType}; | |||
| pub use fleet::{Fleet, FleetOwned}; | |||
| pub use meeting_point::{MeetingPoint, MeetingPointOwned}; | |||
| pub use fleet::{Fleet, FleetOrbiting, FleetOwned}; | |||
| pub use meeting_point::MeetingPoint; | |||
| pub use obstacle::Obstacle; | |||
| pub use planet::Planet; | |||
| pub use player::{Player, PlayerOwned, Race}; | |||
| @@ -3,9 +3,7 @@ use specs::{Dispatcher as Inner, DispatcherBuilder, World, WorldExt}; | |||
| use crate::{ | |||
| components::Player, | |||
| resources::Global, | |||
| systems::{ | |||
| FleetControl, FleetOwnedUpdate, MeetingPointOwnedUpdate, Process, ShipMovement, Ships, | |||
| }, | |||
| systems::{FleetControl, FleetOrbitingUpdate, FleetOwnedUpdate, Process, ShipMovement, Ships}, | |||
| Error, | |||
| }; | |||
| @@ -25,11 +23,7 @@ impl<'a, 'b> Dispatcher<'a, 'b> { | |||
| .with(Ships::new(world), "ships", &[]) | |||
| .with(FleetControl::new(world)?, "fleet_control", &[]) | |||
| .with(FleetOwnedUpdate::new(world), "fleet_owned_update", &[]) | |||
| .with( | |||
| MeetingPointOwnedUpdate::new(world), | |||
| "meeting_point_owned_update", | |||
| &[], | |||
| ) | |||
| .with(FleetOrbitingUpdate::new(world), "fleet_orbiting", &[]) | |||
| .build(); | |||
| dispatcher.setup(world); | |||
| @@ -7,8 +7,8 @@ use specs::{saveload::SimpleMarker, World}; | |||
| use crate::{ | |||
| components::{ | |||
| Asteroid, MeetingPoint, MeetingPointOwned, Obstacle, Planet, Player, PlayerOwned, Position, | |||
| Ship, | |||
| Asteroid, FleetOrbiting, FleetOwned, MeetingPoint, Obstacle, Planet, Player, PlayerOwned, | |||
| Position, Ship, | |||
| }, | |||
| Error, | |||
| }; | |||
| @@ -93,10 +93,11 @@ impl Persistence for WorldPersistence { | |||
| Position, | |||
| Player, | |||
| PlayerOwned, | |||
| MeetingPoint, | |||
| MeetingPointOwned, | |||
| FleetOwned, | |||
| FleetOrbiting, | |||
| Ship, | |||
| Obstacle, | |||
| MeetingPoint, | |||
| Planet, | |||
| Asteroid, | |||
| ); | |||
| @@ -11,7 +11,7 @@ use specs::{ | |||
| use crate::{ | |||
| components::{ | |||
| Fleet, FleetOwned, MeetingPoint, MeetingPointOwned, Player, PlayerOwned, Ship, ShipCount, | |||
| Fleet, FleetOrbiting, FleetOwned, MeetingPoint, Player, PlayerOwned, Ship, ShipCount, | |||
| }, | |||
| misc::WorldHelper, | |||
| Error, | |||
| @@ -37,7 +37,7 @@ pub struct FleetControlData<'a> { | |||
| entities: Entities<'a>, | |||
| fleet_control_events: ReadExpect<'a, EventChannel<FleetControlEvent>>, | |||
| player_owned: WriteStorage<'a, PlayerOwned>, | |||
| meeting_point_owned: WriteStorage<'a, MeetingPointOwned>, | |||
| fleet_orbiting: WriteStorage<'a, FleetOrbiting>, | |||
| fleet_owned: WriteStorage<'a, FleetOwned>, | |||
| meeting_points: WriteStorage<'a, MeetingPoint>, | |||
| fleets: WriteStorage<'a, Fleet>, | |||
| @@ -66,7 +66,7 @@ impl<'a> System<'a> for FleetControl { | |||
| entities, | |||
| fleet_control_events, | |||
| mut player_owned, | |||
| mut meeting_point_owned, | |||
| mut fleet_orbiting, | |||
| mut fleet_owned, | |||
| mut meeting_points, | |||
| mut fleets, | |||
| @@ -79,7 +79,7 @@ impl<'a> System<'a> for FleetControl { | |||
| for event in events { | |||
| match event { | |||
| FleetControlEvent::Move(args) if args.count.is_all() => { | |||
| let orbit_owned = continue_if_none!(meeting_point_owned.get_mut(args.fleet)); | |||
| let orbit_owned = continue_if_none!(fleet_orbiting.get_mut(args.fleet)); | |||
| orbit_owned.set_owner(args.target); | |||
| } | |||
| FleetControlEvent::Move(args) => { | |||
| @@ -98,7 +98,7 @@ impl<'a> System<'a> for FleetControl { | |||
| player_owned | |||
| .insert(fleet, PlayerOwned::new(args.player)) | |||
| .error("Unable to insert component: PlayerOwned"); | |||
| meeting_point_owned | |||
| fleet_orbiting | |||
| .insert(fleet, MeetingPointOwned::new(args.target)) | |||
| .error("Unable to insert component: MeetingPointOwned"); | |||
| fleets | |||
| @@ -7,98 +7,101 @@ use specs::{ | |||
| }; | |||
| use crate::{ | |||
| components::{MeetingPoint, MeetingPointOwned, Player, PlayerOwned}, | |||
| components::{FleetOrbiting, MeetingPoint, Player, PlayerOwned}, | |||
| continue_if_none, | |||
| misc::{ComponentEvent, StorageHelper, StorageHelperMut}, | |||
| }; | |||
| pub struct MeetingPointOwnedUpdate { | |||
| pub struct FleetOrbitingUpdate { | |||
| meeting_point_ids: BitSet, | |||
| meeting_point_owned_ids: BitSet, | |||
| fleet_orbiting_ids: BitSet, | |||
| old_meeting_point_ids: HashMap<Index, Entity>, | |||
| meeting_point_owned_event_id: ReaderId<crate::misc::ComponentEvent<MeetingPointOwned>>, | |||
| fleet_orbiting_event_id: ReaderId<crate::misc::ComponentEvent<FleetOrbiting>>, | |||
| } | |||
| #[derive(SystemData)] | |||
| pub struct MeetingPointOwnedUpdateData<'a> { | |||
| pub struct FleetOrbitingUpdateData<'a> { | |||
| entities: Entities<'a>, | |||
| players: ReadStorage<'a, Player>, | |||
| player_owned: ReadStorage<'a, PlayerOwned>, | |||
| meeting_point_owned: ReadStorage<'a, MeetingPointOwned>, | |||
| fleet_orbiting: ReadStorage<'a, FleetOrbiting>, | |||
| meeting_points: WriteStorage<'a, MeetingPoint>, | |||
| } | |||
| impl MeetingPointOwnedUpdate { | |||
| impl FleetOrbitingUpdate { | |||
| pub fn new(world: &mut World) -> Self { | |||
| WriteStorage::<MeetingPointOwned>::setup(world); | |||
| WriteStorage::<FleetOrbiting>::setup(world); | |||
| let meeting_point_ids = BitSet::new(); | |||
| let meeting_point_owned_ids = BitSet::new(); | |||
| let fleet_orbiting_ids = BitSet::new(); | |||
| let old_meeting_point_ids = HashMap::new(); | |||
| let meeting_point_owned_event_id = world | |||
| .system_data::<WriteStorage<MeetingPointOwned>>() | |||
| let fleet_orbiting_event_id = world | |||
| .system_data::<WriteStorage<FleetOrbiting>>() | |||
| .register_event_reader(); | |||
| Self { | |||
| meeting_point_ids, | |||
| meeting_point_owned_ids, | |||
| fleet_orbiting_ids, | |||
| old_meeting_point_ids, | |||
| meeting_point_owned_event_id, | |||
| fleet_orbiting_event_id, | |||
| } | |||
| } | |||
| } | |||
| impl<'a> System<'a> for MeetingPointOwnedUpdate { | |||
| type SystemData = MeetingPointOwnedUpdateData<'a>; | |||
| impl<'a> System<'a> for FleetOrbitingUpdate { | |||
| type SystemData = FleetOrbitingUpdateData<'a>; | |||
| fn run(&mut self, data: Self::SystemData) { | |||
| let MeetingPointOwnedUpdateData { | |||
| let FleetOrbitingUpdateData { | |||
| entities, | |||
| players, | |||
| player_owned, | |||
| meeting_point_owned, | |||
| fleet_orbiting, | |||
| mut meeting_points, | |||
| } = data; | |||
| self.meeting_point_ids.clear(); | |||
| self.meeting_point_owned_ids.clear(); | |||
| self.fleet_orbiting_ids.clear(); | |||
| self.old_meeting_point_ids.clear(); | |||
| /* handle events */ | |||
| let events = meeting_point_owned | |||
| let events = fleet_orbiting | |||
| .channel() | |||
| .read(&mut self.meeting_point_owned_event_id); | |||
| .read(&mut self.fleet_orbiting_event_id); | |||
| for event in events { | |||
| match event { | |||
| ComponentEvent::Inserted(id, meeting_point_owned) => { | |||
| self.meeting_point_ids.add(meeting_point_owned.owner().id()); | |||
| self.meeting_point_owned_ids.add(*id); | |||
| ComponentEvent::Inserted(id, fleet_orbiting) => { | |||
| self.meeting_point_ids | |||
| .add(fleet_orbiting.meeting_point().id()); | |||
| self.fleet_orbiting_ids.add(*id); | |||
| } | |||
| ComponentEvent::Modified(id, meeting_point_owned) => { | |||
| self.meeting_point_ids.add(meeting_point_owned.owner().id()); | |||
| self.meeting_point_owned_ids.add(*id); | |||
| ComponentEvent::Modified(id, fleet_orbiting) => { | |||
| self.meeting_point_ids | |||
| .add(fleet_orbiting.meeting_point().id()); | |||
| self.fleet_orbiting_ids.add(*id); | |||
| *self | |||
| .old_meeting_point_ids | |||
| .entry(*id) | |||
| .or_insert_with(|| meeting_point_owned.owner()) = | |||
| meeting_point_owned.owner(); | |||
| .or_insert_with(|| fleet_orbiting.meeting_point()) = | |||
| fleet_orbiting.meeting_point(); | |||
| } | |||
| ComponentEvent::Removed(id, meeting_point_owned) => { | |||
| self.meeting_point_ids.add(meeting_point_owned.owner().id()); | |||
| self.meeting_point_owned_ids.add(*id); | |||
| ComponentEvent::Removed(id, fleet_orbiting) => { | |||
| self.meeting_point_ids | |||
| .add(fleet_orbiting.meeting_point().id()); | |||
| self.fleet_orbiting_ids.add(*id); | |||
| *self | |||
| .old_meeting_point_ids | |||
| .entry(*id) | |||
| .or_insert_with(|| meeting_point_owned.owner()) = | |||
| meeting_point_owned.owner(); | |||
| .or_insert_with(|| fleet_orbiting.meeting_point()) = | |||
| fleet_orbiting.meeting_point(); | |||
| } | |||
| } | |||
| } | |||
| /* find new meeting_point ids */ | |||
| for (meeting_point_owned, _) in (&meeting_point_owned, &self.meeting_point_owned_ids).join() | |||
| { | |||
| self.meeting_point_ids.add(meeting_point_owned.owner().id()); | |||
| for (fleet_orbiting, _) in (&fleet_orbiting, &self.fleet_orbiting_ids).join() { | |||
| self.meeting_point_ids | |||
| .add(fleet_orbiting.meeting_point().id()); | |||
| } | |||
| /* update meeting_points */ | |||
| @@ -107,13 +110,13 @@ impl<'a> System<'a> for MeetingPointOwnedUpdate { | |||
| { | |||
| let data = ( | |||
| &entities, | |||
| &meeting_point_owned, | |||
| &fleet_orbiting, | |||
| &player_owned, | |||
| &self.meeting_point_owned_ids, | |||
| &self.fleet_orbiting_ids, | |||
| ); | |||
| for (fleet_id, meeting_point_owned, player_owned, _) in data.join() { | |||
| let new_match = meeting_point_id == meeting_point_owned.owner(); | |||
| for (fleet_id, fleet_orbiting, player_owned, _) in data.join() { | |||
| let new_match = meeting_point_id == fleet_orbiting.meeting_point(); | |||
| let old_match = match self.old_meeting_point_ids.get(&fleet_id.id()) { | |||
| Some(old_meeting_point_id) => meeting_point_id == *old_meeting_point_id, | |||
| None => false, | |||
| @@ -1,13 +1,13 @@ | |||
| mod fleet_control; | |||
| mod fleet_orbiting_update; | |||
| mod fleet_owned_update; | |||
| mod meeting_point_owned_update; | |||
| mod process; | |||
| mod ship_movement; | |||
| mod ships; | |||
| pub use fleet_control::{FleetControl, FleetControlEvent}; | |||
| pub use fleet_orbiting_update::FleetOrbitingUpdate; | |||
| pub use fleet_owned_update::FleetOwnedUpdate; | |||
| pub use meeting_point_owned_update::MeetingPointOwnedUpdate; | |||
| pub use process::Process; | |||
| pub use ship_movement::ShipMovement; | |||
| pub use ships::Ships; | |||
| @@ -12,7 +12,7 @@ use specs::{ | |||
| use crate::{ | |||
| components::{ | |||
| FleetOwned, MeetingPoint, MeetingPointOwned, Obstacle, Position, Shape, Ship, ShipObstacle, | |||
| FleetOrbiting, FleetOwned, MeetingPoint, Obstacle, Position, Shape, Ship, ShipObstacle, | |||
| }, | |||
| constants::{ | |||
| SHIP_ORBIT_AGILITY, SHIP_ORBIT_ANGLE_DELTA_MIN, SHIP_ORBIT_ANGLE_DELTA_RND, | |||
| @@ -34,7 +34,7 @@ pub struct ShipsData<'a> { | |||
| entities: Entities<'a>, | |||
| ships: WriteStorage<'a, Ship>, | |||
| fleet_owned: ReadStorage<'a, FleetOwned>, | |||
| meeting_point_owned: ReadStorage<'a, MeetingPointOwned>, | |||
| fleet_orbiting: ReadStorage<'a, FleetOrbiting>, | |||
| positions: ReadStorage<'a, Position>, | |||
| shapes: ReadStorage<'a, Shape>, | |||
| obstacles: ReadStorage<'a, Obstacle>, | |||
| @@ -48,7 +48,7 @@ struct Processor<'a> { | |||
| shapes: &'a ReadStorage<'a, Shape>, | |||
| obstacles: &'a ReadStorage<'a, Obstacle>, | |||
| meeting_points: &'a ReadStorage<'a, MeetingPoint>, | |||
| meeting_point_owned: &'a ReadStorage<'a, MeetingPointOwned>, | |||
| fleet_orbiting: &'a ReadStorage<'a, FleetOrbiting>, | |||
| delta: f32, | |||
| } | |||
| @@ -91,7 +91,7 @@ impl<'a> System<'a> for Ships { | |||
| entities, | |||
| mut ships, | |||
| fleet_owned, | |||
| meeting_point_owned, | |||
| fleet_orbiting, | |||
| positions, | |||
| shapes, | |||
| obstacles, | |||
| @@ -107,7 +107,7 @@ impl<'a> System<'a> for Ships { | |||
| positions: &positions, | |||
| shapes: &shapes, | |||
| obstacles: &obstacles, | |||
| meeting_point_owned: &meeting_point_owned, | |||
| fleet_orbiting: &fleet_orbiting, | |||
| meeting_points: &meeting_points, | |||
| delta: global.delta * global.world_speed, | |||
| }; | |||
| @@ -134,8 +134,8 @@ impl Processor<'_> { | |||
| fleet_owned: &FleetOwned, | |||
| ) { | |||
| let fleet_id = fleet_owned.owner(); | |||
| let meeting_point_owned = return_if_none!(self.meeting_point_owned.get(fleet_id)); | |||
| let meeting_point_id = meeting_point_owned.owner(); | |||
| let fleet_orbiting = return_if_none!(self.fleet_orbiting.get(fleet_id)); | |||
| let meeting_point_id = fleet_orbiting.meeting_point(); | |||
| let meeting_point = return_if_none!(self.meeting_points.get(meeting_point_id)); | |||
| let meeting_point_pos = return_if_none!(self.positions.get(meeting_point_id)).get(); | |||
| let ship_pos = position.get(); | |||