1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-15 08:13:31 +08:00

Merge pull request #7371 from peppy/lock-difficulty-adjust

Lock user adjusted difficulty settings when changing beatmap
This commit is contained in:
Dan Balasescu 2019-12-27 23:33:30 +09:00 committed by GitHub
commit 965b57dbb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 7 deletions

View File

@ -34,8 +34,8 @@ namespace osu.Game.Rulesets.Catch.Mods
{ {
base.TransferSettings(difficulty); base.TransferSettings(difficulty);
CircleSize.Value = CircleSize.Default = difficulty.CircleSize; TransferSetting(CircleSize, difficulty.CircleSize);
ApproachRate.Value = ApproachRate.Default = difficulty.ApproachRate; TransferSetting(ApproachRate, difficulty.ApproachRate);
} }
protected override void ApplySettings(BeatmapDifficulty difficulty) protected override void ApplySettings(BeatmapDifficulty difficulty)

View File

@ -34,8 +34,8 @@ namespace osu.Game.Rulesets.Osu.Mods
{ {
base.TransferSettings(difficulty); base.TransferSettings(difficulty);
CircleSize.Value = CircleSize.Default = difficulty.CircleSize; TransferSetting(CircleSize, difficulty.CircleSize);
ApproachRate.Value = ApproachRate.Default = difficulty.ApproachRate; TransferSetting(ApproachRate, difficulty.ApproachRate);
} }
protected override void ApplySettings(BeatmapDifficulty difficulty) protected override void ApplySettings(BeatmapDifficulty difficulty)

View File

@ -5,6 +5,7 @@ using osu.Game.Beatmaps;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using System; using System;
using System.Collections.Generic;
using osu.Game.Configuration; using osu.Game.Configuration;
namespace osu.Game.Rulesets.Mods namespace osu.Game.Rulesets.Mods
@ -51,8 +52,8 @@ namespace osu.Game.Rulesets.Mods
{ {
if (this.difficulty == null || this.difficulty.ID != difficulty.ID) if (this.difficulty == null || this.difficulty.ID != difficulty.ID)
{ {
this.difficulty = difficulty;
TransferSettings(difficulty); TransferSettings(difficulty);
this.difficulty = difficulty;
} }
} }
@ -64,8 +65,31 @@ namespace osu.Game.Rulesets.Mods
/// <param name="difficulty">The beatmap's initial values.</param> /// <param name="difficulty">The beatmap's initial values.</param>
protected virtual void TransferSettings(BeatmapDifficulty difficulty) protected virtual void TransferSettings(BeatmapDifficulty difficulty)
{ {
DrainRate.Value = DrainRate.Default = difficulty.DrainRate; TransferSetting(DrainRate, difficulty.DrainRate);
OverallDifficulty.Value = OverallDifficulty.Default = difficulty.OverallDifficulty; TransferSetting(OverallDifficulty, difficulty.OverallDifficulty);
}
private readonly Dictionary<IBindable, bool> userChangedSettings = new Dictionary<IBindable, bool>();
/// <summary>
/// Transfer a setting from <see cref="BeatmapDifficulty"/> to a configuration bindable.
/// Only performs the transfer if the user it not currently overriding..
/// </summary>
protected void TransferSetting<T>(BindableNumber<T> bindable, T beatmapDefault)
where T : struct, IComparable<T>, IConvertible, IEquatable<T>
{
bindable.UnbindEvents();
userChangedSettings.TryAdd(bindable, false);
bindable.Default = beatmapDefault;
// users generally choose a difficulty setting and want it to stick across multiple beatmap changes.
// we only want to value transfer if the user hasn't changed the value previously.
if (!userChangedSettings[bindable])
bindable.Value = beatmapDefault;
bindable.ValueChanged += _ => userChangedSettings[bindable] = !bindable.IsDefault;
} }
/// <summary> /// <summary>