Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement new osu! mod Bloom #30299

Merged
merged 13 commits into from
Nov 15, 2024
Merged
85 changes: 85 additions & 0 deletions osu.Game.Rulesets.Osu/Mods/OsuModBloom.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System;
using osu.Framework.Bindables;
using osu.Framework.Localisation;
using osu.Framework.Utils;
using osu.Game.Configuration;
using osu.Game.Graphics.UserInterface;
using osu.Game.Overlays.Settings;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu.UI.Cursor;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
using osu.Game.Scoring;
using osu.Game.Screens.Play;

namespace osu.Game.Rulesets.Osu.Mods
{
public class OsuModBloom : Mod, IApplicableToScoreProcessor, IUpdatableByPlayfield, IApplicableToPlayer
{
public override string Name => "Bloom";
public override string Acronym => "BM";
public override ModType Type => ModType.Fun;
public override LocalisableString Description => "The cursor blooms into.. a larger cursor!";
public override double ScoreMultiplier => 1;
protected const float MIN_SIZE = 1;
protected const float TRANSITION_DURATION = 100;
public override Type[] IncompatibleMods => new[] { typeof(OsuModFlashlight), typeof(OsuModNoScope), typeof(ModTouchDevice) };

protected readonly BindableNumber<int> CurrentCombo = new BindableInt();
protected readonly IBindable<bool> IsBreakTime = new Bindable<bool>();

private float currentSize;

[SettingSource(
"Max size at combo",
"The combo count at which the cursor reaches its maximum size",
SettingControlType = typeof(SettingsSlider<int, RoundedSliderBar<int>>)
)]
public BindableInt MaxSizeComboCount { get; } = new BindableInt(50)
{
MinValue = 5,
MaxValue = 100,
};

[SettingSource(
"Final size multiplier",
"The multiplier applied to cursor size when combo reaches maximum",
SettingControlType = typeof(SettingsSlider<float, RoundedSliderBar<float>>)
)]
public BindableFloat MaxCursorSize { get; } = new BindableFloat(10f)
{
MinValue = 5f,
MaxValue = 15f,
Precision = 0.5f,
};

public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank;

public void ApplyToPlayer(Player player)
{
IsBreakTime.BindTo(player.IsBreakTime);
}

public void ApplyToScoreProcessor(ScoreProcessor scoreProcessor)
{
CurrentCombo.BindTo(scoreProcessor.Combo);
CurrentCombo.BindValueChanged(combo =>
{
currentSize = Math.Clamp(MaxCursorSize.Value * ((float)combo.NewValue / MaxSizeComboCount.Value), MIN_SIZE, MaxCursorSize.Value);
}, true);
}

public void Update(Playfield playfield)
{
OsuCursor cursor = (OsuCursor)(playfield.Cursor!.ActiveCursor);

if (IsBreakTime.Value)
cursor.ModScaleAdjust.Value = 1;
else
cursor.ModScaleAdjust.Value = (float)Interpolation.Lerp(cursor.ModScaleAdjust.Value, currentSize, Math.Clamp(cursor.Time.Elapsed / TRANSITION_DURATION, 0, 1));
}
}
}
2 changes: 1 addition & 1 deletion osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Mods
public partial class OsuModFlashlight : ModFlashlight<OsuHitObject>, IApplicableToDrawableHitObject
{
public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.12 : 1;
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(OsuModBlinds)).ToArray();
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModBloom), typeof(OsuModBlinds) }).ToArray();

private const double default_follow_delay = 120;

Expand Down
2 changes: 2 additions & 0 deletions osu.Game.Rulesets.Osu/Mods/OsuModNoScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public class OsuModNoScope : ModNoScope, IUpdatableByPlayfield, IApplicableToBea
{
public override LocalisableString Description => "Where's the cursor?";

public override Type[] IncompatibleMods => new[] { typeof(OsuModBloom) };

private PeriodTracker spinnerPeriods = null!;

public override BindableInt HiddenComboCount { get; } = new BindableInt(10)
Expand Down
2 changes: 1 addition & 1 deletion osu.Game.Rulesets.Osu/Mods/OsuModTouchDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Osu.Mods
{
public class OsuModTouchDevice : ModTouchDevice
{
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAutopilot) }).ToArray();
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAutopilot), typeof(OsuModBloom) }).ToArray();
public override bool Ranked => UsesDefaultConfiguration;
}
}
3 changes: 2 additions & 1 deletion osu.Game.Rulesets.Osu/OsuRuleset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,8 @@ public override IEnumerable<Mod> GetModsFor(ModType type)
new OsuModFreezeFrame(),
new OsuModBubbles(),
new OsuModSynesthesia(),
new OsuModDepth()
new OsuModDepth(),
new OsuModBloom()
};

case ModType.System:
Expand Down
9 changes: 8 additions & 1 deletion osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ public partial class OsuCursor : SkinReloadableDrawable

public IBindable<float> CursorScale => cursorScale;

/// <summary>
/// Mods which want to adjust cursor size should do so via this bindable.
/// </summary>
public readonly Bindable<float> ModScaleAdjust = new Bindable<float>(1);

private readonly Bindable<float> cursorScale = new BindableFloat(1);

private Bindable<float> userCursorScale = null!;
Expand Down Expand Up @@ -67,6 +72,8 @@ private void load()
autoCursorScale = config.GetBindable<bool>(OsuSetting.AutoCursorSize);
autoCursorScale.ValueChanged += _ => cursorScale.Value = CalculateCursorScale();

ModScaleAdjust.ValueChanged += _ => cursorScale.Value = CalculateCursorScale();

cursorScale.BindValueChanged(e => cursorScaleContainer.Scale = new Vector2(e.NewValue), true);
}

Expand All @@ -90,7 +97,7 @@ protected override void LoadComplete()

protected virtual float CalculateCursorScale()
{
float scale = userCursorScale.Value;
float scale = userCursorScale.Value * ModScaleAdjust.Value;

if (autoCursorScale.Value && state != null)
{
Expand Down
Loading