diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index a0e1d9ddc4..713166a9a0 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -20,6 +20,7 @@ using osu.Game.Input;
using osu.Game.Input.Bindings;
using osu.Game.Localisation;
using osu.Game.Overlays;
+using osu.Game.Overlays.Mods.Input;
using osu.Game.Rulesets.Scoring;
using osu.Game.Screens.Select;
using osu.Game.Screens.Select.Filter;
@@ -47,6 +48,7 @@ namespace osu.Game.Configuration
SetDefault(OsuSetting.SongSelectSortingMode, SortMode.Title);
SetDefault(OsuSetting.RandomSelectAlgorithm, RandomSelectAlgorithm.RandomPermutation);
+ SetDefault(OsuSetting.ModSelectHotkeyStyle, ModSelectHotkeyStyle.Sequential);
SetDefault(OsuSetting.ChatDisplayHeight, ChatOverlay.DEFAULT_HEIGHT, 0.2f, 1f);
@@ -324,6 +326,7 @@ namespace osu.Game.Configuration
SongSelectGroupingMode,
SongSelectSortingMode,
RandomSelectAlgorithm,
+ ModSelectHotkeyStyle,
ShowFpsDisplay,
ChatDisplayHeight,
BeatmapListingCardSize,
diff --git a/osu.Game/Localisation/UserInterfaceStrings.cs b/osu.Game/Localisation/UserInterfaceStrings.cs
index 4e7af99ce9..a007f760d8 100644
--- a/osu.Game/Localisation/UserInterfaceStrings.cs
+++ b/osu.Game/Localisation/UserInterfaceStrings.cs
@@ -106,6 +106,11 @@ namespace osu.Game.Localisation
///
public static LocalisableString RandomSelectionAlgorithm => new TranslatableString(getKey(@"random_selection_algorithm"), @"Random selection algorithm");
+ ///
+ /// "Mod select hotkey style"
+ ///
+ public static LocalisableString ModSelectHotkeyStyle => new TranslatableString(getKey(@"mod_select_hotkey_style"), @"Mod select hotkey style");
+
///
/// "no limit"
///
diff --git a/osu.Game/Overlays/Mods/Input/ModSelectHotkeyStyle.cs b/osu.Game/Overlays/Mods/Input/ModSelectHotkeyStyle.cs
new file mode 100644
index 0000000000..6375b37f8b
--- /dev/null
+++ b/osu.Game/Overlays/Mods/Input/ModSelectHotkeyStyle.cs
@@ -0,0 +1,27 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Game.Rulesets.Mods;
+
+namespace osu.Game.Overlays.Mods.Input
+{
+ ///
+ /// The style of hotkey handling to use on the mod select screen.
+ ///
+ public enum ModSelectHotkeyStyle
+ {
+ ///
+ /// Each letter row on the keyboard controls one of the three first s.
+ /// Individual letters in a row trigger the mods in a sequential fashion.
+ /// Uses .
+ ///
+ Sequential,
+
+ ///
+ /// Matches keybindings from stable 1:1.
+ /// One keybinding can toggle between what used to be s on stable,
+ /// and some mods in a column may not have any hotkeys at all.
+ ///
+ Classic
+ }
+}
diff --git a/osu.Game/Overlays/Settings/Sections/UserInterface/SongSelectSettings.cs b/osu.Game/Overlays/Settings/Sections/UserInterface/SongSelectSettings.cs
index 8cec7bbb30..507e116723 100644
--- a/osu.Game/Overlays/Settings/Sections/UserInterface/SongSelectSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/UserInterface/SongSelectSettings.cs
@@ -11,6 +11,7 @@ using osu.Framework.Localisation;
using osu.Game.Configuration;
using osu.Game.Graphics.UserInterface;
using osu.Game.Localisation;
+using osu.Game.Overlays.Mods.Input;
namespace osu.Game.Overlays.Settings.Sections.UserInterface
{
@@ -61,6 +62,12 @@ namespace osu.Game.Overlays.Settings.Sections.UserInterface
{
LabelText = UserInterfaceStrings.RandomSelectionAlgorithm,
Current = config.GetBindable(OsuSetting.RandomSelectAlgorithm),
+ },
+ new SettingsEnumDropdown
+ {
+ LabelText = UserInterfaceStrings.ModSelectHotkeyStyle,
+ Current = config.GetBindable(OsuSetting.ModSelectHotkeyStyle),
+ ClassicDefault = ModSelectHotkeyStyle.Classic
}
};
}