public GameInfo OpenGame(Rules rules = null, string gameName = "Game", string team1Name = "Team1", string team2Name = "Team2") { rules = rules ?? new Rules(); Log.Verbose($"{this}: OpenGame({rules}, {gameName}, {team1Name}, {team2Name})"); if (gameName == null || team1Name == null || team2Name == null) { return(null); } var playerGroupInfo = new PlayerGroupInfo { Team1 = new TeamInfo { TeamName = team1Name, TeamId = Guid.NewGuid().ToString() }, Team2 = new TeamInfo { TeamName = team2Name, TeamId = Guid.NewGuid().ToString() } }; var gameInfo = new GameInfo { GameName = gameName, GameId = Guid.NewGuid().ToString(), Rules = rules, PlayerGroupInfo = playerGroupInfo }; _gameServiceDictionary[gameInfo.GameId] = new GameService(gameInfo); return((GameInfo)gameInfo?.Clone()); }
private void UpdatePlayers(bool calculateActions = true) { foreach (var player in PlayerGroupInfo.GetPlayerList()) { var playerGameInfo = GetPlayerGameInfo(player.PlayerId, calculateActions); ClientApiDictionary[player.PlayerId].SetPlayerGameInfo(playerGameInfo); } }
public object Clone() { return(new PlayResult { PlayerGroupInfo = (PlayerGroupInfo)PlayerGroupInfo?.Clone(), Team1Score = (ScoreAmount)Team1Score?.Clone(), Team2Score = (ScoreAmount)Team2Score?.Clone() }); }
public object Clone() { return(new RoundResult { WinningTeam = (TeamInfo)WinningTeam?.Clone(), PlayerGroupInfo = (PlayerGroupInfo)PlayerGroupInfo?.Clone(), Team1FinalScore = Team1FinalScore, Team2FinalScore = Team2FinalScore }); }
public void ProcessPlayAction(PlayAction playAction) { PlayerHandDictionary[CurrentPlayer.PlayerId].Cards.Remove(playAction.Card); PlayActionList.Add(playAction); StickResult = GetStickResult(); if (StickResult == null) { CurrentPlayer = PlayerGroupInfo.GetNextPlayer(CurrentPlayer.PlayerId); } }
public BetStage( Rules rules, PlayerGroupInfo playerGroup, IDictionary <string, CardPile> playerHandDictionary, PlayerInfo initialPlayer) { Rules = rules; PlayerGroup = playerGroup; PlayerHandDictionary = playerHandDictionary; CurrentPlayer = initialPlayer; }
public StickRound( PlayerGroupInfo playerGroupInfo, IDictionary <string, CardPile> playerHandDictionary, PlayerInfo initialPlayer, PlayType playType) { PlayerGroupInfo = playerGroupInfo; PlayerHandDictionary = playerHandDictionary; CurrentPlayer = initialPlayer; PlayType = playType; }
private PlayerInfo GetRandomPlayer() { var playerList = PlayerGroupInfo.GetPlayerList(); if (!playerList.Any()) { return(null); } var randomIndex = _random.Next(playerList.Count - 1); return(playerList[randomIndex]); }
public GameStage( Rules rules, PlayerGroupInfo playerGroupInfo, Action confirmAction) { Rules = rules; PlayerGroupInfo = playerGroupInfo; ConfirmAction = confirmAction; CurrentPlayer = GetRandomPlayer(); var deck = CardPile.CreateDeckPile(); var gameRound = new GameRound(Rules, PlayerGroupInfo, ConfirmAction, CurrentPlayer, deck); GameRoundList.Add(gameRound); }
public PlayStage( Rules rules, PlayerGroupInfo playerGroupInfo, Action confirmAction, IDictionary <string, CardPile> playerHandDictionary, PlayerInfo initialPlayer, PlayType playType) { Rules = rules; PlayerGroupInfo = playerGroupInfo; ConfirmAction = confirmAction; PlayerHandDictionary = playerHandDictionary; PlayType = playType; var stickRound = new StickRound(PlayerGroupInfo, PlayerHandDictionary, initialPlayer, PlayType); StickRoundList.Add(stickRound); }
public GameRound( Rules rules, PlayerGroupInfo playerGroup, Action confirmAction, PlayerInfo initialPlayer, CardPile deck) { Rules = rules; PlayerGroupInfo = playerGroup; ConfirmAction = confirmAction; InitialPlayer = initialPlayer; var playerList = PlayerGroupInfo.GetPlayerList(InitialPlayer.PlayerId); PlayerHandDictionary = playerList .ToDictionary(p => p.PlayerId, p => new CardPile(deck.Draw(9))); BetStage = new BetStage(Rules, PlayerGroupInfo, PlayerHandDictionary, InitialPlayer); ExpectedActionType = ActionType.BetAction; }
public void ProcessAction(ActionBase action) { Log.Information(action.ToString()); CurrentGameRound.ProcessAction(action); if (CurrentGameRound.RoundResult != null) { Log.Information(CurrentGameRound.RoundResult.ToString()); ConfirmAction?.Invoke(); GameResult = GetGameResult(); if (GameResult == null) { CurrentPlayer = PlayerGroupInfo.GetNextPlayer(CurrentPlayer.PlayerId); var deck = CardPile.CreateDeckPile(); var gameRound = new GameRound(Rules, PlayerGroupInfo, ConfirmAction, CurrentPlayer, deck); GameRoundList.Add(gameRound); } else { Log.Information(GameResult.ToString()); } } }
public bool StartGame() { if (GameStage != null) { return(false); } if (PlayerGroupInfo.GetPlayerList().Count != 4) { return(false); } if (!CheckAndSetBusy()) { return(false); } RunBusyAction(() => { try { GameStage = new GameStage(GameInfo.Rules, PlayerGroupInfo, ConfirmAction); } catch (Exception e) { Log.Error($"Exception in StartGame: {e.Message}", e); throw; } try { UpdatePlayers(); } catch (Exception e) { Log.Error($"Exception in UpdatePlayers: {e.Message}", e); throw; } }); return(true); }
public PlayResult GetPlayResult() { var isOver = StickRoundList.Count == 9 && CurrentStickRound.StickResult != null; if (!isOver) { return(null); } var playerResultDictionary = PlayerGroupInfo .GetPlayerList() .ToDictionary(p => p, p => { var wonCards = StickRoundList .Select(r => r.StickResult) .Where(r => r.Winner == p) .SelectMany(r => r.StickPile) .ToList(); return(wonCards); }); var playersWithSticks = playerResultDictionary .Where(p => p.Value.Any()) .Select(p => p.Key) .ToList(); var generalPlayer = playersWithSticks.Count == 1 ? playersWithSticks.Single() : null; if (generalPlayer != null) { //Case General var generalAmount = new ScoreAmount(isMatch: true, isGeneral: true); var zeroAmount = new ScoreAmount(); return(new PlayResult { PlayerGroupInfo = PlayerGroupInfo, Team1Score = PlayerGroupInfo.GetTeamOfPlayer(generalPlayer.PlayerId) == PlayerGroupInfo.Team1 ? generalAmount : zeroAmount, Team2Score = PlayerGroupInfo.GetTeamOfPlayer(generalPlayer.PlayerId) == PlayerGroupInfo.Team2 ? generalAmount : zeroAmount }); } var teamResultDictionary = playerResultDictionary .GroupBy(p => PlayerGroupInfo.GetTeamOfPlayer(p.Key.PlayerId)) .ToDictionary(g => g.Key, g => g.ToList().SelectMany(p => p.Value).ToList()); var teamsWithSticks = teamResultDictionary .Where(p => p.Value.Any()) .Select(p => p.Key) .ToList(); var matchTeam = teamsWithSticks.Count == 1 ? teamsWithSticks.Single() : null; if (matchTeam != null) { //Case Match var matchAmount = new ScoreAmount(isMatch: true); var zeroAmount = new ScoreAmount(); return(new PlayResult { PlayerGroupInfo = PlayerGroupInfo, Team1Score = PlayerGroupInfo.GetTeamOfPlayer(generalPlayer.PlayerId) == PlayerGroupInfo.Team1 ? matchAmount : zeroAmount, Team2Score = PlayerGroupInfo.GetTeamOfPlayer(generalPlayer.PlayerId) == PlayerGroupInfo.Team2 ? matchAmount : zeroAmount }); } //Case no General/Match var team1Amount = teamResultDictionary[PlayerGroupInfo.Team1] .Select(c => c.GetValue(PlayType)) .Sum(); var team2Amount = teamResultDictionary[PlayerGroupInfo.Team2] .Select(c => c.GetValue(PlayType)) .Sum(); var lastStickTeam = PlayerGroupInfo.GetTeamOfPlayer(StickRoundList.Last().StickResult.Winner.PlayerId); if (lastStickTeam == PlayerGroupInfo.Team1) { team1Amount += 5; } if (lastStickTeam == PlayerGroupInfo.Team2) { team2Amount += 5; } return(new PlayResult { PlayerGroupInfo = PlayerGroupInfo, Team1Score = new ScoreAmount(team1Amount), Team2Score = new ScoreAmount(team2Amount) }); }
private RoundResult GetRoundResult() { var betTeamScore = BetResult.BettingTeam == PlayerGroupInfo.Team1 ? PlayResult.Team1Score : PlayResult.Team2Score; var otherTeamScore = BetResult.BettingTeam == PlayerGroupInfo.Team1 ? PlayResult.Team2Score : PlayResult.Team1Score; var betSucceded = BetResult.Bet.IsSuccessFor(betTeamScore); if (betSucceded) { var betTeamFinalScore = (betTeamScore.GetRoundedAmount() + BetResult.Bet.BetAmount.GetRoundedAmount()) / 10; if (BetResult.IsBarrani) { betTeamFinalScore *= 4; } else if (BetResult.IsSidi) { betTeamFinalScore *= 2; } var otherTeamFinalScore = otherTeamScore.GetRoundedAmount() / 10; if (BetResult.IsBarrani) { otherTeamFinalScore *= 0; } else if (BetResult.IsSidi) { otherTeamFinalScore *= 2; } var roundResult = new RoundResult { WinningTeam = BetResult.BettingTeam, PlayerGroupInfo = PlayerGroupInfo, Team1FinalScore = BetResult.BettingTeam == PlayerGroupInfo.Team1 ? betTeamFinalScore : otherTeamFinalScore, Team2FinalScore = BetResult.BettingTeam == PlayerGroupInfo.Team2 ? betTeamFinalScore : otherTeamFinalScore, }; return(roundResult); } else { var otherTeamFinalScore = (otherTeamScore.GetRoundedAmount() + BetResult.Bet.BetAmount.GetRoundedAmount()) / 10; if (BetResult.IsBarrani) { otherTeamFinalScore *= 4; } else if (BetResult.IsSidi) { otherTeamFinalScore *= 2; } var roundResult = new RoundResult { WinningTeam = PlayerGroupInfo.GetOtherTeam(BetResult.BettingTeam.TeamId), PlayerGroupInfo = PlayerGroupInfo, Team1FinalScore = BetResult.BettingTeam == PlayerGroupInfo.Team1 ? 0 : otherTeamFinalScore, Team2FinalScore = BetResult.BettingTeam == PlayerGroupInfo.Team2 ? 0 : otherTeamFinalScore, }; return(roundResult); } }
public static GameStageInfo GetRelativeGameStageInfo(this GameStageInfo gameStageInfo, PlayerGroupInfo playerGroupInfo, string playerId) { var isCurrentTeamTeam1 = playerGroupInfo.GetTeamOfPlayer(playerId).TeamId == playerGroupInfo.Team1.TeamId; var relativePlayerGroupInfo = playerGroupInfo.GetRelativePlayerGroupInfo(playerId); var relativeGameStageInfo = (GameStageInfo)(gameStageInfo?.Clone()); if (relativeGameStageInfo.CurrentPlayer != null) { relativeGameStageInfo.CurrentPlayer = playerGroupInfo.GetRelativePlayerInfo(playerId, gameStageInfo.CurrentPlayer.PlayerId); } if (relativeGameStageInfo.CurrentBetActionList != null) { foreach (var betAction in relativeGameStageInfo.CurrentBetActionList) { betAction.PlayerInfo = playerGroupInfo.GetRelativePlayerInfo(playerId, betAction.PlayerInfo.PlayerId); } } if (relativeGameStageInfo?.CurrentBetResult?.BettingTeam != null) { relativeGameStageInfo.CurrentBetResult.BettingTeam = playerGroupInfo.GetRelativeTeamInfo(playerId, gameStageInfo.CurrentBetResult.BettingTeam.TeamId); } if (relativeGameStageInfo?.StickRoundInfoList != null) { foreach (var stickRoundInfo in relativeGameStageInfo.StickRoundInfoList) { if (stickRoundInfo?.PlayActionList != null) { foreach (var playAction in stickRoundInfo.PlayActionList) { playAction.PlayerInfo = playerGroupInfo.GetRelativePlayerInfo(playerId, playAction.PlayerInfo.PlayerId); } } if (stickRoundInfo?.StickResult?.Winner != null) { stickRoundInfo.StickResult.Winner = playerGroupInfo.GetRelativePlayerInfo(playerId, stickRoundInfo.StickResult.Winner.PlayerId); } } } if (relativeGameStageInfo?.CurrentPlayResult != null) { relativeGameStageInfo.CurrentPlayResult.PlayerGroupInfo = relativePlayerGroupInfo; if (!isCurrentTeamTeam1) { relativeGameStageInfo.CurrentPlayResult.Team1Score = gameStageInfo.CurrentPlayResult.Team2Score; relativeGameStageInfo.CurrentPlayResult.Team2Score = gameStageInfo.CurrentPlayResult.Team1Score; } } if (relativeGameStageInfo?.RoundResultList != null) { foreach (var roundResult in relativeGameStageInfo?.RoundResultList) { if (roundResult != null) { roundResult.PlayerGroupInfo = relativePlayerGroupInfo; roundResult.WinningTeam = playerGroupInfo.GetRelativeTeamInfo(playerId, roundResult.WinningTeam.TeamId); if (!isCurrentTeamTeam1) { var team1Score = roundResult.Team2FinalScore; var team2Score = roundResult.Team1FinalScore; roundResult.Team1FinalScore = team1Score; roundResult.Team2FinalScore = team2Score; } } } } if (relativeGameStageInfo?.GameResult != null) { relativeGameStageInfo.GameResult.PlayerGroupInfo = relativePlayerGroupInfo; relativeGameStageInfo.GameResult.WinningTeam = playerGroupInfo.GetRelativeTeamInfo(playerId, relativeGameStageInfo.GameResult.WinningTeam.TeamId); if (!isCurrentTeamTeam1) { var team1Score = relativeGameStageInfo.GameResult.Team2FinalScore; var team2Score = relativeGameStageInfo.GameResult.Team1FinalScore; relativeGameStageInfo.GameResult.Team1FinalScore = team1Score; relativeGameStageInfo.GameResult.Team2FinalScore = team2Score; } } return(relativeGameStageInfo); }