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