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)
+ },
};
}