diff --git a/osu-framework b/osu-framework index fa44e5a47e..7146c07159 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit fa44e5a47e20956b12e598e85159a1a25b500b3c +Subproject commit 7146c07159d2cf3d07a8d371fa50ef8b200ba038 diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 14f83ed11f..43b0456973 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -50,6 +50,7 @@ namespace osu.Game.Configuration Set(OsuSetting.MenuCursorSize, 1.0, 0.5f, 2); Set(OsuSetting.GameplayCursorSize, 1.0, 0.5f, 2); + Set(OsuSetting.AutoCursorSize, false); Set(OsuSetting.MouseDisableButtons, false); Set(OsuSetting.MouseDisableWheel, false); @@ -86,6 +87,7 @@ namespace osu.Game.Configuration Token, MenuCursorSize, GameplayCursorSize, + AutoCursorSize, DimLevel, KeyOverlay, ShowInterface, diff --git a/osu.Game/Database/BeatmapDifficulty.cs b/osu.Game/Database/BeatmapDifficulty.cs index 7c9f47e7b6..cf1305f705 100644 --- a/osu.Game/Database/BeatmapDifficulty.cs +++ b/osu.Game/Database/BeatmapDifficulty.cs @@ -7,12 +7,17 @@ namespace osu.Game.Database { public class BeatmapDifficulty { + /// + /// The default value used for all difficulty settings except and . + /// + public const float DEFAULT_DIFFICULTY = 5; + [PrimaryKey, AutoIncrement] public int ID { get; set; } - public float DrainRate { get; set; } = 5; - public float CircleSize { get; set; } = 5; - public float OverallDifficulty { get; set; } = 5; - public float ApproachRate { get; set; } = 5; + public float DrainRate { get; set; } = DEFAULT_DIFFICULTY; + public float CircleSize { get; set; } = DEFAULT_DIFFICULTY; + public float OverallDifficulty { get; set; } = DEFAULT_DIFFICULTY; + public float ApproachRate { get; set; } = DEFAULT_DIFFICULTY; public float SliderMultiplier { get; set; } = 1; public float SliderTickRate { get; set; } = 1; diff --git a/osu.Game/Graphics/Cursor/GameplayCursor.cs b/osu.Game/Graphics/Cursor/GameplayCursor.cs index dcdbe675b4..801fe1d011 100644 --- a/osu.Game/Graphics/Cursor/GameplayCursor.cs +++ b/osu.Game/Graphics/Cursor/GameplayCursor.cs @@ -11,7 +11,9 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; +using osu.Game.Beatmaps; using osu.Game.Configuration; +using osu.Game.Database; namespace osu.Game.Graphics.Cursor { @@ -41,7 +43,10 @@ namespace osu.Game.Graphics.Cursor public class OsuCursor : Container { private Container cursorContainer; + private Bindable cursorScale; + private Bindable autoCursorScale; + private Bindable beatmap; public OsuCursor() { @@ -50,7 +55,7 @@ namespace osu.Game.Graphics.Cursor } [BackgroundDependencyLoader] - private void load(OsuConfigManager config) + private void load(OsuConfigManager config, OsuGameBase game) { Children = new Drawable[] { @@ -114,9 +119,29 @@ namespace osu.Game.Graphics.Cursor }, }; + beatmap = game.Beatmap.GetBoundCopy(); + beatmap.ValueChanged += v => calculateScale(); + cursorScale = config.GetBindable(OsuSetting.GameplayCursorSize); - cursorScale.ValueChanged += newScale => cursorContainer.Scale = new Vector2((float)cursorScale); - cursorScale.TriggerChange(); + cursorScale.ValueChanged += v => calculateScale(); + + autoCursorScale = config.GetBindable(OsuSetting.AutoCursorSize); + autoCursorScale.ValueChanged += v => calculateScale(); + + calculateScale(); + } + + private void calculateScale() + { + float scale = (float)cursorScale.Value; + + if (autoCursorScale && beatmap.Value != null) + { + // if we have a beatmap available, let's get its circle size to figure out an automatic cursor scale modifier. + scale *= (float)(1 - 0.7 * (1 + beatmap.Value.BeatmapInfo.Difficulty.CircleSize - BeatmapDifficulty.DEFAULT_DIFFICULTY) / BeatmapDifficulty.DEFAULT_DIFFICULTY); + } + + cursorContainer.Scale = new Vector2(scale); } } } diff --git a/osu.Game/Overlays/Settings/Sections/SkinSection.cs b/osu.Game/Overlays/Settings/Sections/SkinSection.cs index 46bc899499..4b4426aca8 100644 --- a/osu.Game/Overlays/Settings/Sections/SkinSection.cs +++ b/osu.Game/Overlays/Settings/Sections/SkinSection.cs @@ -31,6 +31,11 @@ namespace osu.Game.Overlays.Settings.Sections LabelText = "Gameplay cursor size", Bindable = config.GetBindable(OsuSetting.GameplayCursorSize) }, + new SettingsCheckbox + { + LabelText = "Adjust gameplay cursor size based on current beatmap", + Bindable = config.GetBindable(OsuSetting.AutoCursorSize) + }, }; }