Skip to content

Commit

Permalink
Merge pull request #24662 from frenzibyte/stable-spinner-ticks-2
Browse files Browse the repository at this point in the history
Add two spins gap before awarding bonus score on osu! spinners
  • Loading branch information
peppy committed Sep 12, 2023
2 parents 3aca295 + e810abf commit 2bc6759
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
2 changes: 1 addition & 1 deletion osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ private void updateBonusScore()
tick.TriggerResult(true);

if (tick is DrawableSpinnerBonusTick)
gainedBonus.Value = score_per_tick * (spins - HitObject.SpinsRequired);
gainedBonus.Value = score_per_tick * (spins - HitObject.SpinsRequiredForBonus);
}

completedFullSpins++;
Expand Down
16 changes: 13 additions & 3 deletions osu.Game.Rulesets.Osu/Objects/Spinner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ public double EndTime
/// </summary>
public int SpinsRequired { get; protected set; } = 1;

/// <summary>
/// The number of spins required to start receiving bonus score. The first bonus is awarded on this spin count.
/// </summary>
public int SpinsRequiredForBonus => SpinsRequired + bonus_spins_gap;

/// <summary>
/// The gap between spinner completion and the first bonus-awarding spin.
/// </summary>
private const int bonus_spins_gap = 2;

/// <summary>
/// Number of spins available to give bonus, beyond <see cref="SpinsRequired"/>.
/// </summary>
Expand All @@ -48,22 +58,22 @@ protected override void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, I
double minimumRotationsPerSecond = IBeatmapDifficultyInfo.DifficultyRange(difficulty.OverallDifficulty, 1.5, 2.5, 3.75);

SpinsRequired = (int)(secondsDuration * minimumRotationsPerSecond);
MaximumBonusSpins = (int)((maximum_rotations_per_second - minimumRotationsPerSecond) * secondsDuration);
MaximumBonusSpins = (int)((maximum_rotations_per_second - minimumRotationsPerSecond) * secondsDuration) - bonus_spins_gap;
}

protected override void CreateNestedHitObjects(CancellationToken cancellationToken)
{
base.CreateNestedHitObjects(cancellationToken);

int totalSpins = MaximumBonusSpins + SpinsRequired;
int totalSpins = MaximumBonusSpins + SpinsRequired + bonus_spins_gap;

for (int i = 0; i < totalSpins; i++)
{
cancellationToken.ThrowIfCancellationRequested();

double startTime = StartTime + (float)(i + 1) / totalSpins * Duration;

AddNested(i < SpinsRequired
AddNested(i < SpinsRequiredForBonus
? new SpinnerTick { StartTime = startTime, SpinnerDuration = Duration }
: new SpinnerBonusTick { StartTime = startTime, SpinnerDuration = Duration, Samples = new[] { CreateHitSampleInfo("spinnerbonus") } });
}
Expand Down

0 comments on commit 2bc6759

Please sign in to comment.