public void UpdateRule(PlayerData playerData, RuleData ruleData)
        {
            UdemaeLabel.Content = playerData.Udemae[ruleData.RuleIndex][0];
            RuleLabel.Content   = ruleData.Name;
            if (playerData.Udemae[ruleData.RuleIndex] != "X")
            {
                XPowerLabel.Content = playerData.Udemae[ruleData.RuleIndex].Substring(1);
            }
            else if (playerData.XPower[ruleData.RuleIndex] == 0)
            {
                XPowerLabel.Content = "Calculating";
            }

            XPowerLabel.Margin         = new Thickness(90, 35, 0, 0);
            XPowerSubtractLabel.Margin = new Thickness(370, 91, 0, 0);
            RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(0xE2, 0x56, 0x2C));

            XPowerSubtractLabel.Content = "";
            PaintPointLabel.Content     = "";
            KALabelN.Content            = "0(0)";
            DLabelN.Content             = "0";
            KDLabelN.Content            = "0.00";
        }
Example #2
0
        public async Task <bool> TryInitializePlayerData()
        {
            SplatNet2DataStructure.Records.PersonalRecords.PlayerRecords udemaeData;
            try
            {
                var result = await HttpManager.GetDeserializedJsonAsyncWithCookieContainer <SplatNet2DataStructure.Records>(ApiUriPrefix + "records", Cookie);

                udemaeData = result.records.player;
            }
            catch (HttpRequestException)
            {
                await LogManager.WriteLogAsync("Failed to get \"records\"");

                return(false);
            }
            catch (JsonException)
            {
                await LogManager.WriteLogAsync("Failed to convert \"records\"");

                return(false);
            }

            PlayerData = new PlayerData(udemaeData.nickname, udemaeData.principal_id);

            string GetUdemaeName(SplatNet2DataStructure.Records.PersonalRecords.PlayerRecords.RuleData r) => r.name == null ? "-" : (r.name + r.s_plus_number);

            PlayerData.Udemae = new[]
            {
                GetUdemaeName(udemaeData.udemae_zones),
                GetUdemaeName(udemaeData.udemae_tower),
                GetUdemaeName(udemaeData.udemae_rainmaker),
                GetUdemaeName(udemaeData.udemae_clam),
            };

            SplatNet2DataStructure.XPowerRanking powerData;
            try
            {
                powerData = await HttpManager.GetDeserializedJsonAsyncWithCookieContainer <SplatNet2DataStructure.XPowerRanking>(ApiUriPrefix + "x_power_ranking/" + GetSeason() + "/summary", Cookie);
            }
            catch (HttpRequestException)
            {
                await LogManager.WriteLogAsync("Failed to get \"XPowerRanking\"");

                return(false);
            }
            catch (JsonException)
            {
                await LogManager.WriteLogAsync("Failed to convert \"XPowerRanking\"");

                return(false);
            }

            // parse時にCultureInfo.InvariantCultureを付けないとフランスの方を筆頭にバグる
            float GetXPower(SplatNet2DataStructure.Records.PersonalRecords.PlayerRecords.RuleData r, SplatNet2DataStructure.XPowerRanking.RuleStats m) => r.is_x && m.my_ranking != null?float.Parse(m.my_ranking.x_power, CultureInfo.InvariantCulture) : 0;

            PlayerData.XPower = new[]
            {
                GetXPower(udemaeData.udemae_zones, powerData.splat_zones),
                GetXPower(udemaeData.udemae_tower, powerData.tower_control),
                GetXPower(udemaeData.udemae_rainmaker, powerData.rainmaker),
                GetXPower(udemaeData.udemae_clam, powerData.clam_blitz)
            };

            List <SplatNet2DataStructure.Results.BattleResult> battleData;

            try
            {
                var result2 = await HttpManager.GetDeserializedJsonAsyncWithCookieContainer <SplatNet2DataStructure.Results>(ApiUriPrefix + "results", Cookie);

                battleData = result2.results;
            }
            catch (HttpRequestException)
            {
                await LogManager.WriteLogAsync("Failed to get \"results\"");

                return(false);
            }
            catch (JsonException)
            {
                await LogManager.WriteLogAsync("Failed to convert \"results\"");

                return(false);
            }

            lastBattleNumber = battleData.Max(a => a.battle_number);
#if DEBUG
            lastBattleNumber = battleData.Max(a => a.battle_number) - 50;
#endif

            var ruleIndex = await GetGachiSchedule();

            RuleData = new RuleData(RuleData.GameMode.Gachi, ruleIndex, ruleNamesJP[ruleIndex]);

            return(true);
        }
        public void UpdateWindow(PlayerData playerData, RuleData ruleData)
        {
            if (battleNum == playerData.WinCount + playerData.LoseCount)
            {
                return;
            }
            // common
            battleNum                    = playerData.WinCount + playerData.LoseCount;
            WLabel.Content               = playerData.WinCount;
            LLabel.Content               = playerData.LoseCount;
            RuleLabel.Content            = ruleData.Name;
            UdemaeLabel.Content          = "";
            XPowerLabel.Content          = "";
            XPowerSubtractLabel.Content  = "";
            PaintPointLabel.Content      = "";
            WeaponImage.Source           = null;
            MVPLabel.Visibility          = Visibility.Hidden;
            ContributionLabel.Visibility = Visibility.Hidden;
            PaintPointLabel.Visibility   = Visibility.Hidden;
            contentTarget.xpower         = 0; // アニメーションの処理をストップ

            // ウデマエラベル、XPラベル、XPDiffラベル、色の処理
            switch (ruleData.Mode)
            {
            case RuleData.GameMode.Gachi:
                UdemaeLabel.Content = playerData.Udemae[ruleData.RuleIndex][0];
                if (playerData.Udemae[ruleData.RuleIndex] != "X")
                {
                    XPowerLabel.Content = playerData.Udemae[ruleData.RuleIndex].Substring(1);     // -、+、数字
                }
                else if (playerData.XPower[ruleData.RuleIndex] == 0)
                {
                    XPowerLabel.Content = "Calculating";
                }
                UpdateXPSubtractLabelColor(playerData.XPowerDiff);
                XPowerLabel.Margin         = new Thickness(90, 35, 0, 0);
                XPowerSubtractLabel.Margin = new Thickness(370, 91, 0, 0);
                RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(0xE2, 0x56, 0x2C));

                // コンテンツデータの更新
                contentTarget.xpower         = playerData.XPower[ruleData.RuleIndex];
                contentTarget.xpowerSubtract = playerData.XPowerDiff;
                contentNow.xpower            = playerData.XPowerDiff == 0 ? 0 : playerData.XPower[ruleData.RuleIndex] - playerData.XPowerDiff; // 計測終了直後の場合と分ける
                contentNow.xpowerSubtract    = 0;
                break;

            case RuleData.GameMode.Private:
                PaintPointLabel.Visibility = Visibility.Visible;
                XPowerLabel.Content        = playerData.KDMVP;
                MVPLabel.Visibility        = Visibility.Visible;
                XPowerLabel.Margin         = new Thickness(285, 35, 0, 0);
                RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(194, 0, 255));
                break;

            case RuleData.GameMode.League2:
                if (playerData.LeaguePower == 0)
                {
                    XPowerLabel.Content = "Calculating";
                }
                UpdateXPSubtractLabelColor(playerData.LeaguePowerDiff);
                XPowerLabel.Margin         = new Thickness(40, 35, 0, 0);
                XPowerSubtractLabel.Margin = new Thickness(320, 91, 0, 0);
                RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(255, 1, 206));

                // コンテンツデータの更新
                contentTarget.xpower         = playerData.LeaguePower;
                contentTarget.xpowerSubtract = playerData.LeaguePowerDiff;
                contentNow.xpower            = playerData.LeaguePowerDiff == 0 ? 0 : playerData.LeaguePower - playerData.LeaguePowerDiff;
                contentNow.xpowerSubtract    = 0;
                break;

            case RuleData.GameMode.League4:
                if (playerData.LeaguePower == 0)
                {
                    XPowerLabel.Content = "Calculating";
                }
                UpdateXPSubtractLabelColor(playerData.LeaguePowerDiff);
                XPowerLabel.Margin         = new Thickness(40, 35, 0, 0);
                XPowerSubtractLabel.Margin = new Thickness(320, 91, 0, 0);
                RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(255, 1, 206));

                // コンテンツデータの更新
                contentTarget.xpower         = playerData.LeaguePower;
                contentTarget.xpowerSubtract = playerData.LeaguePowerDiff;
                contentNow.xpower            = playerData.LeaguePowerDiff == 0 ? 0 : playerData.LeaguePower - playerData.LeaguePowerDiff;
                contentNow.xpowerSubtract    = 0;
                break;

            case RuleData.GameMode.Regular:
                PaintPointLabel.Visibility = Visibility.Visible;
                WeaponImage.Source         = new BitmapImage(playerData.ImageUri);
                XPowerLabel.Content        = $"{playerData.WinMeter:F1}";
                XPowerLabel.Margin         = new Thickness(150, 35, 0, 0);
                RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(59, 252, 3));
                break;

            case RuleData.GameMode.FestivalSolo:
                if (playerData.FesPower == 0)
                {
                    XPowerLabel.Content = "Calculating";
                }
                UpdateXPSubtractLabelColor(playerData.FesPowerDiff);
                XPowerLabel.Margin         = new Thickness(40, 35, 0, 0);
                XPowerSubtractLabel.Margin = new Thickness(320, 91, 0, 0);
                RuleLabel.Foreground       = new SolidColorBrush(Color.FromRgb(0xE2, 0x76, 0x4C));

                // コンテンツデータの更新
                contentTarget.xpower         = playerData.FesPower;
                contentTarget.xpowerSubtract = playerData.FesPowerDiff;
                contentNow.xpower            = playerData.FesPowerDiff == 0 ? 0 : playerData.FesPower - playerData.FesPowerDiff;
                contentNow.xpowerSubtract    = 0;
                break;

            case RuleData.GameMode.FestivalTeam:
                var cpt = playerData.ContributionPointTotal;
                if (cpt >= (long)Math.Pow(10, 10))
                {
                    XPowerLabel.Content = $"{cpt / Math.Pow(10, 9):F1}" + "B";
                }
                else if (cpt >= (long)Math.Pow(10, 7))
                {
                    XPowerLabel.Content = $"{cpt / Math.Pow(10, 6):F1}" + "M";
                }
                else if (cpt >= (long)Math.Pow(10, 4))
                {
                    XPowerLabel.Content = $"{cpt / Math.Pow(10, 3):F1}" + "K";
                }
                else
                {
                    XPowerLabel.Content = cpt;
                }

                XPowerLabel.Margin           = new Thickness(35, 35, 0, 0);
                PaintPointLabel.Visibility   = Visibility.Visible;
                ContributionLabel.Visibility = Visibility.Visible;
                RuleLabel.Foreground         = new SolidColorBrush(Color.FromRgb(159, 252, 3));
                break;
            }

            // コンテンツデータの更新(targetに向かってnowからアニメーションが進行)
            contentTarget.killCount    = playerData.KillCount;
            contentTarget.assistCount  = playerData.AssistCount;
            contentTarget.deathCount   = playerData.DeathCount;
            contentTarget.kdRate       = (float)playerData.KillCount / (playerData.DeathCount == 0 ? 1 : playerData.DeathCount);
            contentTarget.killCountN   = playerData.KillCountN;
            contentTarget.assistCountN = playerData.AssistCountN;
            contentTarget.deathCountN  = playerData.DeathCountN;
            contentTarget.kdRateN      = (float)playerData.KillCountN / (playerData.DeathCountN == 0 ? 1 : playerData.DeathCountN);
            contentTarget.wlRate       = (int)Math.Round((float)playerData.WinCount / (playerData.WinCount + playerData.LoseCount == 0 ? 1 : playerData.WinCount + playerData.LoseCount) * 100);
            contentTarget.paintPoint   = playerData.PaintPoint;

            contentNow.killCount    = playerData.KillCount - playerData.KillCountN;
            contentNow.assistCount  = playerData.AssistCount - playerData.AssistCountN;
            contentNow.deathCount   = playerData.DeathCount - playerData.DeathCountN;
            contentNow.kdRate       = (float)contentNow.killCount / (contentNow.deathCount == 0 ? 1 : contentNow.deathCount);
            contentNow.killCountN   = 0;
            contentNow.assistCountN = 0;
            contentNow.deathCountN  = 0;
            contentNow.kdRateN      = float.Parse(KDLabelN.Content.ToString(), CultureInfo.InvariantCulture);
            contentNow.wlRate       = int.Parse(WLLabel.Content.ToString().TrimEnd('%'), CultureInfo.InvariantCulture);
            contentNow.paintPoint   = 0;

            animationTimes = 100;
            _animationDispatcherTimer.Start();
            UpdateAnimation(null, null);
        }