From 8f72f1dcdf2309484b1c5e933984bb6215c14999 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Fri, 23 Dec 2022 19:08:47 -0500 Subject: Enforce following suit in card play --- protocol/src/bridge_engine.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/protocol/src/bridge_engine.rs b/protocol/src/bridge_engine.rs index 0c583f3..70dcda4 100644 --- a/protocol/src/bridge_engine.rs +++ b/protocol/src/bridge_engine.rs @@ -198,6 +198,12 @@ impl DealInPlay { let player = self.current_player(); let player_cards = player.get_cards_mut(&mut self.deal); + if let Some(suit) = self.in_progress.suit() { + if card.suit() != suit && player_cards.iter().find(|c| c.suit() == suit).is_some() { + return Err(anyhow!("Must follow {suit} suit")); + } + } + info!( "Next player is {:?}, playing card {} from {:?}", player, card, player_cards @@ -1188,7 +1194,7 @@ mod tests { west: mkcards("♢A ♡Q"), north: mkcards("♢Q ♡9"), east: mkcards("♢7 ♡K"), - south: mkcards("♢9 ♠9"), + south: mkcards("♥10 ♠9"), } } @@ -1332,16 +1338,20 @@ mod tests { let deal = as_playing_hand(deal.play(mkcard("♢A")).unwrap()); assert_eq!(deal.in_progress.trick.cards_played, vec!(mkcard("♢A"))); + { + let err = deal.clone().play(mkcard("♡9")).unwrap_err().to_string(); + assert_eq!(err, "Must follow ♢ suit"); + } let deal = as_playing_hand(deal.play(mkcard("♢Q")).unwrap()); - let deal = as_playing_hand(deal.play(mkcard("♥K")).unwrap()); - let deal = as_playing_hand(deal.play(mkcard("♢9")).unwrap()); + let deal = as_playing_hand(deal.play(mkcard("♢7")).unwrap()); + let deal = as_playing_hand(deal.play(mkcard("♡10")).unwrap()); assert_eq!(deal.in_progress.trick.cards_played, []); assert_eq!( deal.tricks_played, vec!(Trick { leader: Player::West, - cards_played: mkcards("♢A ♢Q ♡K ♢9"), + cards_played: mkcards("♢A ♢Q ♢7 ♡10"), }) ); } -- cgit v1.2.3