room joining reuqires sender

master^2
Bel LaPointe 2020-05-07 08:18:50 -06:00
parent 3859f29a75
commit 14aab04885
4 changed files with 67 additions and 50 deletions

View File

@ -137,7 +137,6 @@ impl GameEvent {
targets: self.targets(), targets: self.targets(),
params: self.params(), params: self.params(),
}), }),
sender: "__gm__",
msgtype: "m.text".to_string(), msgtype: "m.text".to_string(),
}).dump() }).dump()
} }
@ -256,31 +255,31 @@ mod tests {
d: json::object!{}, d: json::object!{},
sender: "a".to_string(), sender: "a".to_string(),
}; };
assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[],\"targets\":[],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize());
let ge = GameEvent{ let ge = GameEvent{
d: json::object!{GameEventType: "GameStart"}, d: json::object!{GameEventType: "GameStart"},
sender: "a".to_string(), sender: "a".to_string(),
}; };
assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize());
let ge = GameEvent{ let ge = GameEvent{
d: json::object!{GameEventType: "GameStart", params: ["hi"]}, d: json::object!{GameEventType: "GameStart", params: ["hi"]},
sender: "a".to_string(), sender: "a".to_string(),
}; };
assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[\"hi\"]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[\"hi\"]}","msgtype":"m.text"}"#, "{}", ge.serialize());
let ge = GameEvent{ let ge = GameEvent{
d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]}, d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]},
sender: "a".to_string(), sender: "a".to_string(),
}; };
assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize());
let ge = GameEvent{ let ge = GameEvent{
d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]}, d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]},
sender: "a".to_string(), sender: "a".to_string(),
}; };
assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize());
debug!("sample gameevent serialize: {}", ge.serialize()); debug!("sample gameevent serialize: {}", ge.serialize());
} }
} }

View File

@ -4,11 +4,46 @@ use super::super::gameevent::GameEventType;
use super::super::policy::Policy; use super::super::policy::Policy;
use super::super::role::Role; use super::super::role::Role;
use log::debug; use log::{debug, error};
use json; use json;
use std::collections::HashMap; use std::collections::HashMap;
impl GameMaster { impl GameMaster {
pub fn run_game(&mut self) -> Result<GameEvent, Role> {
loop {
let ge = self.game_is_over()?;
self.room.send(ge.serialize());
let ge = self.game_election()?;
self.room.send(ge.serialize());
let ge = self.game_is_over()?;
self.room.send(ge.serialize());
let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() {
GameEventType::VoteFailed => self.game_policy_select_random(),
GameEventType::GameStop => self.game_is_over(),
_ => self.game_policy_select(),
}?;
self.room.send(p.serialize());
if p.mode() != GameEventType::PolicySet {
error!("unexpected game event type after election vote followup: {:?}", p);
return Err(Role::Null);
}
let params = p.params();
let param = params.first();
if param.is_none() {
error!("unexpected missing param on {:?}: {:?}", p, param);
return Err(Role::Null);
}
let param = param.unwrap();
let policy = Policy::from_string(param.to_string());
let ge = self.game_policy_veto(policy.clone())?;
self.room.send(ge.serialize());
let ge = self.game_ends_with(policy.clone())?;
self.room.send(ge.serialize());
let ge = self.game_policy_enact(policy.clone())?;
self.room.send(ge.serialize());
}
}
pub fn game_is_over(&mut self) -> Result<GameEvent, Role> { pub fn game_is_over(&mut self) -> Result<GameEvent, Role> {
if self.policies[&Policy::Facist] >= 3 { if self.policies[&Policy::Facist] >= 3 {
let chancellor = self.chancellor.clone(); let chancellor = self.chancellor.clone();
@ -34,9 +69,7 @@ impl GameMaster {
self.president = Some(president_candidate.clone()); self.president = Some(president_candidate.clone());
ge.d["targets"] = json::array![president_candidate.clone()]; ge.d["targets"] = json::array![president_candidate.clone()];
ge.d["params"] = json::array!["president"]; ge.d["params"] = json::array!["president"];
if self.room.send(ge.serialize()).is_err() { self.room.send(ge.serialize()).unwrap();
return Err(Role::Null);
}
let events = self.scrape_until_gameeventtype(GameEventType::ElectionSet); let events = self.scrape_until_gameeventtype(GameEventType::ElectionSet);
if events.is_err() { if events.is_err() {
return Err(Role::Null); return Err(Role::Null);
@ -95,20 +128,30 @@ impl GameMaster {
} }
self.room.send(ge.serialize()); self.room.send(ge.serialize());
if gm_vote { if ! gm_vote {
return Ok(GameEventType::Null.build()); // todo how to emit continue?
} else {
self.president = None; self.president = None;
self.chancellor = None; self.chancellor = None;
return Ok(GameEventType::VoteFailed.build()); return Ok(GameEventType::VoteFailed.build());
} }
if self.game_is_over().is_err() {
return Ok(GameEventType::GameStop.build());
}
Ok(GameEventType::Null.build())
} }
pub fn game_policy_select_random(&mut self) -> Result<GameEvent, Role> { pub fn game_policy_select_random(&mut self) -> Result<GameEvent, Role> {
Err(Role::Null) let policy = self.deck.pop().unwrap().clone();
let mut ge = GameEventType::PolicySet.build();
ge.d["params"] = json::array![format!("{:?}", policy)];
self.room.send(ge.serialize()).unwrap();
} }
pub fn game_policy_select(&mut self) -> Result<GameEvent, Role> { pub fn game_policy_select(&mut self) -> Result<GameEvent, Role> {
let draw = vec![];
for _ in 0..3 {
draw.push(self.deck.pop().unwrap().clone());
}
Err(Role::Null) Err(Role::Null)
} }
@ -342,4 +385,12 @@ mod tests {
assert!(ge.params()[1] == "true"); assert!(ge.params()[1] == "true");
assert!(ge.params()[2] == "true"); assert!(ge.params()[2] == "true");
} }
#[test]
fn game_policy_select() {
}
#[test]
fn game_policy_select_random() {
}
} }

View File

@ -18,6 +18,7 @@ pub struct GameMaster {
pub lobby: Lobby, pub lobby: Lobby,
pub candidate_presidents: Vec<String>, pub candidate_presidents: Vec<String>,
pub deck: Vec<Policy>, pub deck: Vec<Policy>,
pub discard: Vec<Policy>,
pub policies: HashMap<Policy, usize>, pub policies: HashMap<Policy, usize>,
pub president: Option<String>, pub president: Option<String>,
pub chancellor: Option<String>, pub chancellor: Option<String>,
@ -31,6 +32,7 @@ impl GameMaster {
lobby: Lobby::new(), lobby: Lobby::new(),
candidate_presidents: vec![], candidate_presidents: vec![],
deck: vec![], deck: vec![],
discard: vec![],
policies: HashMap::new(), policies: HashMap::new(),
president: None, president: None,
chancellor: None, chancellor: None,
@ -49,41 +51,6 @@ impl GameMaster {
self.run_game() self.run_game()
} }
pub fn run_game(&mut self) -> Result<GameEvent, Role> {
loop {
let ge = self.game_is_over()?;
self.room.send(ge.serialize());
let ge = self.game_election()?;
self.room.send(ge.serialize());
let ge = self.game_is_over()?;
self.room.send(ge.serialize());
let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() {
GameEventType::VoteFailed => self.game_policy_select_random(),
GameEventType::GameStop => self.game_is_over(),
_ => self.game_policy_select(),
}?;
self.room.send(p.serialize());
if p.mode() != GameEventType::PolicySet {
error!("unexpected game event type after election vote followup: {:?}", p);
return Err(Role::Null);
}
let params = p.params();
let param = params.first();
if param.is_none() {
error!("unexpected missing param on {:?}: {:?}", p, param);
return Err(Role::Null);
}
let param = param.unwrap();
let policy = Policy::from_string(param.to_string());
let ge = self.game_policy_veto(policy.clone())?;
self.room.send(ge.serialize());
let ge = self.game_ends_with(policy.clone())?;
self.room.send(ge.serialize());
let ge = self.game_policy_enact(policy.clone())?;
self.room.send(ge.serialize());
}
}
pub fn players(&self) -> Vec<String> { pub fn players(&self) -> Vec<String> {
let mut players = vec![]; let mut players = vec![];
for k in self.lobby.players.keys() { for k in self.lobby.players.keys() {

View File

@ -75,7 +75,7 @@ impl Room for MockRoom {
} }
fn send(&mut self, message: String) -> Result<String, &str> { fn send(&mut self, message: String) -> Result<String, &str> {
self.send_as(rands(), message) self.send_as(self.sender.clone(), message)
} }
fn room_id(&self) -> String { fn room_id(&self) -> String {