Esempio n. 1
0
        // Purposefully ignore modifiers here - only 2 maps have them enabled and it doesn't make much sense to just filter to those two
        private static float GetHighestPP(IPreviewBeatmapLevel previewBeatmapLevel, bool ppGain)
        {
            float maxPP = 0;
            var   id    = SongDataUtils.GetHash(previewBeatmapLevel.levelID);

            // Check if in SDC
            if (SongDataCore.Plugin.Songs.Data.Songs.ContainsKey(id))
            {
                // Loop through each diff
                foreach (var diff in SongDataCore.Plugin.Songs.Data.Songs[id].diffs)
                {
                    var difficulty = SongDataUtils.GetBeatmapDifficulty(diff.diff);
                    var songID     = new SongID(id, difficulty);
                    // Only go through ranked songs
                    if (SongDataUtils.IsRankedSong(songID))
                    {
                        float pp = PPUtils.CalculatePP(songID, AccLoader.instance.GetAcc(songID));
                        if (ppGain)
                        {
                            pp = PPUtils.GetPPGain(pp, songID);
                        }
                        maxPP = pp > maxPP ? pp : maxPP;
                    }
                }
                return(maxPP);
            }
            return(0);
        }
Esempio n. 2
0
        private void SetPPText(bool canUsePositiveModifiers)
        {
            float ppValue = canUsePositiveModifiers ? PPUtils.CalculatePP(_rawPP, BeatSaberUtils.GetModifiedAcc(_accuracy, _modifiersModel, _modifiers))
                            : PPUtils.CalculatePP(_rawPP, BeatSaberUtils.GetModifiedAcc(_accuracy, _modifiersModel, BeatSaberUtils.RemovePositiveModifiers(_modifiers)));
            string ppText     = Math.Round(ppValue, 2).ToString("0.00");
            var    ppGain     = Math.Round(PPUtils.GetPPGain(ppValue, _id), 2);
            string ppGainText = ppGain.ToString("0.00");
            var    color      = ppGain > 0 ? "green" : "red";

            _ppText.SetText($"{ppText} (<color=\"{color}\">+{ppGain}</color>)");
        }
Esempio n. 3
0
        public override void CounterInit()
        {
            var id = SongDataUtils.GetHash(difficultyBeatmap.level.levelID);

            songID = new SongID(id, difficultyBeatmap.difficulty);

            // Don't show anything for unranked songs or if data not initialized
            if (!ppUtils.DataInitialized() || !ppUtils.IsRanked(songID))
            {
                return;
            }

            var gameplayModifiersModelSO = IPA.Utilities.FieldAccessor <RelativeScoreAndImmediateRankCounter, GameplayModifiersModelSO> .Get(relativeScoreAndImmediateRank, "_gameplayModifiersModel");

            GameplayModifiers updatedModifiers = ppUtils.AllowedPositiveModifiers(songID) ?
                                                 gameplayModifiers : GameplayModifierUtils.RemovePositiveModifiers(gameplayModifiers);

            _multiplier = GameplayModifierUtils.CalculateMultiplier(gameplayModifiersModelSO, updatedModifiers);

            counter          = CanvasUtility.CreateTextFromSettings(Settings);
            counter.fontSize = 3;

            relativeScoreAndImmediateRank.relativeScoreOrImmediateRankDidChangeEvent += ScoreUpdated;
            UpdateCounterText(ppUtils.CalculatePP(songID, _multiplier, ppUtils.AllowedPositiveModifiers(songID)));

            if (PluginSettings.Instance.relativeGain)
            {
                var highScore = playerDataModel.playerData.GetPlayerLevelStatsData(difficultyBeatmap).highScore;
                if (highScore == 0)
                {
                    _pbPP = 0;
                    return;
                }

                var maxScore = ScoreModel.ComputeMaxMultipliedScoreForBeatmap(beatmapData);
                var acc      = (float)highScore / maxScore;
                _pbPP = ppUtils.CalculatePP(songID, acc, ppUtils.AllowedPositiveModifiers(songID));
            }
        }
Esempio n. 4
0
        public void SubmitPlay(SongID songID, double acc)
        {
            // Unplayed or better than previous acc
            if (!songDataInfo.ContainsKey(songID) || acc > songDataInfo[songID].acc)
            {
                Logger.log.Debug("Unplayed or better score");
                double pp       = PPUtils.CalculatePP(songID, (float)(acc * 100));
                int    oldIndex = songDataInfo.ContainsKey(songID) ? songIndex[songID] : songIndex.Count;
                double weight   = Double.NegativeInfinity;
                // Find first song that it's worth more than
                var i = 0;
                foreach (var song in songOrder)
                {
                    var songWorth = songDataInfo[song].pp;
                    if (songWorth < pp)
                    {
                        weight = songDataInfo[song].weight;
                        break;
                    }
                    i++;
                }

                // found a song it's worth more than, decrease weight of songs below it that are above original
                if (weight != Double.NegativeInfinity)
                {
                    for (; i < oldIndex; i++)
                    {
                        var song = songOrder[i];
                        songDataInfo[song].weight *= PPUtils.FALLOFF_RATE;
                    }
                }
                // Lowest value song
                else
                {
                    Logger.log.Debug("Lowest value song");
                    weight = songDataInfo[songOrder.Last()].weight * PPUtils.FALLOFF_RATE;
                }

                // Add/update this song
                songDataInfo[songID] = new SongData(acc, pp, weight);
                // recalculate and save data
                CalculateSums();
                SaveSongData();
            }
        }
Esempio n. 5
0
        private void UpdateCounter()
        {
            var   maxScore = ScoreModel.MaxRawScoreForNumberOfNotes(_totalNotes);
            float acc;

            if (maxScore == 0)
            {
                acc = 1;
            }
            else
            {
                acc = (float)_score / (float)maxScore;
            }

            var pp = PPUtils.CalculatePP(_rawPP, acc * 100);

            _counter.text = $"{Math.Round(pp, Config.decimalPrecision)}pp";
        }