diff options
Diffstat (limited to 'src/server/tractorbeam.rs')
-rw-r--r-- | src/server/tractorbeam.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/server/tractorbeam.rs b/src/server/tractorbeam.rs new file mode 100644 index 0000000..250f5fb --- /dev/null +++ b/src/server/tractorbeam.rs @@ -0,0 +1,70 @@ +extern crate serde_json; + +use std::collections::HashMap; +use std::io::BufRead; +use std::io::Write; + +use crate::mass::{Mass, MassType}; +use crate::modules::navigation::NavigationStatus; +use crate::modules::tractorbeam::TractorbeamStatus; +use crate::server::connection::ServerConnection; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TractorbeamData { + pub has_target: bool, + pub status: TractorbeamStatus, +} + +impl ServerConnection { + pub fn server_tractorbeam(&mut self, masses: &mut HashMap<String, Mass>) { + let mut ship = masses.remove(&self.name).unwrap(); + let ship_clone = ship.clone(); + + if let MassType::Ship { + ref mut tractorbeam, + ref navigation, + .. + } = ship.mass_type + { + let tractorbeam = tractorbeam.as_mut().unwrap(); + let navigation = navigation.as_ref().unwrap(); + + if self.open { + let tractorbeam_data = TractorbeamData { + has_target: navigation.status == NavigationStatus::Targeted, + status: tractorbeam.status.clone(), + }; + + let send = serde_json::to_string(&tractorbeam_data).unwrap() + "\n"; + self.open = match self.stream.write(send.as_bytes()) { + Ok(_result) => true, + Err(_error) => false, + }; + + let mut recv = String::new(); + if let Ok(result) = self.buff_r.read_line(&mut recv) { + match recv.as_bytes() { + b"o\n" => tractorbeam.toggle_pull(), + b"p\n" => tractorbeam.toggle_push(), + b"t\n" => tractorbeam.toggle_bring(5.0), + _ => { + if result == 0 { + self.open = false; + } + } + } + } + } + + if let Some(name) = navigation.target_name.clone() { + let target = masses.get_mut(&name).unwrap(); + let acceleration = tractorbeam.get_acceleration(ship_clone, target.clone()); + target.effects.give_acceleration(acceleration); + } else { + tractorbeam.off(); + } + } + + masses.insert(self.name.clone(), ship); + } +} |