diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModGhost.cs b/osu.Game.Rulesets.Osu/Mods/OsuModGhost.cs new file mode 100644 index 0000000000..d371686d10 --- /dev/null +++ b/osu.Game.Rulesets.Osu/Mods/OsuModGhost.cs @@ -0,0 +1,67 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Rulesets.UI; +using osu.Game.Rulesets.Mods; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Bindables; +using osu.Framework.Localisation; +using osu.Game.Graphics.UserInterface; +using osu.Game.Configuration; +using osu.Game.Overlays.Settings; +using osu.Game.Rulesets.Scoring; +using osu.Game.Scoring; + +namespace osu.Game.Rulesets.Osu.Mods +{ + public class OsuModGhost : Mod, IUpdatableByPlayfield, IApplicableToScoreProcessor + { + public override string Name => "Ghost"; + public override string Acronym => "G"; + public override ModType Type => ModType.Fun; + public override IconUsage? Icon => FontAwesome.Solid.Ghost; + public override string Description => "Where's the cursor?"; + public override double ScoreMultiplier => 1; + + private readonly BindableNumber ghostAlpha = new BindableFloat(0); + private BindableNumber currentCombo; + + [SettingSource( + "Hidden at combo", + "The combo count at which the cursor becomes completely hidden", + SettingControlType = typeof(SettingsSlider) + )] + public BindableInt HiddenComboCount { get; } = new BindableInt + { + Default = 10, + Value = 10, + MinValue = 0, + MaxValue = 50, + }; + + public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank; + public void ApplyToScoreProcessor(ScoreProcessor scoreProcessor) + { + currentCombo = scoreProcessor.Combo.GetBoundCopy(); + currentCombo.BindValueChanged(combo => + { + float dimFactor = HiddenComboCount.Value == 0 ? 1 : (float)combo.NewValue / HiddenComboCount.Value; + + scoreProcessor.TransformBindableTo(ghostAlpha, 1-dimFactor, 100, Easing.OutQuint); + }, true); + } + + + public virtual void Update(Playfield playfield) + { + playfield.Cursor.Alpha = ghostAlpha.Value; + } + + } + + public class HiddenComboSlider : OsuSliderBar + { + public override LocalisableString TooltipText => Current.Value == 0 ? "always hidden" : base.TooltipText; + } +} diff --git a/osu.Game.Rulesets.Osu/OsuRuleset.cs b/osu.Game.Rulesets.Osu/OsuRuleset.cs index f4a93a571d..947ecaae82 100644 --- a/osu.Game.Rulesets.Osu/OsuRuleset.cs +++ b/osu.Game.Rulesets.Osu/OsuRuleset.cs @@ -192,6 +192,7 @@ namespace osu.Game.Rulesets.Osu new OsuModBarrelRoll(), new OsuModApproachDifferent(), new OsuModMuted(), + new OsuModGhost(), }; case ModType.System: