summaryrefslogtreecommitdiff
path: root/src/modules/engines.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/engines.rs')
-rw-r--r--src/modules/engines.rs70
1 files changed, 46 insertions, 24 deletions
diff --git a/src/modules/engines.rs b/src/modules/engines.rs
index 313346a..ebf4e8b 100644
--- a/src/modules/engines.rs
+++ b/src/modules/engines.rs
@@ -5,6 +5,7 @@ use crate::modules::navigation;
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct Engines {
+ pub status: Status,
acceleration: Vector,
target_velocity: Option<Vector>,
pub fuel: f64,
@@ -13,28 +14,44 @@ pub struct Engines {
impl Engines {
pub fn new() -> Engines {
Engines {
+ status: Status::None,
acceleration: Vector::default(),
target_velocity: None,
fuel: constants::SHIP_ENGINES_FUEL_START,
}
}
- pub fn process(&mut self, velocity: Vector) {
- if let Some(target_velocity) = self.target_velocity.clone() {
- self.acceleration += target_velocity - velocity;
- if self.acceleration == Vector::default() {
- self.target_velocity = None
+ pub fn process(&mut self, position: Vector, velocity: Vector, target: Option<&Mass>) {
+ if self.target_velocity.is_none() && self.status != Status::None {
+ if self.status == Status::Stopping {
+ self.target_velocity = Some(Vector::default());
+ }
+ if let Some(target) = target {
+ match self.status {
+ Status::TowardsTarget => {
+ self.acceleration = (target.position.clone() - position).unitize()
+ * constants::SHIP_ENGINES_ACCELERATION;
+ self.status = Status::None;
+ }
+ Status::FollowingTarget => self.target_velocity = Some(target.velocity.clone()),
+ _ => (),
+ }
+ } else {
+ self.status = Status::None;
}
}
+ match self.target_velocity.clone() {
+ Some(target_velocity) => {
+ self.acceleration += target_velocity - velocity;
+ if self.acceleration == Vector::default() {
+ self.target_velocity = None;
+ }
+ }
+ None => (),
+ }
}
- pub fn give_received_data(
- &mut self,
- recv: String,
- position: Vector,
- velocity: Vector,
- target: Option<&Mass>,
- ) {
+ pub fn give_received_data(&mut self, recv: String, velocity: Vector) {
let mut acceleration = Vector::default();
match recv.as_str() {
"5" => acceleration.x += constants::SHIP_ENGINES_ACCELERATION,
@@ -45,18 +62,9 @@ impl Engines {
"6" => acceleration.z -= constants::SHIP_ENGINES_ACCELERATION,
"+" => acceleration = velocity.unitize() * constants::SHIP_ENGINES_ACCELERATION,
"-" => acceleration = velocity.unitize() * -1.0 * constants::SHIP_ENGINES_ACCELERATION,
- "s" => self.target_velocity = Some(Vector::default()),
- "c" => {
- if let Some(target) = target {
- self.target_velocity = Some(target.velocity.clone());
- }
- }
- "t" => {
- if let Some(target) = target {
- acceleration = (target.position.clone() - position).unitize()
- * constants::SHIP_ENGINES_ACCELERATION;
- }
- }
+ "s" => self.status = Status::Stopping,
+ "c" => self.status = Status::FollowingTarget,
+ "t" => self.status = Status::TowardsTarget,
_ => (),
}
self.acceleration = acceleration;
@@ -91,3 +99,17 @@ pub struct ClientData {
pub has_target: bool,
pub fuel: f64,
}
+
+#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
+pub enum Status {
+ None,
+ Stopping,
+ FollowingTarget,
+ TowardsTarget,
+}
+
+impl Default for Status {
+ fn default() -> Self {
+ Status::None
+ }
+}