diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneOsuLogo.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneOsuLogo.cs
index 62a493815b97..c112d2687083 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneOsuLogo.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneOsuLogo.cs
@@ -4,22 +4,31 @@
using NUnit.Framework;
using osu.Framework.Graphics;
using osu.Game.Screens.Menu;
+using osuTK;
namespace osu.Game.Tests.Visual.UserInterface
{
public partial class TestSceneOsuLogo : OsuTestScene
{
+ private OsuLogo? logo;
+
[Test]
public void TestBasic()
{
AddStep("Add logo", () =>
{
- Child = new OsuLogo
+ Child = logo = new OsuLogo
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
};
});
+
+ AddSliderStep("scale", 0.1, 2, 1, scale =>
+ {
+ if (logo != null)
+ Child.Scale = new Vector2((float)scale);
+ });
}
}
}
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index f3c37c6960e6..2c62a10a8f83 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -4,6 +4,7 @@
#nullable disable
using System;
+using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
@@ -211,6 +212,15 @@ public OsuLogo()
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
+ SeasonalUI.ENABLED
+ ? hat = new Sprite
+ {
+ BypassAutoSizeAxes = Axes.Both,
+ Alpha = 0,
+ Origin = Anchor.BottomCentre,
+ Scale = new Vector2(-1, 1),
+ }
+ : Empty(),
}
},
impactContainer = new CircularContainer
@@ -284,6 +294,8 @@ private void load(TextureStore textures, AudioManager audio)
logo.Texture = textures.Get(@"Menu/logo");
ripple.Texture = textures.Get(@"Menu/logo");
+ if (hat != null)
+ hat.Texture = textures.Get(@"Menu/hat");
}
private int lastBeatIndex;
@@ -369,6 +381,9 @@ protected override void Update()
const float scale_adjust_cutoff = 0.4f;
+ if (SeasonalUI.ENABLED)
+ updateHat();
+
if (musicController.CurrentTrack.IsRunning)
{
float maxAmplitude = lastBeatIndex >= 0 ? musicController.CurrentTrack.CurrentAmplitudes.Maximum : 0;
@@ -382,6 +397,38 @@ protected override void Update()
}
}
+ private bool hasHat;
+
+ private void updateHat()
+ {
+ if (hat == null)
+ return;
+
+ bool shouldHat = DrawWidth * Scale.X < 400;
+
+ if (shouldHat != hasHat)
+ {
+ hasHat = shouldHat;
+
+ if (hasHat)
+ {
+ hat.Delay(400)
+ .Then()
+ .MoveTo(new Vector2(120, 160))
+ .RotateTo(0)
+ .RotateTo(-20, 500, Easing.OutQuint)
+ .FadeIn(250, Easing.OutQuint);
+ }
+ else
+ {
+ hat.Delay(100)
+ .Then()
+ .MoveToOffset(new Vector2(0, -5), 500, Easing.OutQuint)
+ .FadeOut(500, Easing.OutQuint);
+ }
+ }
+ }
+
public override bool HandlePositionalInput => base.HandlePositionalInput && Alpha > 0.2f;
protected override bool OnMouseDown(MouseDownEvent e)
@@ -459,6 +506,9 @@ protected override void OnDragEnd(DragEndEvent e)
private Container currentProxyTarget;
private Drawable proxy;
+ [CanBeNull]
+ private readonly Sprite hat;
+
public void StopSamplePlayback() => sampleClickChannel?.Stop();
public Drawable ProxyToContainer(Container c)
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 3f9a8142ca72..7a456022bfc5 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -36,7 +36,7 @@
-
+