diff --git a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
index 5e98025c9a..49594ca969 100644
--- a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
@@ -384,11 +384,11 @@ namespace osu.Game.Beatmaps.Formats
break;
case @"SliderMultiplier":
- difficulty.SliderMultiplier = Parsing.ParseDouble(pair.Value);
+ difficulty.SliderMultiplier = Math.Clamp(Parsing.ParseDouble(pair.Value), 0.4, 3.6);
break;
case @"SliderTickRate":
- difficulty.SliderTickRate = Parsing.ParseDouble(pair.Value);
+ difficulty.SliderTickRate = Math.Clamp(Parsing.ParseDouble(pair.Value), 0.5, 8);
break;
}
}
diff --git a/osu.Game/Localisation/EditorSetupStrings.cs b/osu.Game/Localisation/EditorSetupStrings.cs
index caea3dd130..401411365b 100644
--- a/osu.Game/Localisation/EditorSetupStrings.cs
+++ b/osu.Game/Localisation/EditorSetupStrings.cs
@@ -42,8 +42,7 @@ namespace osu.Game.Localisation
///
/// "If enabled, an "Are you ready? 3, 2, 1, GO!" countdown will be inserted at the beginning of the beatmap, assuming there is enough time to do so."
///
- public static LocalisableString CountdownDescription => new TranslatableString(getKey(@"countdown_description"),
- @"If enabled, an ""Are you ready? 3, 2, 1, GO!"" countdown will be inserted at the beginning of the beatmap, assuming there is enough time to do so.");
+ public static LocalisableString CountdownDescription => new TranslatableString(getKey(@"countdown_description"), @"If enabled, an ""Are you ready? 3, 2, 1, GO!"" countdown will be inserted at the beginning of the beatmap, assuming there is enough time to do so.");
///
/// "Countdown speed"
@@ -53,8 +52,7 @@ namespace osu.Game.Localisation
///
/// "If the countdown sounds off-time, use this to make it appear one or more beats early."
///
- public static LocalisableString CountdownOffsetDescription =>
- new TranslatableString(getKey(@"countdown_offset_description"), @"If the countdown sounds off-time, use this to make it appear one or more beats early.");
+ public static LocalisableString CountdownOffsetDescription => new TranslatableString(getKey(@"countdown_offset_description"), @"If the countdown sounds off-time, use this to make it appear one or more beats early.");
///
/// "Countdown offset"
@@ -69,8 +67,7 @@ namespace osu.Game.Localisation
///
/// "Allows storyboards to use the full screen space, rather than be confined to a 4:3 area."
///
- public static LocalisableString WidescreenSupportDescription =>
- new TranslatableString(getKey(@"widescreen_support_description"), @"Allows storyboards to use the full screen space, rather than be confined to a 4:3 area.");
+ public static LocalisableString WidescreenSupportDescription => new TranslatableString(getKey(@"widescreen_support_description"), @"Allows storyboards to use the full screen space, rather than be confined to a 4:3 area.");
///
/// "Epilepsy warning"
@@ -80,8 +77,7 @@ namespace osu.Game.Localisation
///
/// "Recommended if the storyboard or video contain scenes with rapidly flashing colours."
///
- public static LocalisableString EpilepsyWarningDescription =>
- new TranslatableString(getKey(@"epilepsy_warning_description"), @"Recommended if the storyboard or video contain scenes with rapidly flashing colours.");
+ public static LocalisableString EpilepsyWarningDescription => new TranslatableString(getKey(@"epilepsy_warning_description"), @"Recommended if the storyboard or video contain scenes with rapidly flashing colours.");
///
/// "Letterbox during breaks"
@@ -91,8 +87,7 @@ namespace osu.Game.Localisation
///
/// "Adds horizontal letterboxing to give a cinematic look during breaks."
///
- public static LocalisableString LetterboxDuringBreaksDescription =>
- new TranslatableString(getKey(@"letterbox_during_breaks_description"), @"Adds horizontal letterboxing to give a cinematic look during breaks.");
+ public static LocalisableString LetterboxDuringBreaksDescription => new TranslatableString(getKey(@"letterbox_during_breaks_description"), @"Adds horizontal letterboxing to give a cinematic look during breaks.");
///
/// "Samples match playback rate"
@@ -102,8 +97,7 @@ namespace osu.Game.Localisation
///
/// "When enabled, all samples will speed up or slow down when rate-changing mods are enabled."
///
- public static LocalisableString SamplesMatchPlaybackRateDescription => new TranslatableString(getKey(@"samples_match_playback_rate_description"),
- @"When enabled, all samples will speed up or slow down when rate-changing mods are enabled.");
+ public static LocalisableString SamplesMatchPlaybackRateDescription => new TranslatableString(getKey(@"samples_match_playback_rate_description"), @"When enabled, all samples will speed up or slow down when rate-changing mods are enabled.");
///
/// "The size of all hit objects"
@@ -123,8 +117,17 @@ namespace osu.Game.Localisation
///
/// "The harshness of hit windows and difficulty of special objects (ie. spinners)"
///
- public static LocalisableString OverallDifficultyDescription =>
- new TranslatableString(getKey(@"overall_difficulty_description"), @"The harshness of hit windows and difficulty of special objects (ie. spinners)");
+ public static LocalisableString OverallDifficultyDescription => new TranslatableString(getKey(@"overall_difficulty_description"), @"The harshness of hit windows and difficulty of special objects (ie. spinners)");
+
+ ///
+ /// "Tick Rate"
+ ///
+ public static LocalisableString TickRate => new TranslatableString(getKey(@"tick_rate"), @"Tick Rate");
+
+ ///
+ /// "Determines how many "ticks" are generated within long hit objects. A tick rate of 1 will generate ticks on each beat, 2 would be twice per beat, etc."
+ ///
+ public static LocalisableString TickRateDescription => new TranslatableString(getKey(@"tick_rate_description"), @"Determines how many ""ticks"" are generated within long hit objects. A tick rate of 1 will generate ticks on each beat, 2 would be twice per beat, etc.");
///
/// "Base Velocity"
diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
index 3a3fe7f747..4c062b0cb7 100644
--- a/osu.Game/Screens/Edit/Setup/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -20,6 +20,7 @@ namespace osu.Game.Screens.Edit.Setup
private LabelledSliderBar approachRateSlider = null!;
private LabelledSliderBar overallDifficultySlider = null!;
private LabelledSliderBar baseVelocitySlider = null!;
+ private LabelledSliderBar tickRateSlider = null!;
public override LocalisableString Title => EditorSetupStrings.DifficultyHeader;
@@ -93,6 +94,19 @@ namespace osu.Game.Screens.Edit.Setup
Precision = 0.01f,
}
},
+ tickRateSlider = new LabelledSliderBar
+ {
+ Label = EditorSetupStrings.TickRate,
+ FixedLabelWidth = LABEL_WIDTH,
+ Description = EditorSetupStrings.TickRateDescription,
+ Current = new BindableDouble(Beatmap.Difficulty.SliderTickRate)
+ {
+ Default = 1,
+ MinValue = 1,
+ MaxValue = 4,
+ Precision = 1,
+ }
+ },
};
foreach (var item in Children.OfType>())
@@ -111,6 +125,7 @@ namespace osu.Game.Screens.Edit.Setup
Beatmap.Difficulty.ApproachRate = approachRateSlider.Current.Value;
Beatmap.Difficulty.OverallDifficulty = overallDifficultySlider.Current.Value;
Beatmap.Difficulty.SliderMultiplier = baseVelocitySlider.Current.Value;
+ Beatmap.Difficulty.SliderTickRate = tickRateSlider.Current.Value;
Beatmap.UpdateAllHitObjects();
Beatmap.SaveState();