コード例 #1
0
        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));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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();
        }