From a44b6e9d1001e2525c7deb7af45aa71b8e4c9c65 Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Sun, 13 Oct 2024 11:50:36 +0200 Subject: [PATCH 1/9] Add slider tail mises to perfcalc gui --- PerformanceCalculatorGUI/RulesetHelper.cs | 12 +++++++---- .../Screens/SimulateScreen.cs | 20 ++++++++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/PerformanceCalculatorGUI/RulesetHelper.cs b/PerformanceCalculatorGUI/RulesetHelper.cs index e32f8a6..05a9f1a 100644 --- a/PerformanceCalculatorGUI/RulesetHelper.cs +++ b/PerformanceCalculatorGUI/RulesetHelper.cs @@ -15,6 +15,7 @@ using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Mania; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu; +using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko; using osu.Game.Rulesets.Taiko.Objects; @@ -103,11 +104,11 @@ namespace PerformanceCalculatorGUI return (int)Math.Round(1000000 * scoreMultiplier); } - public static Dictionary GenerateHitResultsForRuleset(RulesetInfo ruleset, double accuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int? countLargeTickMisses) + public static Dictionary GenerateHitResultsForRuleset(RulesetInfo ruleset, bool hasSliderAccuracy, double accuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int countLargeTickMisses, int countSliderTailMisses) { return ruleset.OnlineID switch { - 0 => generateOsuHitResults(accuracy, beatmap, countMiss, countMeh, countGood, countLargeTickMisses), + 0 => generateOsuHitResults(accuracy, hasSliderAccuracy, beatmap, countMiss, countMeh, countGood, countLargeTickMisses, countSliderTailMisses), 1 => generateTaikoHitResults(accuracy, beatmap, countMiss, countGood), 2 => generateCatchHitResults(accuracy, beatmap, countMiss, countMeh, countGood), 3 => generateManiaHitResults(accuracy, beatmap, countMiss), @@ -115,7 +116,7 @@ namespace PerformanceCalculatorGUI }; } - private static Dictionary generateOsuHitResults(double accuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int? countLargeTickMisses) + private static Dictionary generateOsuHitResults(double accuracy, bool hasSliderAccuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int countLargeTickMisses, int countSliderTailMisses) { int countGreat; @@ -191,12 +192,15 @@ namespace PerformanceCalculatorGUI countGreat = (int)(totalResultCount - countGood - countMeh - countMiss); } + int sliderTailHits = beatmap.HitObjects.Count(x => x is Slider) - countSliderTailMisses; + return new Dictionary { { HitResult.Great, countGreat }, { HitResult.Ok, countGood ?? 0 }, { HitResult.Meh, countMeh ?? 0 }, - { HitResult.LargeTickMiss, countLargeTickMisses ?? 0 }, + { HitResult.LargeTickMiss, countLargeTickMisses }, + { hasSliderAccuracy ? HitResult.SliderTailHit : HitResult.SmallTickHit, sliderTailHits }, { HitResult.Miss, countMiss } }; } diff --git a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs index 2d70fc1..3c29337 100644 --- a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs +++ b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs @@ -28,6 +28,7 @@ using osu.Game.Rulesets; using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Difficulty.Skills; using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using osu.Game.Screens.Play.HUD; @@ -53,6 +54,7 @@ namespace PerformanceCalculatorGUI.Screens private LimitedLabelledNumberBox missesTextBox; private LimitedLabelledNumberBox largeTickMissesTextBox; + private LimitedLabelledNumberBox sliderTailMissesTextBox; private LimitedLabelledNumberBox comboTextBox; private LimitedLabelledNumberBox scoreTextBox; @@ -269,6 +271,7 @@ namespace PerformanceCalculatorGUI.Screens AutoSizeAxes = Axes.Y, ColumnDimensions = new[] { + new Dimension(), new Dimension(), new Dimension() }, @@ -292,6 +295,14 @@ namespace PerformanceCalculatorGUI.Screens Label = "Large Tick Misses", PlaceholderText = "0", MinValue = 0 + }, + sliderTailMissesTextBox = new LimitedLabelledNumberBox + { + RelativeSizeAxes = Axes.X, + Anchor = Anchor.TopLeft, + Label = "Slider Tail Misses", + PlaceholderText = "0", + MinValue = 0 } } } @@ -472,6 +483,7 @@ namespace PerformanceCalculatorGUI.Screens mehsTextBox.Value.BindValueChanged(_ => debouncedCalculatePerformance()); missesTextBox.Value.BindValueChanged(_ => debouncedCalculatePerformance()); largeTickMissesTextBox.Value.BindValueChanged(_ => debouncedCalculatePerformance()); + sliderTailMissesTextBox.Value.BindValueChanged(_ => debouncedCalculatePerformance()); comboTextBox.Value.BindValueChanged(_ => debouncedCalculatePerformance()); scoreTextBox.Value.BindValueChanged(_ => debouncedCalculatePerformance()); @@ -660,10 +672,13 @@ namespace PerformanceCalculatorGUI.Screens var accuracy = accuracyTextBox.Value.Value / 100.0; Dictionary statistics = new Dictionary(); + + if (ruleset.Value.OnlineID != -1) { // official rulesets can generate more precise hits from accuracy - statistics = RulesetHelper.GenerateHitResultsForRuleset(ruleset.Value, accuracyTextBox.Value.Value / 100.0, beatmap, missesTextBox.Value.Value, countMeh, countGood, largeTickMissesTextBox.Value.Value); + bool hasSliderAccuracy = !appliedMods.Value.Any(x => x is OsuModClassic cl && cl.NoSliderHeadAccuracy.Value); + statistics = RulesetHelper.GenerateHitResultsForRuleset(ruleset.Value, hasSliderAccuracy, accuracyTextBox.Value.Value / 100.0, beatmap, missesTextBox.Value.Value, countMeh, countGood, largeTickMissesTextBox.Value.Value, sliderTailMissesTextBox.Value.Value); accuracy = RulesetHelper.GetAccuracyForRuleset(ruleset.Value, statistics); } @@ -700,6 +715,7 @@ namespace PerformanceCalculatorGUI.Screens comboTextBox.Hide(); missesTextBox.Hide(); largeTickMissesTextBox.Hide(); + sliderTailMissesTextBox.Hide(); scoreTextBox.Hide(); if (ruleset.Value.ShortName == "osu" || ruleset.Value.ShortName == "taiko" || ruleset.Value.ShortName == "fruits") @@ -714,6 +730,7 @@ namespace PerformanceCalculatorGUI.Screens if (ruleset.Value.ShortName == "osu") { largeTickMissesTextBox.Show(); + sliderTailMissesTextBox.Show(); } } else if (ruleset.Value.ShortName == "mania") @@ -736,6 +753,7 @@ namespace PerformanceCalculatorGUI.Screens comboTextBox.Show(); missesTextBox.Show(); largeTickMissesTextBox.Show(); + sliderTailMissesTextBox.Show(); scoreTextBox.Text = string.Empty; scoreTextBox.Show(); From a8d74f3fb6d8b6e506f118c860b2fa29550f4254 Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Sun, 13 Oct 2024 12:04:05 +0200 Subject: [PATCH 2/9] Update hasSliderAccuracy statement --- PerformanceCalculatorGUI/Screens/SimulateScreen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs index 3c29337..746a017 100644 --- a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs +++ b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs @@ -677,7 +677,7 @@ namespace PerformanceCalculatorGUI.Screens if (ruleset.Value.OnlineID != -1) { // official rulesets can generate more precise hits from accuracy - bool hasSliderAccuracy = !appliedMods.Value.Any(x => x is OsuModClassic cl && cl.NoSliderHeadAccuracy.Value); + bool hasSliderAccuracy = !appliedMods.Value.OfType().All(m => m.NoSliderHeadAccuracy.Value); statistics = RulesetHelper.GenerateHitResultsForRuleset(ruleset.Value, hasSliderAccuracy, accuracyTextBox.Value.Value / 100.0, beatmap, missesTextBox.Value.Value, countMeh, countGood, largeTickMissesTextBox.Value.Value, sliderTailMissesTextBox.Value.Value); accuracy = RulesetHelper.GetAccuracyForRuleset(ruleset.Value, statistics); From 46761bb4f6522b6a2bf46190f2cd6d9fd1b8afee Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:45:50 +0200 Subject: [PATCH 3/9] pleasing codefilesanity --- PerformanceCalculatorGUI/Screens/SimulateScreen.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs index 746a017..2b29a6f 100644 --- a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs +++ b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs @@ -672,8 +672,6 @@ namespace PerformanceCalculatorGUI.Screens var accuracy = accuracyTextBox.Value.Value / 100.0; Dictionary statistics = new Dictionary(); - - if (ruleset.Value.OnlineID != -1) { // official rulesets can generate more precise hits from accuracy From f57c820e0fbe3ff5604c86fbfcf83c1480b62f06 Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Fri, 18 Oct 2024 21:09:36 +0200 Subject: [PATCH 4/9] Add slider tail hits and large tick misses --- .../Simulate/OsuSimulateCommand.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/PerformanceCalculator/Simulate/OsuSimulateCommand.cs b/PerformanceCalculator/Simulate/OsuSimulateCommand.cs index 1b8b30e..34281fe 100644 --- a/PerformanceCalculator/Simulate/OsuSimulateCommand.cs +++ b/PerformanceCalculator/Simulate/OsuSimulateCommand.cs @@ -3,11 +3,14 @@ using System; using System.Collections.Generic; +using System.Linq; using JetBrains.Annotations; using McMaster.Extensions.CommandLineUtils; using osu.Game.Beatmaps; using osu.Game.Rulesets; using osu.Game.Rulesets.Osu; +using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Scoring; namespace PerformanceCalculator.Simulate @@ -31,6 +34,14 @@ namespace PerformanceCalculator.Simulate [Option(Template = "-C|--percent-combo ", Description = "Percentage of beatmap maximum combo achieved. Alternative to combo option. Enter as decimal 0-100.")] public override double PercentCombo { get; } = 100; + [UsedImplicitly] + [Option(Template = "-L|--large-tick-misses ", Description = "Number of large tick misses. Defaults to 0.")] + private int largeTickMisses { get; } = 0; + + [UsedImplicitly] + [Option(Template = "-S|--slider-tail-misses ", Description = "Number of slider tail misses. Defaults to 0.")] + private int sliderTailMisses { get; } = 0; + public override Ruleset Ruleset => new OsuRuleset(); protected override int GetMaxCombo(IBeatmap beatmap) => beatmap.GetMaxCombo(); @@ -111,11 +122,16 @@ namespace PerformanceCalculator.Simulate countGreat = (int)(totalResultCount - countGood - countMeh - countMiss); } + bool hasSliderAccuracy = !GetMods(Ruleset).OfType().All(m => m.NoSliderHeadAccuracy.Value); + int sliderTailHits = beatmap.HitObjects.Count(x => x is Slider) - sliderTailMisses; + return new Dictionary { { HitResult.Great, countGreat }, { HitResult.Ok, countGood ?? 0 }, { HitResult.Meh, countMeh ?? 0 }, + { HitResult.LargeTickMiss, largeTickMisses }, + { hasSliderAccuracy ? HitResult.SliderTailHit : HitResult.SmallTickHit, sliderTailHits }, { HitResult.Miss, countMiss } }; } From 5454df4e0a9d9de38ae2bc837095db28e15a4b3c Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:36:20 +0200 Subject: [PATCH 5/9] Add large tick misses and slider tail misses parameter --- PerformanceCalculator/Simulate/OsuSimulateCommand.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PerformanceCalculator/Simulate/OsuSimulateCommand.cs b/PerformanceCalculator/Simulate/OsuSimulateCommand.cs index 34281fe..857e5d0 100644 --- a/PerformanceCalculator/Simulate/OsuSimulateCommand.cs +++ b/PerformanceCalculator/Simulate/OsuSimulateCommand.cs @@ -122,16 +122,13 @@ namespace PerformanceCalculator.Simulate countGreat = (int)(totalResultCount - countGood - countMeh - countMiss); } - bool hasSliderAccuracy = !GetMods(Ruleset).OfType().All(m => m.NoSliderHeadAccuracy.Value); - int sliderTailHits = beatmap.HitObjects.Count(x => x is Slider) - sliderTailMisses; - return new Dictionary { { HitResult.Great, countGreat }, { HitResult.Ok, countGood ?? 0 }, { HitResult.Meh, countMeh ?? 0 }, { HitResult.LargeTickMiss, largeTickMisses }, - { hasSliderAccuracy ? HitResult.SliderTailHit : HitResult.SmallTickHit, sliderTailHits }, + { HitResult.SliderTailHit, beatmap.HitObjects.Count(x => x is Slider) - sliderTailMisses }, { HitResult.Miss, countMiss } }; } From 389e0f672182c52866d5e482d506c6659c47acfd Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:54:34 +0200 Subject: [PATCH 6/9] get rid of redundant slider accuracy check --- PerformanceCalculatorGUI/RulesetHelper.cs | 8 ++++---- PerformanceCalculatorGUI/Screens/SimulateScreen.cs | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/PerformanceCalculatorGUI/RulesetHelper.cs b/PerformanceCalculatorGUI/RulesetHelper.cs index 05a9f1a..1529d03 100644 --- a/PerformanceCalculatorGUI/RulesetHelper.cs +++ b/PerformanceCalculatorGUI/RulesetHelper.cs @@ -104,11 +104,11 @@ namespace PerformanceCalculatorGUI return (int)Math.Round(1000000 * scoreMultiplier); } - public static Dictionary GenerateHitResultsForRuleset(RulesetInfo ruleset, bool hasSliderAccuracy, double accuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int countLargeTickMisses, int countSliderTailMisses) + public static Dictionary GenerateHitResultsForRuleset(RulesetInfo ruleset, double accuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int countLargeTickMisses, int countSliderTailMisses) { return ruleset.OnlineID switch { - 0 => generateOsuHitResults(accuracy, hasSliderAccuracy, beatmap, countMiss, countMeh, countGood, countLargeTickMisses, countSliderTailMisses), + 0 => generateOsuHitResults(accuracy, beatmap, countMiss, countMeh, countGood, countLargeTickMisses, countSliderTailMisses), 1 => generateTaikoHitResults(accuracy, beatmap, countMiss, countGood), 2 => generateCatchHitResults(accuracy, beatmap, countMiss, countMeh, countGood), 3 => generateManiaHitResults(accuracy, beatmap, countMiss), @@ -116,7 +116,7 @@ namespace PerformanceCalculatorGUI }; } - private static Dictionary generateOsuHitResults(double accuracy, bool hasSliderAccuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int countLargeTickMisses, int countSliderTailMisses) + private static Dictionary generateOsuHitResults(double accuracy, IBeatmap beatmap, int countMiss, int? countMeh, int? countGood, int countLargeTickMisses, int countSliderTailMisses) { int countGreat; @@ -200,7 +200,7 @@ namespace PerformanceCalculatorGUI { HitResult.Ok, countGood ?? 0 }, { HitResult.Meh, countMeh ?? 0 }, { HitResult.LargeTickMiss, countLargeTickMisses }, - { hasSliderAccuracy ? HitResult.SliderTailHit : HitResult.SmallTickHit, sliderTailHits }, + { HitResult.SliderTailHit, sliderTailHits }, { HitResult.Miss, countMiss } }; } diff --git a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs index 2b29a6f..8431a74 100644 --- a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs +++ b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs @@ -675,8 +675,7 @@ namespace PerformanceCalculatorGUI.Screens if (ruleset.Value.OnlineID != -1) { // official rulesets can generate more precise hits from accuracy - bool hasSliderAccuracy = !appliedMods.Value.OfType().All(m => m.NoSliderHeadAccuracy.Value); - statistics = RulesetHelper.GenerateHitResultsForRuleset(ruleset.Value, hasSliderAccuracy, accuracyTextBox.Value.Value / 100.0, beatmap, missesTextBox.Value.Value, countMeh, countGood, largeTickMissesTextBox.Value.Value, sliderTailMissesTextBox.Value.Value); + statistics = RulesetHelper.GenerateHitResultsForRuleset(ruleset.Value, accuracyTextBox.Value.Value / 100.0, beatmap, missesTextBox.Value.Value, countMeh, countGood, largeTickMissesTextBox.Value.Value, sliderTailMissesTextBox.Value.Value); accuracy = RulesetHelper.GetAccuracyForRuleset(ruleset.Value, statistics); } From e11e23af766578efb4dfcd715377f0876379683d Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Sat, 19 Oct 2024 15:36:10 +0200 Subject: [PATCH 7/9] code quality --- PerformanceCalculator/Simulate/OsuSimulateCommand.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PerformanceCalculator/Simulate/OsuSimulateCommand.cs b/PerformanceCalculator/Simulate/OsuSimulateCommand.cs index 5f16069..10151ee 100644 --- a/PerformanceCalculator/Simulate/OsuSimulateCommand.cs +++ b/PerformanceCalculator/Simulate/OsuSimulateCommand.cs @@ -9,7 +9,6 @@ using McMaster.Extensions.CommandLineUtils; using osu.Game.Beatmaps; using osu.Game.Rulesets; using osu.Game.Rulesets.Osu; -using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Scoring; @@ -36,11 +35,11 @@ namespace PerformanceCalculator.Simulate [UsedImplicitly] [Option(Template = "-L|--large-tick-misses ", Description = "Number of large tick misses. Defaults to 0.")] - private int largeTickMisses { get; } = 0; + private int largeTickMisses { get; } [UsedImplicitly] [Option(Template = "-S|--slider-tail-misses ", Description = "Number of slider tail misses. Defaults to 0.")] - private int sliderTailMisses { get; } = 0; + private int sliderTailMisses { get; } public override Ruleset Ruleset => new OsuRuleset(); From 96653bde0eb5e5a0657a15b314c2f307302d5a13 Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Sat, 19 Oct 2024 19:28:08 +0200 Subject: [PATCH 8/9] show/hide STM and LTM textboxes depending on mods --- .../Screens/SimulateScreen.cs | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs index 8431a74..ae4d2cc 100644 --- a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs +++ b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs @@ -52,6 +52,7 @@ namespace PerformanceCalculatorGUI.Screens private LabelledTextBox beatmapIdTextBox; private SwitchButton beatmapImportTypeSwitch; + private GridContainer missesContainer; private LimitedLabelledNumberBox missesTextBox; private LimitedLabelledNumberBox largeTickMissesTextBox; private LimitedLabelledNumberBox sliderTailMissesTextBox; @@ -265,7 +266,7 @@ namespace PerformanceCalculatorGUI.Screens PlaceholderText = "0", MinValue = 0 }, - new GridContainer + missesContainer = new GridContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, @@ -523,14 +524,36 @@ namespace PerformanceCalculatorGUI.Screens private void modsChanged(ValueChangedEvent> mods) { + void updateMissesTextboxes() + { + if (ruleset.Value.ShortName == "osu") + { + + // Large tick misses and slider tail misses are only relevant in PP if slider head accuracy exists + if (mods.NewValue.OfType().Any(m => m.NoSliderHeadAccuracy.Value)) + { + missesContainer.Content = new[] { new[] { missesTextBox } }; + missesContainer.ColumnDimensions = [new Dimension()]; + } + else + { + missesContainer.Content = new[] { new[] { missesTextBox, largeTickMissesTextBox, sliderTailMissesTextBox } }; + missesContainer.ColumnDimensions = [new Dimension(), new Dimension(), new Dimension()]; + } + } + } + modSettingChangeTracker?.Dispose(); if (working is null) return; + updateMissesTextboxes(); + modSettingChangeTracker = new ModSettingChangeTracker(mods.NewValue); modSettingChangeTracker.SettingChanged += m => { + updateMissesTextboxes(); debouncedStatisticsUpdate?.Cancel(); debouncedStatisticsUpdate = Scheduler.AddDelayed(() => { From 0cb20077b78a615b9af310f604b333bd79519503 Mon Sep 17 00:00:00 2001 From: minisbett <39670899+minisbett@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:50:14 +0200 Subject: [PATCH 9/9] fix code quality --- PerformanceCalculatorGUI/Screens/SimulateScreen.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs index ae4d2cc..786b6de 100644 --- a/PerformanceCalculatorGUI/Screens/SimulateScreen.cs +++ b/PerformanceCalculatorGUI/Screens/SimulateScreen.cs @@ -528,7 +528,6 @@ namespace PerformanceCalculatorGUI.Screens { if (ruleset.Value.ShortName == "osu") { - // Large tick misses and slider tail misses are only relevant in PP if slider head accuracy exists if (mods.NewValue.OfType().Any(m => m.NoSliderHeadAccuracy.Value)) {