From dc18d9f8d55e4ebf724accc9a2f4da4c88df6b9b Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 11:35:32 -0600 Subject: [PATCH] impl config::min players for lobby --- secert-hitler/src/config.rs | 1 + .../src/controller/gamemaster/gamemaster.rs | 28 ++++++++++--------- .../src/controller/gamemaster/lobby.rs | 12 ++++++++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/secert-hitler/src/config.rs b/secert-hitler/src/config.rs index e993cd0..9354b85 100644 --- a/secert-hitler/src/config.rs +++ b/secert-hitler/src/config.rs @@ -1 +1,2 @@ pub static PORT:&str = ":8080"; +pub static MIN_PLAYERS:usize = 5; diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 7d214fa..2a1b5b0 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -24,7 +24,7 @@ impl GameMaster { self.run_game() } - fn run_lobby(&mut self) -> Result { + fn run_lobby(&mut self) -> Result { while !self.lobby.locked { let rollback = self.room.since(); let events = self.room.sync(); @@ -33,16 +33,15 @@ impl GameMaster { let ge = GameEvent::new(e.body.clone()); println!(" ge.mode = {:?}", ge.mode()); if ge.mode() == GameEventType::GameStart { - println!(" should return"); self.room.rollback(e.since.clone()); self.lobby.lock(); - return Ok("ok".to_string()); + return self.lobby.ready(); } self.lobby.eat(e.clone()); } thread::sleep(time::Duration::new(1, 0)); } - Ok("ok".to_string()) // todo: on lobby too small, return err and do not lock + return self.lobby.ready(); } fn run_game_setup(&mut self) -> Result { @@ -90,19 +89,22 @@ mod tests { let r1 = mrs.create(); let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); - let mut r2 = mrs.join(room_id).unwrap(); - r2.send(format!(r#"{{ - "msgtype": "m.text", - "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); // TODO mark end of new players - gm.run_lobby(); // todo assert is_ok - assert!(gm.lobby.players.len() == 2, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + for i in 0..4 { + let mut r2 = mrs.join(room_id.clone()).unwrap(); + r2.send(format!(r#"{{ + "msgtype": "m.text", + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); + let ready = gm.run_lobby(); + assert!(ready.is_err() == (i != 3), "want {:?} for ready.is_err #{:?}, which is {:?}", i != 3, i, ready.is_err()); + } + assert!(gm.lobby.players.len() == 5, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); let mut players1 = vec![]; for k in gm.lobby.players.keys() { players1.push(k.clone()); } - gm.run_lobby(); // todo assert is_ok - assert!(gm.lobby.players.len() == 2, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + assert!(gm.run_lobby().is_ok()); + assert!(gm.lobby.players.len() == 5, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); let players2 = gm.lobby.players.keys(); assert!(format!("{:?}", players1) == format!("{:?}", players2)); } diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs index 73e7b70..1f9310a 100644 --- a/secert-hitler/src/controller/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -1,5 +1,6 @@ use super::player::Player; use super::super::super::model::state::event::Event; +use super::super::super::config; use std::collections::HashMap; @@ -29,8 +30,19 @@ impl Lobby { } pub fn lock(&mut self) { + if self.ready().is_err() { + return; + } self.locked = true; } + + pub fn ready(&self) -> Result { + let n: usize = self.players.len(); + if n < config::MIN_PLAYERS { + return Err("not enough players"); + } + Ok(n) + } } #[cfg(test)]