Пример #1
0
        public bool HandleStrike(PlayerGameSession playerScore, int numPins)
        {
            var frameAndCellNum = GetCurrentFrameAndCellNum(playerScore.ResultList);
            var frameNum        = frameAndCellNum.Item1;
            var cellNum         = frameAndCellNum.Item2;

            var resultList = playerScore.ResultList;

            if (frameNum > 1)
            {
                var foundStrikeAndFrame = FoundStrikeTwoShotsBackAndFrameNum(resultList, frameNum, cellNum);

                if (foundStrikeAndFrame.Item1)
                {
                    var shotBeforeResult = GetScoreOneShotBackAndFrameNum(resultList, frameNum, cellNum);

                    var newScore = shotBeforeResult.Item1 + numPins + 10; //spares are handled
                    var oldScore = 10;
                    if (frameNum == 10 && cellNum == 3)                   //bonus frame can have more cells
                    {
                        oldScore = shotBeforeResult.Item1 + 10;
                    }

                    RecalculateRunningTotal(playerScore.RunningTotalList, newScore, oldScore, foundStrikeAndFrame.Item2);
                    playerScore.TotalScore = playerScore.RunningTotalList[frameNum - 1];
                    return(true);
                }
            }

            return(false);
        }
Пример #2
0
 public void ComputeNewScore(PlayerGameSession playerScore, int numPins)
 {
     UpdateTotal(playerScore, numPins);
     UpdateRunningTotal(playerScore.RunningTotalList, playerScore);
     UpdateResultList(playerScore.ResultList, numPins);
     HandleStrike(playerScore, numPins);
     HandleSpare(playerScore, numPins);
 }
Пример #3
0
        public void UpdateTotal(PlayerGameSession playerScore, int numPins)
        {
            var currentFrameAndCellNum = GetCurrentFrameAndCellNum(playerScore.ResultList);

            if (!(currentFrameAndCellNum.Item1 == 10 && currentFrameAndCellNum.Item2 == 2))
            {
                playerScore.TotalScore += numPins;
            }
        }
Пример #4
0
        private async Task OnlineThreadFunc()
        {
            using var scope = serviceScopeFactory.CreateScope();
            var dataManager = scope.ServiceProvider.GetRequiredService <DataManager>();

            var players  = dataManager.Players.ToList();
            var steamIds = players.Select(x => x.SteamId).ToList();

            var currSummaries = steam.GetPlayerSummaries(steamIds);
            var currOnline    = currSummaries.Where(x => x.gameid == SteamClient.Dota2GameId).Select(x => x.steamid).ToList();

            if (prevOnline == null)
            {
                prevOnline = currOnline;
                return;
            }

            var now = DateTime.UtcNow;

            var newOnline  = currOnline.Except(prevOnline).ToList();
            var newOffline = prevOnline.Except(currOnline).ToList();

            prevOnline = currOnline;

            foreach (var online in newOnline)
            {
                playersTimeCache[online] = new PlayerGameSession
                {
                    SteamId = online,
                    Start   = now
                };
            }

            List <PlayerGameSession> endSessions = new List <PlayerGameSession>();

            foreach (var offline in newOffline)
            {
                if (playersTimeCache.ContainsKey(offline))
                {
                    var session = playersTimeCache[offline];
                    session.End = now;

                    endSessions.Add(session);

                    playersTimeCache.Remove(offline);
                }
                else
                {
                    endSessions.Add(new PlayerGameSession
                    {
                        SteamId = offline
                    });
                }
            }

            await matchNotifier.NotifyStatusChats(newOnline, endSessions);
        }
Пример #5
0
        public async Task <bool> Add(PlayerGameSession player)
        {
            try
            {
                await _mongoDbContext.PlayersMongoCollection.InsertOneAsync(player);

                return(true);
            }
            catch (Exception)
            {
                //log exception here
                return(false);
            }
        }
Пример #6
0
        public async Task <bool> Replace(PlayerGameSession playerGameDataToReplace)
        {
            var filter = Builders <PlayerGameSession> .Filter.Eq(p => p.PlayerGameSessionId, playerGameDataToReplace.PlayerGameSessionId);

            try
            {
                var result = await _mongoDbContext.PlayersMongoCollection.ReplaceOneAsync(filter, playerGameDataToReplace);

                return(result.IsAcknowledged && result.MatchedCount > 0);
            }
            catch (Exception e)
            {
                throw;
            }
        }
Пример #7
0
        //curently only updates score data, also need to double check the updates
        public async Task <bool> Update(PlayerGameSession updatedGameData)
        {
            var filter = Builders <PlayerGameSession> .Filter.Eq(p => p.PlayerGameSessionId, updatedGameData.PlayerGameSessionId);

            var updateDef = Builders <PlayerGameSession> .Update.
                            Set(p => p.TotalScore, updatedGameData.TotalScore).
                            Set(p => p.ResultList, updatedGameData.ResultList).
                            Set(p => p.RunningTotalList, updatedGameData.RunningTotalList);

            try
            {
                var result = await _mongoDbContext.PlayersMongoCollection.UpdateOneAsync(filter, updateDef);

                return(result.IsAcknowledged && result.MatchedCount > 0);
            }
            catch (Exception e)
            {
                throw;
            }
        }
Пример #8
0
        public async Task <bool> ReplacePlayerGameSession(PlayerGameSessionIn playerGameDataIn, Guid gameSessionId)
        {
            var playerGameData = new PlayerGameSession
            {
                PlayerGameSessionId = gameSessionId.ToString(),
                PlayerName          = playerGameDataIn.PlayerName,
                TotalScore          = playerGameDataIn.TotalScore,
                ResultList          = playerGameDataIn.ResultList,
                RunningTotalList    = playerGameDataIn.RunningTotalList
            };

            var success = await _playersDataService.Replace(playerGameData);

            if (!success)
            {
                throw new MongoOperationFailException("Mongo 'AddPlayers' operation failed. ");
            }

            return(success);
        }
Пример #9
0
        public async Task <PlayerGameSession> InsertPlayerGameSession(PlayerGameSessionIn playerGameSessionIn)
        {
            var playerGameSession = new PlayerGameSession
            {
                PlayerGameSessionId = Guid.NewGuid().ToString(),
                PlayerName          = playerGameSessionIn.PlayerName,
                TotalScore          = playerGameSessionIn.TotalScore,
                RunningTotalList    = playerGameSessionIn.RunningTotalList,
                ResultList          = playerGameSessionIn.ResultList
            };

            var success = await _playersDataService.Add(playerGameSession);

            if (!success)
            {
                throw new MongoOperationFailException("Mongo 'AddPlayers' operation failed. ");
            }

            return(playerGameSession);
        }
Пример #10
0
        public void UpdateRunningTotal(List <int> runningTotal, PlayerGameSession playerGameData)
        {
            var currentFrameAndCellNum = GetCurrentFrameAndCellNum(playerGameData.ResultList);
            var cellNum = currentFrameAndCellNum.Item2;

            List <int> curFrame = null;

            if (playerGameData.ResultList.Count > 0)
            {
                curFrame = playerGameData.ResultList[currentFrameAndCellNum.Item1 - 1];
            }

            //we expected Frame to not be null if cellNum = 1;
            if (cellNum == 1 && !FrameHasStrike(curFrame) || playerGameData.ResultList.Count == 10) //also logic for 10
            {
                runningTotal[playerGameData.ResultList.Count - 1] = playerGameData.TotalScore;
            }
            else
            {
                runningTotal.Add(playerGameData.TotalScore);
            }
        }
Пример #11
0
        public bool HandleSpare(PlayerGameSession playerScore, int numPins)
        {
            var frameAndCellNum = GetCurrentFrameAndCellNum(playerScore.ResultList);
            var frameNum        = frameAndCellNum.Item1;
            var cellNum         = frameAndCellNum.Item2;

            var resultList = playerScore.ResultList;

            if (frameNum > 1)
            {
                var spareFoundResult = FoundSpareOneShotBackAndFrameNum(resultList, frameNum, cellNum);

                if (spareFoundResult.Item1)                //it's a spare
                {
                    var spareFrameNewScore = 10 + numPins; //expect strikes and spare to have score of 10
                    RecalculateRunningTotal(playerScore.RunningTotalList, spareFrameNewScore, 10, spareFoundResult.Item2);
                    playerScore.TotalScore = playerScore.RunningTotalList[frameNum - 1];
                    return(true);
                }
            }

            return(false);
        }