use crate::username::Username;
use crate::util::{max::IteratorMaxItems, timestamp::Timestamp};
-use super::super::{Action, ActionError, DealerAction, Game, UserAction, ValidatedUserAction};
+use super::super::{Action, ActionError, DealerAction, Game, StartCondition, UserAction, ValidatedUserAction};
use super::classify::rank_7_card_hand;
round_length: Option<i64>,
tournament_length: Option<i64>,
action_timeout: Option<i64>,
+ #[serde(default)]
+ start_time: StartCondition,
}
impl TexasHoldEmSettings {
let mut rng = self.rng.clone();
match self.state {
State::NotStarted => {
- if self.seats.players_len() == self.settings.max_players as usize {
- // TODO
- if let Some(username) = rng.choose_from(self.seats.player_set()) {
- return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
+ match self.settings.start_time {
+ StartCondition::WhenFull => {
+ if self.seats.players_len() == self.settings.max_players as usize {
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
+ }
+ }
+ DealerAction::WaitForPlayer
+ }
+ StartCondition::AtTime(start_time) => {
+ if timestamp >= start_time && self.seats.players_len() >= 2 {
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
+ }
+ }
+ DealerAction::WaitUntil(start_time)
}
}
- DealerAction::WaitForPlayer
}
State::Dealing => {
if let Some(username) = self.receiver {
round_length: None,
tournament_length: None,
action_timeout: None,
+ start_time: StartCondition::WhenFull,
};
assert_eq!(50, settings.level(0).small_blind);
round_length: Some(20 * 60 * 1000),
tournament_length: Some(4 * 60 * 60 * 1000),
action_timeout: None,
+ start_time: StartCondition::WhenFull,
};
assert_eq!(25, settings.level(0).small_blind);
use crate::username::Username;
use crate::util::{max::IteratorMaxItems, timestamp::Timestamp};
-use super::{Action, ActionError, DealerAction, Game, UserAction, ValidatedUserAction};
+use super::{Action, ActionError, DealerAction, Game, StartCondition, UserAction, ValidatedUserAction};
#[derive(Copy, Clone, Debug)]
enum State {
pub struct KnockOutWhistSettings {
title: String,
max_players: u32,
+ #[serde(default)]
+ start_time: StartCondition,
}
impl KnockOutWhistSettings {
let mut rng = self.rng.clone();
match self.state {
State::NotStarted => {
- if self.seats.players_len() == self.settings.max_players as usize {
- // TODO
- if let Some(username) = rng.choose_from(self.seats.player_set()) {
- return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
+ match self.settings.start_time {
+ StartCondition::WhenFull => {
+ if self.seats.players_len() == self.settings.max_players as usize {
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
+ }
+ }
+ DealerAction::WaitForPlayer
+ }
+ StartCondition::AtTime(start_time) => {
+ if timestamp >= start_time && self.seats.players_len() >= 2 {
+ if let Some(username) = rng.choose_from(self.seats.player_set()) {
+ return DealerAction::TakeAction(ValidatedUserAction(UserAction { timestamp, username, action: Action::NextToDeal }));
+ }
+ }
+ DealerAction::WaitUntil(start_time)
}
}
- DealerAction::WaitForPlayer
}
State::Dealing => {
if let Some(username) = self.receiver {
}
}
+ #[test]
+ fn start_game_at_time() {
+ let actions = r#"[
+ {"timestamp":1616272415014,"username":"geoff","action":{"action":"Join","seat":0,"chips":0}},
+ {"timestamp":1616272415018,"username":"kat","action":{"action":"Join","seat":1,"chips":0}},
+ {"timestamp":1616280000000,"username":"geoff","action":{"action":"NextToDeal"}}
+ ]"#;
+ let actions = serde_json::from_str(actions).unwrap();
+
+ let settings = r#"{"format":"KnockOutWhist","title":"2-Player Knock-Out Whist Test","max_players":4,"start_time":1616280000000}"#;
+ let settings = serde_json::from_str(settings).unwrap();
+
+ let seed = r#"{"rng":"ChaCha20","seed":"0bc81b871dca272486f7c848a3c84102f501e934aaf87b311fc21e65327bf1f4"}"#;
+ let seed = serde_json::from_str(seed).unwrap();
+
+ test_game(actions, settings, seed);
+ }
+
#[test]
fn complete_2_player_knock_out_whist() {
let actions = r#"[