// 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); }
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>)"); }
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)); } }
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(); } }
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"; }