fix ghost players and next to act
authorGeoffrey Allott <geoffrey@allott.email>
Sat, 6 Mar 2021 08:18:43 +0000 (08:18 +0000)
committerGeoffrey Allott <geoffrey@allott.email>
Sat, 6 Mar 2021 13:32:09 +0000 (13:32 +0000)
src/game/poker/holdem.rs

index 568e7a535ee388df52c8ebab584836a8db7414ca..ba3dce0d84a7c2c1b7c65c185677ad901e041021 100644 (file)
@@ -138,7 +138,7 @@ impl TexasHoldEm {
     }
 
     fn player_is_all_in(&self, username: Username) -> bool {
-        self.in_hand.contains(&username) && matches!(self.stacks.get(&username), Some(&0) | None)
+        matches!(self.stacks.get(&username), Some(&0) | None)
     }
 
     fn bets_of_players_who_are_not_all_in(&self) -> impl Iterator<Item=u64> + '_ {
@@ -317,7 +317,7 @@ impl Game for TexasHoldEm {
                 self.community.clear();
                 self.receiver = self.seats.player_after(username);
                 self.active = None;
-                self.in_hand = self.seats.player_set();
+                self.in_hand = self.seats.player_set().into_iter().filter(|username| !self.ghosts.contains_key(username)).collect();
                 self.bets.clear();
                 self.committed.clear();
                 if self.pot != 0 {
@@ -1148,4 +1148,113 @@ mod tests {
 
         test_game(actions, settings, seed);
     }
+
+    #[test]
+    fn four_player_game_next_to_act_post_flop_after_knocked_out() {
+        let actions = r#"[
+            {"timestamp":1614983132049,"username":"geoff","action":{"action":"Join","seat":0,"chips":1000}},
+            {"timestamp":1614983137566,"username":"kat","action":{"action":"Join","seat":1,"chips":1000}},
+            {"timestamp":1614983142530,"username":"mack","action":{"action":"Join","seat":2,"chips":1000}},
+            {"timestamp":1614983151450,"username":"pete","action":{"action":"Join","seat":3,"chips":1000}},
+            {"timestamp":1614983151458,"username":"pete","action":{"action":"NextToDeal"}},
+            {"timestamp":1614983151466,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Spades"}}},
+            {"timestamp":1614983151473,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Clubs"}}},
+            {"timestamp":1614983151485,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Hearts"}}},
+            {"timestamp":1614983151500,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1614983151514,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Clubs"}}},
+            {"timestamp":1614983151523,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Spades"}}},
+            {"timestamp":1614983151532,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Spades"}}},
+            {"timestamp":1614983151545,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Hearts"}}},
+            {"timestamp":1614983151552,"username":"pete","action":{"action":"EndDeal"}},
+            {"timestamp":1614983151558,"username":"geoff","action":{"action":"PostBlind","chips":25}},
+            {"timestamp":1614983151567,"username":"kat","action":{"action":"PostBlind","chips":50}},
+            {"timestamp":1614983197919,"username":"mack","action":{"action":"Bet","chips":100}},
+            {"timestamp":1614983199720,"username":"pete","action":{"action":"Bet","chips":100}},
+            {"timestamp":1614983201040,"username":"geoff","action":{"action":"Bet","chips":75}},
+            {"timestamp":1614983204158,"username":"kat","action":{"action":"Bet","chips":100}},
+            {"timestamp":1614983206577,"username":"mack","action":{"action":"Bet","chips":50}},
+            {"timestamp":1614983208281,"username":"pete","action":{"action":"Bet","chips":50}},
+            {"timestamp":1614983209310,"username":"geoff","action":{"action":"Bet","chips":50}},
+            {"timestamp":1614983209317,"username":"pete","action":{"action":"CommunityCard","card":{"rank":"Ten","suit":"Diamonds"}}},
+            {"timestamp":1614983209325,"username":"pete","action":{"action":"CommunityCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1614983209335,"username":"pete","action":{"action":"CommunityCard","card":{"rank":"Five","suit":"Hearts"}}},
+            {"timestamp":1614983218313,"username":"geoff","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983219292,"username":"kat","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983222154,"username":"mack","action":{"action":"Bet","chips":200}},
+            {"timestamp":1614983228929,"username":"pete","action":{"action":"Fold"}},
+            {"timestamp":1614983231894,"username":"geoff","action":{"action":"Bet","chips":200}},
+            {"timestamp":1614983234042,"username":"kat","action":{"action":"Bet","chips":200}},
+            {"timestamp":1614983234050,"username":"pete","action":{"action":"CommunityCard","card":{"rank":"Ten","suit":"Spades"}}},
+            {"timestamp":1614983240053,"username":"geoff","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983241193,"username":"kat","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983245410,"username":"mack","action":{"action":"Bet","chips":250}},
+            {"timestamp":1614983250973,"username":"geoff","action":{"action":"Fold"}},
+            {"timestamp":1614983252204,"username":"kat","action":{"action":"Bet","chips":250}},
+            {"timestamp":1614983252210,"username":"pete","action":{"action":"CommunityCard","card":{"rank":"Seven","suit":"Hearts"}}},
+            {"timestamp":1614983258503,"username":"kat","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983261826,"username":"mack","action":{"action":"Bet","chips":400}},
+            {"timestamp":1614983263390,"username":"kat","action":{"action":"Bet","chips":400}},
+            {"timestamp":1614983263398,"username":"mack","action":{"action":"WinHand","chips":2500,"hand":"Straight, J High"}},
+            {"timestamp":1614983263405,"username":"kat","action":{"action":"KnockedOut"}},
+            {"timestamp":1614983263412,"username":"geoff","action":{"action":"NextToDeal"}},
+            {"timestamp":1614983263419,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Clubs"}}},
+            {"timestamp":1614983263428,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Hearts"}}},
+            {"timestamp":1614983263435,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Clubs"}}},
+            {"timestamp":1614983263443,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Clubs"}}},
+            {"timestamp":1614983263450,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1614983263459,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Diamonds"}}},
+            {"timestamp":1614983263465,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Hearts"}}},
+            {"timestamp":1614983263475,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1614983263482,"username":"geoff","action":{"action":"EndDeal"}},
+            {"timestamp":1614983263491,"username":"kat","action":{"action":"PostBlind","chips":0}},
+            {"timestamp":1614983263502,"username":"mack","action":{"action":"PostBlind","chips":50}},
+            {"timestamp":1614983275207,"username":"pete","action":{"action":"Bet","chips":50}},
+            {"timestamp":1614983277953,"username":"geoff","action":{"action":"Bet","chips":50}},
+            {"timestamp":1614983281204,"username":"mack","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983281211,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Eight","suit":"Spades"}}},
+            {"timestamp":1614983281219,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Five","suit":"Diamonds"}}},
+            {"timestamp":1614983281227,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"King","suit":"Diamonds"}}},
+            {"timestamp":1614983286335,"username":"mack","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983287681,"username":"pete","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983292106,"username":"geoff","action":{"action":"Bet","chips":200}},
+            {"timestamp":1614983293844,"username":"mack","action":{"action":"Bet","chips":200}},
+            {"timestamp":1614983295211,"username":"pete","action":{"action":"Fold"}},
+            {"timestamp":1614983295217,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Jack","suit":"Diamonds"}}},
+            {"timestamp":1614983300431,"username":"mack","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983301319,"username":"geoff","action":{"action":"Bet","chips":0}},
+            {"timestamp":1614983301327,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Five","suit":"Spades"}}},
+            {"timestamp":1614983308234,"username":"mack","action":{"action":"Bet","chips":250}},
+            {"timestamp":1614983309575,"username":"geoff","action":{"action":"Bet","chips":250}},
+            {"timestamp":1614983309584,"username":"geoff","action":{"action":"WinHand","chips":1050,"hand":"Two Pair, 8s & 5s, K Kicker"}},
+            {"timestamp":1614983309592,"username":"kat","action":{"action":"KnockedOut"}},
+            {"timestamp":1614983309599,"username":"kat","action":{"action":"NextToDeal"}},
+            {"timestamp":1614983309619,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Spades"}}},
+            {"timestamp":1614983309642,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Clubs"}}},
+            {"timestamp":1614983309651,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Clubs"}}},
+            {"timestamp":1614983309660,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Hearts"}}},
+            {"timestamp":1614983309673,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1614983309683,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1614983309691,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Hearts"}}},
+            {"timestamp":1614983309699,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Clubs"}}},
+            {"timestamp":1614983309707,"username":"kat","action":{"action":"EndDeal"}},
+            {"timestamp":1614983309712,"username":"mack","action":{"action":"PostBlind","chips":25}},
+            {"timestamp":1614983309720,"username":"pete","action":{"action":"PostBlind","chips":50}},
+            {"timestamp":1614983320450,"username":"geoff","action":{"action":"Bet","chips":900}},
+            {"timestamp":1614983322843,"username":"mack","action":{"action":"Bet","chips":875}},
+            {"timestamp":1614983324378,"username":"pete","action":{"action":"Fold"}},
+            {"timestamp":1614983324386,"username":"kat","action":{"action":"CommunityCard","card":{"rank":"Nine","suit":"Diamonds"}}},
+            {"timestamp":1614983324395,"username":"kat","action":{"action":"CommunityCard","card":{"rank":"Six","suit":"Spades"}}},
+            {"timestamp":1614983324402,"username":"kat","action":{"action":"CommunityCard","card":{"rank":"Eight","suit":"Hearts"}}},
+            {"timestamp":1614983328902,"username":"mack","action":{"action":"Bet","chips":0}}
+        ]"#;
+        let actions = serde_json::from_str(actions).unwrap();
+
+        let settings = r#"{"format":"TexasHoldEm","title":"4-Player TexasHoldEm Test","max_players":4,"small_blind":25,"starting_stack":1000,"action_timeout":null}"#;
+        let settings = serde_json::from_str(settings).unwrap();
+
+        let seed = r#"{"rng":"ChaCha20","seed":"092b99f45313fff167029dc7420ed69a92becae492e09b65bc06ddcaae3c9e9c"}"#;
+        let seed = serde_json::from_str(seed).unwrap();
+
+        test_game(actions, settings, seed);
+    }
 }