From 573ba69d810914c153a578747414b3d631e61bbc Mon Sep 17 00:00:00 2001 From: tom barrett Date: Thu, 12 Apr 2018 04:33:23 -0500 Subject: completely restructured code and fixed navigation bug --- src/client/navigation.rs | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/client/navigation.rs (limited to 'src/client/navigation.rs') diff --git a/src/client/navigation.rs b/src/client/navigation.rs new file mode 100644 index 0000000..e5a5069 --- /dev/null +++ b/src/client/navigation.rs @@ -0,0 +1,101 @@ +extern crate termion; +extern crate itertools; +extern crate serde_json; + +use std::net::TcpStream; +use std::collections::BTreeMap; +use self::termion::async_stdin; +use self::itertools::Itertools; +use std::io::{BufRead, BufReader}; +use std::io::{stdout, Read, Write}; +use self::termion::raw::IntoRawMode; + +use mass::Mass; +use ship::Ship; +use math::distance; +use astroid::Astroid; + +pub fn client_navigation(name : String, mut stream : TcpStream, mut buff_r : BufReader){ + let stdout = stdout(); + let mut stdout = stdout.lock().into_raw_mode().unwrap(); + let mut stdin = async_stdin().bytes(); + + loop { + let mut recv = String::new(); + buff_r.read_line(&mut recv).unwrap(); + + let string_hashmap = recv.split(";"); + let mut masses : BTreeMap> = BTreeMap::new(); + for string_element in string_hashmap { + if string_element.len() <= 1 { + break; + } + let (string_name, string_mass) = string_element.split("@").next_tuple().unwrap(); + masses.insert(string_name.to_string(), build_mass(string_mass)); + } + + + write!(stdout, "{}{}Targets:", + termion::clear::All, + termion::cursor::Goto(1,1)).unwrap(); + + let ship = masses.remove(&name).unwrap().downcast::().unwrap(); + + for (i, (mass_name, mass)) in masses.iter().enumerate() { + + let target_data = match ship.recv_target() { + Some(target_name) => { + if &target_name == mass_name { + serde_json::to_string(&ship.recv_targeting_status()).unwrap() + } + else { + String::new() + } + } + None => String::new(), + }; + + write!(stdout, "{}{}) {} ({:.2}, {:.2}, {:.2}) Distance : {:.2} {}", + termion::cursor::Goto(1, 2 + i as u16), + i, + mass_name, + mass.position().0, + mass.position().1, + mass.position().2, + distance(mass.position(), ship.position()), + target_data + ).unwrap(); + } + + match stdin.next() { + Some(c) => { + let c = c.unwrap() as char; + if c == 'q' { + break; + } + else { + let i = c.to_digit(10).unwrap() as usize; + if i < masses.len() { + let mut send = String::new(); + send.push_str(masses.iter().nth(i).unwrap().0); + send.push_str("\n"); + stream.write(send.as_bytes()).unwrap(); + } + } + } + None => () + } + stdout.flush().unwrap(); + } +} + +fn build_mass(string_mass : &str) -> Box { + if string_mass.contains("Ship") { + let mass : Ship = serde_json::from_str(&string_mass).unwrap(); + return Box::new(mass) + } + else { + let mass : Astroid = serde_json::from_str(&string_mass).unwrap(); + return Box::new(mass) + } +} -- cgit v1.2.3