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());
        }
Esempio n. 2
0
 private void UpdatePlayers(bool calculateActions = true)
 {
     foreach (var player in PlayerGroupInfo.GetPlayerList())
     {
         var playerGameInfo = GetPlayerGameInfo(player.PlayerId, calculateActions);
         ClientApiDictionary[player.PlayerId].SetPlayerGameInfo(playerGameInfo);
     }
 }
Esempio n. 3
0
 public object Clone()
 {
     return(new PlayResult
     {
         PlayerGroupInfo = (PlayerGroupInfo)PlayerGroupInfo?.Clone(),
         Team1Score = (ScoreAmount)Team1Score?.Clone(),
         Team2Score = (ScoreAmount)Team2Score?.Clone()
     });
 }
Esempio n. 4
0
 public object Clone()
 {
     return(new RoundResult
     {
         WinningTeam = (TeamInfo)WinningTeam?.Clone(),
         PlayerGroupInfo = (PlayerGroupInfo)PlayerGroupInfo?.Clone(),
         Team1FinalScore = Team1FinalScore,
         Team2FinalScore = Team2FinalScore
     });
 }
Esempio n. 5
0
 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);
     }
 }
Esempio n. 6
0
 public BetStage(
     Rules rules,
     PlayerGroupInfo playerGroup,
     IDictionary <string, CardPile> playerHandDictionary,
     PlayerInfo initialPlayer)
 {
     Rules                = rules;
     PlayerGroup          = playerGroup;
     PlayerHandDictionary = playerHandDictionary;
     CurrentPlayer        = initialPlayer;
 }
Esempio n. 7
0
 public StickRound(
     PlayerGroupInfo playerGroupInfo,
     IDictionary <string, CardPile> playerHandDictionary,
     PlayerInfo initialPlayer,
     PlayType playType)
 {
     PlayerGroupInfo      = playerGroupInfo;
     PlayerHandDictionary = playerHandDictionary;
     CurrentPlayer        = initialPlayer;
     PlayType             = playType;
 }
Esempio n. 8
0
        private PlayerInfo GetRandomPlayer()
        {
            var playerList = PlayerGroupInfo.GetPlayerList();

            if (!playerList.Any())
            {
                return(null);
            }
            var randomIndex = _random.Next(playerList.Count - 1);

            return(playerList[randomIndex]);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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;
        }
Esempio n. 12
0
 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());
         }
     }
 }
Esempio n. 13
0
        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);
        }
Esempio n. 14
0
        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)
            });
        }
Esempio n. 15
0
        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);
        }