public bool SetAdditionalWeddingPlayer(TablePlayer[] players, int stitchWinnerId) { var additionPlayer = players.Count(player => player.PlayerId == stitchWinnerId && player.GameVariant != GamesVariants.Wedding) == 1; if (GameVariant == GamesVariants.Wedding && additionPlayer && AdditionalWeddingPlayerId < 0) { if (WeddingWithFirstColorCast && StitchCounter < 2) { var leftOfGiverPlayer = players.FirstOrDefault((player) => GetLeftOfGiversPosition() == player.PlayerPosition); if (leftOfGiverPlayer != null && CardPointsUtil.IsColorPlayed(this, leftOfGiverPlayer.GetPlayedCard())) { AdditionalWeddingPlayerId = stitchWinnerId; return(true); } } else if (!WeddingWithFirstColorCast) { AdditionalWeddingPlayerId = stitchWinnerId; return(true); } else { GameVariant = GamesVariants.Solo; } } return(false); }
public bool SetGameVariant(int playerId, GamesVariants variant) { if (variant == GamesVariants.None) { return(false); } var tablePlayer = GettablePlayerOfId(playerId); if (tablePlayer != null && tablePlayer.GameVariant == GamesVariants.None) { // change the variant of the player tablePlayer.GameVariant = variant; tablePlayer.NextTurn = true; _context.TablePlayer.Update(tablePlayer); _context.SaveChanges(); // check if all players has set game variant and set the table variant with status var tablePlayers = GetPlayersOfTable(tablePlayer.TableId); var playerSetVariantCount = tablePlayers.Count((player) => player.GameVariant != GamesVariants.None); if (playerSetVariantCount == 4) { PlayTable table = GetTableById(tablePlayer.TableId); table.GameVariant = CardPointsUtil.WhichVariantIsPlayed(tablePlayers); if (table.GameVariant == GamesVariants.Normal) { table.SilentForPlayer = CardPointsUtil.SilentPlayer(tablePlayers); } table.Status = PlayStatus.Run; _context.Update(table); _context.SaveChanges(); } OnTableChanged(tablePlayer.TableId); return(true); } return(false); }
public void NextTurn(int playerId) { var nextTurnCountA = _context.TablePlayer.Count(tp => tp.NextTurn); var tablePlayer = GettablePlayerOfId(playerId); // if a player set his next step, do nothing. if (tablePlayer != null && tablePlayer.NextTurn == false) { var nextStepValueSet = tablePlayer.NextTurn; tablePlayer.NextTurn = true; _context.TablePlayer.Update(tablePlayer); _context.SaveChanges(); var tableId = tablePlayer.TableId; var nextTurnCountB = _context.TablePlayer.Count(tp => tp.NextTurn); if (nextTurnCountA == nextTurnCountB || nextTurnCountB <= 1) { nextTurnCountB = _context.TablePlayer.Count(tp => tp.NextTurn); } // only if all players have set the next step and this player's next step was not set, then the next step can be executed. if (nextTurnCountB >= 4 && nextStepValueSet == false) { var newRound = _context.PlayTables.Count((pt) => pt.Id == tablePlayer.TableId && pt.Status == PlayStatus.WinnersTime) == 1; if (newRound) { // after seen all the winner state setup a new round StartNewRound(tableId); } else { var tablePlayers = GetPlayersOfTable(tablePlayer.TableId); var playedRoundCards = tablePlayers.Select((tp) => new PlayCard(tp)).ToArray(); var table = _context.PlayTables.FirstOrDefault(pt => pt.Id == tablePlayer.TableId); table.SetLastCardSet(playedRoundCards.Select((prc) => prc.Card).ToArray()); int stitchWinnerId = CardPointsUtil.WhoWinCardRound(playedRoundCards, table, tablePlayers); // var stitchWinner = tablePlayers.FirstOrDefault((tp) => tp.PlayerId == stitchWinnerId); table.SetAdditionalWeddingPlayer(tablePlayers, stitchWinnerId); foreach (var player in tablePlayers) { player.ClearForNextTurn(); if (player.PlayerId == stitchWinnerId) { player.RoundsPoints += CardPointsUtil.CardPoints(playedRoundCards); table.CurrentPlayerPosition = player.PlayerPosition; } } _context.TablePlayer.UpdateRange(tablePlayers); table.StitchCounter++; // if the round is over if (table.StitchCounter >= 12 || (!table.WithNiner && table.StitchCounter >= 10) || tablePlayers.All((player) => player.AnyCards())) { TableUtil.SetWinners(tablePlayers, table); table.Status = PlayStatus.WinnersTime; _context.TablePlayer.UpdateRange(tablePlayers); } else { table.Status = PlayStatus.Run; } _context.PlayTables.Update(table); _context.SaveChanges(); OnTableChanged(table.Id); } } else { OnTableChanged(tableId); } } }