private PlayAction PlayCard(IPlayer player, Contract contract, IList<Card> currentTrickCards)
{
// Prepare played cards and allowed cards
var currentPlayerCards = this.playerCards[(int)this.game[player]];
var allowedCards = new CardsCollection(currentPlayerCards.GetAllowedCards(contract, currentTrickCards));
// Play card
var playAction = player.PlayCard(allowedCards.ToList(), currentTrickCards.ToList());
// Check for invalid card
if (!allowedCards.Contains(playAction.Card))
{
throw new InvalidPlayerActionException(player, string.Format("Invalid card: {0}", playAction.Card));
}
// Save belote to team points
playAction.Belote = false;
if (playAction.AnnounceBeloteIfAvailable && currentPlayerCards.IsBeloteAllowed(contract, currentTrickCards, playAction.Card))
{
switch (this.game[player])
{
case PlayerPosition.South:
this.southNorthBelotes++;
break;
case PlayerPosition.East:
this.eastWestBelotes++;
break;
case PlayerPosition.North:
this.southNorthBelotes++;
break;
case PlayerPosition.West:
this.eastWestBelotes++;
break;
}
playAction.Belote = true;
}
// Remove played card from the players cards
this.playerCards[(int)this.game[player]].Remove(playAction.Card);
return playAction;
}