gameServer2/src/server/room.rs
changeset 13432 6f6a866c86a2
parent 13431 f091f69d59e4
child 13433 c8425fbcf1d9
--- a/gameServer2/src/server/room.rs	Wed Jun 27 17:58:33 2018 +0300
+++ b/gameServer2/src/server/room.rs	Wed Jun 27 23:26:29 2018 +0300
@@ -7,16 +7,19 @@
 const MAX_HEDGEHOGS_IN_ROOM: u8 = 48;
 pub type RoomId = usize;
 
+#[derive(Clone)]
 struct Ammo {
     name: String,
     settings: Option<String>
 }
 
+#[derive(Clone)]
 struct Scheme {
     name: String,
     settings: Option<Vec<String>>
 }
 
+#[derive(Clone)]
 struct RoomConfig {
     feature_size: u32,
     map_type: String,
@@ -51,18 +54,57 @@
     }
 }
 
+fn client_teams_impl(teams: &Vec<(ClientId, TeamInfo)>, client_id: ClientId)
+    -> impl Iterator<Item = &TeamInfo> + Clone
+{
+    teams.iter().filter(move |(id, _)| *id == client_id).map(|(_, t)| t)
+}
+
+fn map_config_from(c: &RoomConfig) -> Vec<String> {
+    vec![c.feature_size.to_string(), c.map_type.to_string(),
+         c.map_generator.to_string(), c.maze_size.to_string(),
+         c.seed.to_string(), c.template.to_string()]
+}
+
+fn game_config_from(c: &RoomConfig) -> Vec<GameCfg> {
+    use server::coretypes::GameCfg::*;
+    let mut v = vec![
+        Ammo(c.ammo.name.to_string(), c.ammo.settings.clone()),
+        Scheme(c.scheme.name.to_string(), c.scheme.settings.clone()),
+        Script(c.script.to_string()),
+        Theme(c.theme.to_string())];
+    if let Some(ref m) = c.drawn_map {
+        v.push(DrawnMap(m.to_string()))
+    }
+    v
+}
+
 pub struct GameInfo {
     pub teams_in_game: u8,
-    pub left_teams: Vec<String>
+    pub teams_at_start: Vec<(ClientId, TeamInfo)>,
+    pub left_teams: Vec<String>,
+    pub msg_log: String,
+    pub last_msg: Option<String>,
+    pub is_paused: bool,
+    config: RoomConfig
 }
 
 impl GameInfo {
-    pub fn new(teams_number: u8) -> GameInfo {
+    fn new(teams: Vec<(ClientId, TeamInfo)>, config: RoomConfig) -> GameInfo {
         GameInfo {
-            teams_in_game: teams_number,
-            left_teams: Vec::new()
+            left_teams: Vec::new(),
+            msg_log: String::new(),
+            last_msg: None,
+            is_paused: false,
+            teams_in_game: teams.len() as u8,
+            teams_at_start: teams,
+            config
         }
     }
+
+    pub fn client_teams(&self, client_id: ClientId) -> impl Iterator<Item = &TeamInfo> + Clone {
+        client_teams_impl(&self.teams_at_start, client_id)
+    }
 }
 
 pub struct HWRoom {
@@ -138,7 +180,7 @@
     }
 
     pub fn client_teams(&self, client_id: ClientId) -> impl Iterator<Item = &TeamInfo> {
-        self.teams.iter().filter(move |(id, _)| *id == client_id).map(|(_, t)| t)
+        client_teams_impl(&self.teams, client_id)
     }
 
     pub fn client_team_indices(&self, client_id: ClientId) -> Vec<u8> {
@@ -179,6 +221,13 @@
         };
     }
 
+    pub fn start_round(&mut self) {
+        if self.game_info.is_none() {
+            self.game_info = Some(GameInfo::new(
+                self.teams.clone(), self.config.clone()));
+        }
+    }
+
     pub fn info(&self, master: Option<&HWClient>) -> Vec<String> {
         let flags = "-".to_string();
         let c = &self.config;
@@ -196,24 +245,17 @@
     }
 
     pub fn map_config(&self) -> Vec<String> {
-        let c = &self.config;
-        vec![c.feature_size.to_string(), c.map_type.to_string(),
-             c.map_generator.to_string(), c.maze_size.to_string(),
-             c.seed.to_string(), c.template.to_string()]
+        match self.game_info {
+            Some(ref info) => map_config_from(&info.config),
+            None => map_config_from(&self.config)
+        }
     }
 
     pub fn game_config(&self) -> Vec<GameCfg> {
-        use server::coretypes::GameCfg::*;
-        let c = &self.config;
-        let mut v = vec![
-            Ammo(c.ammo.name.to_string(), c.ammo.settings.clone()),
-            Scheme(c.scheme.name.to_string(), c.scheme.settings.clone()),
-            Script(c.script.to_string()),
-            Theme(c.theme.to_string())];
-        if let Some(ref m) = c.drawn_map {
-            v.push(DrawnMap(m.to_string()))
+        match self.game_info {
+            Some(ref info) => game_config_from(&info.config),
+            None => game_config_from(&self.config)
         }
-        v
     }
 
     pub fn team_info(owner: &HWClient, team: &TeamInfo) -> Vec<String> {