summaryrefslogtreecommitdiffstats
path: root/src/fleet.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/fleet.rs')
-rw-r--r--src/fleet.rs112
1 files changed, 69 insertions, 43 deletions
diff --git a/src/fleet.rs b/src/fleet.rs
index 344aef3..2d7dad5 100644
--- a/src/fleet.rs
+++ b/src/fleet.rs
@@ -1,16 +1,17 @@
-use std::cell::RefCell;
-use std::collections::HashMap;
-use std::collections::hash_map::Iter;
+pub mod schedule;
+
+use std::collections::{BinaryHeap, HashMap};
use std::error::Error;
-use std::iter::Filter;
+use std::ops::{Range, RangeBounds};
use cgmath::Zero;
use crate::GameState;
+use crate::fleet::schedule::{Schedule, ScheduleManager};
use crate::solar_system::body::BodyId;
use crate::solar_system::orbit::StaticOrbiter;
-use crate::solar_system::{SystemId, GRAVITATIONAL_CONSTANT, Kilometers, SolarSystem, body::OrbitalBody, orbit::StaticOrbit};
-use crate::timeman::{self, Second};
+use crate::solar_system::{SystemId, GRAVITATIONAL_CONSTANT, Kilometers, SolarSystem, orbit::StaticOrbit};
+use crate::timeman::{HOUR, Second};
use crate::ui::fleet_window::NewFleet;
pub type FleetId = usize;
@@ -24,6 +25,12 @@ pub struct Fleet
offset: cgmath::Vector3<Kilometers>,
heading: cgmath::Vector2<cgmath::Rad<f32>>,
+ velocity: cgmath::Vector3<f32>,
+ acceleration: cgmath::Vector3<f32>,
+
+ angular_velocity: cgmath::Vector2<f32>,
+ angular_acceleration: cgmath::Vector2<f32>,
+
system: Option<SystemId>,
baked_orbit: Option<(f64, StaticOrbit)>,
}
@@ -31,7 +38,7 @@ pub struct Fleet
pub struct FleetsManager
{
next_id: FleetId,
- fleets: HashMap<FleetId, Fleet>
+ fleets: HashMap<FleetId, Fleet>,
}
impl StaticOrbiter for Fleet {
@@ -54,6 +61,8 @@ impl StaticOrbiter for Fleet {
impl Fleet
{
+ pub const SUBTICK_DURATION: Second = HOUR;
+
pub fn new(
id: FleetId,
name: String)
@@ -67,9 +76,15 @@ impl Fleet
heading: cgmath::vec2(
cgmath::Rad::zero(),
cgmath::Rad::zero()),
+
+ velocity: cgmath::vec3(0.0, 0.0, 0.0),
+ acceleration: cgmath::vec3(0.0, 0.0, 0.0),
+
+ angular_velocity: cgmath::vec2(0.0, 0.0),
+ angular_acceleration: cgmath::vec2(0.0, 0.0),
system: None,
- baked_orbit: None,
+ baked_orbit: None
}
}
@@ -97,20 +112,20 @@ impl Fleet
self.system = Some(star_system.id());
}
- fn subtick(
+ fn tick(
&mut self,
star_systems: &[SolarSystem],
- time: Second)
- -> Result<(), ()>
+ time: &Range<Second>)
{
if let Some((_sgp, orbit)) = &self.baked_orbit {
let solar_system = &star_systems[self.system().unwrap()];
let body = solar_system.body(orbit.parent());
- self.origin = body.absolute_position(solar_system, time);
- self.offset = orbit.calculate_position_at(self, time);
+ self.origin = body.absolute_position(solar_system, time.end);
+ self.offset = orbit.calculate_position_at(self, time.end);
+ }else{
+
}
- Ok(())
}
} // impl Fleet
@@ -143,53 +158,66 @@ impl FleetsManager
system: SystemId)
-> Vec<usize>
{
- self.fleets.iter().filter_map(|v| {
- if v.1.system().is_some_and(|id| { id == system }) {
- Some(*v.0)
+ self.fleets.values().filter_map(|v| {
+ if v.system().is_some_and(|id| { id == system }) {
+ Some(v.id())
}else {
None
}
}).collect()
}
- pub fn entry_mut(
- &mut self,
- id: FleetId)
- -> Option<&mut Fleet>
+ pub fn fleet_mut(&mut self, id: FleetId) -> Option<&mut Fleet>
{ self.fleets.get_mut(&id) }
-
- pub fn entry(
- &self,
- id: FleetId)
- -> Option<&Fleet>
+ pub fn fleet(&self, id: FleetId) -> Option<&Fleet>
{ self.fleets.get(&id) }
- fn subtick_fleet(
+ fn subtick(
&mut self,
star_systems: &[SolarSystem],
- time: Second)
- -> Result<(), ()>
+ scheduler: &mut ScheduleManager,
+ time: &Range<Second>)
+ -> Result<(), Second>
{
- let mut tick_interrupt = Ok(());
- for (id, fleet) in &mut self.fleets {
- let res = fleet.subtick(star_systems, time);
- if res.is_err() {
- tick_interrupt = Err(());
- }
+ let interrupt = scheduler.subtick(self, star_systems, time);
+ let new_range = time.start..
+ (if interrupt.is_err()
+ { interrupt.expect_err("Expect interrupt") }
+ else { time.end }
+ );
+
+ for (_, fleet) in self.fleets.iter_mut() {
+ fleet.tick(star_systems, &new_range);
}
- tick_interrupt
+
+ interrupt
}
pub fn tick(
&mut self,
star_systems: &[SolarSystem],
- time_then: Second,
- time_now: Second)
+ scheduler: &mut ScheduleManager,
+ time: Range<Second>)
-> Result<(), Second>
{
- self.subtick_fleet(star_systems, time_now);
+ let delta_time = time.end - time.start;
+ let subticks = delta_time / Fleet::SUBTICK_DURATION;
+
+ for tick in 0..subticks {
+ let last_tick_time = time.start + tick * Fleet::SUBTICK_DURATION;
+ let now_tick_time = last_tick_time + Fleet::SUBTICK_DURATION;
+
+ let tick_time = last_tick_time..now_tick_time;
+ let interrupt = self.subtick(star_systems, scheduler, &tick_time);
+ if interrupt.is_err() {
+ return interrupt;
+ }
+ }
+
+ let last_tick_start = time.start + subticks * Fleet::SUBTICK_DURATION;
+ let last_tick_time = last_tick_start..time.end;
- Ok(())
+ self.subtick(star_systems, scheduler, &last_tick_time)
}
} // impl FleetsManager
@@ -206,9 +234,7 @@ impl GameState
let mut fleet = Fleet::new(fleet_id, info.name);
fleet.make_orbit(star_system, info.orbiting, info.sma);
- self.fleets.fleets.insert(
- fleet_id,
- fleet);
+ self.fleets.fleets.insert(fleet_id, fleet);
Ok(fleet_id)
}