2024-07-10 20:42:11 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System.Linq ;
using osu.Framework.Allocation ;
using osu.Framework.Bindables ;
using osu.Framework.Graphics ;
using osu.Framework.Localisation ;
using osu.Game.Beatmaps ;
using osu.Game.Graphics.UserInterfaceV2 ;
using osu.Game.Localisation ;
using osu.Game.Resources.Localisation.Web ;
using osu.Game.Screens.Edit.Setup ;
namespace osu.Game.Rulesets.Osu.Edit.Setup
{
public partial class OsuDifficultySection : SetupSection
{
2024-08-28 18:17:39 +08:00
private FormSliderBar < float > circleSizeSlider { get ; set ; } = null ! ;
private FormSliderBar < float > healthDrainSlider { get ; set ; } = null ! ;
private FormSliderBar < float > approachRateSlider { get ; set ; } = null ! ;
private FormSliderBar < float > overallDifficultySlider { get ; set ; } = null ! ;
private FormSliderBar < double > baseVelocitySlider { get ; set ; } = null ! ;
private FormSliderBar < double > tickRateSlider { get ; set ; } = null ! ;
private FormSliderBar < float > stackLeniency { get ; set ; } = null ! ;
2024-07-10 20:42:11 +08:00
public override LocalisableString Title = > EditorSetupStrings . DifficultyHeader ;
[BackgroundDependencyLoader]
private void load ( )
{
Children = new Drawable [ ]
{
2024-08-28 18:17:39 +08:00
circleSizeSlider = new FormSliderBar < float >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsCs ,
HintText = EditorSetupStrings . CircleSizeDescription ,
2024-07-10 20:42:11 +08:00
Current = new BindableFloat ( Beatmap . Difficulty . CircleSize )
{
Default = BeatmapDifficulty . DEFAULT_DIFFICULTY ,
MinValue = 0 ,
MaxValue = 10 ,
Precision = 0.1f ,
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
2024-08-28 18:17:39 +08:00
healthDrainSlider = new FormSliderBar < float >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsDrain ,
HintText = EditorSetupStrings . DrainRateDescription ,
2024-07-10 20:42:11 +08:00
Current = new BindableFloat ( Beatmap . Difficulty . DrainRate )
{
Default = BeatmapDifficulty . DEFAULT_DIFFICULTY ,
MinValue = 0 ,
MaxValue = 10 ,
Precision = 0.1f ,
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
2024-08-28 18:17:39 +08:00
approachRateSlider = new FormSliderBar < float >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsAr ,
HintText = EditorSetupStrings . ApproachRateDescription ,
2024-07-10 20:42:11 +08:00
Current = new BindableFloat ( Beatmap . Difficulty . ApproachRate )
{
Default = BeatmapDifficulty . DEFAULT_DIFFICULTY ,
MinValue = 0 ,
MaxValue = 10 ,
Precision = 0.1f ,
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
2024-08-28 18:17:39 +08:00
overallDifficultySlider = new FormSliderBar < float >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsAccuracy ,
HintText = EditorSetupStrings . OverallDifficultyDescription ,
2024-07-10 20:42:11 +08:00
Current = new BindableFloat ( Beatmap . Difficulty . OverallDifficulty )
{
Default = BeatmapDifficulty . DEFAULT_DIFFICULTY ,
MinValue = 0 ,
MaxValue = 10 ,
Precision = 0.1f ,
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
2024-08-28 18:17:39 +08:00
baseVelocitySlider = new FormSliderBar < double >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = EditorSetupStrings . BaseVelocity ,
HintText = EditorSetupStrings . BaseVelocityDescription ,
2024-07-10 20:42:11 +08:00
Current = new BindableDouble ( Beatmap . Difficulty . SliderMultiplier )
{
Default = 1.4 ,
MinValue = 0.4 ,
MaxValue = 3.6 ,
Precision = 0.01f ,
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
2024-08-28 18:17:39 +08:00
tickRateSlider = new FormSliderBar < double >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = EditorSetupStrings . TickRate ,
HintText = EditorSetupStrings . TickRateDescription ,
2024-07-10 20:42:11 +08:00
Current = new BindableDouble ( Beatmap . Difficulty . SliderTickRate )
{
Default = 1 ,
MinValue = 1 ,
MaxValue = 4 ,
Precision = 1 ,
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
2024-08-28 18:17:39 +08:00
stackLeniency = new FormSliderBar < float >
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = "Stack Leniency" ,
HintText = "In play mode, osu! automatically stacks notes which occur at the same location. Increasing this value means it is more likely to snap notes of further time-distance." ,
2024-07-10 20:42:11 +08:00
Current = new BindableFloat ( Beatmap . BeatmapInfo . StackLeniency )
{
Default = 0.7f ,
MinValue = 0 ,
MaxValue = 1 ,
Precision = 0.1f
2024-08-28 18:17:39 +08:00
} ,
2024-10-04 20:03:38 +08:00
TransferValueOnCommit = true ,
2024-08-28 18:17:39 +08:00
TabbableContentContainer = this ,
2024-07-10 20:42:11 +08:00
} ,
} ;
2024-08-28 18:17:39 +08:00
foreach ( var item in Children . OfType < FormSliderBar < float > > ( ) )
2024-07-10 20:42:11 +08:00
item . Current . ValueChanged + = _ = > updateValues ( ) ;
2024-08-28 18:17:39 +08:00
foreach ( var item in Children . OfType < FormSliderBar < double > > ( ) )
2024-07-10 20:42:11 +08:00
item . Current . ValueChanged + = _ = > updateValues ( ) ;
}
private void updateValues ( )
{
// for now, update these on commit rather than making BeatmapMetadata bindables.
// after switching database engines we can reconsider if switching to bindables is a good direction.
Beatmap . Difficulty . CircleSize = circleSizeSlider . Current . Value ;
Beatmap . Difficulty . DrainRate = healthDrainSlider . Current . Value ;
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 . BeatmapInfo . StackLeniency = stackLeniency . Current . Value ;
Beatmap . UpdateAllHitObjects ( ) ;
Beatmap . SaveState ( ) ;
}
}
}