From f617213b4a48d73acd245580f8551a7c37ce9ad8 Mon Sep 17 00:00:00 2001 From: tom barrett Date: Sun, 10 Feb 2019 03:55:05 -0600 Subject: added vector math and tractorbeam module --- src/modules/engines.rs | 52 ++++++++++----------------- src/modules/mod.rs | 1 + src/modules/navigation.rs | 10 ++---- src/modules/tractorbeam.rs | 90 ++++++++++++++++++++++++++++++++++++++++++++++ src/modules/types.rs | 1 + 5 files changed, 113 insertions(+), 41 deletions(-) create mode 100644 src/modules/tractorbeam.rs (limited to 'src/modules') diff --git a/src/modules/engines.rs b/src/modules/engines.rs index a930847..f319ee5 100644 --- a/src/modules/engines.rs +++ b/src/modules/engines.rs @@ -1,64 +1,48 @@ use crate::mass::Mass; +use crate::math::Vector; #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct Engines { - acceleration: (f64, f64, f64), + acceleration: Vector, } impl Engines { pub fn new() -> Engines { Engines { - acceleration: (0.0, 0.0, 0.0), + acceleration: Vector::default(), } } - pub fn recv_acceleration(&mut self) -> (f64, f64, f64) { - let acceleration = self.acceleration; - self.acceleration = (0.0, 0.0, 0.0); + pub fn recv_acceleration(&mut self) -> Vector { + let acceleration = self.acceleration.clone(); + self.acceleration = Vector::default(); acceleration } pub fn give_client_data(&mut self, ship: &Mass, target: Option<&Mass>, data: String) { - let mut acceleration = (0.0, 0.0, 0.0); + let mut acceleration = Vector::default(); match data.as_bytes() { - b"5\n" => acceleration.0 += 0.1, - b"0\n" => acceleration.0 -= 0.1, - b"8\n" => acceleration.1 += 0.1, - b"2\n" => acceleration.1 -= 0.1, - b"4\n" => acceleration.2 += 0.1, - b"6\n" => acceleration.2 -= 0.1, - b"+\n" => { - let m_v = ship.velocity; - acceleration = (m_v.0 * 0.05, m_v.1 * 0.05, m_v.2 * 0.05); - } + b"5\n" => acceleration.a += 0.1, + b"0\n" => acceleration.a -= 0.1, + b"8\n" => acceleration.b += 0.1, + b"2\n" => acceleration.b -= 0.1, + b"4\n" => acceleration.c += 0.1, + b"6\n" => acceleration.c -= 0.1, + b"+\n" => acceleration = ship.velocity.clone() * 0.05, b"-\n" => { - let m_v = ship.velocity; - acceleration = ( - -1.0 * m_v.0 * 0.05, - -1.0 * m_v.1 * 0.05, - -1.0 * m_v.2 * 0.05, - ); + acceleration = ship.velocity.clone() * -1.05; } b"s\n" => { - let m_v = ship.velocity; - acceleration = (-1.0 * m_v.0, -1.0 * m_v.1, -1.0 * m_v.2); + acceleration = ship.velocity.clone() * -1.0; } b"c\n" => { if let Some(target) = target { - let d_v = target.velocity; - let m_v = ship.velocity; - acceleration = (d_v.0 - m_v.0, d_v.1 - m_v.1, d_v.2 - m_v.2); + acceleration = target.velocity.clone() - ship.velocity.clone(); } } b"t\n" => { if let Some(target) = target { - let d_p = target.position; - let m_p = ship.position; - acceleration = ( - (d_p.0 - m_p.0) * 0.01, - (d_p.1 - m_p.1) * 0.01, - (d_p.2 - m_p.2) * 0.01, - ); + acceleration = (target.position.clone() - ship.position.clone()) * 0.01; } } _ => (), diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 3929e24..15c161b 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -4,4 +4,5 @@ pub mod engines; pub mod mining; pub mod navigation; pub mod refinery; +pub mod tractorbeam; pub mod types; diff --git a/src/modules/navigation.rs b/src/modules/navigation.rs index 11f3e94..03a9ca5 100644 --- a/src/modules/navigation.rs +++ b/src/modules/navigation.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use std::time::SystemTime; use crate::mass::Mass; -use crate::math::distance; +use crate::math::Vector; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub enum NavigationStatus { @@ -52,14 +52,10 @@ impl Navigation { self.target_name = Some(target_name); } - pub fn verify_target( - &mut self, - ship_position: (f64, f64, f64), - masses: &HashMap, - ) { + pub fn verify_target(&mut self, ship_position: Vector, masses: &HashMap) { if let Some(name) = self.target_name.clone() { let target = masses.get(&name).unwrap(); - if distance(target.position, ship_position) > self.range { + if target.position.distance_from(ship_position) > self.range { self.target_name = None; self.status = NavigationStatus::None; } diff --git a/src/modules/tractorbeam.rs b/src/modules/tractorbeam.rs new file mode 100644 index 0000000..1ddc7d0 --- /dev/null +++ b/src/modules/tractorbeam.rs @@ -0,0 +1,90 @@ +use crate::mass::Mass; +use crate::math::Vector; + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +pub struct Tractorbeam { + pub status: TractorbeamStatus, + strength: f64, + desired_distance: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TractorbeamStatus { + None, + Push, + Pull, + Bring, +} + +impl Default for TractorbeamStatus { + fn default() -> Self { + TractorbeamStatus::None + } +} + +impl Tractorbeam { + pub fn new() -> Tractorbeam { + Tractorbeam { + status: TractorbeamStatus::None, + strength: 0.1, + desired_distance: None, + } + } + + pub fn toggle_pull(&mut self) { + self.status = match self.status { + TractorbeamStatus::None => TractorbeamStatus::Pull, + TractorbeamStatus::Push => TractorbeamStatus::Pull, + TractorbeamStatus::Bring => TractorbeamStatus::Pull, + TractorbeamStatus::Pull => TractorbeamStatus::None, + } + } + + pub fn toggle_push(&mut self) { + self.status = match self.status { + TractorbeamStatus::None => TractorbeamStatus::Push, + TractorbeamStatus::Pull => TractorbeamStatus::Push, + TractorbeamStatus::Bring => TractorbeamStatus::Push, + TractorbeamStatus::Push => TractorbeamStatus::None, + } + } + + pub fn toggle_bring(&mut self, desired_distance: f64) { + self.desired_distance = Some(desired_distance); + self.status = match self.status { + TractorbeamStatus::None => TractorbeamStatus::Bring, + TractorbeamStatus::Pull => TractorbeamStatus::Bring, + TractorbeamStatus::Push => TractorbeamStatus::Bring, + TractorbeamStatus::Bring => TractorbeamStatus::None, + } + } + + pub fn off(&mut self) { + self.status = TractorbeamStatus::None; + } + + pub fn get_acceleration(&self, ship: Mass, target: Mass) -> Vector { + let acceleration = ship.position.clone() - target.position.clone(); + match self.status { + TractorbeamStatus::Push => acceleration.unitize() * -0.05, + TractorbeamStatus::Pull => acceleration.unitize() * 0.05, + TractorbeamStatus::Bring => match self.desired_distance { + Some(desired_distance) => { + if desired_distance > ship.position.distance_from(target.position) { + acceleration.unitize() * -0.05 + //some sort of velocity limiter + //if target.speed_torwards(ship) < 10.0 { + // acceleration.unitize() * -0.05 + //} else { + // Vector::default() + //} + } else { + acceleration.unitize() * 0.05 + } + } + None => Vector::default(), + }, + TractorbeamStatus::None => Vector::default(), + } + } +} diff --git a/src/modules/types.rs b/src/modules/types.rs index 17e7c6c..91e41dc 100644 --- a/src/modules/types.rs +++ b/src/modules/types.rs @@ -5,5 +5,6 @@ pub enum ModuleType { Refinery, Dashboard, Navigation, + Tractorbeam, Construction, } -- cgit v1.2.3