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); }
public void ComputeNewScore(PlayerGameSession playerScore, int numPins) { UpdateTotal(playerScore, numPins); UpdateRunningTotal(playerScore.RunningTotalList, playerScore); UpdateResultList(playerScore.ResultList, numPins); HandleStrike(playerScore, numPins); HandleSpare(playerScore, numPins); }
public void UpdateTotal(PlayerGameSession playerScore, int numPins) { var currentFrameAndCellNum = GetCurrentFrameAndCellNum(playerScore.ResultList); if (!(currentFrameAndCellNum.Item1 == 10 && currentFrameAndCellNum.Item2 == 2)) { playerScore.TotalScore += numPins; } }
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); }
public async Task <bool> Add(PlayerGameSession player) { try { await _mongoDbContext.PlayersMongoCollection.InsertOneAsync(player); return(true); } catch (Exception) { //log exception here return(false); } }
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; } }
//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; } }
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); }
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); }
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); } }
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); }