From: Geoffrey Allott Date: Tue, 16 Mar 2021 20:25:27 +0000 (+0000) Subject: fix last round of knock-out whist X-Git-Url: https://git.pointlesshacks.com/?a=commitdiff_plain;h=e0843aaa33cc17ae71665a9a55010aeef5faf78c;p=pokerwave.git fix last round of knock-out whist --- diff --git a/src/game/whist.rs b/src/game/whist.rs index a383953..86c7032 100644 --- a/src/game/whist.rs +++ b/src/game/whist.rs @@ -99,6 +99,10 @@ impl KnockOutWhist { fn cards_by_player(&self) -> impl Iterator + '_ { self.hands.iter().map(|(username, hand)| hand.iter().map(move |card| (*username, *card))).flatten() } + + fn all_hands_dealt(&self) -> bool { + self.hands.values().all(|hand| hand.len() == self.cards_to_deal as usize) && self.seats.players_len() == self.hands.len() + } } impl Game for KnockOutWhist { @@ -185,7 +189,7 @@ impl Game for KnockOutWhist { (State::Dealing, Action::ReceiveCard { card: Some(card) }) => { self.deck.remove(&card); self.hands.entry(username).or_default().insert(card); - if self.hands.values().all(|hand| hand.len() == self.cards_to_deal as usize) { + if self.all_hands_dealt() { self.receiver = None; } else { self.receiver = self.receiver.and_then(|player| self.seats.player_after(player)); @@ -568,4 +572,194 @@ mod tests { test_game(actions, settings, seed); } + + #[test] + fn both_players_get_dealt_cards_in_last_round() { + let actions = r#"[ + {"timestamp":1615925105601,"username":"kat","action":{"action":"Join","seat":0,"chips":0}}, + {"timestamp":1615925110622,"username":"geoff","action":{"action":"Join","seat":1,"chips":0}}, + {"timestamp":1615925110625,"username":"geoff","action":{"action":"NextToDeal"}}, + {"timestamp":1615925110627,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Spades"}}}, + {"timestamp":1615925110629,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Clubs"}}}, + {"timestamp":1615925110631,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Clubs"}}}, + {"timestamp":1615925110633,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Diamonds"}}}, + {"timestamp":1615925110635,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Spades"}}}, + {"timestamp":1615925110637,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Diamonds"}}}, + {"timestamp":1615925110639,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Spades"}}}, + {"timestamp":1615925110640,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Clubs"}}}, + {"timestamp":1615925110642,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Diamonds"}}}, + {"timestamp":1615925110644,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Clubs"}}}, + {"timestamp":1615925110646,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Hearts"}}}, + {"timestamp":1615925110648,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925110650,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Hearts"}}}, + {"timestamp":1615925110652,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Spades"}}}, + {"timestamp":1615925110653,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Jack","suit":"Hearts"}}}, + {"timestamp":1615925110655,"username":"geoff","action":{"action":"EndDeal"}}, + {"timestamp":1615925129308,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Spades"}}}, + {"timestamp":1615925132220,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Spades"}}}, + {"timestamp":1615925132223,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925139061,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Hearts"}}}, + {"timestamp":1615925140230,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925140233,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925144240,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Hearts"}}}, + {"timestamp":1615925145800,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Clubs"}}}, + {"timestamp":1615925145803,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925147230,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Clubs"}}}, + {"timestamp":1615925148866,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Clubs"}}}, + {"timestamp":1615925148868,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925150792,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Three","suit":"Spades"}}}, + {"timestamp":1615925152406,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Diamonds"}}}, + {"timestamp":1615925152409,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925153695,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Spades"}}}, + {"timestamp":1615925155260,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Clubs"}}}, + {"timestamp":1615925155263,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925156221,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Diamonds"}}}, + {"timestamp":1615925157007,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Diamonds"}}}, + {"timestamp":1615925157010,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925157012,"username":"kat","action":{"action":"WinCall"}}, + {"timestamp":1615925157013,"username":"kat","action":{"action":"NextToDeal"}}, + {"timestamp":1615925157015,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Diamonds"}}}, + {"timestamp":1615925157017,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Clubs"}}}, + {"timestamp":1615925157019,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Spades"}}}, + {"timestamp":1615925157022,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Diamonds"}}}, + {"timestamp":1615925157024,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Diamonds"}}}, + {"timestamp":1615925157026,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925157027,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Spades"}}}, + {"timestamp":1615925157030,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Hearts"}}}, + {"timestamp":1615925157031,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Diamonds"}}}, + {"timestamp":1615925157034,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Diamonds"}}}, + {"timestamp":1615925157036,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Spades"}}}, + {"timestamp":1615925157038,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Spades"}}}, + {"timestamp":1615925157040,"username":"kat","action":{"action":"EndDeal"}}, + {"timestamp":1615925173066,"username":"kat","action":{"action":"ChooseTrumps","suit":"Diamonds"}}, + {"timestamp":1615925177864,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Spades"}}}, + {"timestamp":1615925179503,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Spades"}}}, + {"timestamp":1615925179506,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925185729,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Spades"}}}, + {"timestamp":1615925187617,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Diamonds"}}}, + {"timestamp":1615925187621,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925188218,"username":"kat","action":{"action":"PlayCard","card":{"rank":"King","suit":"Diamonds"}}}, + {"timestamp":1615925190134,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Diamonds"}}}, + {"timestamp":1615925190137,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925192652,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925194196,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Diamonds"}}}, + {"timestamp":1615925194198,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925194703,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Diamonds"}}}, + {"timestamp":1615925196373,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Three","suit":"Clubs"}}}, + {"timestamp":1615925196375,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925197387,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Spades"}}}, + {"timestamp":1615925198533,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Hearts"}}}, + {"timestamp":1615925198535,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925198536,"username":"geoff","action":{"action":"WinCall"}}, + {"timestamp":1615925198538,"username":"geoff","action":{"action":"NextToDeal"}}, + {"timestamp":1615925198539,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Clubs"}}}, + {"timestamp":1615925198541,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Diamonds"}}}, + {"timestamp":1615925198543,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Spades"}}}, + {"timestamp":1615925198545,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Clubs"}}}, + {"timestamp":1615925198547,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Clubs"}}}, + {"timestamp":1615925198549,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Spades"}}}, + {"timestamp":1615925198550,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925198552,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Diamonds"}}}, + {"timestamp":1615925198554,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Hearts"}}}, + {"timestamp":1615925198556,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Diamonds"}}}, + {"timestamp":1615925198557,"username":"geoff","action":{"action":"EndDeal"}}, + {"timestamp":1615925204006,"username":"geoff","action":{"action":"ChooseTrumps","suit":"Diamonds"}}, + {"timestamp":1615925206551,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Spades"}}}, + {"timestamp":1615925208687,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Spades"}}}, + {"timestamp":1615925208690,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925211265,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Clubs"}}}, + {"timestamp":1615925212326,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Clubs"}}}, + {"timestamp":1615925212329,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925213392,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Hearts"}}}, + {"timestamp":1615925214444,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Diamonds"}}}, + {"timestamp":1615925214447,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925215433,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Diamonds"}}}, + {"timestamp":1615925216267,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Clubs"}}}, + {"timestamp":1615925216269,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925217294,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"King","suit":"Diamonds"}}}, + {"timestamp":1615925218272,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925218275,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925218276,"username":"geoff","action":{"action":"WinCall"}}, + {"timestamp":1615925218278,"username":"kat","action":{"action":"NextToDeal"}}, + {"timestamp":1615925218279,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Diamonds"}}}, + {"timestamp":1615925218281,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Hearts"}}}, + {"timestamp":1615925218283,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Hearts"}}}, + {"timestamp":1615925218284,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Spades"}}}, + {"timestamp":1615925218286,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Spades"}}}, + {"timestamp":1615925218287,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Clubs"}}}, + {"timestamp":1615925218288,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}}, + {"timestamp":1615925218290,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Spades"}}}, + {"timestamp":1615925218292,"username":"kat","action":{"action":"EndDeal"}}, + {"timestamp":1615925222455,"username":"geoff","action":{"action":"ChooseTrumps","suit":"Diamonds"}}, + {"timestamp":1615925226057,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Hearts"}}}, + {"timestamp":1615925227339,"username":"kat","action":{"action":"PlayCard","card":{"rank":"King","suit":"Hearts"}}}, + {"timestamp":1615925227342,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925228276,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Spades"}}}, + {"timestamp":1615925229444,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Spades"}}}, + {"timestamp":1615925229447,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925230355,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Clubs"}}}, + {"timestamp":1615925231155,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Diamonds"}}}, + {"timestamp":1615925231158,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925234913,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Diamonds"}}}, + {"timestamp":1615925235946,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Spades"}}}, + {"timestamp":1615925235949,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925235951,"username":"geoff","action":{"action":"RevealCard","card":{"rank":"Jack","suit":"Diamonds"}}}, + {"timestamp":1615925235953,"username":"kat","action":{"action":"RevealCard","card":{"rank":"Six","suit":"Diamonds"}}}, + {"timestamp":1615925235955,"username":"geoff","action":{"action":"WinCall"}}, + {"timestamp":1615925235956,"username":"geoff","action":{"action":"NextToDeal"}}, + {"timestamp":1615925235958,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Diamonds"}}}, + {"timestamp":1615925235960,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Hearts"}}}, + {"timestamp":1615925235962,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Spades"}}}, + {"timestamp":1615925235963,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}}, + {"timestamp":1615925235965,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Clubs"}}}, + {"timestamp":1615925235967,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Diamonds"}}}, + {"timestamp":1615925235968,"username":"geoff","action":{"action":"EndDeal"}}, + {"timestamp":1615925258442,"username":"geoff","action":{"action":"ChooseTrumps","suit":"Diamonds"}}, + {"timestamp":1615925260577,"username":"kat","action":{"action":"PlayCard","card":{"rank":"King","suit":"Clubs"}}}, + {"timestamp":1615925262207,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Diamonds"}}}, + {"timestamp":1615925262209,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925263408,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Diamonds"}}}, + {"timestamp":1615925264130,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Diamonds"}}}, + {"timestamp":1615925264133,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925264660,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Spades"}}}, + {"timestamp":1615925265416,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Hearts"}}}, + {"timestamp":1615925265419,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925265420,"username":"kat","action":{"action":"WinCall"}}, + {"timestamp":1615925265422,"username":"kat","action":{"action":"NextToDeal"}}, + {"timestamp":1615925265423,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Diamonds"}}}, + {"timestamp":1615925265425,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Diamonds"}}}, + {"timestamp":1615925265426,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Diamonds"}}}, + {"timestamp":1615925265428,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Clubs"}}}, + {"timestamp":1615925265429,"username":"kat","action":{"action":"EndDeal"}}, + {"timestamp":1615925268602,"username":"kat","action":{"action":"ChooseTrumps","suit":"Clubs"}}, + {"timestamp":1615925270715,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Diamonds"}}}, + {"timestamp":1615925272007,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Diamonds"}}}, + {"timestamp":1615925272010,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925273054,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"King","suit":"Diamonds"}}}, + {"timestamp":1615925273976,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Clubs"}}}, + {"timestamp":1615925273979,"username":"kat","action":{"action":"WinTrick"}}, + {"timestamp":1615925273980,"username":"geoff","action":{"action":"RevealCard","card":{"rank":"Queen","suit":"Spades"}}}, + {"timestamp":1615925273983,"username":"kat","action":{"action":"RevealCard","card":{"rank":"Eight","suit":"Hearts"}}}, + {"timestamp":1615925273984,"username":"geoff","action":{"action":"WinCall"}}, + {"timestamp":1615925273986,"username":"geoff","action":{"action":"NextToDeal"}}, + {"timestamp":1615925273987,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Spades"}}}, + {"timestamp":1615925273988,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}}, + {"timestamp":1615925273989,"username":"geoff","action":{"action":"EndDeal"}}, + {"timestamp":1615925296989,"username":"geoff","action":{"action":"ChooseTrumps","suit":"Diamonds"}}, + {"timestamp":1615925298327,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Spades"}}}, + {"timestamp":1615925298327,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Diamonds"}}}, + {"timestamp":1615925299327,"username":"geoff","action":{"action":"WinTrick"}}, + {"timestamp":1615925299527,"username":"kat","action":{"action":"KnockedOut"}}, + {"timestamp":1615925300327,"username":"geoff","action":{"action":"WinGame"}} + ]"#; + let actions = serde_json::from_str(actions).unwrap(); + + let settings = r#"{"format":"KnockOutWhist","title":"Zesty Diversion","max_players":2}"#; + let settings = serde_json::from_str(settings).unwrap(); + + let seed = r#"{"rng":"ChaCha20","seed":"0fb90c54f1e742d4e7602bb81024779b38110ae95c0e572ecc451347cc48a9ec"}"#; + let seed = serde_json::from_str(seed).unwrap(); + + test_game(actions, settings, seed); + } }