From: Geoffrey Allott Date: Thu, 4 Mar 2021 18:23:45 +0000 (+0000) Subject: fix detection of round completion when players are all-in X-Git-Url: https://git.pointlesshacks.com/?a=commitdiff_plain;h=242fdb75c85f9134dbb9b6b20ac7ea738896a8e2;p=pokerwave.git fix detection of round completion when players are all-in --- diff --git a/src/game/poker/holdem.rs b/src/game/poker/holdem.rs index 139f82e..9814972 100644 --- a/src/game/poker/holdem.rs +++ b/src/game/poker/holdem.rs @@ -171,6 +171,7 @@ impl TexasHoldEm { } } self.all_bets_are_in() && self.all_bets_are_equal() + || self.players_able_to_bet() <= 1 && self.bets.len() == 0 } } @@ -349,7 +350,11 @@ impl Game for TexasHoldEm { self.community.insert(card); self.deck.remove(&card); if self.community.len() == 3 { - self.active = self.seats.player_after_where(username, |username| self.is_able_to_bet(username)); + self.active = if self.betting_round_completed() { + None + } else { + self.seats.player_after_where(username, |username| self.is_able_to_bet(username)) + }; self.state = match self.active { Some(_) => State::PostFlopBetting, None => State::DealingTurn, @@ -360,7 +365,11 @@ impl Game for TexasHoldEm { (State::DealingTurn, Action::CommunityCard{card}) => { self.community.insert(card); self.deck.remove(&card); - self.active = self.seats.player_after_where(username, |username| self.is_able_to_bet(username)); + self.active = if self.betting_round_completed() { + None + } else { + self.seats.player_after_where(username, |username| self.is_able_to_bet(username)) + }; self.state = match self.active { Some(_) => State::TurnBetting, None => State::DealingRiver, @@ -370,7 +379,11 @@ impl Game for TexasHoldEm { (State::DealingRiver, Action::CommunityCard{card}) => { self.community.insert(card); self.deck.remove(&card); - self.active = self.seats.player_after_where(username, |username| self.is_able_to_bet(username)); + self.active = if self.betting_round_completed() { + None + } else { + self.seats.player_after_where(username, |username| self.is_able_to_bet(username)) + }; self.state = match self.active { Some(_) => State::RiverBetting, None => State::Showdown, @@ -842,4 +855,50 @@ mod tests { test_game(actions, settings, seed); } + + #[test] + fn deals_cards_to_completion_when_all_in() { + let actions = r#"[ + {"timestamp":1614881204492,"username":"geoff","action":{"action":"Join","seat":0,"chips":1000}}, + {"timestamp":1614881208123,"username":"kat","action":{"action":"Join","seat":1,"chips":1000}}, + {"timestamp":1614881208131,"username":"kat","action":{"action":"NextToDeal"}}, + {"timestamp":1614881208139,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Diamonds"}}}, + {"timestamp":1614881208147,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Diamonds"}}}, + {"timestamp":1614881208163,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Hearts"}}}, + {"timestamp":1614881208185,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Clubs"}}}, + {"timestamp":1614881208201,"username":"kat","action":{"action":"EndDeal"}}, + {"timestamp":1614881208214,"username":"kat","action":{"action":"PostBlind","chips":100}}, + {"timestamp":1614881208222,"username":"geoff","action":{"action":"PostBlind","chips":200}}, + {"timestamp":1614881226321,"username":"kat","action":{"action":"Bet","chips":300}}, + {"timestamp":1614881227926,"username":"geoff","action":{"action":"Fold"}}, + {"timestamp":1614881227932,"username":"kat","action":{"action":"WinHand","chips":600,"hand":null}}, + {"timestamp":1614881227938,"username":"geoff","action":{"action":"NextToDeal"}}, + {"timestamp":1614881227944,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Diamonds"}}}, + {"timestamp":1614881227949,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Clubs"}}}, + {"timestamp":1614881227957,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Diamonds"}}}, + {"timestamp":1614881227969,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}}, + {"timestamp":1614881227980,"username":"geoff","action":{"action":"EndDeal"}}, + {"timestamp":1614881227991,"username":"geoff","action":{"action":"PostBlind","chips":100}}, + {"timestamp":1614881228000,"username":"kat","action":{"action":"PostBlind","chips":200}}, + {"timestamp":1614881234665,"username":"geoff","action":{"action":"Bet","chips":700}}, + {"timestamp":1614881236125,"username":"kat","action":{"action":"Bet","chips":600}}, + {"timestamp":1614881236132,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Ace","suit":"Clubs"}}}, + {"timestamp":1614881236136,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Eight","suit":"Spades"}}}, + {"timestamp":1614881236141,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Jack","suit":"Clubs"}}}, + {"timestamp":1614881241470,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Seven","suit":"Clubs"}}}, + {"timestamp":1614881244838,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Five","suit":"Spades"}}}, + {"timestamp":1614881247469,"username":"kat","action":{"action":"WinHand","chips":1600,"hand":"Two Pair, As & Js, 8 Kicker"}}, + {"timestamp":1614881247477,"username":"geoff","action":{"action":"KnockedOut"}}, + {"timestamp":1614881247480,"username":"kat","action":{"action":"WinGame"}} + ]"#; + let actions = serde_json::from_str(actions).unwrap(); + + let settings = r#"{"title":"2-Player TexasHoldEm Test","max_players":2,"small_blind":100,"starting_stack":1000,"action_timeout":null}"#; + let settings = serde_json::from_str(settings).unwrap(); + + let seed = r#"{"rng":"ChaCha20","seed":"8de0ac3be302e26cbc0a371044c8b349107108abb1f94a10fe84ba04a59d7f31"}"#; + let seed = serde_json::from_str(seed).unwrap(); + + test_game(actions, settings, seed); + } }