2023-07-21 17:52:19 +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 osu.Framework.Allocation ;
2023-07-22 22:10:58 +08:00
using osu.Framework.Bindables ;
2024-06-11 17:30:20 +08:00
using osu.Framework.Extensions ;
using osu.Framework.Graphics ;
using osu.Framework.Localisation ;
using osu.Game.Beatmaps ;
using osu.Game.Graphics.UserInterfaceV2 ;
using osu.Game.Localisation ;
2023-07-21 17:52:19 +08:00
using osu.Game.Resources.Localisation.Web ;
2024-06-11 17:30:20 +08:00
using osu.Game.Screens.Edit ;
2023-07-21 17:52:19 +08:00
using osu.Game.Screens.Edit.Setup ;
namespace osu.Game.Rulesets.Mania.Edit.Setup
{
2024-06-11 17:30:20 +08:00
public partial class ManiaDifficultySection : SetupSection
2023-07-21 17:52:19 +08:00
{
2024-06-11 17:30:20 +08:00
public override LocalisableString Title = > EditorSetupStrings . DifficultyHeader ;
2024-08-28 18:17:39 +08:00
private FormSliderBar < float > keyCountSlider { get ; set ; } = null ! ;
private FormCheckBox specialStyle { get ; set ; } = null ! ;
private FormSliderBar < float > healthDrainSlider { get ; set ; } = null ! ;
private FormSliderBar < float > overallDifficultySlider { get ; set ; } = null ! ;
private FormSliderBar < double > baseVelocitySlider { get ; set ; } = null ! ;
private FormSliderBar < double > tickRateSlider { get ; set ; } = null ! ;
2024-06-11 17:30:20 +08:00
[Resolved]
2024-06-12 11:23:56 +08:00
private Editor ? editor { get ; set ; }
2024-06-11 17:30:20 +08:00
[Resolved]
2024-06-12 11:23:56 +08:00
private IEditorChangeHandler ? changeHandler { get ; set ; }
2024-06-11 17:30:20 +08:00
2023-07-21 17:52:19 +08:00
[BackgroundDependencyLoader]
private void load ( )
{
2024-06-11 17:30:20 +08:00
Children = new Drawable [ ]
{
2024-08-28 18:17:39 +08:00
keyCountSlider = new FormSliderBar < float >
2024-06-11 17:30:20 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsCsMania ,
HintText = "The number of columns in the beatmap" ,
2024-06-11 17:30:20 +08:00
Current = new BindableFloat ( Beatmap . Difficulty . CircleSize )
{
Default = BeatmapDifficulty . DEFAULT_DIFFICULTY ,
MinValue = 0 ,
MaxValue = 10 ,
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-06-11 17:30:20 +08:00
} ,
2024-08-28 18:17:39 +08:00
specialStyle = new FormCheckBox
2024-07-10 20:42:11 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = "Use special (N+1) style" ,
HintText = "Changes one column to act as a classic \"scratch\" or \"special\" column, which can be moved around by the user's skin (to the left/right/centre). Generally used in 6K (5+1) or 8K (7+1) configurations." ,
2024-07-10 20:42:11 +08:00
Current = { Value = Beatmap . BeatmapInfo . SpecialStyle }
} ,
2024-08-28 18:17:39 +08:00
healthDrainSlider = new FormSliderBar < float >
2024-06-11 17:30:20 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsDrain ,
HintText = EditorSetupStrings . DrainRateDescription ,
2024-06-11 17:30:20 +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-06-11 17:30:20 +08:00
} ,
2024-08-28 18:17:39 +08:00
overallDifficultySlider = new FormSliderBar < float >
2024-06-11 17:30:20 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = BeatmapsetsStrings . ShowStatsAccuracy ,
HintText = EditorSetupStrings . OverallDifficultyDescription ,
2024-06-11 17:30:20 +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-06-11 17:30:20 +08:00
} ,
2024-08-28 18:17:39 +08:00
baseVelocitySlider = new FormSliderBar < double >
2024-06-11 17:30:20 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = EditorSetupStrings . BaseVelocity ,
HintText = EditorSetupStrings . BaseVelocityDescription ,
2024-06-11 17:30:20 +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-06-11 17:30:20 +08:00
} ,
2024-08-28 18:17:39 +08:00
tickRateSlider = new FormSliderBar < double >
2024-06-11 17:30:20 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = EditorSetupStrings . TickRate ,
HintText = EditorSetupStrings . TickRateDescription ,
2024-06-11 17:30:20 +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-06-11 17:30:20 +08:00
} ,
} ;
keyCountSlider . Current . BindValueChanged ( updateKeyCount ) ;
healthDrainSlider . Current . BindValueChanged ( _ = > updateValues ( ) ) ;
overallDifficultySlider . Current . BindValueChanged ( _ = > updateValues ( ) ) ;
baseVelocitySlider . Current . BindValueChanged ( _ = > updateValues ( ) ) ;
tickRateSlider . Current . BindValueChanged ( _ = > updateValues ( ) ) ;
}
2024-06-11 17:31:49 +08:00
private bool updatingKeyCount ;
2024-06-11 17:30:20 +08:00
private void updateKeyCount ( ValueChangedEvent < float > keyCount )
{
2024-06-11 17:31:49 +08:00
if ( updatingKeyCount ) return ;
2024-06-12 11:23:56 +08:00
updateValues ( ) ;
if ( editor = = null ) return ;
2024-06-11 17:31:49 +08:00
updatingKeyCount = true ;
editor . Reload ( ) . ContinueWith ( t = >
{
if ( ! t . GetResultSafely ( ) )
{
Schedule ( ( ) = >
{
2024-06-12 11:23:56 +08:00
changeHandler ! . RestoreState ( - 1 ) ;
2024-06-11 17:31:49 +08:00
Beatmap . Difficulty . CircleSize = keyCountSlider . Current . Value = keyCount . OldValue ;
updatingKeyCount = false ;
} ) ;
}
else
{
updatingKeyCount = false ;
}
} ) ;
2024-06-11 17:30:20 +08:00
}
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 = keyCountSlider . Current . Value ;
2024-07-10 20:42:11 +08:00
Beatmap . BeatmapInfo . SpecialStyle = specialStyle . Current . Value ;
2024-06-11 17:30:20 +08:00
Beatmap . Difficulty . DrainRate = healthDrainSlider . Current . Value ;
Beatmap . Difficulty . OverallDifficulty = overallDifficultySlider . Current . Value ;
Beatmap . Difficulty . SliderMultiplier = baseVelocitySlider . Current . Value ;
Beatmap . Difficulty . SliderTickRate = tickRateSlider . Current . Value ;
Beatmap . UpdateAllHitObjects ( ) ;
Beatmap . SaveState ( ) ;
2023-07-21 17:52:19 +08:00
}
}
}