diff --git a/osu.Android.props b/osu.Android.props
index 924e9c4a16..e5fed09c07 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
index 854fc4c91c..a438dc8be4 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
@@ -14,8 +14,8 @@ using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Osu.Judgements;
using osu.Game.Rulesets.Osu.Objects.Drawables.Pieces;
using osu.Game.Rulesets.Scoring;
-using osuTK;
using osu.Game.Skinning;
+using osuTK;
namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
diff --git a/osu.Game.Rulesets.Osu/Skinning/LegacyMainCirclePiece.cs b/osu.Game.Rulesets.Osu/Skinning/LegacyMainCirclePiece.cs
index e7486ef9b0..0ab3e8825b 100644
--- a/osu.Game.Rulesets.Osu/Skinning/LegacyMainCirclePiece.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/LegacyMainCirclePiece.cs
@@ -14,6 +14,7 @@ using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Skinning;
using osuTK;
using osuTK.Graphics;
+using static osu.Game.Skinning.LegacySkinConfiguration;
namespace osu.Game.Rulesets.Osu.Skinning
{
@@ -28,53 +29,67 @@ namespace osu.Game.Rulesets.Osu.Skinning
Size = new Vector2(OsuHitObject.OBJECT_RADIUS * 2);
}
+ private Container circleSprites;
+ private Sprite hitCircleSprite;
+ private Sprite hitCircleOverlay;
+
+ private SkinnableSpriteText hitCircleText;
+
private readonly IBindable state = new Bindable();
private readonly Bindable accentColour = new Bindable();
private readonly IBindable indexInCurrentCombo = new Bindable();
+ [Resolved]
+ private ISkinSource skin { get; set; }
+
[BackgroundDependencyLoader]
- private void load(DrawableHitObject drawableObject, ISkinSource skin)
+ private void load(DrawableHitObject drawableObject)
{
OsuHitObject osuObject = (OsuHitObject)drawableObject.HitObject;
- Sprite hitCircleSprite;
- SkinnableSpriteText hitCircleText;
-
InternalChildren = new Drawable[]
{
- hitCircleSprite = new Sprite
+ circleSprites = new Container
{
- Texture = getTextureWithFallback(string.Empty),
- Colour = drawableObject.AccentColour.Value,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Both,
+ Children = new[]
+ {
+ hitCircleSprite = new Sprite
+ {
+ Texture = getTextureWithFallback(string.Empty),
+ Colour = drawableObject.AccentColour.Value,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ },
+ hitCircleOverlay = new Sprite
+ {
+ Texture = getTextureWithFallback("overlay"),
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ }
},
hitCircleText = new SkinnableSpriteText(new OsuSkinComponent(OsuSkinComponents.HitCircleText), _ => new OsuSpriteText
{
Font = OsuFont.Numeric.With(size: 40),
UseFullGlyphHeight = false,
- }, confineMode: ConfineMode.NoScaling),
- new Sprite
+ }, confineMode: ConfineMode.NoScaling)
{
- Texture = getTextureWithFallback("overlay"),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- }
+ },
};
bool overlayAboveNumber = skin.GetConfig(OsuSkinConfiguration.HitCircleOverlayAboveNumber)?.Value ?? true;
- if (!overlayAboveNumber)
- ChangeInternalChildDepth(hitCircleText, -float.MaxValue);
+ if (overlayAboveNumber)
+ AddInternal(hitCircleOverlay.CreateProxy());
state.BindTo(drawableObject.State);
- state.BindValueChanged(updateState, true);
-
accentColour.BindTo(drawableObject.AccentColour);
- accentColour.BindValueChanged(colour => hitCircleSprite.Colour = colour.NewValue, true);
-
indexInCurrentCombo.BindTo(osuObject.IndexInCurrentComboBindable);
- indexInCurrentCombo.BindValueChanged(index => hitCircleText.Text = (index.NewValue + 1).ToString(), true);
Texture getTextureWithFallback(string name)
{
@@ -87,6 +102,15 @@ namespace osu.Game.Rulesets.Osu.Skinning
}
}
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+
+ state.BindValueChanged(updateState, true);
+ accentColour.BindValueChanged(colour => hitCircleSprite.Colour = colour.NewValue, true);
+ indexInCurrentCombo.BindValueChanged(index => hitCircleText.Text = (index.NewValue + 1).ToString(), true);
+ }
+
private void updateState(ValueChangedEvent state)
{
const double legacy_fade_duration = 240;
@@ -94,8 +118,21 @@ namespace osu.Game.Rulesets.Osu.Skinning
switch (state.NewValue)
{
case ArmedState.Hit:
- this.FadeOut(legacy_fade_duration, Easing.Out);
- this.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
+ circleSprites.FadeOut(legacy_fade_duration, Easing.Out);
+ circleSprites.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
+
+ var legacyVersion = skin.GetConfig(LegacySetting.Version)?.Value;
+
+ if (legacyVersion >= 2.0m)
+ // legacy skins of version 2.0 and newer only apply very short fade out to the number piece.
+ hitCircleText.FadeOut(legacy_fade_duration / 4, Easing.Out);
+ else
+ {
+ // old skins scale and fade it normally along other pieces.
+ hitCircleText.FadeOut(legacy_fade_duration, Easing.Out);
+ hitCircleText.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
+ }
+
break;
}
}
diff --git a/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs b/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs
index b4d51d11c9..b2299398e1 100644
--- a/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs
+++ b/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Rulesets.Osu.UI
protected override PassThroughInputManager CreateInputManager() => new OsuInputManager(Ruleset.RulesetInfo);
- public override PlayfieldAdjustmentContainer CreatePlayfieldAdjustmentContainer() => new OsuPlayfieldAdjustmentContainer();
+ public override PlayfieldAdjustmentContainer CreatePlayfieldAdjustmentContainer() => new OsuPlayfieldAdjustmentContainer { AlignWithStoryboard = true };
protected override ResumeOverlay CreateResumeOverlay() => new OsuResumeOverlay();
diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfieldAdjustmentContainer.cs
index 9c8be868b0..0d1a5a8304 100644
--- a/osu.Game.Rulesets.Osu/UI/OsuPlayfieldAdjustmentContainer.cs
+++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfieldAdjustmentContainer.cs
@@ -11,10 +11,19 @@ namespace osu.Game.Rulesets.Osu.UI
public class OsuPlayfieldAdjustmentContainer : PlayfieldAdjustmentContainer
{
protected override Container Content => content;
- private readonly Container content;
+ private readonly ScalingContainer content;
private const float playfield_size_adjust = 0.8f;
+ ///
+ /// When true, an offset is applied to allow alignment with historical storyboards displayed in the same parent space.
+ /// This will shift the playfield downwards slightly.
+ ///
+ public bool AlignWithStoryboard
+ {
+ set => content.PlayfieldShift = value;
+ }
+
public OsuPlayfieldAdjustmentContainer()
{
Anchor = Anchor.Centre;
@@ -39,6 +48,8 @@ namespace osu.Game.Rulesets.Osu.UI
///
private class ScalingContainer : Container
{
+ internal bool PlayfieldShift { get; set; }
+
protected override void Update()
{
base.Update();
@@ -55,6 +66,7 @@ namespace osu.Game.Rulesets.Osu.UI
// Scale = 819.2 / 512
// Scale = 1.6
Scale = new Vector2(Parent.ChildSize.X / OsuPlayfield.BASE_SIZE.X);
+ Position = new Vector2(0, (PlayfieldShift ? 8f : 0f) * Scale.X);
// Size = 0.625
Size = Vector2.Divide(Vector2.One, Scale);
}
diff --git a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
index 168e937256..83a1077d70 100644
--- a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
+++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
@@ -117,6 +117,8 @@ namespace osu.Game.Rulesets.UI
public void RemoveAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException();
+ public void RemoveAllAdjustments(AdjustableProperty type) => throw new NotSupportedException();
+
public BindableNumber Volume => throw new NotSupportedException();
public BindableNumber Balance => throw new NotSupportedException();
diff --git a/osu.Game/Skinning/SkinnableSound.cs b/osu.Game/Skinning/SkinnableSound.cs
index 7ee0b474de..7739be693d 100644
--- a/osu.Game/Skinning/SkinnableSound.cs
+++ b/osu.Game/Skinning/SkinnableSound.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
+using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Bindables;
using osu.Framework.Extensions.IEnumerableExtensions;
@@ -159,28 +160,28 @@ namespace osu.Game.Skinning
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence VolumeTo(double newVolume, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> VolumeTo(double newVolume, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.VolumeTo(newVolume, duration, easing);
///
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence BalanceTo(double newBalance, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> BalanceTo(double newBalance, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.BalanceTo(newBalance, duration, easing);
///
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence FrequencyTo(double newFrequency, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> FrequencyTo(double newFrequency, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.FrequencyTo(newFrequency, duration, easing);
///
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence TempoTo(double newTempo, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> TempoTo(double newTempo, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.TempoTo(newTempo, duration, easing);
#endregion
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 627c2f3d33..18c3052ca3 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -24,7 +24,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index f443937017..b034253d88 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
-
+
@@ -80,7 +80,7 @@
-
+