public async Task <IActionResult> Save([FromBody] Save.Request req) { var res = new Save.Response(); evolib.Services.MasterData.ISeason currentSeason = MasterData.GetCurrentSeason(); // プレイヤー毎 foreach (var registerSaveData in req.playerRecordInfoList) { await SaveCareerRecordOfPlayer(req, registerSaveData, currentSeason); } return(Ok(res)); }
public async Task <IActionResult> GetSelf([FromBody] GetSelf.Request req) { var res = new GetSelf.Response(); var playerId = SelfHost.playerInfo.playerId; var db = PDBSM.PersonalDBContext(playerId); // カジュアルマッチの戦績取得 { int seasonNoOfCasualMatch = 0; var casualMatchRecords = await db.CareerRecords .Where(x => x.playerId == playerId && x.matchType == evolib.Battle.MatchType.Casual && x.seasonNo == seasonNoOfCasualMatch) .ToListAsync(); res.casual = createRecordInfoList(casualMatchRecords); } // ランクマッチの戦績取得 { evolib.Services.MasterData.ISeason currentSeason = MasterData.GetCurrentSeason(); //現在のシーズンが取得出来なかったなら、ランクマッチの戦績リストを空で終了する if (currentSeason == null) { res.rank = new List <RecordInfo>(); } else { int seasonNoOfRankMatch = currentSeason.seasonNo; var rankMatchRecords = await db.CareerRecords .Where(x => x.playerId == playerId && x.matchType == evolib.Battle.MatchType.Rank && x.seasonNo == seasonNoOfRankMatch) .ToListAsync(); res.rank = createRecordInfoList(rankMatchRecords); } } return(Ok(res)); }
private async Task <List <UseMobileSuitInfo> > getUseMobileSuitSeasonTop3List(long playerId) { var useMsTop3 = new List <UseMobileSuitInfo>(); evolib.Services.MasterData.ISeason currentSeason = MasterData.GetCurrentSeason(); //現在のシーズンが取得出来なかったなら、機体の使用率のリストを空で終了する if (currentSeason == null) { return(useMsTop3); } int seasonNoOfRankMatch = currentSeason.seasonNo; var db = PDBSM.PersonalDBContext(playerId); // 戦績から現在のシーズンの機体の使用時間のリストを取得する(使用時間の長い順にソート) var useMsList = await db.CareerRecords .Where(x => x.playerId == playerId && x.matchType == evolib.Battle.MatchType.Rank && x.seasonNo == seasonNoOfRankMatch && x.recordItemId == evolib.CareerRecord.RECORD_ID_PLAY_TIME) .OrderByDescending(x => x.value) .ToListAsync(); // プレイヤーがシーズンでプレイした時間(全機体の使用時間の合計)を取得する double totalUseTime = useMsList.Sum(x => x.value); // プレイヤーの使用時間の長い機体TOP3を取得する foreach (var playTime in useMsList) { useMsTop3.Add(new UseMobileSuitInfo { mobileSuitId = playTime.mobileSuitId, useRate = (totalUseTime <= 0.0f) ? 0.0f : (float)((playTime.value / totalUseTime) * 100.0f), }); if (3 <= useMsTop3.Count()) { break; } } return(useMsTop3); }
private async Task SaveCareerRecordOfPlayer(Save.Request req, Save.Request.PlayerRecordInfo registerSaveData, evolib.Services.MasterData.ISeason currentSeason) { //ランクマッチ時に現在のシーズンが取得出来なかったなら、処理を終了する //(カジュアルマッチ時は処理が行える為、呼び出し側ではなく内部でチェックする) if (req.matchType == evolib.Battle.MatchType.Rank && currentSeason == null) { return; } var playerId = registerSaveData.playerId; var db = PDBSM.PersonalDBContext(playerId); int seasonNo = req.matchType == evolib.Battle.MatchType.Rank ? currentSeason.seasonNo : 0; var query = db.CareerRecords.Where( x => x.playerId == playerId && x.matchType == req.matchType && x.seasonNo == seasonNo); var records = await query.ToListAsync(); foreach (var info in registerSaveData.recordList) { var careerRecord = MasterData.GetCareerRecord(info.id); if (careerRecord == null) { continue; } foreach (var blockInfo in info.blocks) { var blockRecord = new evolib.Databases.personal.CareerRecord(); blockRecord.playerId = playerId; blockRecord.recordItemId = info.id; blockRecord.matchType = req.matchType; blockRecord.seasonNo = seasonNo; blockRecord.mobileSuitId = blockInfo.ms; blockRecord.value = double.Parse(blockInfo.val); blockRecord.numForAverage = blockInfo.num; // CareerRecordの1項目を特定 var recordData = records.Find(i => i.recordItemId == info.id && i.mobileSuitId == blockInfo.ms); if (recordData == null) { await db.CareerRecords.AddAsync(blockRecord); } else { switch (careerRecord.valueType) { // 累積する場合 case evolib.CareerRecord.ValueType.Sum: case evolib.CareerRecord.ValueType.SumAverage: { recordData.value += blockRecord.value; recordData.numForAverage += blockRecord.numForAverage; } break; // 値が高い方を更新する場合 default: { // 平均値の場合 if (careerRecord.valueType == evolib.CareerRecord.ValueType.MaxAverage) { var averageValue = blockRecord.numForAverage == 0 ? blockRecord.value : blockRecord.value / blockRecord.numForAverage; var recordAverageValue = recordData.numForAverage == 0 ? recordData.value : recordData.value / recordData.numForAverage; if (recordAverageValue < averageValue) { recordData.value = blockRecord.value; recordData.numForAverage = blockRecord.numForAverage; } } // 平均値以外 else { if (recordData.value < blockRecord.value) { recordData.value = blockRecord.value; recordData.numForAverage = blockRecord.numForAverage; } } } break; } // 最大値を超えないように設定 recordData.value = Math.Min(recordData.value, evolib.CareerRecord.RECORD_MAX_VALUE); recordData.numForAverage = Math.Min(recordData.numForAverage, evolib.CareerRecord.RECORD_MAX_VALUE); } } } await db.SaveChangesAsync(); }