2022-05-24 14:23:44 +00: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 ;
2022-06-09 04:15:15 +00:00
using System.Globalization ;
2022-05-24 14:23:44 +00:00
using System.Linq ;
using osu.Framework.Bindables ;
2023-01-17 08:03:04 +00:00
using osu.Framework.Localisation ;
2022-05-24 14:23:44 +00:00
using osu.Game.Configuration ;
2023-04-26 08:40:25 +00:00
using osu.Game.Localisation.HUD ;
2022-05-24 14:23:44 +00:00
using osu.Game.Overlays.Settings ;
using osu.Game.Rulesets.Scoring ;
using osu.Game.Rulesets.Judgements ;
2023-01-17 08:03:04 +00:00
using osu.Game.Scoring ;
2022-05-24 14:23:44 +00:00
namespace osu.Game.Rulesets.Mods
{
2023-01-17 08:03:04 +00:00
public class ModAccuracyChallenge : ModFailCondition , IApplicableToScoreProcessor
2022-05-24 14:23:44 +00:00
{
public override string Name = > "Accuracy Challenge" ;
2023-01-17 08:03:04 +00:00
2022-05-24 14:23:44 +00:00
public override string Acronym = > "AC" ;
2023-01-17 08:03:04 +00:00
public override LocalisableString Description = > "Fail if your accuracy drops too low!" ;
2022-05-24 14:23:44 +00:00
public override ModType Type = > ModType . DifficultyIncrease ;
2023-01-17 08:03:04 +00:00
2022-05-24 14:23:44 +00:00
public override double ScoreMultiplier = > 1.0 ;
2023-01-17 08:03:04 +00:00
2022-05-25 00:04:57 +00:00
public override Type [ ] IncompatibleMods = > base . IncompatibleMods . Concat ( new [ ] { typeof ( ModEasyWithExtraLives ) , typeof ( ModPerfect ) } ) . ToArray ( ) ;
2023-01-17 08:03:04 +00:00
2022-05-25 00:04:57 +00:00
public override bool RequiresConfiguration = > false ;
2023-01-17 08:03:04 +00:00
2022-06-09 04:15:15 +00:00
public override string SettingDescription = > base . SettingDescription . Replace ( MinimumAccuracy . ToString ( ) , MinimumAccuracy . Value . ToString ( "##%" , NumberFormatInfo . InvariantInfo ) ) ;
2022-05-24 14:23:44 +00:00
2023-03-07 18:43:52 +00:00
[SettingSource("Minimum accuracy", "Trigger a failure if your accuracy goes below this value.", SettingControlType = typeof(SettingsPercentageSlider<double>))]
2022-05-24 14:23:44 +00:00
public BindableNumber < double > MinimumAccuracy { get ; } = new BindableDouble
{
2023-01-24 05:31:46 +00:00
MinValue = 0.60 ,
2023-05-28 00:50:11 +00:00
MaxValue = 0.99 ,
Precision = 0.01 ,
2022-05-24 14:23:44 +00:00
Default = 0.9 ,
Value = 0.9 ,
} ;
2023-05-29 20:12:37 +00:00
[SettingSource("Accuracy mode", "The mode of accuracy that will trigger failure.")]
2023-04-26 08:40:25 +00:00
public Bindable < AccuracyMode > AccuracyJudgeMode { get ; } = new Bindable < AccuracyMode > ( ) ;
2023-01-17 08:03:04 +00:00
2023-04-26 08:40:25 +00:00
private readonly Bindable < double > currentAccuracy = new Bindable < double > ( ) ;
2023-01-17 08:03:04 +00:00
2023-04-26 08:40:25 +00:00
public void ApplyToScoreProcessor ( ScoreProcessor scoreProcessor )
2022-05-24 14:23:44 +00:00
{
2023-04-26 08:40:25 +00:00
switch ( AccuracyJudgeMode . Value )
{
case AccuracyMode . Standard :
currentAccuracy . BindTo ( scoreProcessor . Accuracy ) ;
break ;
case AccuracyMode . MaximumAchievable :
currentAccuracy . BindTo ( scoreProcessor . MaximumAccuracy ) ;
break ;
}
currentAccuracy . BindValueChanged ( s = >
{
if ( s . NewValue < MinimumAccuracy . Value )
{
TriggerFailure ( ) ;
}
} ) ;
2023-01-18 09:08:58 +00:00
}
2023-04-26 08:40:25 +00:00
public ScoreRank AdjustRank ( ScoreRank rank , double accuracy ) = > rank ;
protected override bool FailCondition ( HealthProcessor healthProcessor , JudgementResult result ) = > false ;
2023-01-18 09:08:58 +00:00
2023-04-26 08:40:25 +00:00
public enum AccuracyMode
{
[LocalisableDescription(typeof(GameplayAccuracyCounterStrings), nameof(GameplayAccuracyCounterStrings.AccuracyDisplayModeMax))]
MaximumAchievable ,
2023-05-27 12:27:32 +00:00
[LocalisableDescription(typeof(GameplayAccuracyCounterStrings), nameof(GameplayAccuracyCounterStrings.AccuracyDisplayModeStandard))]
Standard ,
2022-05-24 14:23:44 +00:00
}
}
}