diff options
author | tom barrett <spalf0@gmail.com> | 2019-02-19 13:24:25 -0600 |
---|---|---|
committer | tom barrett <spalf0@gmail.com> | 2019-02-19 13:24:25 -0600 |
commit | a4efade392aa7127c373b0247d39274cb0decd10 (patch) | |
tree | 72ff44e69917873ca9933c4a56794a15b99fb90c /src/modules/refinery.rs | |
parent | 892088d723fd3dc0aae969273331c2765f322e6f (diff) |
unified all server->client connection and brought logic to modules
Diffstat (limited to 'src/modules/refinery.rs')
-rw-r--r-- | src/modules/refinery.rs | 79 |
1 files changed, 55 insertions, 24 deletions
diff --git a/src/modules/refinery.rs b/src/modules/refinery.rs index 4a4ca85..a0a401b 100644 --- a/src/modules/refinery.rs +++ b/src/modules/refinery.rs @@ -1,20 +1,8 @@ use std::time::SystemTime; use crate::constants; -use crate::server::refinery::RefineryData; - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] -pub enum RefineryStatus { - None, - Refining, - Refined, -} - -impl Default for RefineryStatus { - fn default() -> Self { - RefineryStatus::None - } -} +use crate::item::{Item, ItemType}; +use crate::storage::Storage; #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct Refinery { @@ -32,41 +20,84 @@ impl Refinery { } } - pub fn process(&mut self) { + pub fn process(&mut self, storage: &mut Storage) { + if !self.has_crude_minerals(storage) { + self.off(); + } if let Some(timer) = self.start { if timer.elapsed().unwrap().as_secs() > self.time { self.status = RefineryStatus::Refined; - self.start = Some(SystemTime::now()); + self.start = None } } + if self.status == RefineryStatus::Refined { + storage.take_item(ItemType::CrudeMinerals); + storage.give_item(Item::new(ItemType::Iron)); + storage.give_item(Item::new(ItemType::Hydrogen)); + self.taken(); + } } - pub fn give_recv(&mut self, recv: String, refinery_data: RefineryData) { - if !refinery_data.has_crude_minerals { - self.off(); - } else if let "R" = recv.as_str() { + pub fn get_client_data(&self, storage: &Storage) -> String { + let client_data = RefineryClientData { + has_crude_minerals: self.has_crude_minerals(storage), + status: self.status.clone(), + }; + + serde_json::to_string(&client_data).unwrap() + "\n" + } + + pub fn give_received_data(&mut self, recv: String) { + if let "R" = recv.as_str() { self.toggle(); } } - pub fn toggle(&mut self) { + fn has_crude_minerals(&self, storage: &Storage) -> bool { + storage + .items + .iter() + .any(|item| item.item_type == ItemType::CrudeMinerals) + } + + fn toggle(&mut self) { match self.status { RefineryStatus::None => self.on(), _ => self.off(), }; } - pub fn on(&mut self) { + fn on(&mut self) { self.start = Some(SystemTime::now()); self.status = RefineryStatus::Refining; } - pub fn off(&mut self) { + fn off(&mut self) { self.start = None; self.status = RefineryStatus::None; } - pub fn taken(&mut self) { + fn taken(&mut self) { self.status = RefineryStatus::Refining; + self.start = Some(SystemTime::now()); + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RefineryClientData { + pub has_crude_minerals: bool, + pub status: RefineryStatus, +} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub enum RefineryStatus { + None, + Refining, + Refined, +} + +impl Default for RefineryStatus { + fn default() -> Self { + RefineryStatus::None } } |