// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Rulesets.Catch.Objects; using osu.Game.Rulesets.Catch.UI; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; using osuTK; namespace osu.Game.Rulesets.Catch.Mods { public class CatchModFlashlight : ModFlashlight { public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.12 : 1; public override BindableFloat SizeMultiplier { get; } = new BindableFloat(1) { MinValue = 0.5f, MaxValue = 1.5f, Precision = 0.1f }; public override BindableBool ComboBasedSize { get; } = new BindableBool(true); public override float DefaultFlashlightSize => 325; protected override Flashlight CreateFlashlight() => new CatchFlashlight(this, playfield); private CatchPlayfield playfield = null!; public override void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset) { playfield = (CatchPlayfield)drawableRuleset.Playfield; base.ApplyToDrawableRuleset(drawableRuleset); } private class CatchFlashlight : Flashlight { private readonly CatchPlayfield playfield; public CatchFlashlight(CatchModFlashlight modFlashlight, CatchPlayfield playfield) : base(modFlashlight) { this.playfield = playfield; FlashlightSize = new Vector2(0, GetSizeFor(0)); FlashlightSmoothness = 1.4f; } protected override float GetComboScaleFor(int combo) { if (combo >= 200) return 0.770f; if (combo >= 100) return 0.885f; return 1.0f; } protected override void Update() { base.Update(); FlashlightPosition = playfield.CatcherArea.ToSpaceOfOtherDrawable(playfield.Catcher.DrawPosition, this); } protected override void OnComboChange(ValueChangedEvent e) { this.TransformTo(nameof(FlashlightSize), new Vector2(0, GetSizeFor(e.NewValue)), FLASHLIGHT_FADE_DURATION); } protected override string FragmentShader => "CircularFlashlight"; } } }