From 14ca7b5fc15eb2618b46bde0cac85e37ebc9ebd9 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Thu, 21 May 2026 07:58:47 -0400 Subject: tacmap back as canvas. begin work on fleet scheduling --- src/fleet.rs | 112 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 43 deletions(-) (limited to 'src/fleet.rs') 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, heading: cgmath::Vector2>, + velocity: cgmath::Vector3, + acceleration: cgmath::Vector3, + + angular_velocity: cgmath::Vector2, + angular_acceleration: cgmath::Vector2, + system: Option, baked_orbit: Option<(f64, StaticOrbit)>, } @@ -31,7 +38,7 @@ pub struct Fleet pub struct FleetsManager { next_id: FleetId, - fleets: HashMap + fleets: HashMap, } 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) { 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 { - 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) + -> 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) -> 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) } -- cgit v1.2.3