diff --git a/osu.Game/Rulesets/Edit/PlacementBlueprint.cs b/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
index 551e557599..a0a04c13d0 100644
--- a/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
+++ b/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
@@ -32,6 +32,11 @@ namespace osu.Game.Rulesets.Edit
///
public PlacementState PlacementActive { get; private set; }
+ ///
+ /// Whether the sample bank should be taken from the previous hit object.
+ ///
+ public bool AutomaticBankAssignment;
+
///
/// The that is being placed.
///
@@ -86,11 +91,6 @@ namespace osu.Game.Rulesets.Edit
/// Whether this call is committing a value for HitObject.StartTime and continuing with further adjustments.
protected void BeginPlacement(bool commitStart = false)
{
- // Take the hitnormal sample of the last hit object
- var lastHitNormal = getPreviousHitObject()?.Samples?.FirstOrDefault(o => o.Name == HitSampleInfo.HIT_NORMAL);
- if (lastHitNormal != null)
- HitObject.Samples[0] = lastHitNormal;
-
placementHandler.BeginPlacement(HitObject);
if (commitStart)
PlacementActive = PlacementState.Active;
@@ -155,6 +155,14 @@ namespace osu.Game.Rulesets.Edit
if (HitObject is IHasComboInformation comboInformation)
comboInformation.UpdateComboInformation(getPreviousHitObject() as IHasComboInformation);
}
+
+ if (AutomaticBankAssignment)
+ {
+ // Take the hitnormal sample of the last hit object
+ var lastHitNormal = getPreviousHitObject()?.Samples?.FirstOrDefault(o => o.Name == HitSampleInfo.HIT_NORMAL);
+ if (lastHitNormal != null)
+ HitObject.Samples[0] = lastHitNormal;
+ }
}
///
diff --git a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
index d2dd83eb1a..25babae6ff 100644
--- a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
@@ -201,6 +201,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
if (CurrentPlacement == null) return;
+ if (bankName == EditorSelectionHandler.HIT_BANK_AUTO)
+ CurrentPlacement.AutomaticBankAssignment = state == TernaryState.True;
if (state == TernaryState.True)
CurrentPlacement.HitObject.Samples = CurrentPlacement.HitObject.Samples.Select(s => s.With(newBank: bankName)).ToList();
}
diff --git a/osu.Game/Screens/Edit/Compose/Components/EditorSelectionHandler.cs b/osu.Game/Screens/Edit/Compose/Components/EditorSelectionHandler.cs
index fa3a4cddaa..dc7e12ea93 100644
--- a/osu.Game/Screens/Edit/Compose/Components/EditorSelectionHandler.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/EditorSelectionHandler.cs
@@ -21,6 +21,12 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
public partial class EditorSelectionHandler : SelectionHandler
{
+ ///
+ /// A special bank name that is only used in the editor UI.
+ /// When selected and in placement mode, the bank of the last hit object will always be used.
+ ///
+ public const string HIT_BANK_AUTO = "auto";
+
[Resolved]
protected EditorBeatmap EditorBeatmap { get; private set; }
@@ -59,7 +65,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
///
private void createStateBindables()
{
- foreach (string bankName in HitSampleInfo.AllBanks)
+ foreach (string bankName in HitSampleInfo.AllBanks.Prepend(HIT_BANK_AUTO))
{
var bindable = new Bindable
{
@@ -100,6 +106,14 @@ namespace osu.Game.Screens.Edit.Compose.Components
}
else
{
+ // Auto should just not apply if there's a selection already made.
+ // Maybe we could make it a disabled button in the future, but right now the editor buttons don't support disabled state.
+ if (bankName == HIT_BANK_AUTO)
+ {
+ bindable.Value = TernaryState.False;
+ break;
+ }
+
AddSampleBank(bankName);
}