diff --git a/osu.Android.props b/osu.Android.props
index 97f7a7edb1..6a8e66ee6a 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs b/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs
new file mode 100644
index 0000000000..47e91e50d4
--- /dev/null
+++ b/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs
@@ -0,0 +1,54 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Game.Rulesets.Catch.Mods;
+using osu.Game.Rulesets.Catch.Objects;
+using osu.Game.Rulesets.Objects;
+using osu.Game.Rulesets.Objects.Types;
+using osu.Game.Tests.Visual;
+using osuTK;
+
+namespace osu.Game.Rulesets.Catch.Tests.Mods
+{
+ public class TestSceneCatchModPerfect : ModPerfectTestScene
+ {
+ public TestSceneCatchModPerfect()
+ : base(new CatchRuleset(), new CatchModPerfect())
+ {
+ }
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestBananaShower(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new BananaShower { StartTime = 1000, EndTime = 3000 }, false), shouldMiss);
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestFruit(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Fruit { StartTime = 1000 }), shouldMiss);
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestJuiceStream(bool shouldMiss)
+ {
+ var stream = new JuiceStream
+ {
+ StartTime = 1000,
+ Path = new SliderPath(PathType.Linear, new[]
+ {
+ Vector2.Zero,
+ new Vector2(100, 0),
+ })
+ };
+
+ CreateHitObjectTest(new HitObjectTestData(stream), shouldMiss);
+ }
+
+ // We only care about testing misses, hits are tested via JuiceStream
+ [TestCase(true)]
+ public void TestDroplet(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Droplet { StartTime = 1000 }), shouldMiss);
+
+ // We only care about testing misses, hits are tested via JuiceStream
+ [TestCase(true)]
+ public void TestTinyDroplet(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new TinyDroplet { StartTime = 1000 }), shouldMiss);
+ }
+}
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-0@2x.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-0@2x.png
new file mode 100644
index 0000000000..786e5cc25a
Binary files /dev/null and b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-0@2x.png differ
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-1@2x.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-1@2x.png
new file mode 100644
index 0000000000..e93530fb16
Binary files /dev/null and b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-1@2x.png differ
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-2@2x.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-2@2x.png
new file mode 100644
index 0000000000..6f51257742
Binary files /dev/null and b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-2@2x.png differ
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-3@2x.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-3@2x.png
new file mode 100644
index 0000000000..953a04d4e4
Binary files /dev/null and b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-3@2x.png differ
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-4@2x.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-4@2x.png
new file mode 100644
index 0000000000..66a3cf9e0b
Binary files /dev/null and b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-4@2x.png differ
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-5@2x.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-5@2x.png
new file mode 100644
index 0000000000..ec4487f8fb
Binary files /dev/null and b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle-5@2x.png differ
diff --git a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle.png b/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle.png
deleted file mode 100755
index 17177f3246..0000000000
Binary files a/osu.Game.Rulesets.Catch.Tests/Resources/special-skin/fruit-catcher-idle.png and /dev/null differ
diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs
index 4ff9f7a7fe..fbbe00bb6c 100644
--- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs
+++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs
@@ -17,6 +17,7 @@ namespace osu.Game.Rulesets.Catch.Tests
public override IReadOnlyList RequiredTypes => new[]
{
typeof(CatcherArea),
+ typeof(CatcherSprite)
};
[BackgroundDependencyLoader]
diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs
index df1ac4c725..cf4843c200 100644
--- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs
+++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs
@@ -1,8 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using System;
-using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using osu.Framework.Allocation;
@@ -22,11 +20,6 @@ namespace osu.Game.Rulesets.Catch.Tests
{
private RulesetInfo catchRuleset;
- public override IReadOnlyList RequiredTypes => new[]
- {
- typeof(CatcherArea),
- };
-
public TestSceneCatcherArea()
{
AddSliderStep("CircleSize", 0, 8, 5, createCatcher);
diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs
index da36673930..6f0d8f0a3a 100644
--- a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs
+++ b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs
@@ -1,16 +1,28 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using System.Collections.Generic;
+using System.Linq;
using NUnit.Framework;
+using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Catch.Objects;
+using osu.Game.Rulesets.Catch.UI;
+using osu.Game.Rulesets.Objects;
using osu.Game.Tests.Visual;
+using osuTK;
namespace osu.Game.Rulesets.Catch.Tests
{
[TestFixture]
public class TestSceneHyperDash : PlayerTestScene
{
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(CatcherArea),
+ };
+
public TestSceneHyperDash()
: base(new CatchRuleset())
{
@@ -22,8 +34,19 @@ namespace osu.Game.Rulesets.Catch.Tests
public void TestHyperDash()
{
AddAssert("First note is hyperdash", () => Beatmap.Value.Beatmap.HitObjects[0] is Fruit f && f.HyperDash);
+ AddUntilStep("wait for right movement", () => getCatcher().Scale.X > 0); // don't check hyperdashing as it happens too fast.
+
+ AddUntilStep("wait for left movement", () => getCatcher().Scale.X < 0);
+
+ for (int i = 0; i < 3; i++)
+ {
+ AddUntilStep("wait for right hyperdash", () => getCatcher().Scale.X > 0 && getCatcher().HyperDashing);
+ AddUntilStep("wait for left hyperdash", () => getCatcher().Scale.X < 0 && getCatcher().HyperDashing);
+ }
}
+ private CatcherArea.Catcher getCatcher() => Player.ChildrenOfType().First().MovableCatcher;
+
protected override IBeatmap CreateBeatmap(RulesetInfo ruleset)
{
var beatmap = new Beatmap
@@ -35,17 +58,52 @@ namespace osu.Game.Rulesets.Catch.Tests
}
};
- // Should produce a hyper-dash
- beatmap.HitObjects.Add(new Fruit { StartTime = 816, X = 308 / 512f, NewCombo = true });
- beatmap.HitObjects.Add(new Fruit { StartTime = 1008, X = 56 / 512f, });
+ // Should produce a hyper-dash (edge case test)
+ beatmap.HitObjects.Add(new Fruit { StartTime = 1816, X = 56 / 512f, NewCombo = true });
+ beatmap.HitObjects.Add(new Fruit { StartTime = 2008, X = 308 / 512f, NewCombo = true });
- for (int i = 0; i < 512; i++)
- {
- if (i % 5 < 3)
- beatmap.HitObjects.Add(new Fruit { X = i % 10 < 5 ? 0.02f : 0.98f, StartTime = 2000 + i * 100, NewCombo = i % 8 == 0 });
- }
+ double startTime = 3000;
+
+ const float left_x = 0.02f;
+ const float right_x = 0.98f;
+
+ createObjects(() => new Fruit { X = left_x });
+ createObjects(() => new TestJuiceStream(right_x), 1);
+ createObjects(() => new TestJuiceStream(left_x), 1);
+ createObjects(() => new Fruit { X = right_x });
+ createObjects(() => new Fruit { X = left_x });
+ createObjects(() => new Fruit { X = right_x });
+ createObjects(() => new TestJuiceStream(left_x), 1);
return beatmap;
+
+ void createObjects(Func createObject, int count = 3)
+ {
+ const float spacing = 140;
+
+ for (int i = 0; i < count; i++)
+ {
+ var hitObject = createObject();
+ hitObject.StartTime = startTime + i * spacing;
+ beatmap.HitObjects.Add(hitObject);
+ }
+
+ startTime += 700;
+ }
+ }
+
+ private class TestJuiceStream : JuiceStream
+ {
+ public TestJuiceStream(float x)
+ {
+ X = x;
+
+ Path = new SliderPath(new[]
+ {
+ new PathControlPoint(Vector2.Zero),
+ new PathControlPoint(new Vector2(30, 0)),
+ });
+ }
}
}
}
diff --git a/osu.Game.Rulesets.Catch/CatchSkinComponents.cs b/osu.Game.Rulesets.Catch/CatchSkinComponents.cs
index 02c045f363..08bff36401 100644
--- a/osu.Game.Rulesets.Catch/CatchSkinComponents.cs
+++ b/osu.Game.Rulesets.Catch/CatchSkinComponents.cs
@@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Catch
FruitGrapes,
FruitOrange,
FruitPear,
- Droplet
+ Droplet,
+ CatcherIdle
}
}
diff --git a/osu.Game.Rulesets.Catch/Mods/CatchModPerfect.cs b/osu.Game.Rulesets.Catch/Mods/CatchModPerfect.cs
index fb92399102..e3391c47f1 100644
--- a/osu.Game.Rulesets.Catch/Mods/CatchModPerfect.cs
+++ b/osu.Game.Rulesets.Catch/Mods/CatchModPerfect.cs
@@ -1,11 +1,17 @@
// 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.Catch.Judgements;
+using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Mods;
+using osu.Game.Rulesets.Scoring;
namespace osu.Game.Rulesets.Catch.Mods
{
public class CatchModPerfect : ModPerfect
{
+ protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result)
+ => !(result.Judgement is CatchBananaJudgement)
+ && base.FailCondition(healthProcessor, result);
}
}
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
index 5bfe0515a1..6844be5941 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
@@ -91,10 +91,6 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
ApplyResult(r => r.Type = CheckPosition.Invoke(HitObject) ? HitResult.Perfect : HitResult.Miss);
}
- protected sealed override double InitialLifetimeOffset => HitObject.TimePreempt;
-
- protected override void UpdateInitialTransforms() => this.FadeInFromZero(200);
-
protected override void UpdateStateTransforms(ArmedState state)
{
var endTime = HitObject.GetEndTime();
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableDroplet.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableDroplet.cs
index 0a8e830af9..cad8892283 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableDroplet.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableDroplet.cs
@@ -36,7 +36,7 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
float startRotation = RNG.NextSingle() * 20;
double duration = HitObject.TimePreempt + 2000;
- this.RotateTo(startRotation).RotateTo(startRotation + 720, duration);
+ ScaleContainer.RotateTo(startRotation).RotateTo(startRotation + 720, duration);
}
}
}
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableFruit.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableFruit.cs
index 197ad41247..fae5a10d04 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableFruit.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableFruit.cs
@@ -13,7 +13,6 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
public DrawableFruit(Fruit h)
: base(h)
{
- Rotation = (float)(RNG.NextDouble() - 0.5f) * 40;
}
[BackgroundDependencyLoader]
@@ -21,6 +20,8 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
{
ScaleContainer.Child = new SkinnableDrawable(
new CatchSkinComponent(getComponent(HitObject.VisualRepresentation)), _ => new FruitPiece());
+
+ ScaleContainer.Rotation = (float)(RNG.NextDouble() - 0.5f) * 40;
}
private CatchSkinComponents getComponent(FruitVisualRepresentation hitObjectVisualRepresentation)
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableJuiceStream.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableJuiceStream.cs
index 932464cfd1..7bc016d94f 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableJuiceStream.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableJuiceStream.cs
@@ -6,6 +6,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Drawables;
+using osuTK;
namespace osu.Game.Rulesets.Catch.Objects.Drawables
{
@@ -14,11 +15,13 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
private readonly Func> createDrawableRepresentation;
private readonly Container dropletContainer;
+ public override Vector2 OriginPosition => base.OriginPosition - new Vector2(0, CatchHitObject.OBJECT_RADIUS);
+
public DrawableJuiceStream(JuiceStream s, Func> createDrawableRepresentation = null)
: base(s)
{
this.createDrawableRepresentation = createDrawableRepresentation;
- RelativeSizeAxes = Axes.Both;
+ RelativeSizeAxes = Axes.X;
Origin = Anchor.BottomLeft;
X = 0;
@@ -27,6 +30,8 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
protected override void AddNestedHitObject(DrawableHitObject hitObject)
{
+ hitObject.Origin = Anchor.BottomCentre;
+
base.AddNestedHitObject(hitObject);
dropletContainer.Add(hitObject);
}
diff --git a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs
index 642ff0246e..01011645bd 100644
--- a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs
+++ b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs
@@ -24,8 +24,8 @@ namespace osu.Game.Rulesets.Catch.Objects
public int RepeatCount { get; set; }
- public double Velocity;
- public double TickDistance;
+ public double Velocity { get; private set; }
+ public double TickDistance { get; private set; }
///
/// The length of one span of this .
@@ -49,7 +49,7 @@ namespace osu.Game.Rulesets.Catch.Objects
{
base.CreateNestedHitObjects();
- var tickSamples = Samples.Select(s => new HitSampleInfo
+ var dropletSamples = Samples.Select(s => new HitSampleInfo
{
Bank = s.Bank,
Name = @"slidertick",
@@ -75,7 +75,6 @@ namespace osu.Game.Rulesets.Catch.Objects
{
AddNested(new TinyDroplet
{
- Samples = tickSamples,
StartTime = t + lastEvent.Value.Time,
X = X + Path.PositionAt(
lastEvent.Value.PathProgress + (t / sinceLastTick) * (e.PathProgress - lastEvent.Value.PathProgress)).X / CatchPlayfield.BASE_WIDTH,
@@ -93,7 +92,7 @@ namespace osu.Game.Rulesets.Catch.Objects
case SliderEventType.Tick:
AddNested(new Droplet
{
- Samples = tickSamples,
+ Samples = dropletSamples,
StartTime = e.Time,
X = X + Path.PositionAt(e.PathProgress).X / CatchPlayfield.BASE_WIDTH,
});
diff --git a/osu.Game.Rulesets.Catch/Skinning/CatchLegacySkinTransformer.cs b/osu.Game.Rulesets.Catch/Skinning/CatchLegacySkinTransformer.cs
index 36164c5543..af7c60b929 100644
--- a/osu.Game.Rulesets.Catch/Skinning/CatchLegacySkinTransformer.cs
+++ b/osu.Game.Rulesets.Catch/Skinning/CatchLegacySkinTransformer.cs
@@ -44,6 +44,10 @@ namespace osu.Game.Rulesets.Catch.Skinning
return new LegacyFruitPiece("fruit-drop") { Scale = new Vector2(0.8f) };
break;
+
+ case CatchSkinComponents.CatcherIdle:
+ return this.GetAnimation("fruit-catcher-idle", true, true, true) ??
+ this.GetAnimation("fruit-ryuuta", true, true, true);
}
return null;
diff --git a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
index b977d46611..cc0f41a14f 100644
--- a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
@@ -155,7 +155,10 @@ namespace osu.Game.Rulesets.Catch.UI
Anchor = Anchor.TopCentre,
Origin = Anchor.BottomCentre,
},
- createCatcherSprite(),
+ createCatcherSprite().With(c =>
+ {
+ c.Anchor = Anchor.TopCentre;
+ })
};
}
@@ -202,17 +205,7 @@ namespace osu.Game.Rulesets.Catch.UI
if (!Trail) return;
- var additive = createCatcherSprite();
-
- additive.Anchor = Anchor;
- additive.OriginPosition += new Vector2(DrawWidth / 2, 0); // also temporary to align sprite correctly.
- additive.Position = Position;
- additive.Scale = Scale;
- additive.Colour = HyperDashing ? Color4.Red : Color4.White;
- additive.RelativePositionAxes = RelativePositionAxes;
- additive.Blending = BlendingParameters.Additive;
-
- AdditiveTarget.Add(additive);
+ var additive = createAdditiveSprite(HyperDashing);
additive.FadeTo(0.4f).FadeOut(800, Easing.OutQuint);
additive.Expire(true);
@@ -220,6 +213,22 @@ namespace osu.Game.Rulesets.Catch.UI
Scheduler.AddDelayed(beginTrail, HyperDashing ? 25 : 50);
}
+ private Drawable createAdditiveSprite(bool hyperDash)
+ {
+ var additive = createCatcherSprite();
+
+ additive.Anchor = Anchor;
+ additive.Scale = Scale;
+ additive.Colour = hyperDash ? Color4.Red : Color4.White;
+ additive.Blending = BlendingParameters.Additive;
+ additive.RelativePositionAxes = RelativePositionAxes;
+ additive.Position = Position;
+
+ AdditiveTarget.Add(additive);
+
+ return additive;
+ }
+
private Drawable createCatcherSprite() => new CatcherSprite();
///
@@ -270,6 +279,10 @@ namespace osu.Game.Rulesets.Catch.UI
catchObjectPosition >= catcherPosition - halfCatchWidth &&
catchObjectPosition <= catcherPosition + halfCatchWidth;
+ // only update hyperdash state if we are catching a fruit.
+ // exceptions are Droplets and JuiceStreams.
+ if (!(fruit is Fruit)) return validCatch;
+
if (validCatch && fruit.HyperDash)
{
var target = fruit.HyperDashTarget;
@@ -305,14 +318,14 @@ namespace osu.Game.Rulesets.Catch.UI
{
const float hyper_dash_transition_length = 180;
- bool previouslyHyperDashing = HyperDashing;
+ bool wasHyperDashing = HyperDashing;
if (modifier <= 1 || X == targetPosition)
{
hyperDashModifier = 1;
hyperDashDirection = 0;
- if (previouslyHyperDashing)
+ if (wasHyperDashing)
{
this.FadeColour(Color4.White, hyper_dash_transition_length, Easing.OutQuint);
this.FadeTo(1, hyper_dash_transition_length, Easing.OutQuint);
@@ -325,11 +338,18 @@ namespace osu.Game.Rulesets.Catch.UI
hyperDashDirection = Math.Sign(targetPosition - X);
hyperDashTargetPosition = targetPosition;
- if (!previouslyHyperDashing)
+ if (!wasHyperDashing)
{
this.FadeColour(Color4.OrangeRed, hyper_dash_transition_length, Easing.OutQuint);
this.FadeTo(0.2f, hyper_dash_transition_length, Easing.OutQuint);
Trail = true;
+
+ var hyperDashEndGlow = createAdditiveSprite(true);
+
+ hyperDashEndGlow.MoveToOffset(new Vector2(0, -20), 1200, Easing.In);
+ hyperDashEndGlow.ScaleTo(hyperDashEndGlow.Scale * 0.9f).ScaleTo(hyperDashEndGlow.Scale * 1.2f, 1200, Easing.In);
+ hyperDashEndGlow.FadeOut(1200);
+ hyperDashEndGlow.Expire(true);
}
}
}
diff --git a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs
index 025fa9c56e..78020114cd 100644
--- a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs
@@ -3,31 +3,35 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Textures;
using osu.Game.Skinning;
using osuTK;
namespace osu.Game.Rulesets.Catch.UI
{
- public class CatcherSprite : CompositeDrawable
+ public class CatcherSprite : SkinnableDrawable
{
+ protected override bool ApplySizeRestrictionsToDefault => true;
+
public CatcherSprite()
+ : base(new CatchSkinComponent(CatchSkinComponents.CatcherIdle), _ =>
+ new DefaultCatcherSprite(), confineMode: ConfineMode.ScaleDownToFit)
{
+ RelativeSizeAxes = Axes.None;
Size = new Vector2(CatcherArea.CATCHER_SIZE);
// Sets the origin roughly to the centre of the catcher's plate to allow for correct scaling.
- OriginPosition = new Vector2(-0.02f, 0.06f) * CatcherArea.CATCHER_SIZE;
+ OriginPosition = new Vector2(0.5f, 0.06f) * CatcherArea.CATCHER_SIZE;
}
- [BackgroundDependencyLoader]
- private void load()
+ private class DefaultCatcherSprite : Sprite
{
- InternalChild = new SkinnableSprite("Gameplay/catch/fruit-catcher-idle", confineMode: ConfineMode.ScaleDownToFit)
+ [BackgroundDependencyLoader]
+ private void load(TextureStore textures)
{
- RelativeSizeAxes = Axes.Both,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- };
+ Texture = textures.Get("Gameplay/catch/fruit-catcher-idle");
+ }
}
}
}
diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs
new file mode 100644
index 0000000000..607d42a1bb
--- /dev/null
+++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs
@@ -0,0 +1,26 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Game.Rulesets.Mania.Mods;
+using osu.Game.Rulesets.Mania.Objects;
+using osu.Game.Tests.Visual;
+
+namespace osu.Game.Rulesets.Mania.Tests.Mods
+{
+ public class TestSceneManiaModPerfect : ModPerfectTestScene
+ {
+ public TestSceneManiaModPerfect()
+ : base(new ManiaRuleset(), new ManiaModPerfect())
+ {
+ }
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Note { StartTime = 1000 }), shouldMiss);
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestHoldNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HoldNote { StartTime = 1000, EndTime = 3000 }), shouldMiss);
+ }
+}
diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs
new file mode 100644
index 0000000000..b03a894085
--- /dev/null
+++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs
@@ -0,0 +1,52 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Game.Rulesets.Objects;
+using osu.Game.Rulesets.Objects.Types;
+using osu.Game.Rulesets.Osu.Mods;
+using osu.Game.Rulesets.Osu.Objects;
+using osu.Game.Tests.Visual;
+using osuTK;
+
+namespace osu.Game.Rulesets.Osu.Tests.Mods
+{
+ public class TestSceneOsuModPerfect : ModPerfectTestScene
+ {
+ public TestSceneOsuModPerfect()
+ : base(new OsuRuleset(), new OsuModPerfect())
+ {
+ }
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestHitCircle(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HitCircle { StartTime = 1000 }), shouldMiss);
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestSlider(bool shouldMiss)
+ {
+ var slider = new Slider
+ {
+ StartTime = 1000,
+ Path = new SliderPath(PathType.Linear, new[] { Vector2.Zero, new Vector2(100, 0), })
+ };
+
+ CreateHitObjectTest(new HitObjectTestData(slider), shouldMiss);
+ }
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestSpinner(bool shouldMiss)
+ {
+ var spinner = new Spinner
+ {
+ StartTime = 1000,
+ EndTime = 3000,
+ Position = new Vector2(256, 192)
+ };
+
+ CreateHitObjectTest(new HitObjectTestData(spinner), shouldMiss);
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs
new file mode 100644
index 0000000000..5f3596976d
--- /dev/null
+++ b/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs
@@ -0,0 +1,101 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Game.Beatmaps;
+using osu.Game.Replays;
+using osu.Game.Rulesets.Osu.Beatmaps;
+using osu.Game.Rulesets.Osu.Mods;
+using osu.Game.Rulesets.Osu.Objects;
+using osu.Game.Rulesets.Osu.Replays;
+using osu.Game.Rulesets.Osu.Scoring;
+using osu.Game.Rulesets.Scoring;
+using osu.Game.Scoring;
+using osu.Game.Tests.Visual;
+using osu.Game.Users;
+using osuTK;
+
+namespace osu.Game.Rulesets.Osu.Tests
+{
+ public class TestSceneMissHitWindowJudgements : ModTestScene
+ {
+ public TestSceneMissHitWindowJudgements()
+ : base(new OsuRuleset())
+ {
+ }
+
+ [Test]
+ public void TestMissViaEarlyHit()
+ {
+ var beatmap = new Beatmap
+ {
+ HitObjects = { new HitCircle { Position = new Vector2(256, 192) } }
+ };
+
+ var hitWindows = new OsuHitWindows();
+ hitWindows.SetDifficulty(beatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty);
+
+ CreateModTest(new ModTestData
+ {
+ Autoplay = false,
+ Mod = new TestAutoMod(),
+ Beatmap = new Beatmap
+ {
+ HitObjects = { new HitCircle { Position = new Vector2(256, 192) } }
+ },
+ PassCondition = () => Player.Results.Count > 0 && Player.Results[0].TimeOffset < -hitWindows.WindowFor(HitResult.Meh) && Player.Results[0].Type == HitResult.Miss
+ });
+ }
+
+ [Test]
+ public void TestMissViaNotHitting()
+ {
+ var beatmap = new Beatmap
+ {
+ HitObjects = { new HitCircle { Position = new Vector2(256, 192) } }
+ };
+
+ var hitWindows = new OsuHitWindows();
+ hitWindows.SetDifficulty(beatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty);
+
+ CreateModTest(new ModTestData
+ {
+ Autoplay = false,
+ Beatmap = beatmap,
+ PassCondition = () => Player.Results.Count > 0 && Player.Results[0].TimeOffset >= hitWindows.WindowFor(HitResult.Meh) && Player.Results[0].Type == HitResult.Miss
+ });
+ }
+
+ private class TestAutoMod : OsuModAutoplay
+ {
+ public override Score CreateReplayScore(IBeatmap beatmap) => new Score
+ {
+ ScoreInfo = new ScoreInfo { User = new User { Username = "Autoplay" } },
+ Replay = new MissingAutoGenerator(beatmap).Generate()
+ };
+ }
+
+ private class MissingAutoGenerator : OsuAutoGeneratorBase
+ {
+ public new OsuBeatmap Beatmap => (OsuBeatmap)base.Beatmap;
+
+ public MissingAutoGenerator(IBeatmap beatmap)
+ : base(beatmap)
+ {
+ }
+
+ public override Replay Generate()
+ {
+ AddFrameToReplay(new OsuReplayFrame(-100000, new Vector2(256, 500)));
+ AddFrameToReplay(new OsuReplayFrame(Beatmap.HitObjects[0].StartTime - 1500, new Vector2(256, 500)));
+ AddFrameToReplay(new OsuReplayFrame(Beatmap.HitObjects[0].StartTime - 1500, new Vector2(256, 500)));
+
+ AddFrameToReplay(new OsuReplayFrame(Beatmap.HitObjects[0].StartTime - 450, Beatmap.HitObjects[0].StackedPosition));
+ AddFrameToReplay(new OsuReplayFrame(Beatmap.HitObjects[0].StartTime - 350, Beatmap.HitObjects[0].StackedPosition, OsuAction.LeftButton));
+ AddFrameToReplay(new OsuReplayFrame(Beatmap.HitObjects[0].StartTime - 325, Beatmap.HitObjects[0].StackedPosition));
+
+ return Replay;
+ }
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index de11ab6419..0ec7f2ebfe 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -36,8 +36,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private readonly SpriteIcon symbol;
- private readonly Color4 baseColour = OsuColour.FromHex(@"002c3c");
- private readonly Color4 fillColour = OsuColour.FromHex(@"005b7c");
+ private readonly Color4 baseColour = Color4Extensions.FromHex(@"002c3c");
+ private readonly Color4 fillColour = Color4Extensions.FromHex(@"005b7c");
private readonly IBindable positionBindable = new Bindable();
diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs b/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs
index a6491bb3f3..6f2998006f 100644
--- a/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs
+++ b/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs
@@ -12,7 +12,7 @@ namespace osu.Game.Rulesets.Osu.Scoring
new DifficultyRange(HitResult.Great, 80, 50, 20),
new DifficultyRange(HitResult.Good, 140, 100, 60),
new DifficultyRange(HitResult.Meh, 200, 150, 100),
- new DifficultyRange(HitResult.Miss, 200, 200, 200),
+ new DifficultyRange(HitResult.Miss, 400, 400, 400),
};
public override bool IsHitResultAllowed(HitResult result)
diff --git a/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs b/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs
new file mode 100644
index 0000000000..d3be2cdf0d
--- /dev/null
+++ b/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs
@@ -0,0 +1,47 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Game.Rulesets.Scoring;
+using osu.Game.Rulesets.Taiko.Mods;
+using osu.Game.Rulesets.Taiko.Objects;
+using osu.Game.Rulesets.Taiko.Scoring;
+using osu.Game.Tests.Visual;
+
+namespace osu.Game.Rulesets.Taiko.Tests.Mods
+{
+ public class TestSceneTaikoModPerfect : ModPerfectTestScene
+ {
+ public TestSceneTaikoModPerfect()
+ : base(new TestTaikoRuleset(), new TaikoModPerfect())
+ {
+ }
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestHit(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new CentreHit { StartTime = 1000 }), shouldMiss);
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestDrumRoll(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new DrumRoll { StartTime = 1000, EndTime = 3000 }), shouldMiss);
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestSwell(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Swell { StartTime = 1000, EndTime = 3000 }), shouldMiss);
+
+ private class TestTaikoRuleset : TaikoRuleset
+ {
+ public override HealthProcessor CreateHealthProcessor(double drainStartTime) => new TestTaikoHealthProcessor();
+
+ private class TestTaikoHealthProcessor : TaikoHealthProcessor
+ {
+ protected override void Reset(bool storeResults)
+ {
+ base.Reset(storeResults);
+
+ Health.Value = 1; // Don't care about the health condition (only the mod condition)
+ }
+ }
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs b/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs
index edb089dbac..dd3c2289ea 100644
--- a/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs
+++ b/osu.Game.Rulesets.Taiko/Scoring/TaikoHealthProcessor.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Linq;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Judgements;
@@ -39,7 +40,7 @@ namespace osu.Game.Rulesets.Taiko.Scoring
{
base.ApplyBeatmap(beatmap);
- hpMultiplier = 1 / (object_count_factor * beatmap.HitObjects.OfType().Count() * BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, 0.5, 0.75, 0.98));
+ hpMultiplier = 1 / (object_count_factor * Math.Max(1, beatmap.HitObjects.OfType().Count()) * BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, 0.5, 0.75, 0.98));
hpMissMultiplier = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, 0.0018, 0.0075, 0.0120);
}
diff --git a/osu.Game.Tests/Beatmaps/Formats/LegacyStoryboardDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/LegacyStoryboardDecoderTest.cs
index 96ff6b81e3..76b76aa357 100644
--- a/osu.Game.Tests/Beatmaps/Formats/LegacyStoryboardDecoderTest.cs
+++ b/osu.Game.Tests/Beatmaps/Formats/LegacyStoryboardDecoderTest.cs
@@ -99,7 +99,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
var storyboard = decoder.Decode(stream);
StoryboardLayer background = storyboard.Layers.Single(l => l.Depth == 3);
- Assert.AreEqual(123456, ((StoryboardSprite)background.Elements.Single()).InitialPosition.X);
+ Assert.AreEqual(3456, ((StoryboardSprite)background.Elements.Single()).InitialPosition.X);
}
}
}
diff --git a/osu.Game.Tests/Resources/variable-with-suffix.osb b/osu.Game.Tests/Resources/variable-with-suffix.osb
index 5c9b46ca98..fd284eb055 100644
--- a/osu.Game.Tests/Resources/variable-with-suffix.osb
+++ b/osu.Game.Tests/Resources/variable-with-suffix.osb
@@ -1,5 +1,5 @@
[Variables]
-$var=1234
+$var=34
[Events]
Sprite,Background,TopCentre,"img.jpg",$var56,240
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneScoreCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneScoreCounter.cs
index ffd6f55b53..030d420ec0 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneScoreCounter.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneScoreCounter.cs
@@ -3,9 +3,6 @@
using NUnit.Framework;
using osu.Framework.Graphics;
-using osu.Framework.Graphics.Sprites;
-using osu.Framework.Utils;
-using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using osu.Game.Screens.Play.HUD;
using osuTK;
@@ -45,32 +42,12 @@ namespace osu.Game.Tests.Visual.Gameplay
};
Add(accuracyCounter);
- StarCounter stars = new StarCounter
- {
- Origin = Anchor.BottomLeft,
- Anchor = Anchor.BottomLeft,
- Position = new Vector2(20, -160),
- CountStars = 5,
- };
- Add(stars);
-
- SpriteText starsLabel = new OsuSpriteText
- {
- Origin = Anchor.BottomLeft,
- Anchor = Anchor.BottomLeft,
- Position = new Vector2(20, -190),
- Text = stars.CountStars.ToString("0.00"),
- };
- Add(starsLabel);
-
AddStep(@"Reset all", delegate
{
score.Current.Value = 0;
comboCounter.Current.Value = 0;
numerator = denominator = 0;
accuracyCounter.SetFraction(0, 0);
- stars.CountStars = 0;
- starsLabel.Text = stars.CountStars.ToString("0.00");
});
AddStep(@"Hit! :D", delegate
@@ -88,20 +65,6 @@ namespace osu.Game.Tests.Visual.Gameplay
denominator++;
accuracyCounter.SetFraction(numerator, denominator);
});
-
- AddStep(@"Alter stars", delegate
- {
- stars.CountStars = RNG.NextSingle() * (stars.StarCount + 1);
- starsLabel.Text = stars.CountStars.ToString("0.00");
- });
-
- AddStep(@"Stop counters", delegate
- {
- score.StopRolling();
- comboCounter.StopRolling();
- accuracyCounter.StopRolling();
- stars.StopAnimation();
- });
}
}
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs
new file mode 100644
index 0000000000..709e71d195
--- /dev/null
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs
@@ -0,0 +1,57 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Utils;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Graphics.UserInterface;
+using osuTK;
+
+namespace osu.Game.Tests.Visual.Gameplay
+{
+ [TestFixture]
+ public class TestSceneStarCounter : OsuTestScene
+ {
+ public TestSceneStarCounter()
+ {
+ StarCounter stars = new StarCounter
+ {
+ Origin = Anchor.Centre,
+ Anchor = Anchor.Centre,
+ Current = 5,
+ };
+
+ Add(stars);
+
+ SpriteText starsLabel = new OsuSpriteText
+ {
+ Origin = Anchor.Centre,
+ Anchor = Anchor.Centre,
+ Scale = new Vector2(2),
+ Y = 50,
+ Text = stars.Current.ToString("0.00"),
+ };
+
+ Add(starsLabel);
+
+ AddRepeatStep(@"random value", delegate
+ {
+ stars.Current = RNG.NextSingle() * (stars.StarCount + 1);
+ starsLabel.Text = stars.Current.ToString("0.00");
+ }, 10);
+
+ AddStep(@"Stop animation", delegate
+ {
+ stars.StopAnimation();
+ });
+
+ AddStep(@"Reset", delegate
+ {
+ stars.Current = 0;
+ starsLabel.Text = stars.Current.ToString("0.00");
+ });
+ }
+ }
+}
diff --git a/osu.Game.Tests/Visual/Menus/TestSceneDisclaimer.cs b/osu.Game.Tests/Visual/Menus/TestSceneDisclaimer.cs
index 681bf1b40b..49fab08ded 100644
--- a/osu.Game.Tests/Visual/Menus/TestSceneDisclaimer.cs
+++ b/osu.Game.Tests/Visual/Menus/TestSceneDisclaimer.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Tests.Visual.Menus
API.LocalUser.Value = new User
{
Username = API.LocalUser.Value.Username,
- Id = API.LocalUser.Value.Id,
+ Id = API.LocalUser.Value.Id + 1,
IsSupporter = !API.LocalUser.Value.IsSupporter,
};
});
diff --git a/osu.Game.Tests/Visual/Online/TestSceneChatLink.cs b/osu.Game.Tests/Visual/Online/TestSceneChatLink.cs
index a1c77e2db0..c76d4fd5b8 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneChatLink.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneChatLink.cs
@@ -7,6 +7,7 @@ using System.Linq;
using NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
@@ -102,7 +103,7 @@ namespace osu.Game.Tests.Visual.Online
{
bool hasBackground = !string.IsNullOrEmpty(newLine.Message.Sender.Colour);
- Color4 textColour = isAction && hasBackground ? OsuColour.FromHex(newLine.Message.Sender.Colour) : Color4.White;
+ Color4 textColour = isAction && hasBackground ? Color4Extensions.FromHex(newLine.Message.Sender.Colour) : Color4.White;
var linkCompilers = newLine.ContentFlow.Where(d => d is DrawableLinkCompiler).ToList();
var linkSprites = linkCompilers.SelectMany(comp => ((DrawableLinkCompiler)comp).Parts);
diff --git a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
index 51d302123b..105d96cdfe 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
@@ -465,6 +465,43 @@ namespace osu.Game.Tests.Visual.SongSelect
AddAssert("carousel still correct", () => songSelect.Carousel.SelectedBeatmap.OnlineBeatmapID == target.OnlineBeatmapID);
}
+ [Test]
+ public void TestExternalBeatmapChangeWhileFilteredThenRefilter()
+ {
+ createSongSelect();
+ addManyTestMaps();
+
+ changeRuleset(0);
+
+ AddUntilStep("has selection", () => songSelect.Carousel.SelectedBeatmap != null);
+
+ AddStep("set filter text", () => songSelect.FilterControl.ChildrenOfType().First().Text = "nonono");
+
+ AddUntilStep("dummy selected", () => Beatmap.Value is DummyWorkingBeatmap);
+
+ AddUntilStep("has no selection", () => songSelect.Carousel.SelectedBeatmap == null);
+
+ BeatmapInfo target = null;
+
+ AddStep("select beatmap externally", () =>
+ {
+ target = manager.GetAllUsableBeatmapSets().Where(b => b.Beatmaps.Any(bi => bi.RulesetID == 1))
+ .ElementAt(5).Beatmaps.First();
+
+ Beatmap.Value = manager.GetWorkingBeatmap(target);
+ });
+
+ AddUntilStep("has selection", () => songSelect.Carousel.SelectedBeatmap != null);
+
+ AddUntilStep("carousel has correct", () => songSelect.Carousel.SelectedBeatmap?.OnlineBeatmapID == target.OnlineBeatmapID);
+ AddUntilStep("game has correct", () => Beatmap.Value.BeatmapInfo.OnlineBeatmapID == target.OnlineBeatmapID);
+
+ AddStep("set filter text", () => songSelect.FilterControl.ChildrenOfType().First().Text = "nononoo");
+
+ AddUntilStep("game lost selection", () => Beatmap.Value is DummyWorkingBeatmap);
+ AddAssert("carousel lost selection", () => songSelect.Carousel.SelectedBeatmap == null);
+ }
+
[Test]
public void TestAutoplayViaCtrlEnter()
{
diff --git a/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentTeam.cs b/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentTeam.cs
new file mode 100644
index 0000000000..01edcb66e4
--- /dev/null
+++ b/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentTeam.cs
@@ -0,0 +1,125 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using System.Collections.Generic;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Game.Tests.Visual;
+using osu.Game.Tournament.Components;
+using osu.Game.Tournament.Models;
+using osu.Game.Tournament.Screens.Drawings.Components;
+using osu.Game.Tournament.Screens.Gameplay.Components;
+using osu.Game.Tournament.Screens.Ladder.Components;
+using osu.Game.Users;
+
+namespace osu.Game.Tournament.Tests.Components
+{
+ public class TestSceneDrawableTournamentTeam : OsuGridTestScene
+ {
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(DrawableTeamFlag),
+ typeof(DrawableTeamTitle),
+ typeof(DrawableTeamTitleWithHeader),
+ typeof(DrawableMatchTeam),
+ typeof(DrawableTeamWithPlayers),
+ typeof(GroupTeam),
+ typeof(TeamDisplay),
+ };
+
+ public TestSceneDrawableTournamentTeam()
+ : base(4, 3)
+ {
+ var team = new TournamentTeam
+ {
+ FlagName = { Value = "AU" },
+ FullName = { Value = "Australia" },
+ Players =
+ {
+ new User { Username = "ASecretBox" },
+ new User { Username = "Dereban" },
+ new User { Username = "mReKk" },
+ new User { Username = "uyghti" },
+ new User { Username = "Parkes" },
+ new User { Username = "Shiroha" },
+ new User { Username = "Jordan The Bear" },
+ }
+ };
+
+ var match = new TournamentMatch { Team1 = { Value = team } };
+
+ int i = 0;
+
+ Cell(i++).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "DrawableTeamFlag" },
+ new DrawableTeamFlag(team)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+
+ Cell(i++).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "DrawableTeamTitle" },
+ new DrawableTeamTitle(team)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+
+ Cell(i++).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "DrawableTeamTitleWithHeader" },
+ new DrawableTeamTitleWithHeader(team, TeamColour.Red)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+
+ Cell(i++).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "DrawableMatchTeam" },
+ new DrawableMatchTeam(team, match, false)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+
+ Cell(i++).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "TeamWithPlayers" },
+ new DrawableTeamWithPlayers(team, TeamColour.Blue)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+
+ Cell(i++).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "GroupTeam" },
+ new GroupTeam(team)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+
+ Cell(i).AddRange(new Drawable[]
+ {
+ new TournamentSpriteText { Text = "TeamDisplay" },
+ new TeamDisplay(team, TeamColour.Red, new Bindable(2), 6)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ }
+ });
+ }
+ }
+}
diff --git a/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs b/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
index 9de00818a5..34fa7a4997 100644
--- a/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
+++ b/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
@@ -1,16 +1,31 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using System.Collections.Generic;
using osu.Framework.Allocation;
using osu.Game.Tournament.Components;
+using osu.Game.Tournament.Screens;
using osu.Game.Tournament.Screens.Gameplay;
+using osu.Game.Tournament.Screens.Gameplay.Components;
namespace osu.Game.Tournament.Tests.Screens
{
public class TestSceneGameplayScreen : TournamentTestScene
{
[Cached]
- private TournamentMatchChatDisplay chat = new TournamentMatchChatDisplay();
+ private TournamentMatchChatDisplay chat = new TournamentMatchChatDisplay { Width = 0.5f };
+
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(TeamScore),
+ typeof(TeamScoreDisplay),
+ typeof(TeamDisplay),
+ typeof(MatchHeader),
+ typeof(MatchScoreDisplay),
+ typeof(BeatmapInfoScreen),
+ typeof(SongBar),
+ };
[BackgroundDependencyLoader]
private void load()
diff --git a/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs b/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs
index 2277302e98..b240ef3ae5 100644
--- a/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs
+++ b/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs
@@ -2,6 +2,8 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Graphics;
+using osu.Game.Tournament.Components;
using osu.Game.Tournament.Screens.Schedule;
namespace osu.Game.Tournament.Tests.Screens
@@ -11,6 +13,7 @@ namespace osu.Game.Tournament.Tests.Screens
[BackgroundDependencyLoader]
private void load()
{
+ Add(new TourneyVideo("main") { RelativeSizeAxes = Axes.Both });
Add(new ScheduleScreen());
}
}
diff --git a/osu.Game.Tournament/Components/DrawableTeamFlag.cs b/osu.Game.Tournament/Components/DrawableTeamFlag.cs
new file mode 100644
index 0000000000..8c85c9a46f
--- /dev/null
+++ b/osu.Game.Tournament/Components/DrawableTeamFlag.cs
@@ -0,0 +1,33 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using JetBrains.Annotations;
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Textures;
+using osu.Game.Tournament.Models;
+
+namespace osu.Game.Tournament.Components
+{
+ public class DrawableTeamFlag : Sprite
+ {
+ private readonly TournamentTeam team;
+
+ [UsedImplicitly]
+ private Bindable flag;
+
+ public DrawableTeamFlag(TournamentTeam team)
+ {
+ this.team = team;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(TextureStore textures)
+ {
+ if (team == null) return;
+
+ (flag = team.FlagName.GetBoundCopy()).BindValueChanged(acronym => Texture = textures.Get($@"Flags/{team.FlagName}"), true);
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/DrawableTeamHeader.cs b/osu.Game.Tournament/Components/DrawableTeamHeader.cs
new file mode 100644
index 0000000000..3d9e8a6e00
--- /dev/null
+++ b/osu.Game.Tournament/Components/DrawableTeamHeader.cs
@@ -0,0 +1,20 @@
+// 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.Tournament.Models;
+using osuTK;
+
+namespace osu.Game.Tournament.Components
+{
+ public class DrawableTeamHeader : TournamentSpriteTextWithBackground
+ {
+ public DrawableTeamHeader(TeamColour colour)
+ {
+ Background.Colour = TournamentGame.GetTeamColour(colour);
+
+ Text.Colour = TournamentGame.TEXT_COLOUR;
+ Text.Text = $"Team {colour}".ToUpperInvariant();
+ Text.Scale = new Vector2(0.6f);
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/DrawableTeamTitle.cs b/osu.Game.Tournament/Components/DrawableTeamTitle.cs
new file mode 100644
index 0000000000..5aac37259f
--- /dev/null
+++ b/osu.Game.Tournament/Components/DrawableTeamTitle.cs
@@ -0,0 +1,32 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using JetBrains.Annotations;
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics.Textures;
+using osu.Game.Tournament.Models;
+
+namespace osu.Game.Tournament.Components
+{
+ public class DrawableTeamTitle : TournamentSpriteTextWithBackground
+ {
+ private readonly TournamentTeam team;
+
+ [UsedImplicitly]
+ private Bindable acronym;
+
+ public DrawableTeamTitle(TournamentTeam team)
+ {
+ this.team = team;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(TextureStore textures)
+ {
+ if (team == null) return;
+
+ (acronym = team.Acronym.GetBoundCopy()).BindValueChanged(acronym => Text.Text = team?.FullName.Value ?? string.Empty, true);
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/DrawableTeamTitleWithHeader.cs b/osu.Game.Tournament/Components/DrawableTeamTitleWithHeader.cs
new file mode 100644
index 0000000000..ceffe3d315
--- /dev/null
+++ b/osu.Game.Tournament/Components/DrawableTeamTitleWithHeader.cs
@@ -0,0 +1,30 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Tournament.Models;
+using osuTK;
+
+namespace osu.Game.Tournament.Components
+{
+ public class DrawableTeamTitleWithHeader : CompositeDrawable
+ {
+ public DrawableTeamTitleWithHeader(TournamentTeam team, TeamColour colour)
+ {
+ AutoSizeAxes = Axes.Both;
+
+ InternalChild = new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(0, 10),
+ Children = new Drawable[]
+ {
+ new DrawableTeamHeader(colour),
+ new DrawableTeamTitle(team),
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/DrawableTeamWithPlayers.cs b/osu.Game.Tournament/Components/DrawableTeamWithPlayers.cs
new file mode 100644
index 0000000000..e949bf9881
--- /dev/null
+++ b/osu.Game.Tournament/Components/DrawableTeamWithPlayers.cs
@@ -0,0 +1,66 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System.Linq;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics;
+using osu.Game.Tournament.Models;
+using osu.Game.Users;
+using osuTK;
+using osuTK.Graphics;
+
+namespace osu.Game.Tournament.Components
+{
+ public class DrawableTeamWithPlayers : CompositeDrawable
+ {
+ public DrawableTeamWithPlayers(TournamentTeam team, TeamColour colour)
+ {
+ AutoSizeAxes = Axes.Both;
+
+ InternalChildren = new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(30),
+ Children = new Drawable[]
+ {
+ new DrawableTeamTitleWithHeader(team, colour),
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Padding = new MarginPadding { Left = 10 },
+ Spacing = new Vector2(30),
+ Children = new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ Direction = FillDirection.Vertical,
+ AutoSizeAxes = Axes.Both,
+ ChildrenEnumerable = team?.Players.Select(createPlayerText).Take(5) ?? Enumerable.Empty()
+ },
+ new FillFlowContainer
+ {
+ Direction = FillDirection.Vertical,
+ AutoSizeAxes = Axes.Both,
+ ChildrenEnumerable = team?.Players.Select(createPlayerText).Skip(5) ?? Enumerable.Empty()
+ },
+ }
+ },
+ }
+ },
+ };
+
+ TournamentSpriteText createPlayerText(User p) =>
+ new TournamentSpriteText
+ {
+ Text = p.Username,
+ Font = OsuFont.Torus.With(size: 24, weight: FontWeight.SemiBold),
+ Colour = Color4.White,
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/DrawableTournamentTeam.cs b/osu.Game.Tournament/Components/DrawableTournamentTeam.cs
index 99116d4a17..f8aed26ce1 100644
--- a/osu.Game.Tournament/Components/DrawableTournamentTeam.cs
+++ b/osu.Game.Tournament/Components/DrawableTournamentTeam.cs
@@ -23,14 +23,11 @@ namespace osu.Game.Tournament.Components
[UsedImplicitly]
private Bindable acronym;
- [UsedImplicitly]
- private Bindable flag;
-
protected DrawableTournamentTeam(TournamentTeam team)
{
Team = team;
- Flag = new Sprite
+ Flag = new DrawableTeamFlag(team)
{
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit
@@ -48,7 +45,6 @@ namespace osu.Game.Tournament.Components
if (Team == null) return;
(acronym = Team.Acronym.GetBoundCopy()).BindValueChanged(acronym => AcronymText.Text = Team?.Acronym.Value?.ToUpperInvariant() ?? string.Empty, true);
- (flag = Team.FlagName.GetBoundCopy()).BindValueChanged(acronym => Flag.Texture = textures.Get($@"Flags/{Team.FlagName}"), true);
}
}
}
diff --git a/osu.Game.Tournament/Components/DrawableTournamentTitleText.cs b/osu.Game.Tournament/Components/DrawableTournamentTitleText.cs
new file mode 100644
index 0000000000..4fbc6cd060
--- /dev/null
+++ b/osu.Game.Tournament/Components/DrawableTournamentTitleText.cs
@@ -0,0 +1,16 @@
+// 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.Graphics;
+
+namespace osu.Game.Tournament.Components
+{
+ public class DrawableTournamentTitleText : TournamentSpriteText
+ {
+ public DrawableTournamentTitleText()
+ {
+ Text = "osu!taiko world cup 2020";
+ Font = OsuFont.Torus.With(size: 26, weight: FontWeight.SemiBold);
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/RoundDisplay.cs b/osu.Game.Tournament/Components/RoundDisplay.cs
new file mode 100644
index 0000000000..dd56c83c57
--- /dev/null
+++ b/osu.Game.Tournament/Components/RoundDisplay.cs
@@ -0,0 +1,36 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics;
+using osu.Game.Tournament.Models;
+
+namespace osu.Game.Tournament.Components
+{
+ public class RoundDisplay : CompositeDrawable
+ {
+ public RoundDisplay(TournamentMatch match)
+ {
+ AutoSizeAxes = Axes.Both;
+
+ InternalChildren = new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new DrawableTournamentTitleText(),
+ new TournamentSpriteText
+ {
+ Text = match.Round.Value?.Name.Value ?? "Unknown Round",
+ Font = OsuFont.Torus.With(size: 26, weight: FontWeight.SemiBold)
+ },
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/SongBar.cs b/osu.Game.Tournament/Components/SongBar.cs
index 48ea36a8f3..8d766ec9ba 100644
--- a/osu.Game.Tournament/Components/SongBar.cs
+++ b/osu.Game.Tournament/Components/SongBar.cs
@@ -4,10 +4,8 @@
using System;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
-using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Game.Beatmaps;
@@ -24,6 +22,8 @@ namespace osu.Game.Tournament.Components
{
private BeatmapInfo beatmap;
+ private const float height = 145;
+
[Resolved]
private IBindable ruleset { get; set; }
@@ -52,15 +52,7 @@ namespace osu.Game.Tournament.Components
}
}
- private Container panelContents;
- private Container innerPanel;
- private Container outerPanel;
- private TournamentBeatmapPanel panel;
-
- private float panelWidth => expanded ? 0.6f : 1;
-
- private const float main_width = 0.97f;
- private const float inner_panel_width = 0.7f;
+ private FillFlowContainer flow;
private bool expanded;
@@ -70,86 +62,27 @@ namespace osu.Game.Tournament.Components
set
{
expanded = value;
- panel?.ResizeWidthTo(panelWidth, 800, Easing.OutQuint);
-
- if (expanded)
- {
- innerPanel.ResizeWidthTo(inner_panel_width, 800, Easing.OutQuint);
- outerPanel.ResizeWidthTo(main_width, 800, Easing.OutQuint);
- }
- else
- {
- innerPanel.ResizeWidthTo(1, 800, Easing.OutQuint);
- outerPanel.ResizeWidthTo(0.25f, 800, Easing.OutQuint);
- }
+ flow.Direction = expanded ? FillDirection.Full : FillDirection.Vertical;
}
}
[BackgroundDependencyLoader]
private void load()
{
- RelativeSizeAxes = Axes.Both;
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
InternalChildren = new Drawable[]
{
- outerPanel = new Container
+ flow = new FillFlowContainer
{
- Masking = true,
- EdgeEffect = new EdgeEffectParameters
- {
- Colour = Color4.Black.Opacity(0.2f),
- Type = EdgeEffectType.Shadow,
- Radius = 5,
- },
RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ LayoutDuration = 500,
+ LayoutEasing = Easing.OutQuint,
+ Direction = FillDirection.Full,
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomRight,
- RelativePositionAxes = Axes.X,
- X = -(1 - main_width) / 2,
- Y = -10,
- Width = main_width,
- Height = TournamentBeatmapPanel.HEIGHT,
- CornerRadius = TournamentBeatmapPanel.HEIGHT / 2,
- CornerExponent = 2,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.Gray(0.93f),
- },
- new OsuLogo
- {
- Triangles = false,
- Colour = OsuColour.Gray(0.33f),
- Scale = new Vector2(0.08f),
- Margin = new MarginPadding(50),
- Anchor = Anchor.CentreRight,
- Origin = Anchor.CentreRight,
- },
- innerPanel = new Container
- {
- Masking = true,
- CornerRadius = TournamentBeatmapPanel.HEIGHT / 2,
- CornerExponent = 2,
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- RelativeSizeAxes = Axes.Both,
- Width = inner_panel_width,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.Gray(0.86f),
- },
- panelContents = new Container
- {
- RelativeSizeAxes = Axes.Both,
- }
- }
- }
- }
}
};
@@ -160,7 +93,7 @@ namespace osu.Game.Tournament.Components
{
if (beatmap == null)
{
- panelContents.Clear();
+ flow.Clear();
return;
}
@@ -219,34 +152,86 @@ namespace osu.Game.Tournament.Components
break;
}
- panelContents.Children = new Drawable[]
+ flow.Children = new Drawable[]
{
- new DiffPiece(("Length", TimeSpan.FromMilliseconds(length).ToString(@"mm\:ss")))
+ new Container
{
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.BottomLeft,
+ RelativeSizeAxes = Axes.X,
+ Height = height / 2,
+ Width = 0.5f,
+ Anchor = Anchor.BottomRight,
+ Origin = Anchor.BottomRight,
+
+ Children = new Drawable[]
+ {
+ new GridContainer
+ {
+ RelativeSizeAxes = Axes.Both,
+
+ Content = new[]
+ {
+ new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new DiffPiece(stats),
+ new DiffPiece(("Star Rating", $"{beatmap.StarDifficulty:0.#}{srExtra}"))
+ }
+ },
+ new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new DiffPiece(("Length", TimeSpan.FromMilliseconds(length).ToString(@"mm\:ss"))),
+ new DiffPiece(("BPM", $"{bpm:0.#}"))
+ }
+ },
+ new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ Colour = Color4.Black,
+ RelativeSizeAxes = Axes.Both,
+ Alpha = 0.1f,
+ },
+ new OsuLogo
+ {
+ Triangles = false,
+ Scale = new Vector2(0.08f),
+ Margin = new MarginPadding(50),
+ X = -10,
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreRight,
+ },
+ }
+ },
+ },
+ }
+ }
+ }
},
- new DiffPiece(("BPM", $"{bpm:0.#}"))
+ new TournamentBeatmapPanel(beatmap)
{
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.TopLeft
- },
- new DiffPiece(stats)
- {
- Anchor = Anchor.CentreRight,
- Origin = Anchor.BottomRight
- },
- new DiffPiece(("Star Rating", $"{beatmap.StarDifficulty:0.#}{srExtra}"))
- {
- Anchor = Anchor.CentreRight,
- Origin = Anchor.TopRight
- },
- panel = new TournamentBeatmapPanel(beatmap)
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- RelativeSizeAxes = Axes.Both,
- Size = new Vector2(panelWidth, 1)
+ RelativeSizeAxes = Axes.X,
+ Width = 0.5f,
+ Height = height / 2,
+ Anchor = Anchor.BottomRight,
+ Origin = Anchor.BottomRight,
}
};
}
@@ -258,10 +243,9 @@ namespace osu.Game.Tournament.Components
Margin = new MarginPadding { Horizontal = 15, Vertical = 1 };
AutoSizeAxes = Axes.Both;
- static void cp(SpriteText s, Color4 colour)
+ static void cp(SpriteText s, bool bold)
{
- s.Colour = colour;
- s.Font = OsuFont.Torus.With(weight: FontWeight.Bold, size: 15);
+ s.Font = OsuFont.Torus.With(weight: bold ? FontWeight.Bold : FontWeight.Regular, size: 15);
}
for (var i = 0; i < tuples.Length; i++)
@@ -272,14 +256,14 @@ namespace osu.Game.Tournament.Components
{
AddText(" / ", s =>
{
- cp(s, OsuColour.Gray(0.33f));
+ cp(s, false);
s.Spacing = new Vector2(-2, 0);
});
}
- AddText(new TournamentSpriteText { Text = heading }, s => cp(s, OsuColour.Gray(0.33f)));
- AddText(" ", s => cp(s, OsuColour.Gray(0.33f)));
- AddText(new TournamentSpriteText { Text = content }, s => cp(s, OsuColour.Gray(0.5f)));
+ AddText(new TournamentSpriteText { Text = heading }, s => cp(s, false));
+ AddText(" ", s => cp(s, false));
+ AddText(new TournamentSpriteText { Text = content }, s => cp(s, true));
}
}
}
diff --git a/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs b/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs
index 394ffe304e..4116ffbec6 100644
--- a/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs
+++ b/osu.Game.Tournament/Components/TournamentBeatmapPanel.cs
@@ -27,7 +27,7 @@ namespace osu.Game.Tournament.Components
private readonly string mods;
private const float horizontal_padding = 10;
- private const float vertical_padding = 5;
+ private const float vertical_padding = 10;
public const float HEIGHT = 50;
@@ -50,8 +50,6 @@ namespace osu.Game.Tournament.Components
currentMatch.BindValueChanged(matchChanged);
currentMatch.BindTo(ladder.CurrentMatch);
- CornerRadius = HEIGHT / 2;
- CornerExponent = 2;
Masking = true;
AddRangeInternal(new Drawable[]
@@ -70,16 +68,14 @@ namespace osu.Game.Tournament.Components
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Padding = new MarginPadding(vertical_padding),
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Padding = new MarginPadding(15),
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
new TournamentSpriteText
{
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
Text = new LocalisedString((
$"{Beatmap.Metadata.ArtistUnicode ?? Beatmap.Metadata.Artist} - {Beatmap.Metadata.TitleUnicode ?? Beatmap.Metadata.Title}",
$"{Beatmap.Metadata.Artist} - {Beatmap.Metadata.Title}")),
@@ -88,9 +84,6 @@ namespace osu.Game.Tournament.Components
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Padding = new MarginPadding(vertical_padding),
Direction = FillDirection.Horizontal,
Children = new Drawable[]
{
@@ -137,8 +130,8 @@ namespace osu.Game.Tournament.Components
Texture = textures.Get($"mods/{mods}"),
Anchor = Anchor.CentreRight,
Origin = Anchor.CentreRight,
- Margin = new MarginPadding(20),
- Scale = new Vector2(0.5f)
+ Margin = new MarginPadding(10),
+ Scale = new Vector2(0.8f)
});
}
}
@@ -170,16 +163,7 @@ namespace osu.Game.Tournament.Components
BorderThickness = 6;
- switch (found.Team)
- {
- case TeamColour.Red:
- BorderColour = Color4.Red;
- break;
-
- case TeamColour.Blue:
- BorderColour = Color4.Blue;
- break;
- }
+ BorderColour = TournamentGame.GetTeamColour(found.Team);
switch (found.Type)
{
diff --git a/osu.Game.Tournament/Components/TournamentMatchChatDisplay.cs b/osu.Game.Tournament/Components/TournamentMatchChatDisplay.cs
index 48c5b9bd35..2a183d0d45 100644
--- a/osu.Game.Tournament/Components/TournamentMatchChatDisplay.cs
+++ b/osu.Game.Tournament/Components/TournamentMatchChatDisplay.cs
@@ -9,8 +9,6 @@ using osu.Game.Online.Chat;
using osu.Game.Overlays.Chat;
using osu.Game.Tournament.IPC;
using osu.Game.Tournament.Models;
-using osuTK;
-using osuTK.Graphics;
namespace osu.Game.Tournament.Components
{
@@ -23,11 +21,11 @@ namespace osu.Game.Tournament.Components
public TournamentMatchChatDisplay()
{
RelativeSizeAxes = Axes.X;
- Y = 100;
- Size = new Vector2(0.45f, 112);
- Margin = new MarginPadding(10);
- Anchor = Anchor.BottomCentre;
- Origin = Anchor.BottomCentre;
+ Height = 144;
+ Anchor = Anchor.BottomLeft;
+ Origin = Anchor.BottomLeft;
+
+ CornerRadius = 0;
}
[BackgroundDependencyLoader(true)]
@@ -66,6 +64,10 @@ namespace osu.Game.Tournament.Components
}
}
+ public void Expand() => this.FadeIn(300);
+
+ public void Contract() => this.FadeOut(200);
+
protected override ChatLine CreateMessage(Message message) => new MatchMessage(message);
protected class MatchMessage : StandAloneMessage
@@ -75,19 +77,15 @@ namespace osu.Game.Tournament.Components
{
}
- [BackgroundDependencyLoader]
private void load(LadderInfo info)
{
- //if (info.CurrentMatch.Value.Team1.Value.Players.Any(u => u.Id == Message.Sender.Id))
- // ColourBox.Colour = red;
- //else if (info.CurrentMatch.Value.Team2.Value.Players.Any(u => u.Id == Message.Sender.Id))
- // ColourBox.Colour = blue;
- //else if (Message.Sender.Colour != null)
- // SenderText.Colour = ColourBox.Colour = OsuColour.FromHex(Message.Sender.Colour);
+ // if (info.CurrentMatch.Value.Team1.Value.Players.Any(u => u.Id == Message.Sender.Id))
+ // SenderText.Colour = TournamentGame.COLOUR_RED;
+ // else if (info.CurrentMatch.Value.Team2.Value.Players.Any(u => u.Id == Message.Sender.Id))
+ // SenderText.Colour = TournamentGame.COLOUR_BLUE;
+ // else if (Message.Sender.Colour != null)
+ // SenderText.Colour = ColourBox.Colour = Color4Extensions.FromHex(Message.Sender.Colour);
}
-
- private readonly Color4 red = new Color4(186, 0, 18, 255);
- private readonly Color4 blue = new Color4(17, 136, 170, 255);
}
}
}
diff --git a/osu.Game.Tournament/Components/TournamentSpriteTextWithBackground.cs b/osu.Game.Tournament/Components/TournamentSpriteTextWithBackground.cs
new file mode 100644
index 0000000000..d92b9eb605
--- /dev/null
+++ b/osu.Game.Tournament/Components/TournamentSpriteTextWithBackground.cs
@@ -0,0 +1,37 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+
+namespace osu.Game.Tournament.Components
+{
+ public class TournamentSpriteTextWithBackground : CompositeDrawable
+ {
+ protected readonly TournamentSpriteText Text;
+ protected readonly Box Background;
+
+ public TournamentSpriteTextWithBackground(string text = "")
+ {
+ AutoSizeAxes = Axes.Both;
+
+ InternalChildren = new Drawable[]
+ {
+ Background = new Box
+ {
+ Colour = TournamentGame.ELEMENT_BACKGROUND_COLOUR,
+ RelativeSizeAxes = Axes.Both,
+ },
+ Text = new TournamentSpriteText
+ {
+ Colour = TournamentGame.ELEMENT_FOREGROUND_COLOUR,
+ Font = OsuFont.Torus.With(weight: FontWeight.SemiBold, size: 50),
+ Padding = new MarginPadding { Left = 10, Right = 20 },
+ Text = text
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/TourneyVideo.cs b/osu.Game.Tournament/Components/TourneyVideo.cs
index 7d2eaff515..43088d6b92 100644
--- a/osu.Game.Tournament/Components/TourneyVideo.cs
+++ b/osu.Game.Tournament/Components/TourneyVideo.cs
@@ -38,7 +38,8 @@ namespace osu.Game.Tournament.Components
{
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit,
- Clock = new FramedClock(manualClock = new ManualClock())
+ Clock = new FramedClock(manualClock = new ManualClock()),
+ Loop = loop,
};
}
else if (drawFallbackGradient)
@@ -51,15 +52,24 @@ namespace osu.Game.Tournament.Components
}
}
+ private bool loop;
+
public bool Loop
{
set
{
+ loop = value;
if (video != null)
video.Loop = value;
}
}
+ public void Reset()
+ {
+ if (manualClock != null)
+ manualClock.CurrentTime = 0;
+ }
+
protected override void Update()
{
base.Update();
diff --git a/osu.Game.Tournament/Models/TournamentMatch.cs b/osu.Game.Tournament/Models/TournamentMatch.cs
index 06cce3d59e..8ebcbf4e15 100644
--- a/osu.Game.Tournament/Models/TournamentMatch.cs
+++ b/osu.Game.Tournament/Models/TournamentMatch.cs
@@ -90,6 +90,8 @@ namespace osu.Game.Tournament.Models
[JsonIgnore]
public TournamentTeam Loser => !Completed.Value ? null : Team1Score.Value > Team2Score.Value ? Team2.Value : Team1.Value;
+ public TeamColour WinnerColour => Winner == Team1.Value ? TeamColour.Red : TeamColour.Blue;
+
public int PointsToWin => Round.Value?.BestOf.Value / 2 + 1 ?? 0;
///
diff --git a/osu.Game.Tournament/Screens/BeatmapInfoScreen.cs b/osu.Game.Tournament/Screens/BeatmapInfoScreen.cs
index fccd35ca9e..0a3163ef43 100644
--- a/osu.Game.Tournament/Screens/BeatmapInfoScreen.cs
+++ b/osu.Game.Tournament/Screens/BeatmapInfoScreen.cs
@@ -21,6 +21,7 @@ namespace osu.Game.Tournament.Screens
{
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomRight,
+ Depth = float.MinValue,
});
}
diff --git a/osu.Game.Tournament/Screens/Drawings/Components/Group.cs b/osu.Game.Tournament/Screens/Drawings/Components/Group.cs
index 4126f2db65..ece1c431e2 100644
--- a/osu.Game.Tournament/Screens/Drawings/Components/Group.cs
+++ b/osu.Game.Tournament/Screens/Drawings/Components/Group.cs
@@ -8,7 +8,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Game.Graphics;
-using osu.Game.Tournament.Components;
using osu.Game.Tournament.Models;
using osuTK;
using osuTK.Graphics;
@@ -116,53 +115,5 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
sb.AppendLine(gt.Team.FullName.Value);
return sb.ToString();
}
-
- private class GroupTeam : DrawableTournamentTeam
- {
- private readonly FillFlowContainer innerContainer;
-
- public GroupTeam(TournamentTeam team)
- : base(team)
- {
- Width = 36;
- AutoSizeAxes = Axes.Y;
-
- Flag.Anchor = Anchor.TopCentre;
- Flag.Origin = Anchor.TopCentre;
-
- AcronymText.Anchor = Anchor.TopCentre;
- AcronymText.Origin = Anchor.TopCentre;
- AcronymText.Text = team.Acronym.Value.ToUpperInvariant();
- AcronymText.Font = OsuFont.Torus.With(weight: FontWeight.Bold, size: 10);
-
- InternalChildren = new Drawable[]
- {
- innerContainer = new FillFlowContainer
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
-
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
-
- Direction = FillDirection.Vertical,
- Spacing = new Vector2(0, 5f),
-
- Children = new Drawable[]
- {
- Flag,
- AcronymText
- }
- }
- };
- }
-
- protected override void LoadComplete()
- {
- base.LoadComplete();
- innerContainer.ScaleTo(1.5f);
- innerContainer.ScaleTo(1f, 200);
- }
- }
}
}
diff --git a/osu.Game.Tournament/Screens/Drawings/Components/GroupTeam.cs b/osu.Game.Tournament/Screens/Drawings/Components/GroupTeam.cs
new file mode 100644
index 0000000000..4f0ce0bbe7
--- /dev/null
+++ b/osu.Game.Tournament/Screens/Drawings/Components/GroupTeam.cs
@@ -0,0 +1,60 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics;
+using osu.Game.Tournament.Components;
+using osu.Game.Tournament.Models;
+using osuTK;
+
+namespace osu.Game.Tournament.Screens.Drawings.Components
+{
+ public class GroupTeam : DrawableTournamentTeam
+ {
+ private readonly FillFlowContainer innerContainer;
+
+ public GroupTeam(TournamentTeam team)
+ : base(team)
+ {
+ Width = 36;
+ AutoSizeAxes = Axes.Y;
+
+ Flag.Anchor = Anchor.TopCentre;
+ Flag.Origin = Anchor.TopCentre;
+
+ AcronymText.Anchor = Anchor.TopCentre;
+ AcronymText.Origin = Anchor.TopCentre;
+ AcronymText.Text = team.Acronym.Value.ToUpperInvariant();
+ AcronymText.Font = OsuFont.Torus.With(weight: FontWeight.Bold, size: 10);
+
+ InternalChildren = new Drawable[]
+ {
+ innerContainer = new FillFlowContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(0, 5f),
+
+ Children = new Drawable[]
+ {
+ Flag,
+ AcronymText
+ }
+ }
+ };
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ innerContainer.ScaleTo(1.5f);
+ innerContainer.ScaleTo(1f, 200);
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs b/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs
index 631393c6f4..7468c9484d 100644
--- a/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs
+++ b/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs
@@ -172,19 +172,6 @@ namespace osu.Game.Tournament.Screens.Editors
drawableContainer.Child = new DrawableTeamFlag(Model);
}
- private class DrawableTeamFlag : DrawableTournamentTeam
- {
- public DrawableTeamFlag(TournamentTeam team)
- : base(team)
- {
- InternalChild = Flag;
- RelativeSizeAxes = Axes.Both;
-
- Flag.Anchor = Anchor.Centre;
- Flag.Origin = Anchor.Centre;
- }
- }
-
public class PlayerEditor : CompositeDrawable
{
private readonly TournamentTeam team;
diff --git a/osu.Game.Tournament/Screens/Editors/TournamentEditorScreen.cs b/osu.Game.Tournament/Screens/Editors/TournamentEditorScreen.cs
index e4256e727d..8e5df72cc8 100644
--- a/osu.Game.Tournament/Screens/Editors/TournamentEditorScreen.cs
+++ b/osu.Game.Tournament/Screens/Editors/TournamentEditorScreen.cs
@@ -40,7 +40,6 @@ namespace osu.Game.Tournament.Screens.Editors
new OsuScrollContainer
{
RelativeSizeAxes = Axes.Both,
- Width = 0.9f,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
Child = flow = new FillFlowContainer
diff --git a/osu.Game.Tournament/Screens/Gameplay/Components/MatchHeader.cs b/osu.Game.Tournament/Screens/Gameplay/Components/MatchHeader.cs
index ce17c392d0..69a68c946b 100644
--- a/osu.Game.Tournament/Screens/Gameplay/Components/MatchHeader.cs
+++ b/osu.Game.Tournament/Screens/Gameplay/Components/MatchHeader.cs
@@ -5,21 +5,28 @@ using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
-using osu.Game.Graphics;
-using osu.Game.Graphics.UserInterface;
using osu.Game.Tournament.Components;
using osu.Game.Tournament.Models;
-using osu.Game.Tournament.Screens.Showcase;
using osuTK;
-using osuTK.Graphics;
using osuTK.Input;
namespace osu.Game.Tournament.Screens.Gameplay.Components
{
public class MatchHeader : Container
{
+ private TeamScoreDisplay teamDisplay1;
+ private TeamScoreDisplay teamDisplay2;
+
+ public bool ShowScores
+ {
+ set
+ {
+ teamDisplay1.ShowScore = value;
+ teamDisplay2.ShowScore = value;
+ }
+ }
+
[BackgroundDependencyLoader]
private void load()
{
@@ -27,200 +34,108 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
Height = 95;
Children = new Drawable[]
{
- new TournamentLogo(),
- new RoundDisplay
+ new FillFlowContainer
{
- Y = 5,
- Anchor = Anchor.BottomCentre,
- Origin = Anchor.TopCentre,
+ RelativeSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(5),
+ Children = new Drawable[]
+ {
+ new DrawableTournamentTitleText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Scale = new Vector2(1.2f)
+ },
+ new RoundDisplay
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Scale = new Vector2(0.4f)
+ },
+ }
},
- new TeamScoreDisplay(TeamColour.Red)
+ teamDisplay1 = new TeamScoreDisplay(TeamColour.Red)
{
Anchor = Anchor.TopLeft,
Origin = Anchor.TopLeft,
},
- new TeamScoreDisplay(TeamColour.Blue)
+ teamDisplay2 = new TeamScoreDisplay(TeamColour.Blue)
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
},
};
}
+ }
- private class TeamScoreDisplay : CompositeDrawable
+ public class TeamScoreDisplay : CompositeDrawable
+ {
+ private readonly TeamColour teamColour;
+
+ private readonly Bindable currentMatch = new Bindable();
+ private readonly Bindable currentTeam = new Bindable();
+ private readonly Bindable currentTeamScore = new Bindable();
+
+ private TeamDisplay teamDisplay;
+
+ public bool ShowScore { set => teamDisplay.ShowScore = value; }
+
+ public TeamScoreDisplay(TeamColour teamColour)
{
- private readonly TeamColour teamColour;
+ this.teamColour = teamColour;
- private readonly Bindable currentMatch = new Bindable();
- private readonly Bindable currentTeam = new Bindable();
- private readonly Bindable currentTeamScore = new Bindable();
+ RelativeSizeAxes = Axes.Y;
+ AutoSizeAxes = Axes.X;
+ }
- public TeamScoreDisplay(TeamColour teamColour)
+ [BackgroundDependencyLoader]
+ private void load(LadderInfo ladder)
+ {
+ currentMatch.BindTo(ladder.CurrentMatch);
+ currentMatch.BindValueChanged(matchChanged, true);
+ }
+
+ private void matchChanged(ValueChangedEvent match)
+ {
+ currentTeamScore.UnbindBindings();
+ currentTeam.UnbindBindings();
+
+ if (match.NewValue != null)
{
- this.teamColour = teamColour;
-
- RelativeSizeAxes = Axes.Y;
- Width = 300;
- }
-
- [BackgroundDependencyLoader]
- private void load(LadderInfo ladder)
- {
- currentMatch.BindValueChanged(matchChanged);
- currentMatch.BindTo(ladder.CurrentMatch);
- }
-
- private void matchChanged(ValueChangedEvent match)
- {
- currentTeamScore.UnbindBindings();
currentTeamScore.BindTo(teamColour == TeamColour.Red ? match.NewValue.Team1Score : match.NewValue.Team2Score);
-
- currentTeam.UnbindBindings();
currentTeam.BindTo(teamColour == TeamColour.Red ? match.NewValue.Team1 : match.NewValue.Team2);
-
- // team may change to same team, which means score is not in a good state.
- // thus we handle this manually.
- teamChanged(currentTeam.Value);
}
- protected override bool OnMouseDown(MouseDownEvent e)
- {
- switch (e.Button)
- {
- case MouseButton.Left:
- if (currentTeamScore.Value < currentMatch.Value.PointsToWin)
- currentTeamScore.Value++;
- return true;
-
- case MouseButton.Right:
- if (currentTeamScore.Value > 0)
- currentTeamScore.Value--;
- return true;
- }
-
- return base.OnMouseDown(e);
- }
-
- private void teamChanged(TournamentTeam team)
- {
- var colour = teamColour == TeamColour.Red ? TournamentGame.COLOUR_RED : TournamentGame.COLOUR_BLUE;
- var flip = teamColour != TeamColour.Red;
-
- InternalChildren = new Drawable[]
- {
- new TeamDisplay(team, colour, flip),
- new TeamScore(currentTeamScore, flip, currentMatch.Value.PointsToWin)
- {
- Colour = colour
- }
- };
- }
+ // team may change to same team, which means score is not in a good state.
+ // thus we handle this manually.
+ teamChanged(currentTeam.Value);
}
- private class TeamScore : CompositeDrawable
+ protected override bool OnMouseDown(MouseDownEvent e)
{
- private readonly Bindable currentTeamScore = new Bindable();
- private readonly StarCounter counter;
-
- public TeamScore(Bindable score, bool flip, int count)
+ switch (e.Button)
{
- var anchor = flip ? Anchor.CentreRight : Anchor.CentreLeft;
+ case MouseButton.Left:
+ if (currentTeamScore.Value < currentMatch.Value.PointsToWin)
+ currentTeamScore.Value++;
+ return true;
- Anchor = anchor;
- Origin = anchor;
-
- InternalChild = counter = new StarCounter(count)
- {
- Anchor = anchor,
- X = (flip ? -1 : 1) * 90,
- Y = 5,
- Scale = flip ? new Vector2(-1, 1) : Vector2.One,
- };
-
- currentTeamScore.BindValueChanged(scoreChanged);
- currentTeamScore.BindTo(score);
+ case MouseButton.Right:
+ if (currentTeamScore.Value > 0)
+ currentTeamScore.Value--;
+ return true;
}
- private void scoreChanged(ValueChangedEvent score) => counter.CountStars = score.NewValue ?? 0;
+ return base.OnMouseDown(e);
}
- private class TeamDisplay : DrawableTournamentTeam
+ private void teamChanged(TournamentTeam team)
{
- public TeamDisplay(TournamentTeam team, Color4 colour, bool flip)
- : base(team)
+ InternalChildren = new Drawable[]
{
- RelativeSizeAxes = Axes.Both;
-
- var anchor = flip ? Anchor.CentreRight : Anchor.CentreLeft;
-
- Anchor = Origin = anchor;
-
- Flag.Anchor = Flag.Origin = anchor;
- Flag.RelativeSizeAxes = Axes.None;
- Flag.Size = new Vector2(60, 40);
- Flag.Margin = new MarginPadding(20);
-
- InternalChild = new Container
- {
- RelativeSizeAxes = Axes.Both,
- Children = new Drawable[]
- {
- Flag,
- new TournamentSpriteText
- {
- Text = team?.FullName.Value.ToUpper() ?? "???",
- X = (flip ? -1 : 1) * 90,
- Y = -10,
- Colour = colour,
- Font = OsuFont.Torus.With(weight: FontWeight.Regular, size: 20),
- Origin = anchor,
- Anchor = anchor,
- },
- }
- };
- }
- }
-
- private class RoundDisplay : CompositeDrawable
- {
- private readonly Bindable currentMatch = new Bindable();
-
- private readonly TournamentSpriteText text;
-
- public RoundDisplay()
- {
- Width = 200;
- Height = 20;
-
- Masking = true;
- CornerRadius = 10;
-
- InternalChildren = new Drawable[]
- {
- new Box
- {
- Colour = OsuColour.Gray(0.18f),
- RelativeSizeAxes = Axes.Both,
- },
- text = new TournamentSpriteText
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Colour = Color4.White,
- Font = OsuFont.Torus.With(weight: FontWeight.Regular, size: 16),
- },
- };
- }
-
- [BackgroundDependencyLoader]
- private void load(LadderInfo ladder)
- {
- currentMatch.BindValueChanged(matchChanged);
- currentMatch.BindTo(ladder.CurrentMatch);
- }
-
- private void matchChanged(ValueChangedEvent match) =>
- text.Text = match.NewValue.Round.Value?.Name.Value ?? "Unknown Round";
+ teamDisplay = new TeamDisplay(team, teamColour, currentTeamScore, currentMatch.Value?.PointsToWin ?? 0),
+ };
}
}
}
diff --git a/osu.Game.Tournament/Screens/Gameplay/Components/MatchScoreDisplay.cs b/osu.Game.Tournament/Screens/Gameplay/Components/MatchScoreDisplay.cs
index fcf1469278..ed14956793 100644
--- a/osu.Game.Tournament/Screens/Gameplay/Components/MatchScoreDisplay.cs
+++ b/osu.Game.Tournament/Screens/Gameplay/Components/MatchScoreDisplay.cs
@@ -11,16 +11,12 @@ using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using osu.Game.Tournament.IPC;
using osu.Game.Tournament.Models;
-using osuTK.Graphics;
namespace osu.Game.Tournament.Screens.Gameplay.Components
{
public class MatchScoreDisplay : CompositeDrawable
{
- private readonly Color4 red = new Color4(186, 0, 18, 255);
- private readonly Color4 blue = new Color4(17, 136, 170, 255);
-
- private const float bar_height = 20;
+ private const float bar_height = 18;
private readonly BindableInt score1 = new BindableInt();
private readonly BindableInt score2 = new BindableInt();
@@ -28,45 +24,63 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
private readonly MatchScoreCounter score1Text;
private readonly MatchScoreCounter score2Text;
- private readonly Circle score1Bar;
- private readonly Circle score2Bar;
+ private readonly Drawable score1Bar;
+ private readonly Drawable score2Bar;
public MatchScoreDisplay()
{
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
- InternalChildren = new Drawable[]
+ InternalChildren = new[]
{
- score1Bar = new Circle
+ new Box
+ {
+ Name = "top bar red (static)",
+ RelativeSizeAxes = Axes.X,
+ Height = bar_height / 4,
+ Width = 0.5f,
+ Colour = TournamentGame.COLOUR_RED,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopRight
+ },
+ new Box
+ {
+ Name = "top bar blue (static)",
+ RelativeSizeAxes = Axes.X,
+ Height = bar_height / 4,
+ Width = 0.5f,
+ Colour = TournamentGame.COLOUR_BLUE,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopLeft
+ },
+ score1Bar = new Box
{
Name = "top bar red",
RelativeSizeAxes = Axes.X,
Height = bar_height,
Width = 0,
- Colour = red,
+ Colour = TournamentGame.COLOUR_RED,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopRight
},
score1Text = new MatchScoreCounter
{
- Colour = red,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre
},
- score2Bar = new Circle
+ score2Bar = new Box
{
Name = "top bar blue",
RelativeSizeAxes = Axes.X,
Height = bar_height,
Width = 0,
- Colour = blue,
+ Colour = TournamentGame.COLOUR_BLUE,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopLeft
},
score2Text = new MatchScoreCounter
{
- Colour = blue,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre
},
@@ -103,10 +117,9 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
winningBar.ResizeWidthTo(Math.Min(0.4f, MathF.Pow(diff / 1500000f, 0.5f) / 2), 400, Easing.OutQuint);
}
- protected override void Update()
+ protected override void UpdateAfterChildren()
{
- base.Update();
-
+ base.UpdateAfterChildren();
score1Text.X = -Math.Max(5 + score1Text.DrawWidth / 2, score1Bar.DrawWidth);
score2Text.X = Math.Max(5 + score2Text.DrawWidth / 2, score2Bar.DrawWidth);
}
@@ -115,7 +128,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
{
public MatchScoreCounter()
{
- Margin = new MarginPadding { Top = bar_height + 5, Horizontal = 10 };
+ Margin = new MarginPadding { Top = bar_height, Horizontal = 10 };
Winning = false;
}
@@ -123,8 +136,8 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
public bool Winning
{
set => DisplayedCountSpriteText.Font = value
- ? OsuFont.Torus.With(weight: FontWeight.Regular, size: 60)
- : OsuFont.Torus.With(weight: FontWeight.Light, size: 40);
+ ? OsuFont.Torus.With(weight: FontWeight.Bold, size: 50)
+ : OsuFont.Torus.With(weight: FontWeight.Regular, size: 40);
}
}
}
diff --git a/osu.Game.Tournament/Screens/Gameplay/Components/RoundDisplay.cs b/osu.Game.Tournament/Screens/Gameplay/Components/RoundDisplay.cs
new file mode 100644
index 0000000000..c8b0d3bdda
--- /dev/null
+++ b/osu.Game.Tournament/Screens/Gameplay/Components/RoundDisplay.cs
@@ -0,0 +1,25 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Game.Tournament.Components;
+using osu.Game.Tournament.Models;
+
+namespace osu.Game.Tournament.Screens.Gameplay.Components
+{
+ public class RoundDisplay : TournamentSpriteTextWithBackground
+ {
+ private readonly Bindable currentMatch = new Bindable();
+
+ [BackgroundDependencyLoader]
+ private void load(LadderInfo ladder)
+ {
+ currentMatch.BindValueChanged(matchChanged);
+ currentMatch.BindTo(ladder.CurrentMatch);
+ }
+
+ private void matchChanged(ValueChangedEvent match) =>
+ Text.Text = match.NewValue.Round.Value?.Name.Value ?? "Unknown Round";
+ }
+}
diff --git a/osu.Game.Tournament/Screens/Gameplay/Components/TeamDisplay.cs b/osu.Game.Tournament/Screens/Gameplay/Components/TeamDisplay.cs
new file mode 100644
index 0000000000..29908e8e7c
--- /dev/null
+++ b/osu.Game.Tournament/Screens/Gameplay/Components/TeamDisplay.cs
@@ -0,0 +1,91 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Tournament.Components;
+using osu.Game.Tournament.Models;
+using osuTK;
+
+namespace osu.Game.Tournament.Screens.Gameplay.Components
+{
+ public class TeamDisplay : DrawableTournamentTeam
+ {
+ private readonly TeamScore score;
+
+ public bool ShowScore { set => score.FadeTo(value ? 1 : 0, 200); }
+
+ public TeamDisplay(TournamentTeam team, TeamColour colour, Bindable currentTeamScore, int pointsToWin)
+ : base(team)
+ {
+ AutoSizeAxes = Axes.Both;
+
+ bool flip = colour == TeamColour.Red;
+
+ var anchor = flip ? Anchor.TopLeft : Anchor.TopRight;
+
+ Flag.RelativeSizeAxes = Axes.None;
+ Flag.Size = new Vector2(60, 40);
+ Flag.Origin = anchor;
+ Flag.Anchor = anchor;
+
+ Margin = new MarginPadding(20);
+
+ InternalChild = new Container
+ {
+ AutoSizeAxes = Axes.Both,
+ Children = new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(5),
+ Children = new Drawable[]
+ {
+ Flag,
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Origin = anchor,
+ Anchor = anchor,
+ Spacing = new Vector2(5),
+ Children = new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(5),
+ Children = new Drawable[]
+ {
+ new DrawableTeamHeader(colour)
+ {
+ Scale = new Vector2(0.75f),
+ Origin = anchor,
+ Anchor = anchor,
+ },
+ score = new TeamScore(currentTeamScore, colour, pointsToWin)
+ {
+ Origin = anchor,
+ Anchor = anchor,
+ }
+ }
+ },
+ new TournamentSpriteTextWithBackground(team?.FullName.Value ?? "???")
+ {
+ Scale = new Vector2(0.5f),
+ Origin = anchor,
+ Anchor = anchor,
+ },
+ }
+ },
+ }
+ },
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Screens/Gameplay/Components/TeamScore.cs b/osu.Game.Tournament/Screens/Gameplay/Components/TeamScore.cs
new file mode 100644
index 0000000000..36c78c5ac1
--- /dev/null
+++ b/osu.Game.Tournament/Screens/Gameplay/Components/TeamScore.cs
@@ -0,0 +1,103 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Effects;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Tournament.Models;
+using osuTK;
+using osuTK.Graphics;
+
+namespace osu.Game.Tournament.Screens.Gameplay.Components
+{
+ public class TeamScore : CompositeDrawable
+ {
+ private readonly Bindable currentTeamScore = new Bindable();
+ private readonly StarCounter counter;
+
+ public TeamScore(Bindable score, TeamColour colour, int count)
+ {
+ bool flip = colour == TeamColour.Blue;
+ var anchor = flip ? Anchor.TopRight : Anchor.TopLeft;
+
+ AutoSizeAxes = Axes.Both;
+
+ InternalChild = counter = new TeamScoreStarCounter(count)
+ {
+ Anchor = anchor,
+ Scale = flip ? new Vector2(-1, 1) : Vector2.One,
+ };
+
+ currentTeamScore.BindValueChanged(scoreChanged);
+ currentTeamScore.BindTo(score);
+ }
+
+ private void scoreChanged(ValueChangedEvent score) => counter.Current = score.NewValue ?? 0;
+
+ public class TeamScoreStarCounter : StarCounter
+ {
+ public TeamScoreStarCounter(int count)
+ : base(count)
+ {
+ }
+
+ public override Star CreateStar() => new LightSquare();
+
+ public class LightSquare : Star
+ {
+ private readonly Box box;
+
+ public LightSquare()
+ {
+ Size = new Vector2(22.5f);
+
+ InternalChildren = new Drawable[]
+ {
+ new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Masking = true,
+ BorderColour = OsuColour.Gray(0.5f),
+ BorderThickness = 3,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ Colour = Color4.Transparent,
+ RelativeSizeAxes = Axes.Both,
+ AlwaysPresent = true,
+ },
+ }
+ },
+ box = new Box
+ {
+ Colour = Color4Extensions.FromHex("#FFE8AD"),
+ RelativeSizeAxes = Axes.Both,
+ },
+ };
+
+ Masking = true;
+ EdgeEffect = new EdgeEffectParameters
+ {
+ Type = EdgeEffectType.Glow,
+ Colour = Color4Extensions.FromHex("#FFE8AD").Opacity(0.1f),
+ Hollow = true,
+ Radius = 20,
+ Roundness = 10,
+ };
+ }
+
+ public override void DisplayAt(float scale)
+ {
+ box.FadeTo(scale, 500, Easing.OutQuint);
+ FadeEdgeEffectTo(0.2f * scale, 500, Easing.OutQuint);
+ }
+ }
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs b/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs
index d632e7c5f3..4d770855cd 100644
--- a/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs
+++ b/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs
@@ -15,7 +15,6 @@ using osu.Game.Tournament.Models;
using osu.Game.Tournament.Screens.Gameplay.Components;
using osu.Game.Tournament.Screens.MapPool;
using osu.Game.Tournament.Screens.TeamWin;
-using osuTK;
using osuTK.Graphics;
namespace osu.Game.Tournament.Screens.Gameplay
@@ -30,9 +29,6 @@ namespace osu.Game.Tournament.Screens.Gameplay
private OsuButton warmupButton;
private MatchIPCInfo ipc;
- private readonly Color4 red = new Color4(186, 0, 18, 255);
- private readonly Color4 blue = new Color4(17, 136, 170, 255);
-
[Resolved(canBeNull: true)]
private TournamentSceneManager sceneManager { get; set; }
@@ -51,14 +47,14 @@ namespace osu.Game.Tournament.Screens.Gameplay
Loop = true,
RelativeSizeAxes = Axes.Both,
},
- new MatchHeader(),
+ header = new MatchHeader(),
new Container
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Y = 5,
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
+ Y = 110,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
Children = new Drawable[]
{
new Box
@@ -66,44 +62,18 @@ namespace osu.Game.Tournament.Screens.Gameplay
// chroma key area for stable gameplay
Name = "chroma",
RelativeSizeAxes = Axes.X,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
Height = 512,
Colour = new Color4(0, 255, 0, 255),
},
- new Container
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Y = -4,
- Children = new Drawable[]
- {
- new Circle
- {
- Name = "top bar red",
- RelativeSizeAxes = Axes.X,
- Height = 8,
- Width = 0.5f,
- Colour = red,
- },
- new Circle
- {
- Name = "top bar blue",
- RelativeSizeAxes = Axes.X,
- Height = 8,
- Width = 0.5f,
- Colour = blue,
- Anchor = Anchor.TopRight,
- Origin = Anchor.TopRight,
- },
- }
- },
}
},
scoreDisplay = new MatchScoreDisplay
{
- Y = -60,
- Scale = new Vector2(0.8f),
+ Y = -147,
Anchor = Anchor.BottomCentre,
- Origin = Anchor.BottomCentre,
+ Origin = Anchor.TopCentre,
},
new ControlPanel
{
@@ -136,13 +106,18 @@ namespace osu.Game.Tournament.Screens.Gameplay
currentMatch.BindTo(ladder.CurrentMatch);
- warmup.BindValueChanged(w => warmupButton.Alpha = !w.NewValue ? 0.5f : 1, true);
+ warmup.BindValueChanged(w =>
+ {
+ warmupButton.Alpha = !w.NewValue ? 0.5f : 1;
+ header.ShowScores = !w.NewValue;
+ }, true);
}
private ScheduledDelegate scheduledOperation;
private MatchScoreDisplay scoreDisplay;
private TourneyState lastState;
+ private MatchHeader header;
private void stateChanged(ValueChangedEvent state)
{
@@ -162,7 +137,7 @@ namespace osu.Game.Tournament.Screens.Gameplay
void expand()
{
- chat?.Expand();
+ chat?.Contract();
using (BeginDelayedSequence(300, true))
{
@@ -176,7 +151,7 @@ namespace osu.Game.Tournament.Screens.Gameplay
SongBar.Expanded = false;
scoreDisplay.FadeOut(100);
using (chat?.BeginDelayedSequence(500))
- chat?.Contract();
+ chat?.Expand();
}
switch (state.NewValue)
@@ -203,7 +178,7 @@ namespace osu.Game.Tournament.Screens.Gameplay
break;
default:
- chat.Expand();
+ chat.Contract();
expand();
break;
}
diff --git a/osu.Game.Tournament/Screens/Ladder/Components/DrawableMatchTeam.cs b/osu.Game.Tournament/Screens/Ladder/Components/DrawableMatchTeam.cs
index 88d7b95b0c..15cb7e44cb 100644
--- a/osu.Game.Tournament/Screens/Ladder/Components/DrawableMatchTeam.cs
+++ b/osu.Game.Tournament/Screens/Ladder/Components/DrawableMatchTeam.cs
@@ -4,6 +4,7 @@
using System;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
@@ -27,21 +28,23 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
private readonly bool losers;
private TournamentSpriteText scoreText;
private Box background;
+ private Box backgroundRight;
private readonly Bindable score = new Bindable();
private readonly BindableBool completed = new BindableBool();
private Color4 colourWinner;
- private Color4 colourNormal;
private readonly Func isWinner;
private LadderEditorScreen ladderEditor;
- [Resolved]
+ [Resolved(canBeNull: true)]
private LadderInfo ladderInfo { get; set; }
private void setCurrent()
{
+ if (ladderInfo == null) return;
+
//todo: tournamentgamebase?
if (ladderInfo.CurrentMatch.Value != null)
ladderInfo.CurrentMatch.Value.Current.Value = false;
@@ -60,15 +63,12 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
this.losers = losers;
Size = new Vector2(150, 40);
- Masking = true;
- CornerRadius = 5;
-
Flag.Scale = new Vector2(0.9f);
Flag.Anchor = Flag.Origin = Anchor.CentreLeft;
AcronymText.Anchor = AcronymText.Origin = Anchor.CentreLeft;
AcronymText.Padding = new MarginPadding { Left = 50 };
- AcronymText.Font = OsuFont.Torus.With(size: 24);
+ AcronymText.Font = OsuFont.Torus.With(size: 22, weight: FontWeight.Bold);
if (match != null)
{
@@ -85,8 +85,9 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{
this.ladderEditor = ladderEditor;
- colourWinner = losers ? colours.YellowDarker : colours.BlueDarker;
- colourNormal = OsuColour.Gray(0.2f);
+ colourWinner = losers
+ ? Color4Extensions.FromHex("#8E7F48")
+ : Color4Extensions.FromHex("#1462AA");
InternalChildren = new Drawable[]
{
@@ -102,29 +103,28 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{
AcronymText,
Flag,
- new Container
+ }
+ },
+ new Container
+ {
+ Masking = true,
+ Width = 0.3f,
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreRight,
+ RelativeSizeAxes = Axes.Both,
+ Children = new Drawable[]
+ {
+ backgroundRight = new Box
{
- Masking = true,
- CornerRadius = 5,
- Width = 0.3f,
- Anchor = Anchor.CentreRight,
- Origin = Anchor.CentreRight,
+ Colour = OsuColour.Gray(0.1f),
+ Alpha = 0.8f,
RelativeSizeAxes = Axes.Both,
- Children = new Drawable[]
- {
- new Box
- {
- Colour = OsuColour.Gray(0.1f),
- Alpha = 0.8f,
- RelativeSizeAxes = Axes.Both,
- },
- scoreText = new TournamentSpriteText
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Font = OsuFont.Torus.With(size: 20),
- }
- }
+ },
+ scoreText = new TournamentSpriteText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Font = OsuFont.Torus.With(size: 22),
}
}
}
@@ -181,9 +181,12 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{
bool winner = completed.Value && isWinner?.Invoke() == true;
- background.FadeColour(winner ? colourWinner : colourNormal, winner ? 500 : 0, Easing.OutQuint);
+ background.FadeColour(winner ? Color4.White : Color4Extensions.FromHex("#444"), winner ? 500 : 0, Easing.OutQuint);
+ backgroundRight.FadeColour(winner ? colourWinner : Color4Extensions.FromHex("#333"), winner ? 500 : 0, Easing.OutQuint);
- scoreText.Font = AcronymText.Font = OsuFont.Torus.With(weight: winner ? FontWeight.Bold : FontWeight.Regular);
+ AcronymText.Colour = winner ? Color4.Black : Color4.White;
+
+ scoreText.Font = scoreText.Font.With(weight: winner ? FontWeight.Bold : FontWeight.Regular);
}
public MenuItem[] ContextMenuItems
diff --git a/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentMatch.cs b/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentMatch.cs
index c4b670f059..655beb4bdd 100644
--- a/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentMatch.cs
+++ b/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentMatch.cs
@@ -23,7 +23,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
private readonly bool editor;
protected readonly FillFlowContainer Flow;
private readonly Drawable selectionBox;
- private readonly Drawable currentMatchSelectionBox;
+ protected readonly Drawable CurrentMatchSelectionBox;
private Bindable globalSelection;
[Resolved(CanBeNull = true)]
@@ -45,9 +45,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{
selectionBox = new Container
{
- CornerRadius = 5,
- Masking = true,
- Scale = new Vector2(1.05f),
+ Scale = new Vector2(1.1f),
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
@@ -55,16 +53,14 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
Colour = Color4.YellowGreen,
Child = new Box { RelativeSizeAxes = Axes.Both }
},
- currentMatchSelectionBox = new Container
+ CurrentMatchSelectionBox = new Container
{
- CornerRadius = 5,
- Masking = true,
- Scale = new Vector2(1.05f),
+ Scale = new Vector2(1.05f, 1.1f),
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Alpha = 0,
- Colour = Color4.OrangeRed,
+ Colour = Color4.White,
Child = new Box { RelativeSizeAxes = Axes.Both }
},
Flow = new FillFlowContainer
@@ -128,9 +124,9 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
private void updateCurrentMatch()
{
if (Match.Current.Value)
- currentMatchSelectionBox.Show();
+ CurrentMatchSelectionBox.Show();
else
- currentMatchSelectionBox.Hide();
+ CurrentMatchSelectionBox.Hide();
}
private bool selected;
diff --git a/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentRound.cs b/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentRound.cs
index d14ebb4d03..cad0b827c0 100644
--- a/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentRound.cs
+++ b/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentRound.cs
@@ -7,7 +7,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Game.Tournament.Models;
-using osuTK.Graphics;
namespace osu.Game.Tournament.Screens.Ladder.Components
{
@@ -33,14 +32,14 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{
textDescription = new TournamentSpriteText
{
- Colour = Color4.Black,
+ Colour = TournamentGame.TEXT_COLOUR,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre
},
textName = new TournamentSpriteText
{
Font = OsuFont.Torus.With(weight: FontWeight.Bold),
- Colour = Color4.Black,
+ Colour = TournamentGame.TEXT_COLOUR,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre
},
diff --git a/osu.Game.Tournament/Screens/Ladder/LadderScreen.cs b/osu.Game.Tournament/Screens/Ladder/LadderScreen.cs
index 7b265ded32..6f62b3ddba 100644
--- a/osu.Game.Tournament/Screens/Ladder/LadderScreen.cs
+++ b/osu.Game.Tournament/Screens/Ladder/LadderScreen.cs
@@ -32,8 +32,8 @@ namespace osu.Game.Tournament.Screens.Ladder
[BackgroundDependencyLoader]
private void load(OsuColour colours, Storage storage)
{
- normalPathColour = colours.BlueDarker.Darken(2);
- losersPathColour = colours.YellowDarker.Darken(2);
+ normalPathColour = Color4Extensions.FromHex("#66D1FF");
+ losersPathColour = Color4Extensions.FromHex("#FFC700");
RelativeSizeAxes = Axes.Both;
@@ -47,6 +47,12 @@ namespace osu.Game.Tournament.Screens.Ladder
RelativeSizeAxes = Axes.Both,
Loop = true,
},
+ new DrawableTournamentTitleText
+ {
+ Y = 100,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ },
ScrollContent = new LadderDragContainer
{
RelativeSizeAxes = Axes.Both,
diff --git a/osu.Game.Tournament/Screens/MapPool/MapPoolScreen.cs b/osu.Game.Tournament/Screens/MapPool/MapPoolScreen.cs
index d7aeac02cb..1ef2916ca1 100644
--- a/osu.Game.Tournament/Screens/MapPool/MapPoolScreen.cs
+++ b/osu.Game.Tournament/Screens/MapPool/MapPoolScreen.cs
@@ -42,6 +42,11 @@ namespace osu.Game.Tournament.Screens.MapPool
{
InternalChildren = new Drawable[]
{
+ new TourneyVideo("gameplay")
+ {
+ Loop = true,
+ RelativeSizeAxes = Axes.Both,
+ },
new MatchHeader(),
mapFlows = new FillFlowContainer>
{
diff --git a/osu.Game.Tournament/Screens/Schedule/ScheduleScreen.cs b/osu.Game.Tournament/Screens/Schedule/ScheduleScreen.cs
index 4c93c04fcf..0fcec645e3 100644
--- a/osu.Game.Tournament/Screens/Schedule/ScheduleScreen.cs
+++ b/osu.Game.Tournament/Screens/Schedule/ScheduleScreen.cs
@@ -18,7 +18,7 @@ using osuTK.Graphics;
namespace osu.Game.Tournament.Screens.Schedule
{
- public class ScheduleScreen : TournamentScreen
+ public class ScheduleScreen : TournamentScreen // IProvidesVideo
{
private readonly Bindable currentMatch = new Bindable();
private Container mainContainer;
@@ -38,10 +38,63 @@ namespace osu.Game.Tournament.Screens.Schedule
RelativeSizeAxes = Axes.Both,
Loop = true,
},
- mainContainer = new Container
+ new Container
{
RelativeSizeAxes = Axes.Both,
- }
+ Padding = new MarginPadding(100) { Bottom = 50 },
+ Children = new Drawable[]
+ {
+ new GridContainer
+ {
+ RelativeSizeAxes = Axes.Both,
+ RowDimensions = new[]
+ {
+ new Dimension(GridSizeMode.AutoSize),
+ new Dimension(),
+ },
+ Content = new[]
+ {
+ new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new DrawableTournamentTitleText(),
+ new Container
+ {
+ Margin = new MarginPadding { Top = 40 },
+ AutoSizeAxes = Axes.Both,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ Colour = Color4.White,
+ Size = new Vector2(50, 10),
+ },
+ new TournamentSpriteTextWithBackground("Schedule")
+ {
+ X = 60,
+ Scale = new Vector2(0.8f)
+ }
+ }
+ },
+ }
+ },
+ },
+ new Drawable[]
+ {
+ mainContainer = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ }
+ }
+ }
+ }
+ }
+ },
};
currentMatch.BindValueChanged(matchChanged);
@@ -62,7 +115,7 @@ namespace osu.Game.Tournament.Screens.Schedule
.SelectMany(m => m.ConditionalMatches.Where(cp => m.Acronyms.TrueForAll(a => cp.Acronyms.Contains(a))));
upcoming = upcoming.Concat(conditionals);
- upcoming = upcoming.OrderBy(p => p.Date.Value).Take(12);
+ upcoming = upcoming.OrderBy(p => p.Date.Value).Take(8);
mainContainer.Child = new FillFlowContainer
{
@@ -73,7 +126,7 @@ namespace osu.Game.Tournament.Screens.Schedule
new Container
{
RelativeSizeAxes = Axes.Both,
- Height = 0.65f,
+ Height = 0.74f,
Child = new FillFlowContainer
{
RelativeSizeAxes = Axes.Both,
@@ -91,7 +144,7 @@ namespace osu.Game.Tournament.Screens.Schedule
.Take(8)
.Select(p => new ScheduleMatch(p))
},
- new ScheduleContainer("match overview")
+ new ScheduleContainer("upcoming matches")
{
RelativeSizeAxes = Axes.Both,
Width = 0.6f,
@@ -100,26 +153,57 @@ namespace osu.Game.Tournament.Screens.Schedule
}
}
},
- new ScheduleContainer("current match")
+ new ScheduleContainer("coming up next")
{
RelativeSizeAxes = Axes.Both,
Height = 0.25f,
Children = new Drawable[]
{
- new TournamentSpriteText
+ new FillFlowContainer
{
- Margin = new MarginPadding { Left = -10, Bottom = 10, Top = -5 },
- Spacing = new Vector2(10, 0),
- Text = match.NewValue.Round.Value?.Name.Value,
- Colour = Color4.Black,
- Font = OsuFont.Torus.With(size: 20)
- },
- new ScheduleMatch(match.NewValue, false),
- new TournamentSpriteText
- {
- Text = "Start Time " + match.NewValue.Date.Value.ToUniversalTime().ToString("HH:mm UTC"),
- Colour = Color4.Black,
- Font = OsuFont.Torus.With(size: 20)
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(30),
+ Children = new Drawable[]
+ {
+ new ScheduleMatch(match.NewValue, false)
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ },
+ new TournamentSpriteTextWithBackground(match.NewValue.Round.Value?.Name.Value)
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Scale = new Vector2(0.5f)
+ },
+ new TournamentSpriteText
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Text = match.NewValue.Team1.Value?.FullName + " vs " + match.NewValue.Team2.Value?.FullName,
+ Font = OsuFont.Torus.With(size: 24, weight: FontWeight.SemiBold)
+ },
+ new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Children = new Drawable[]
+ {
+ new TournamentSpriteText
+ {
+ Text = "Starting ",
+ Font = OsuFont.Torus.With(size: 24, weight: FontWeight.Regular)
+ },
+ new DrawableDate(match.NewValue.Date.Value)
+ {
+ Font = OsuFont.Torus.With(size: 24, weight: FontWeight.Regular)
+ }
+ }
+ },
+ }
},
}
}
@@ -134,6 +218,10 @@ namespace osu.Game.Tournament.Screens.Schedule
{
Flow.Direction = FillDirection.Horizontal;
+ Scale = new Vector2(0.8f);
+
+ CurrentMatchSelectionBox.Scale = new Vector2(1.02f, 1.15f);
+
bool conditional = match is ConditionalTournamentMatch;
if (conditional)
@@ -145,15 +233,16 @@ namespace osu.Game.Tournament.Screens.Schedule
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopLeft,
- Colour = Color4.Black,
+ Colour = OsuColour.Gray(0.7f),
Alpha = conditional ? 0.6f : 1,
+ Font = OsuFont.Torus,
Margin = new MarginPadding { Horizontal = 10, Vertical = 5 },
});
AddInternal(new TournamentSpriteText
{
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomLeft,
- Colour = Color4.Black,
+ Colour = OsuColour.Gray(0.7f),
Alpha = conditional ? 0.6f : 1,
Margin = new MarginPadding { Horizontal = 10, Vertical = 5 },
Text = match.Date.Value.ToUniversalTime().ToString("HH:mm UTC") + (conditional ? " (conditional)" : "")
@@ -170,29 +259,27 @@ namespace osu.Game.Tournament.Screens.Schedule
public ScheduleContainer(string title)
{
- Padding = new MarginPadding { Left = 30, Top = 30 };
+ Padding = new MarginPadding { Left = 60, Top = 10 };
InternalChildren = new Drawable[]
{
- new TournamentSpriteText
+ new FillFlowContainer
{
- X = 30,
- Text = title,
- Colour = Color4.Black,
- Spacing = new Vector2(10, 0),
- Font = OsuFont.Torus.With(size: 30)
- },
- content = new FillFlowContainer
- {
- Direction = FillDirection.Vertical,
RelativeSizeAxes = Axes.Both,
- Margin = new MarginPadding(40)
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new TournamentSpriteTextWithBackground(title.ToUpperInvariant())
+ {
+ Scale = new Vector2(0.5f)
+ },
+ content = new FillFlowContainer
+ {
+ Direction = FillDirection.Vertical,
+ RelativeSizeAxes = Axes.Both,
+ Margin = new MarginPadding(10)
+ },
+ }
},
- new Circle
- {
- Colour = new Color4(233, 187, 79, 255),
- Width = 5,
- RelativeSizeAxes = Axes.Y,
- }
};
}
}
diff --git a/osu.Game.Tournament/Screens/TeamIntro/TeamIntroScreen.cs b/osu.Game.Tournament/Screens/TeamIntro/TeamIntroScreen.cs
index d584c21058..6c2848897b 100644
--- a/osu.Game.Tournament/Screens/TeamIntro/TeamIntroScreen.cs
+++ b/osu.Game.Tournament/Screens/TeamIntro/TeamIntroScreen.cs
@@ -6,7 +6,6 @@ using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Platform;
-using osu.Game.Graphics;
using osu.Game.Tournament.Components;
using osu.Game.Tournament.Models;
using osuTK;
@@ -49,141 +48,33 @@ namespace osu.Game.Tournament.Screens.TeamIntro
return;
}
+ const float y_flag_offset = 292;
+
+ const float y_offset = 460;
+
mainContainer.Children = new Drawable[]
{
- new TeamWithPlayers(match.NewValue.Team1.Value, true)
- {
- RelativeSizeAxes = Axes.Both,
- Width = 0.5f,
- Height = 0.6f,
- Anchor = Anchor.Centre,
- Origin = Anchor.CentreRight
- },
- new TeamWithPlayers(match.NewValue.Team2.Value)
- {
- RelativeSizeAxes = Axes.Both,
- Width = 0.5f,
- Height = 0.6f,
- Anchor = Anchor.Centre,
- Origin = Anchor.CentreLeft
- },
new RoundDisplay(match.NewValue)
{
- RelativeSizeAxes = Axes.Both,
- Height = 0.25f,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Y = 180,
- }
+ Position = new Vector2(100, 100)
+ },
+ new DrawableTeamFlag(match.NewValue.Team1.Value)
+ {
+ Position = new Vector2(165, y_flag_offset),
+ },
+ new DrawableTeamWithPlayers(match.NewValue.Team1.Value, TeamColour.Red)
+ {
+ Position = new Vector2(165, y_offset),
+ },
+ new DrawableTeamFlag(match.NewValue.Team2.Value)
+ {
+ Position = new Vector2(740, y_flag_offset),
+ },
+ new DrawableTeamWithPlayers(match.NewValue.Team2.Value, TeamColour.Blue)
+ {
+ Position = new Vector2(740, y_offset),
+ },
};
}
-
- private class RoundDisplay : CompositeDrawable
- {
- public RoundDisplay(TournamentMatch match)
- {
- InternalChildren = new Drawable[]
- {
- new FillFlowContainer
- {
- AutoSizeAxes = Axes.Both,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Direction = FillDirection.Vertical,
- Spacing = new Vector2(0, 10),
- Children = new Drawable[]
- {
- new TournamentSpriteText
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Colour = OsuColour.Gray(0.33f),
- Text = match.Round.Value?.Name.Value ?? "Unknown Round",
- Font = OsuFont.Torus.With(size: 26, weight: FontWeight.Light)
- },
- }
- }
- };
- }
- }
-
- private class TeamWithPlayers : CompositeDrawable
- {
- public TeamWithPlayers(TournamentTeam team, bool left = false)
- {
- FillFlowContainer players;
- var colour = left ? TournamentGame.COLOUR_RED : TournamentGame.COLOUR_BLUE;
- InternalChildren = new Drawable[]
- {
- new TeamDisplay(team)
- {
- Anchor = left ? Anchor.CentreRight : Anchor.CentreLeft,
- Origin = Anchor.TopCentre,
- RelativePositionAxes = Axes.Both,
- X = (left ? -1 : 1) * 0.3145f,
- Y = -0.077f,
- },
- players = new FillFlowContainer
- {
- Direction = FillDirection.Vertical,
- AutoSizeAxes = Axes.Both,
- Spacing = new Vector2(0, 5),
- Padding = new MarginPadding(20),
- Anchor = left ? Anchor.CentreRight : Anchor.CentreLeft,
- Origin = left ? Anchor.CentreRight : Anchor.CentreLeft,
- RelativePositionAxes = Axes.Both,
- X = (left ? -1 : 1) * 0.58f,
- },
- };
-
- if (team != null)
- {
- foreach (var p in team.Players)
- {
- players.Add(new TournamentSpriteText
- {
- Text = p.Username,
- Font = OsuFont.Torus.With(size: 24),
- Colour = colour,
- Anchor = left ? Anchor.CentreRight : Anchor.CentreLeft,
- Origin = left ? Anchor.CentreRight : Anchor.CentreLeft,
- });
- }
- }
- }
-
- private class TeamDisplay : DrawableTournamentTeam
- {
- public TeamDisplay(TournamentTeam team)
- : base(team)
- {
- AutoSizeAxes = Axes.Both;
-
- Flag.Anchor = Flag.Origin = Anchor.TopCentre;
- Flag.RelativeSizeAxes = Axes.None;
- Flag.Size = new Vector2(300, 200);
- Flag.Scale = new Vector2(0.32f);
-
- InternalChild = new FillFlowContainer
- {
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Vertical,
- Spacing = new Vector2(160),
- Children = new Drawable[]
- {
- Flag,
- new TournamentSpriteText
- {
- Text = team?.FullName.Value ?? "???",
- Font = OsuFont.Torus.With(size: 20, weight: FontWeight.Regular),
- Colour = OsuColour.Gray(0.2f),
- Origin = Anchor.TopCentre,
- Anchor = Anchor.TopCentre,
- },
- }
- };
- }
- }
- }
}
}
diff --git a/osu.Game.Tournament/Screens/TeamWin/TeamWinScreen.cs b/osu.Game.Tournament/Screens/TeamWin/TeamWinScreen.cs
index 1765ab7ba2..3870f486e1 100644
--- a/osu.Game.Tournament/Screens/TeamWin/TeamWinScreen.cs
+++ b/osu.Game.Tournament/Screens/TeamWin/TeamWinScreen.cs
@@ -10,7 +10,6 @@ using osu.Game.Graphics;
using osu.Game.Tournament.Components;
using osu.Game.Tournament.Models;
using osuTK;
-using osuTK.Graphics;
namespace osu.Game.Tournament.Screens.TeamWin
{
@@ -63,7 +62,9 @@ namespace osu.Game.Tournament.Screens.TeamWin
update();
}
- private void update()
+ private bool firstDisplay = true;
+
+ private void update() => Schedule(() =>
{
var match = currentMatch.Value;
@@ -73,105 +74,53 @@ namespace osu.Game.Tournament.Screens.TeamWin
return;
}
- bool redWin = match.Winner == match.Team1.Value;
- redWinVideo.Alpha = redWin ? 1 : 0;
- blueWinVideo.Alpha = redWin ? 0 : 1;
+ redWinVideo.Alpha = match.WinnerColour == TeamColour.Red ? 1 : 0;
+ blueWinVideo.Alpha = match.WinnerColour == TeamColour.Blue ? 1 : 0;
+
+ if (firstDisplay)
+ {
+ if (match.WinnerColour == TeamColour.Red)
+ redWinVideo.Reset();
+ else
+ blueWinVideo.Reset();
+ firstDisplay = false;
+ }
mainContainer.Children = new Drawable[]
{
- new TeamFlagDisplay(match.Winner)
+ new DrawableTeamFlag(match.Winner)
{
Size = new Vector2(300, 200),
Scale = new Vector2(0.5f),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- X = -387,
+ Position = new Vector2(-300, 10),
},
- new TournamentSpriteText
+ new FillFlowContainer
{
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
Anchor = Anchor.Centre,
- Origin = Anchor.TopLeft,
- Position = new Vector2(78, -70),
- Colour = OsuColour.Gray(0.33f),
- Text = match.Round.Value?.Name.Value ?? "Unknown Round",
- Font = OsuFont.Torus.With(size: 30, weight: FontWeight.Regular)
- },
- new TeamWithPlayers(match.Winner, redWin)
- {
- RelativeSizeAxes = Axes.Both,
- Width = 0.5f,
- Height = 0.6f,
- Anchor = Anchor.Centre,
- Origin = Anchor.TopLeft,
- Position = new Vector2(78, 0),
+ Origin = Anchor.Centre,
+ X = 260,
+ Children = new Drawable[]
+ {
+ new RoundDisplay(match)
+ {
+ Margin = new MarginPadding { Bottom = 30 },
+ },
+ new TournamentSpriteText
+ {
+ Text = "WINNER",
+ Font = OsuFont.Torus.With(size: 100, weight: FontWeight.Bold),
+ Margin = new MarginPadding { Bottom = 50 },
+ },
+ new DrawableTeamWithPlayers(match.Winner, match.WinnerColour)
+ }
},
};
- }
-
- private class TeamWithPlayers : CompositeDrawable
- {
- public TeamWithPlayers(TournamentTeam team, bool left = false)
- {
- FillFlowContainer players;
-
- var colour = left ? TournamentGame.COLOUR_RED : TournamentGame.COLOUR_BLUE;
- InternalChildren = new Drawable[]
- {
- new FillFlowContainer
- {
- Direction = FillDirection.Vertical,
- AutoSizeAxes = Axes.Both,
- Children = new Drawable[]
- {
- new TournamentSpriteText
- {
- Text = "WINNER",
- Font = OsuFont.Torus.With(size: 24, weight: FontWeight.SemiBold),
- Colour = Color4.Black,
- },
- new TournamentSpriteText
- {
- Text = team?.FullName.Value ?? "???",
- Font = OsuFont.Torus.With(size: 30, weight: FontWeight.SemiBold),
- Colour = Color4.Black,
- },
- players = new FillFlowContainer
- {
- Direction = FillDirection.Vertical,
- AutoSizeAxes = Axes.Both,
- Padding = new MarginPadding { Top = 10 },
- },
- }
- },
- };
-
- if (team != null)
- {
- foreach (var p in team.Players)
- {
- players.Add(new TournamentSpriteText
- {
- Text = p.Username,
- Font = OsuFont.Torus.With(size: 24),
- Colour = colour,
- Anchor = left ? Anchor.CentreRight : Anchor.CentreLeft,
- Origin = left ? Anchor.CentreRight : Anchor.CentreLeft,
- });
- }
- }
- }
- }
-
- private class TeamFlagDisplay : DrawableTournamentTeam
- {
- public TeamFlagDisplay(TournamentTeam team)
- : base(team)
- {
- InternalChildren = new Drawable[]
- {
- Flag
- };
- }
- }
+ mainContainer.FadeOut();
+ mainContainer.Delay(2000).FadeIn(1600, Easing.OutQuint);
+ });
}
}
diff --git a/osu.Game.Tournament/TournamentGame.cs b/osu.Game.Tournament/TournamentGame.cs
index 608fc5f04a..78bb66d553 100644
--- a/osu.Game.Tournament/TournamentGame.cs
+++ b/osu.Game.Tournament/TournamentGame.cs
@@ -1,16 +1,26 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
+using osu.Framework.Graphics.Colour;
using osu.Game.Graphics.Cursor;
+using osu.Game.Tournament.Models;
using osuTK.Graphics;
namespace osu.Game.Tournament
{
public class TournamentGame : TournamentGameBase
{
- public static readonly Color4 COLOUR_RED = new Color4(144, 0, 0, 255);
- public static readonly Color4 COLOUR_BLUE = new Color4(0, 84, 144, 255);
+ public static ColourInfo GetTeamColour(TeamColour teamColour) => teamColour == TeamColour.Red ? COLOUR_RED : COLOUR_BLUE;
+
+ public static readonly Color4 COLOUR_RED = Color4Extensions.FromHex("#AA1414");
+ public static readonly Color4 COLOUR_BLUE = Color4Extensions.FromHex("#1462AA");
+
+ public static readonly Color4 ELEMENT_BACKGROUND_COLOUR = Color4Extensions.FromHex("#fff");
+ public static readonly Color4 ELEMENT_FOREGROUND_COLOUR = Color4Extensions.FromHex("#000");
+
+ public static readonly Color4 TEXT_COLOUR = Color4Extensions.FromHex("#fff");
protected override void LoadComplete()
{
diff --git a/osu.Game.Tournament/TournamentGameBase.cs b/osu.Game.Tournament/TournamentGameBase.cs
index 435f315c8d..41165ca141 100644
--- a/osu.Game.Tournament/TournamentGameBase.cs
+++ b/osu.Game.Tournament/TournamentGameBase.cs
@@ -22,6 +22,7 @@ using osu.Game.Online.API.Requests;
using osu.Game.Tournament.IPC;
using osu.Game.Tournament.Models;
using osu.Game.Users;
+using osuTK;
using osuTK.Graphics;
using osuTK.Input;
@@ -74,16 +75,40 @@ namespace osu.Game.Tournament
AddRange(new[]
{
- new TourneyButton
+ new Container
{
- Text = "Save Changes",
- Width = 140,
- Height = 50,
+ CornerRadius = 10,
Depth = float.MinValue,
+ Position = new Vector2(5),
+ Masking = true,
+ AutoSizeAxes = Axes.Both,
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomRight,
- Padding = new MarginPadding(10),
- Action = SaveChanges,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ Colour = OsuColour.Gray(0.2f),
+ RelativeSizeAxes = Axes.Both,
+ },
+ new TourneyButton
+ {
+ Text = "Save Changes",
+ Width = 140,
+ Height = 50,
+ Padding = new MarginPadding
+ {
+ Top = 10,
+ Left = 10,
+ },
+ Margin = new MarginPadding
+ {
+ Right = 10,
+ Bottom = 10,
+ },
+ Action = SaveChanges,
+ },
+ }
},
heightWarning = new Container
{
diff --git a/osu.Game.Tournament/TournamentSceneManager.cs b/osu.Game.Tournament/TournamentSceneManager.cs
index 287e25b1fb..ef8d16011d 100644
--- a/osu.Game.Tournament/TournamentSceneManager.cs
+++ b/osu.Game.Tournament/TournamentSceneManager.cs
@@ -194,9 +194,14 @@ namespace osu.Game.Tournament
switch (currentScreen)
{
- case GameplayScreen _:
case MapPoolScreen _:
chatContainer.FadeIn(TournamentScreen.FADE_DELAY);
+ chatContainer.ResizeWidthTo(1, 500, Easing.OutQuint);
+ break;
+
+ case GameplayScreen _:
+ chatContainer.FadeIn(TournamentScreen.FADE_DELAY);
+ chatContainer.ResizeWidthTo(0.5f, 500, Easing.OutQuint);
break;
default:
diff --git a/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
index 6569f76b2d..c81f933bca 100644
--- a/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.IO;
using osuTK;
using osuTK.Graphics;
@@ -93,8 +92,8 @@ namespace osu.Game.Beatmaps.Formats
var layer = parseLayer(split[1]);
var origin = parseOrigin(split[2]);
var path = CleanFilename(split[3]);
- var x = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
- var y = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
+ var x = Parsing.ParseFloat(split[4], Parsing.MAX_COORDINATE_VALUE);
+ var y = Parsing.ParseFloat(split[5], Parsing.MAX_COORDINATE_VALUE);
storyboardSprite = new StoryboardSprite(path, origin, new Vector2(x, y));
storyboard.GetLayer(layer).Add(storyboardSprite);
break;
@@ -105,10 +104,10 @@ namespace osu.Game.Beatmaps.Formats
var layer = parseLayer(split[1]);
var origin = parseOrigin(split[2]);
var path = CleanFilename(split[3]);
- var x = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
- var y = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
- var frameCount = int.Parse(split[6]);
- var frameDelay = double.Parse(split[7], NumberFormatInfo.InvariantInfo);
+ var x = Parsing.ParseFloat(split[4], Parsing.MAX_COORDINATE_VALUE);
+ var y = Parsing.ParseFloat(split[5], Parsing.MAX_COORDINATE_VALUE);
+ var frameCount = Parsing.ParseInt(split[6]);
+ var frameDelay = Parsing.ParseDouble(split[7]);
var loopType = split.Length > 8 ? (AnimationLoopType)Enum.Parse(typeof(AnimationLoopType), split[8]) : AnimationLoopType.LoopForever;
storyboardSprite = new StoryboardAnimation(path, origin, new Vector2(x, y), frameCount, frameDelay, loopType);
storyboard.GetLayer(layer).Add(storyboardSprite);
@@ -117,10 +116,10 @@ namespace osu.Game.Beatmaps.Formats
case LegacyEventType.Sample:
{
- var time = double.Parse(split[1], CultureInfo.InvariantCulture);
+ var time = Parsing.ParseDouble(split[1]);
var layer = parseLayer(split[2]);
var path = CleanFilename(split[3]);
- var volume = split.Length > 4 ? float.Parse(split[4], CultureInfo.InvariantCulture) : 100;
+ var volume = split.Length > 4 ? Parsing.ParseFloat(split[4]) : 100;
storyboard.GetLayer(layer).Add(new StoryboardSampleInfo(path, time, (int)volume));
break;
}
@@ -138,17 +137,17 @@ namespace osu.Game.Beatmaps.Formats
case "T":
{
var triggerName = split[1];
- var startTime = split.Length > 2 ? double.Parse(split[2], CultureInfo.InvariantCulture) : double.MinValue;
- var endTime = split.Length > 3 ? double.Parse(split[3], CultureInfo.InvariantCulture) : double.MaxValue;
- var groupNumber = split.Length > 4 ? int.Parse(split[4]) : 0;
+ var startTime = split.Length > 2 ? Parsing.ParseDouble(split[2]) : double.MinValue;
+ var endTime = split.Length > 3 ? Parsing.ParseDouble(split[3]) : double.MaxValue;
+ var groupNumber = split.Length > 4 ? Parsing.ParseInt(split[4]) : 0;
timelineGroup = storyboardSprite?.AddTrigger(triggerName, startTime, endTime, groupNumber);
break;
}
case "L":
{
- var startTime = double.Parse(split[1], CultureInfo.InvariantCulture);
- var loopCount = int.Parse(split[2]);
+ var startTime = Parsing.ParseDouble(split[1]);
+ var loopCount = Parsing.ParseInt(split[2]);
timelineGroup = storyboardSprite?.AddLoop(startTime, loopCount);
break;
}
@@ -158,52 +157,52 @@ namespace osu.Game.Beatmaps.Formats
if (string.IsNullOrEmpty(split[3]))
split[3] = split[2];
- var easing = (Easing)int.Parse(split[1]);
- var startTime = double.Parse(split[2], CultureInfo.InvariantCulture);
- var endTime = double.Parse(split[3], CultureInfo.InvariantCulture);
+ var easing = (Easing)Parsing.ParseInt(split[1]);
+ var startTime = Parsing.ParseDouble(split[2]);
+ var endTime = Parsing.ParseDouble(split[3]);
switch (commandType)
{
case "F":
{
- var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
- var endValue = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
+ var startValue = Parsing.ParseFloat(split[4]);
+ var endValue = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
timelineGroup?.Alpha.Add(easing, startTime, endTime, startValue, endValue);
break;
}
case "S":
{
- var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
- var endValue = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
+ var startValue = Parsing.ParseFloat(split[4]);
+ var endValue = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
timelineGroup?.Scale.Add(easing, startTime, endTime, startValue, endValue);
break;
}
case "V":
{
- var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
- var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
- var endX = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
- var endY = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
+ var startX = Parsing.ParseFloat(split[4]);
+ var startY = Parsing.ParseFloat(split[5]);
+ var endX = split.Length > 6 ? Parsing.ParseFloat(split[6]) : startX;
+ var endY = split.Length > 7 ? Parsing.ParseFloat(split[7]) : startY;
timelineGroup?.VectorScale.Add(easing, startTime, endTime, new Vector2(startX, startY), new Vector2(endX, endY));
break;
}
case "R":
{
- var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
- var endValue = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
+ var startValue = Parsing.ParseFloat(split[4]);
+ var endValue = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
timelineGroup?.Rotation.Add(easing, startTime, endTime, MathUtils.RadiansToDegrees(startValue), MathUtils.RadiansToDegrees(endValue));
break;
}
case "M":
{
- var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
- var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
- var endX = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
- var endY = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
+ var startX = Parsing.ParseFloat(split[4]);
+ var startY = Parsing.ParseFloat(split[5]);
+ var endX = split.Length > 6 ? Parsing.ParseFloat(split[6]) : startX;
+ var endY = split.Length > 7 ? Parsing.ParseFloat(split[7]) : startY;
timelineGroup?.X.Add(easing, startTime, endTime, startX, endX);
timelineGroup?.Y.Add(easing, startTime, endTime, startY, endY);
break;
@@ -211,28 +210,28 @@ namespace osu.Game.Beatmaps.Formats
case "MX":
{
- var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
- var endValue = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
+ var startValue = Parsing.ParseFloat(split[4]);
+ var endValue = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
timelineGroup?.X.Add(easing, startTime, endTime, startValue, endValue);
break;
}
case "MY":
{
- var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
- var endValue = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
+ var startValue = Parsing.ParseFloat(split[4]);
+ var endValue = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
timelineGroup?.Y.Add(easing, startTime, endTime, startValue, endValue);
break;
}
case "C":
{
- var startRed = float.Parse(split[4], CultureInfo.InvariantCulture);
- var startGreen = float.Parse(split[5], CultureInfo.InvariantCulture);
- var startBlue = float.Parse(split[6], CultureInfo.InvariantCulture);
- var endRed = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startRed;
- var endGreen = split.Length > 8 ? float.Parse(split[8], CultureInfo.InvariantCulture) : startGreen;
- var endBlue = split.Length > 9 ? float.Parse(split[9], CultureInfo.InvariantCulture) : startBlue;
+ var startRed = Parsing.ParseFloat(split[4]);
+ var startGreen = Parsing.ParseFloat(split[5]);
+ var startBlue = Parsing.ParseFloat(split[6]);
+ var endRed = split.Length > 7 ? Parsing.ParseFloat(split[7]) : startRed;
+ var endGreen = split.Length > 8 ? Parsing.ParseFloat(split[8]) : startGreen;
+ var endBlue = split.Length > 9 ? Parsing.ParseFloat(split[9]) : startBlue;
timelineGroup?.Colour.Add(easing, startTime, endTime,
new Color4(startRed / 255f, startGreen / 255f, startBlue / 255f, 1),
new Color4(endRed / 255f, endGreen / 255f, endBlue / 255f, 1));
diff --git a/osu.Game/Database/IModelDownloader.cs b/osu.Game/Database/IModelDownloader.cs
index 17f1ccab06..99aeb4eacf 100644
--- a/osu.Game/Database/IModelDownloader.cs
+++ b/osu.Game/Database/IModelDownloader.cs
@@ -15,11 +15,13 @@ namespace osu.Game.Database
{
///
/// Fired when a download begins.
+ /// This is NOT run on the update thread and should be scheduled.
///
event Action> DownloadBegan;
///
/// Fired when a download is interrupted, either due to user cancellation or failure.
+ /// This is NOT run on the update thread and should be scheduled.
///
event Action> DownloadFailed;
diff --git a/osu.Game/Graphics/OsuColour.cs b/osu.Game/Graphics/OsuColour.cs
index 59dd823266..984f5e52d1 100644
--- a/osu.Game/Graphics/OsuColour.cs
+++ b/osu.Game/Graphics/OsuColour.cs
@@ -1,8 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using System;
-using System.Globalization;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Game.Beatmaps;
using osuTK.Graphics;
@@ -13,45 +12,6 @@ namespace osu.Game.Graphics
public static Color4 Gray(float amt) => new Color4(amt, amt, amt, 1f);
public static Color4 Gray(byte amt) => new Color4(amt, amt, amt, 255);
- public static Color4 FromHex(string hex)
- {
- var hexSpan = hex[0] == '#' ? hex.AsSpan().Slice(1) : hex.AsSpan();
-
- switch (hexSpan.Length)
- {
- default:
- throw new ArgumentException(@"Invalid hex string length!");
-
- case 3:
- return new Color4(
- (byte)(byte.Parse(hexSpan.Slice(0, 1), NumberStyles.HexNumber) * 17),
- (byte)(byte.Parse(hexSpan.Slice(1, 1), NumberStyles.HexNumber) * 17),
- (byte)(byte.Parse(hexSpan.Slice(2, 1), NumberStyles.HexNumber) * 17),
- 255);
-
- case 6:
- return new Color4(
- byte.Parse(hexSpan.Slice(0, 2), NumberStyles.HexNumber),
- byte.Parse(hexSpan.Slice(2, 2), NumberStyles.HexNumber),
- byte.Parse(hexSpan.Slice(4, 2), NumberStyles.HexNumber),
- 255);
-
- case 4:
- return new Color4(
- (byte)(byte.Parse(hexSpan.Slice(0, 1), NumberStyles.HexNumber) * 17),
- (byte)(byte.Parse(hexSpan.Slice(1, 1), NumberStyles.HexNumber) * 17),
- (byte)(byte.Parse(hexSpan.Slice(0, 1), NumberStyles.HexNumber) * 17),
- (byte)(byte.Parse(hexSpan.Slice(0, 1), NumberStyles.HexNumber) * 17));
-
- case 8:
- return new Color4(
- byte.Parse(hexSpan.Slice(0, 2), NumberStyles.HexNumber),
- byte.Parse(hexSpan.Slice(2, 2), NumberStyles.HexNumber),
- byte.Parse(hexSpan.Slice(4, 2), NumberStyles.HexNumber),
- byte.Parse(hexSpan.Slice(6, 2), NumberStyles.HexNumber));
- }
- }
-
public Color4 ForDifficultyRating(DifficultyRating difficulty, bool useLighterColour = false)
{
switch (difficulty)
@@ -78,105 +38,105 @@ namespace osu.Game.Graphics
}
// See https://github.com/ppy/osu-web/blob/master/resources/assets/less/colors.less
- public readonly Color4 PurpleLighter = FromHex(@"eeeeff");
- public readonly Color4 PurpleLight = FromHex(@"aa88ff");
- public readonly Color4 PurpleLightAlternative = FromHex(@"cba4da");
- public readonly Color4 Purple = FromHex(@"8866ee");
- public readonly Color4 PurpleDark = FromHex(@"6644cc");
- public readonly Color4 PurpleDarkAlternative = FromHex(@"312436");
- public readonly Color4 PurpleDarker = FromHex(@"441188");
+ public readonly Color4 PurpleLighter = Color4Extensions.FromHex(@"eeeeff");
+ public readonly Color4 PurpleLight = Color4Extensions.FromHex(@"aa88ff");
+ public readonly Color4 PurpleLightAlternative = Color4Extensions.FromHex(@"cba4da");
+ public readonly Color4 Purple = Color4Extensions.FromHex(@"8866ee");
+ public readonly Color4 PurpleDark = Color4Extensions.FromHex(@"6644cc");
+ public readonly Color4 PurpleDarkAlternative = Color4Extensions.FromHex(@"312436");
+ public readonly Color4 PurpleDarker = Color4Extensions.FromHex(@"441188");
- public readonly Color4 PinkLighter = FromHex(@"ffddee");
- public readonly Color4 PinkLight = FromHex(@"ff99cc");
- public readonly Color4 Pink = FromHex(@"ff66aa");
- public readonly Color4 PinkDark = FromHex(@"cc5288");
- public readonly Color4 PinkDarker = FromHex(@"bb1177");
+ public readonly Color4 PinkLighter = Color4Extensions.FromHex(@"ffddee");
+ public readonly Color4 PinkLight = Color4Extensions.FromHex(@"ff99cc");
+ public readonly Color4 Pink = Color4Extensions.FromHex(@"ff66aa");
+ public readonly Color4 PinkDark = Color4Extensions.FromHex(@"cc5288");
+ public readonly Color4 PinkDarker = Color4Extensions.FromHex(@"bb1177");
- public readonly Color4 BlueLighter = FromHex(@"ddffff");
- public readonly Color4 BlueLight = FromHex(@"99eeff");
- public readonly Color4 Blue = FromHex(@"66ccff");
- public readonly Color4 BlueDark = FromHex(@"44aadd");
- public readonly Color4 BlueDarker = FromHex(@"2299bb");
+ public readonly Color4 BlueLighter = Color4Extensions.FromHex(@"ddffff");
+ public readonly Color4 BlueLight = Color4Extensions.FromHex(@"99eeff");
+ public readonly Color4 Blue = Color4Extensions.FromHex(@"66ccff");
+ public readonly Color4 BlueDark = Color4Extensions.FromHex(@"44aadd");
+ public readonly Color4 BlueDarker = Color4Extensions.FromHex(@"2299bb");
- public readonly Color4 YellowLighter = FromHex(@"ffffdd");
- public readonly Color4 YellowLight = FromHex(@"ffdd55");
- public readonly Color4 Yellow = FromHex(@"ffcc22");
- public readonly Color4 YellowDark = FromHex(@"eeaa00");
- public readonly Color4 YellowDarker = FromHex(@"cc6600");
+ public readonly Color4 YellowLighter = Color4Extensions.FromHex(@"ffffdd");
+ public readonly Color4 YellowLight = Color4Extensions.FromHex(@"ffdd55");
+ public readonly Color4 Yellow = Color4Extensions.FromHex(@"ffcc22");
+ public readonly Color4 YellowDark = Color4Extensions.FromHex(@"eeaa00");
+ public readonly Color4 YellowDarker = Color4Extensions.FromHex(@"cc6600");
- public readonly Color4 GreenLighter = FromHex(@"eeffcc");
- public readonly Color4 GreenLight = FromHex(@"b3d944");
- public readonly Color4 Green = FromHex(@"88b300");
- public readonly Color4 GreenDark = FromHex(@"668800");
- public readonly Color4 GreenDarker = FromHex(@"445500");
+ public readonly Color4 GreenLighter = Color4Extensions.FromHex(@"eeffcc");
+ public readonly Color4 GreenLight = Color4Extensions.FromHex(@"b3d944");
+ public readonly Color4 Green = Color4Extensions.FromHex(@"88b300");
+ public readonly Color4 GreenDark = Color4Extensions.FromHex(@"668800");
+ public readonly Color4 GreenDarker = Color4Extensions.FromHex(@"445500");
- public readonly Color4 Sky = FromHex(@"6bb5ff");
- public readonly Color4 GreySkyLighter = FromHex(@"c6e3f4");
- public readonly Color4 GreySkyLight = FromHex(@"8ab3cc");
- public readonly Color4 GreySky = FromHex(@"405461");
- public readonly Color4 GreySkyDark = FromHex(@"303d47");
- public readonly Color4 GreySkyDarker = FromHex(@"21272c");
+ public readonly Color4 Sky = Color4Extensions.FromHex(@"6bb5ff");
+ public readonly Color4 GreySkyLighter = Color4Extensions.FromHex(@"c6e3f4");
+ public readonly Color4 GreySkyLight = Color4Extensions.FromHex(@"8ab3cc");
+ public readonly Color4 GreySky = Color4Extensions.FromHex(@"405461");
+ public readonly Color4 GreySkyDark = Color4Extensions.FromHex(@"303d47");
+ public readonly Color4 GreySkyDarker = Color4Extensions.FromHex(@"21272c");
- public readonly Color4 Seafoam = FromHex(@"05ffa2");
- public readonly Color4 GreySeafoamLighter = FromHex(@"9ebab1");
- public readonly Color4 GreySeafoamLight = FromHex(@"4d7365");
- public readonly Color4 GreySeafoam = FromHex(@"33413c");
- public readonly Color4 GreySeafoamDark = FromHex(@"2c3532");
- public readonly Color4 GreySeafoamDarker = FromHex(@"1e2422");
+ public readonly Color4 Seafoam = Color4Extensions.FromHex(@"05ffa2");
+ public readonly Color4 GreySeafoamLighter = Color4Extensions.FromHex(@"9ebab1");
+ public readonly Color4 GreySeafoamLight = Color4Extensions.FromHex(@"4d7365");
+ public readonly Color4 GreySeafoam = Color4Extensions.FromHex(@"33413c");
+ public readonly Color4 GreySeafoamDark = Color4Extensions.FromHex(@"2c3532");
+ public readonly Color4 GreySeafoamDarker = Color4Extensions.FromHex(@"1e2422");
- public readonly Color4 Cyan = FromHex(@"05f4fd");
- public readonly Color4 GreyCyanLighter = FromHex(@"77b1b3");
- public readonly Color4 GreyCyanLight = FromHex(@"436d6f");
- public readonly Color4 GreyCyan = FromHex(@"293d3e");
- public readonly Color4 GreyCyanDark = FromHex(@"243536");
- public readonly Color4 GreyCyanDarker = FromHex(@"1e2929");
+ public readonly Color4 Cyan = Color4Extensions.FromHex(@"05f4fd");
+ public readonly Color4 GreyCyanLighter = Color4Extensions.FromHex(@"77b1b3");
+ public readonly Color4 GreyCyanLight = Color4Extensions.FromHex(@"436d6f");
+ public readonly Color4 GreyCyan = Color4Extensions.FromHex(@"293d3e");
+ public readonly Color4 GreyCyanDark = Color4Extensions.FromHex(@"243536");
+ public readonly Color4 GreyCyanDarker = Color4Extensions.FromHex(@"1e2929");
- public readonly Color4 Lime = FromHex(@"82ff05");
- public readonly Color4 GreyLimeLighter = FromHex(@"deff87");
- public readonly Color4 GreyLimeLight = FromHex(@"657259");
- public readonly Color4 GreyLime = FromHex(@"3f443a");
- public readonly Color4 GreyLimeDark = FromHex(@"32352e");
- public readonly Color4 GreyLimeDarker = FromHex(@"2e302b");
+ public readonly Color4 Lime = Color4Extensions.FromHex(@"82ff05");
+ public readonly Color4 GreyLimeLighter = Color4Extensions.FromHex(@"deff87");
+ public readonly Color4 GreyLimeLight = Color4Extensions.FromHex(@"657259");
+ public readonly Color4 GreyLime = Color4Extensions.FromHex(@"3f443a");
+ public readonly Color4 GreyLimeDark = Color4Extensions.FromHex(@"32352e");
+ public readonly Color4 GreyLimeDarker = Color4Extensions.FromHex(@"2e302b");
- public readonly Color4 Violet = FromHex(@"bf04ff");
- public readonly Color4 GreyVioletLighter = FromHex(@"ebb8fe");
- public readonly Color4 GreyVioletLight = FromHex(@"685370");
- public readonly Color4 GreyViolet = FromHex(@"46334d");
- public readonly Color4 GreyVioletDark = FromHex(@"2c2230");
- public readonly Color4 GreyVioletDarker = FromHex(@"201823");
+ public readonly Color4 Violet = Color4Extensions.FromHex(@"bf04ff");
+ public readonly Color4 GreyVioletLighter = Color4Extensions.FromHex(@"ebb8fe");
+ public readonly Color4 GreyVioletLight = Color4Extensions.FromHex(@"685370");
+ public readonly Color4 GreyViolet = Color4Extensions.FromHex(@"46334d");
+ public readonly Color4 GreyVioletDark = Color4Extensions.FromHex(@"2c2230");
+ public readonly Color4 GreyVioletDarker = Color4Extensions.FromHex(@"201823");
- public readonly Color4 Carmine = FromHex(@"ff0542");
- public readonly Color4 GreyCarmineLighter = FromHex(@"deaab4");
- public readonly Color4 GreyCarmineLight = FromHex(@"644f53");
- public readonly Color4 GreyCarmine = FromHex(@"342b2d");
- public readonly Color4 GreyCarmineDark = FromHex(@"302a2b");
- public readonly Color4 GreyCarmineDarker = FromHex(@"241d1e");
+ public readonly Color4 Carmine = Color4Extensions.FromHex(@"ff0542");
+ public readonly Color4 GreyCarmineLighter = Color4Extensions.FromHex(@"deaab4");
+ public readonly Color4 GreyCarmineLight = Color4Extensions.FromHex(@"644f53");
+ public readonly Color4 GreyCarmine = Color4Extensions.FromHex(@"342b2d");
+ public readonly Color4 GreyCarmineDark = Color4Extensions.FromHex(@"302a2b");
+ public readonly Color4 GreyCarmineDarker = Color4Extensions.FromHex(@"241d1e");
- public readonly Color4 Gray0 = FromHex(@"000");
- public readonly Color4 Gray1 = FromHex(@"111");
- public readonly Color4 Gray2 = FromHex(@"222");
- public readonly Color4 Gray3 = FromHex(@"333");
- public readonly Color4 Gray4 = FromHex(@"444");
- public readonly Color4 Gray5 = FromHex(@"555");
- public readonly Color4 Gray6 = FromHex(@"666");
- public readonly Color4 Gray7 = FromHex(@"777");
- public readonly Color4 Gray8 = FromHex(@"888");
- public readonly Color4 Gray9 = FromHex(@"999");
- public readonly Color4 GrayA = FromHex(@"aaa");
- public readonly Color4 GrayB = FromHex(@"bbb");
- public readonly Color4 GrayC = FromHex(@"ccc");
- public readonly Color4 GrayD = FromHex(@"ddd");
- public readonly Color4 GrayE = FromHex(@"eee");
- public readonly Color4 GrayF = FromHex(@"fff");
+ public readonly Color4 Gray0 = Color4Extensions.FromHex(@"000");
+ public readonly Color4 Gray1 = Color4Extensions.FromHex(@"111");
+ public readonly Color4 Gray2 = Color4Extensions.FromHex(@"222");
+ public readonly Color4 Gray3 = Color4Extensions.FromHex(@"333");
+ public readonly Color4 Gray4 = Color4Extensions.FromHex(@"444");
+ public readonly Color4 Gray5 = Color4Extensions.FromHex(@"555");
+ public readonly Color4 Gray6 = Color4Extensions.FromHex(@"666");
+ public readonly Color4 Gray7 = Color4Extensions.FromHex(@"777");
+ public readonly Color4 Gray8 = Color4Extensions.FromHex(@"888");
+ public readonly Color4 Gray9 = Color4Extensions.FromHex(@"999");
+ public readonly Color4 GrayA = Color4Extensions.FromHex(@"aaa");
+ public readonly Color4 GrayB = Color4Extensions.FromHex(@"bbb");
+ public readonly Color4 GrayC = Color4Extensions.FromHex(@"ccc");
+ public readonly Color4 GrayD = Color4Extensions.FromHex(@"ddd");
+ public readonly Color4 GrayE = Color4Extensions.FromHex(@"eee");
+ public readonly Color4 GrayF = Color4Extensions.FromHex(@"fff");
- public readonly Color4 RedLighter = FromHex(@"ffeded");
- public readonly Color4 RedLight = FromHex(@"ed7787");
- public readonly Color4 Red = FromHex(@"ed1121");
- public readonly Color4 RedDark = FromHex(@"ba0011");
- public readonly Color4 RedDarker = FromHex(@"870000");
+ public readonly Color4 RedLighter = Color4Extensions.FromHex(@"ffeded");
+ public readonly Color4 RedLight = Color4Extensions.FromHex(@"ed7787");
+ public readonly Color4 Red = Color4Extensions.FromHex(@"ed1121");
+ public readonly Color4 RedDark = Color4Extensions.FromHex(@"ba0011");
+ public readonly Color4 RedDarker = Color4Extensions.FromHex(@"870000");
- public readonly Color4 ChatBlue = FromHex(@"17292e");
+ public readonly Color4 ChatBlue = Color4Extensions.FromHex(@"17292e");
- public readonly Color4 ContextMenuGray = FromHex(@"223034");
+ public readonly Color4 ContextMenuGray = Color4Extensions.FromHex(@"223034");
}
}
diff --git a/osu.Game/Graphics/UserInterface/DrawableOsuMenuItem.cs b/osu.Game/Graphics/UserInterface/DrawableOsuMenuItem.cs
index 591ed3df83..a3ca851341 100644
--- a/osu.Game/Graphics/UserInterface/DrawableOsuMenuItem.cs
+++ b/osu.Game/Graphics/UserInterface/DrawableOsuMenuItem.cs
@@ -4,6 +4,7 @@
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
@@ -38,7 +39,7 @@ namespace osu.Game.Graphics.UserInterface
sampleClick = audio.Samples.Get(@"UI/generic-select");
BackgroundColour = Color4.Transparent;
- BackgroundColourHover = OsuColour.FromHex(@"172023");
+ BackgroundColourHover = Color4Extensions.FromHex(@"172023");
updateTextColour();
}
@@ -57,7 +58,7 @@ namespace osu.Game.Graphics.UserInterface
break;
case MenuItemType.Highlighted:
- text.Colour = OsuColour.FromHex(@"ffcc22");
+ text.Colour = Color4Extensions.FromHex(@"ffcc22");
break;
}
}
diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
index e7699e5255..0c82a869f8 100644
--- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
@@ -18,7 +18,11 @@ namespace osu.Game.Graphics.UserInterface
{
public class OsuPasswordTextBox : OsuTextBox, ISuppressKeyEventLogging
{
- protected override Drawable GetDrawableCharacter(char c) => new PasswordMaskChar(CalculatedTextSize);
+ protected override Drawable GetDrawableCharacter(char c) => new FallingDownContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Child = new PasswordMaskChar(CalculatedTextSize),
+ };
protected override bool AllowClipboardExport => false;
diff --git a/osu.Game/Graphics/UserInterface/OsuTextBox.cs b/osu.Game/Graphics/UserInterface/OsuTextBox.cs
index 4abbf8db57..6f440d8138 100644
--- a/osu.Game/Graphics/UserInterface/OsuTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTextBox.cs
@@ -63,7 +63,11 @@ namespace osu.Game.Graphics.UserInterface
base.OnFocusLost(e);
}
- protected override Drawable GetDrawableCharacter(char c) => new OsuSpriteText { Text = c.ToString(), Font = OsuFont.GetFont(size: CalculatedTextSize) };
+ protected override Drawable GetDrawableCharacter(char c) => new FallingDownContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Child = new OsuSpriteText { Text = c.ToString(), Font = OsuFont.GetFont(size: CalculatedTextSize) },
+ };
protected override Caret CreateCaret() => new OsuCaret
{
diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs
index 586cd2ce84..b13d6485ac 100644
--- a/osu.Game/Graphics/UserInterface/StarCounter.cs
+++ b/osu.Game/Graphics/UserInterface/StarCounter.cs
@@ -13,7 +13,7 @@ namespace osu.Game.Graphics.UserInterface
{
public class StarCounter : Container
{
- private readonly Container stars;
+ private readonly FillFlowContainer stars;
///
/// Maximum amount of stars displayed.
@@ -23,34 +23,29 @@ namespace osu.Game.Graphics.UserInterface
///
public int StarCount { get; }
- private double animationDelay => 80;
+ ///
+ /// The added delay for each subsequent star to be animated.
+ ///
+ protected virtual double AnimationDelay => 80;
- private double scalingDuration => 1000;
- private Easing scalingEasing => Easing.OutElasticHalf;
- private float minStarScale => 0.4f;
-
- private double fadingDuration => 100;
- private float minStarAlpha => 0.5f;
-
- private const float star_size = 20;
private const float star_spacing = 4;
- private float countStars;
+ private float current;
///
/// Amount of stars represented.
///
- public float CountStars
+ public float Current
{
- get => countStars;
+ get => current;
set
{
- if (countStars == value) return;
+ if (current == value) return;
if (IsLoaded)
- transformCount(value);
- countStars = value;
+ animate(value);
+ current = value;
}
}
@@ -71,11 +66,13 @@ namespace osu.Game.Graphics.UserInterface
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
Spacing = new Vector2(star_spacing),
- ChildrenEnumerable = Enumerable.Range(0, StarCount).Select(i => new Star { Alpha = minStarAlpha })
+ ChildrenEnumerable = Enumerable.Range(0, StarCount).Select(i => CreateStar())
}
};
}
+ public virtual Star CreateStar() => new DefaultStar();
+
protected override void LoadComplete()
{
base.LoadComplete();
@@ -86,63 +83,60 @@ namespace osu.Game.Graphics.UserInterface
public void ResetCount()
{
- countStars = 0;
+ current = 0;
StopAnimation();
}
public void ReplayAnimation()
{
- var t = countStars;
+ var t = current;
ResetCount();
- CountStars = t;
+ Current = t;
}
public void StopAnimation()
{
- int i = 0;
-
+ animate(current);
foreach (var star in stars.Children)
+ star.FinishTransforms(true);
+ }
+
+ private float getStarScale(int i, float value) => i + 1 <= value ? 1.0f : Interpolation.ValueAt(value, 0, 1.0f, i, i + 1);
+
+ private void animate(float newValue)
+ {
+ for (var i = 0; i < stars.Children.Count; i++)
{
+ var star = stars.Children[i];
+
star.ClearTransforms(true);
- star.FadeTo(i < countStars ? 1.0f : minStarAlpha);
- star.Icon.ScaleTo(getStarScale(i, countStars));
- i++;
+
+ double delay = (current <= newValue ? Math.Max(i - current, 0) : Math.Max(current - 1 - i, 0)) * AnimationDelay;
+
+ using (star.BeginDelayedSequence(delay, true))
+ star.DisplayAt(getStarScale(i, newValue));
}
}
- private float getStarScale(int i, float value)
+ public class DefaultStar : Star
{
- if (value <= i)
- return minStarScale;
+ private const double scaling_duration = 1000;
- return i + 1 <= value ? 1.0f : Interpolation.ValueAt(value, minStarScale, 1.0f, i, i + 1);
- }
+ private const double fading_duration = 100;
- private void transformCount(float newValue)
- {
- int i = 0;
+ private const Easing scaling_easing = Easing.OutElasticHalf;
- foreach (var star in stars.Children)
- {
- star.ClearTransforms(true);
+ private const float min_star_scale = 0.4f;
- var delay = (countStars <= newValue ? Math.Max(i - countStars, 0) : Math.Max(countStars - 1 - i, 0)) * animationDelay;
- star.Delay(delay).FadeTo(i < newValue ? 1.0f : minStarAlpha, fadingDuration);
- star.Icon.Delay(delay).ScaleTo(getStarScale(i, newValue), scalingDuration, scalingEasing);
+ private const float star_size = 20;
- i++;
- }
- }
-
- private class Star : Container
- {
public readonly SpriteIcon Icon;
- public Star()
+ public DefaultStar()
{
Size = new Vector2(star_size);
- Child = Icon = new SpriteIcon
+ InternalChild = Icon = new SpriteIcon
{
Size = new Vector2(star_size),
Icon = FontAwesome.Solid.Star,
@@ -150,6 +144,19 @@ namespace osu.Game.Graphics.UserInterface
Origin = Anchor.Centre,
};
}
+
+ public override void DisplayAt(float scale)
+ {
+ scale = Math.Clamp(scale, min_star_scale, 1);
+
+ this.FadeTo(scale, fading_duration);
+ Icon.ScaleTo(scale, scaling_duration, scaling_easing);
+ }
+ }
+
+ public abstract class Star : CompositeDrawable
+ {
+ public abstract void DisplayAt(float scale);
}
}
}
diff --git a/osu.Game/Graphics/UserInterfaceV2/LabelledDrawable.cs b/osu.Game/Graphics/UserInterfaceV2/LabelledDrawable.cs
index f44bd72aee..0e995ca73d 100644
--- a/osu.Game/Graphics/UserInterfaceV2/LabelledDrawable.cs
+++ b/osu.Game/Graphics/UserInterfaceV2/LabelledDrawable.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -42,7 +43,7 @@ namespace osu.Game.Graphics.UserInterfaceV2
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex("1c2125"),
+ Colour = Color4Extensions.FromHex("1c2125"),
},
new FillFlowContainer
{
diff --git a/osu.Game/Online/Chat/StandAloneChatDisplay.cs b/osu.Game/Online/Chat/StandAloneChatDisplay.cs
index 21d0bcc4bf..0914f688e9 100644
--- a/osu.Game/Online/Chat/StandAloneChatDisplay.cs
+++ b/osu.Game/Online/Chat/StandAloneChatDisplay.cs
@@ -92,18 +92,6 @@ namespace osu.Game.Online.Chat
textbox.Text = string.Empty;
}
- public void Contract()
- {
- this.FadeIn(300);
- this.MoveToY(0, 500, Easing.OutQuint);
- }
-
- public void Expand()
- {
- this.FadeOut(200);
- this.MoveToY(100, 500, Easing.In);
- }
-
protected virtual ChatLine CreateMessage(Message message) => new StandAloneMessage(message);
private void channelChanged(ValueChangedEvent e)
diff --git a/osu.Game/Online/DownloadTrackingComposite.cs b/osu.Game/Online/DownloadTrackingComposite.cs
index 6e7ef99c6d..0769be2998 100644
--- a/osu.Game/Online/DownloadTrackingComposite.cs
+++ b/osu.Game/Online/DownloadTrackingComposite.cs
@@ -53,17 +53,17 @@ namespace osu.Game.Online
manager.ItemRemoved += itemRemoved;
}
- private void downloadBegan(ArchiveDownloadRequest request)
+ private void downloadBegan(ArchiveDownloadRequest request) => Schedule(() =>
{
if (request.Model.Equals(Model.Value))
attachDownload(request);
- }
+ });
- private void downloadFailed(ArchiveDownloadRequest request)
+ private void downloadFailed(ArchiveDownloadRequest request) => Schedule(() =>
{
if (request.Model.Equals(Model.Value))
attachDownload(null);
- }
+ });
private ArchiveDownloadRequest attachedRequest;
diff --git a/osu.Game/Online/Leaderboards/DrawableRank.cs b/osu.Game/Online/Leaderboards/DrawableRank.cs
index 20bda4601f..45b91bbf81 100644
--- a/osu.Game/Online/Leaderboards/DrawableRank.cs
+++ b/osu.Game/Online/Leaderboards/DrawableRank.cs
@@ -80,23 +80,23 @@ namespace osu.Game.Online.Leaderboards
{
case ScoreRank.XH:
case ScoreRank.X:
- return OsuColour.FromHex(@"ce1c9d");
+ return Color4Extensions.FromHex(@"ce1c9d");
case ScoreRank.SH:
case ScoreRank.S:
- return OsuColour.FromHex(@"00a8b5");
+ return Color4Extensions.FromHex(@"00a8b5");
case ScoreRank.A:
- return OsuColour.FromHex(@"7cce14");
+ return Color4Extensions.FromHex(@"7cce14");
case ScoreRank.B:
- return OsuColour.FromHex(@"e3b130");
+ return Color4Extensions.FromHex(@"e3b130");
case ScoreRank.C:
- return OsuColour.FromHex(@"f18252");
+ return Color4Extensions.FromHex(@"f18252");
default:
- return OsuColour.FromHex(@"e95353");
+ return Color4Extensions.FromHex(@"e95353");
}
}
@@ -109,23 +109,23 @@ namespace osu.Game.Online.Leaderboards
{
case ScoreRank.XH:
case ScoreRank.SH:
- return ColourInfo.GradientVertical(Color4.White, OsuColour.FromHex("afdff0"));
+ return ColourInfo.GradientVertical(Color4.White, Color4Extensions.FromHex("afdff0"));
case ScoreRank.X:
case ScoreRank.S:
- return ColourInfo.GradientVertical(OsuColour.FromHex(@"ffe7a8"), OsuColour.FromHex(@"ffb800"));
+ return ColourInfo.GradientVertical(Color4Extensions.FromHex(@"ffe7a8"), Color4Extensions.FromHex(@"ffb800"));
case ScoreRank.A:
- return OsuColour.FromHex(@"275227");
+ return Color4Extensions.FromHex(@"275227");
case ScoreRank.B:
- return OsuColour.FromHex(@"553a2b");
+ return Color4Extensions.FromHex(@"553a2b");
case ScoreRank.C:
- return OsuColour.FromHex(@"473625");
+ return Color4Extensions.FromHex(@"473625");
default:
- return OsuColour.FromHex(@"512525");
+ return Color4Extensions.FromHex(@"512525");
}
}
}
diff --git a/osu.Game/Online/Leaderboards/LeaderboardScore.cs b/osu.Game/Online/Leaderboards/LeaderboardScore.cs
index ba92b993a2..1469f29874 100644
--- a/osu.Game/Online/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Online/Leaderboards/LeaderboardScore.cs
@@ -200,7 +200,7 @@ namespace osu.Game.Online.Leaderboards
scoreLabel = new GlowingSpriteText
{
TextColour = Color4.White,
- GlowColour = OsuColour.FromHex(@"83ccfa"),
+ GlowColour = Color4Extensions.FromHex(@"83ccfa"),
Text = score.TotalScore.ToString(@"N0"),
Font = OsuFont.Numeric.With(size: 23),
},
@@ -325,7 +325,7 @@ namespace osu.Game.Online.Leaderboards
Origin = Anchor.Centre,
Size = new Vector2(icon_size),
Rotation = 45,
- Colour = OsuColour.FromHex(@"3087ac"),
+ Colour = Color4Extensions.FromHex(@"3087ac"),
Icon = FontAwesome.Solid.Square,
Shadow = true,
},
@@ -334,7 +334,7 @@ namespace osu.Game.Online.Leaderboards
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Size = new Vector2(icon_size - 6),
- Colour = OsuColour.FromHex(@"a4edff"),
+ Colour = Color4Extensions.FromHex(@"a4edff"),
Icon = statistic.Icon,
},
},
@@ -344,7 +344,7 @@ namespace osu.Game.Online.Leaderboards
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
TextColour = Color4.White,
- GlowColour = OsuColour.FromHex(@"83ccfa"),
+ GlowColour = Color4Extensions.FromHex(@"83ccfa"),
Text = statistic.Value,
Font = OsuFont.GetFont(size: 17, weight: FontWeight.Bold),
},
diff --git a/osu.Game/Overlays/BeatmapSet/BasicStats.cs b/osu.Game/Overlays/BeatmapSet/BasicStats.cs
index ba0a62ec2f..a2464bef09 100644
--- a/osu.Game/Overlays/BeatmapSet/BasicStats.cs
+++ b/osu.Game/Overlays/BeatmapSet/BasicStats.cs
@@ -3,6 +3,7 @@
using System;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
@@ -124,7 +125,7 @@ namespace osu.Game.Overlays.BeatmapSet
Icon = FontAwesome.Solid.Square,
Size = new Vector2(12),
Rotation = 45,
- Colour = OsuColour.FromHex(@"441288"),
+ Colour = Color4Extensions.FromHex(@"441288"),
},
new SpriteIcon
{
@@ -132,7 +133,7 @@ namespace osu.Game.Overlays.BeatmapSet
Origin = Anchor.Centre,
Icon = icon,
Size = new Vector2(12),
- Colour = OsuColour.FromHex(@"f7dd55"),
+ Colour = Color4Extensions.FromHex(@"f7dd55"),
Scale = new Vector2(0.8f),
},
value = new OsuSpriteText
diff --git a/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs b/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs
index 6de1d3fca7..99b0b2ed3b 100644
--- a/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs
+++ b/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs
@@ -2,8 +2,8 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
-using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Overlays.BeatmapSet.Buttons
@@ -19,9 +19,9 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
[BackgroundDependencyLoader]
private void load()
{
- BackgroundColour = OsuColour.FromHex(@"094c5f");
- Triangles.ColourLight = OsuColour.FromHex(@"0f7c9b");
- Triangles.ColourDark = OsuColour.FromHex(@"094c5f");
+ BackgroundColour = Color4Extensions.FromHex(@"094c5f");
+ Triangles.ColourLight = Color4Extensions.FromHex(@"0f7c9b");
+ Triangles.ColourDark = Color4Extensions.FromHex(@"094c5f");
Triangles.TriangleScale = 1.5f;
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs
index f1250679c1..097ca27bf7 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs
@@ -52,22 +52,28 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
highAccuracyColour = colours.GreenLight;
}
- public IReadOnlyList Scores
+ private bool showPerformancePoints;
+
+ public void DisplayScores(IReadOnlyList scores, bool showPerformanceColumn)
{
- set
- {
- Content = null;
- backgroundFlow.Clear();
+ ClearScores();
- if (value?.Any() != true)
- return;
+ if (!scores.Any())
+ return;
- for (int i = 0; i < value.Count; i++)
- backgroundFlow.Add(new ScoreTableRowBackground(i, value[i], row_height));
+ showPerformancePoints = showPerformanceColumn;
- Columns = createHeaders(value[0]);
- Content = value.Select((s, i) => createContent(i, s)).ToArray().ToRectangular();
- }
+ for (int i = 0; i < scores.Count; i++)
+ backgroundFlow.Add(new ScoreTableRowBackground(i, scores[i], row_height));
+
+ Columns = createHeaders(scores.FirstOrDefault());
+ Content = scores.Select((s, i) => createContent(i, s)).ToArray().ToRectangular();
+ }
+
+ public void ClearScores()
+ {
+ Content = null;
+ backgroundFlow.Clear();
}
private TableColumn[] createHeaders(ScoreInfo score)
@@ -88,11 +94,10 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
columns.Add(new TableColumn(score.SortedStatistics.LastOrDefault().Key.GetDescription(), Anchor.CentreLeft, new Dimension(GridSizeMode.Distributed, minSize: 45, maxSize: 95)));
- columns.AddRange(new[]
- {
- new TableColumn("pp", Anchor.CentreLeft, new Dimension(GridSizeMode.Absolute, 30)),
- new TableColumn("mods", Anchor.CentreLeft, new Dimension(GridSizeMode.AutoSize)),
- });
+ if (showPerformancePoints)
+ columns.Add(new TableColumn("pp", Anchor.CentreLeft, new Dimension(GridSizeMode.Absolute, 30)));
+
+ columns.Add(new TableColumn("mods", Anchor.CentreLeft, new Dimension(GridSizeMode.AutoSize)));
return columns.ToArray();
}
@@ -150,24 +155,25 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
});
}
- content.AddRange(new Drawable[]
+ if (showPerformancePoints)
{
- new OsuSpriteText
+ content.Add(new OsuSpriteText
{
Text = $@"{score.PP:N0}",
Font = OsuFont.GetFont(size: text_size)
- },
- new FillFlowContainer
+ });
+ }
+
+ content.Add(new FillFlowContainer
+ {
+ Direction = FillDirection.Horizontal,
+ AutoSizeAxes = Axes.Both,
+ Spacing = new Vector2(1),
+ ChildrenEnumerable = score.Mods.Select(m => new ModIcon(m)
{
- Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
- Spacing = new Vector2(1),
- ChildrenEnumerable = score.Mods.Select(m => new ModIcon(m)
- {
- AutoSizeAxes = Axes.Both,
- Scale = new Vector2(0.3f)
- })
- },
+ Scale = new Vector2(0.3f)
+ })
});
return content.ToArray();
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
index 7607eac1f8..a58d662de7 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
@@ -52,17 +52,17 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
if (value?.Scores.Any() != true)
{
- scoreTable.Scores = null;
+ scoreTable.ClearScores();
scoreTable.Hide();
return;
}
var scoreInfos = value.Scores.Select(s => s.CreateScoreInfo(rulesets)).ToList();
+ var topScore = scoreInfos.First();
- scoreTable.Scores = scoreInfos;
+ scoreTable.DisplayScores(scoreInfos, topScore.Beatmap?.Status == BeatmapSetOnlineStatus.Ranked);
scoreTable.Show();
- var topScore = scoreInfos.First();
var userScore = value.UserScore;
var userScoreInfo = userScore?.Score.CreateScoreInfo(rulesets);
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs
index a15dc57d23..a92346e0fe 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs
@@ -10,6 +10,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
+using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Rulesets.Mods;
@@ -96,6 +97,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
totalScoreColumn.Text = $@"{value.TotalScore:N0}";
accuracyColumn.Text = value.DisplayAccuracy;
maxComboColumn.Text = $@"{value.MaxCombo:N0}x";
+ ppColumn.Alpha = value.Beatmap?.Status == BeatmapSetOnlineStatus.Ranked ? 1 : 0;
ppColumn.Text = $@"{value.PP:N0}";
statisticsColumns.ChildrenEnumerable = value.SortedStatistics.Select(kvp => createStatisticsColumn(kvp.Key, kvp.Value));
diff --git a/osu.Game/Overlays/Chat/ChatLine.cs b/osu.Game/Overlays/Chat/ChatLine.cs
index 8abde8a24f..496986dc56 100644
--- a/osu.Game/Overlays/Chat/ChatLine.cs
+++ b/osu.Game/Overlays/Chat/ChatLine.cs
@@ -123,7 +123,7 @@ namespace osu.Game.Overlays.Chat
EdgeEffect = new EdgeEffectParameters
{
Radius = 1,
- Colour = OsuColour.FromHex(message.Sender.Colour),
+ Colour = Color4Extensions.FromHex(message.Sender.Colour),
Type = EdgeEffectType.Shadow,
},
Padding = new MarginPadding { Left = 3, Right = 3, Bottom = 1, Top = -3 },
@@ -172,7 +172,7 @@ namespace osu.Game.Overlays.Chat
t.Font = OsuFont.GetFont(italics: true);
if (senderHasBackground)
- t.Colour = OsuColour.FromHex(message.Sender.Colour);
+ t.Colour = Color4Extensions.FromHex(message.Sender.Colour);
}
t.Font = t.Font.With(size: TextSize);
@@ -249,41 +249,41 @@ namespace osu.Game.Overlays.Chat
private static readonly Color4[] username_colours =
{
- OsuColour.FromHex("588c7e"),
- OsuColour.FromHex("b2a367"),
- OsuColour.FromHex("c98f65"),
- OsuColour.FromHex("bc5151"),
- OsuColour.FromHex("5c8bd6"),
- OsuColour.FromHex("7f6ab7"),
- OsuColour.FromHex("a368ad"),
- OsuColour.FromHex("aa6880"),
+ Color4Extensions.FromHex("588c7e"),
+ Color4Extensions.FromHex("b2a367"),
+ Color4Extensions.FromHex("c98f65"),
+ Color4Extensions.FromHex("bc5151"),
+ Color4Extensions.FromHex("5c8bd6"),
+ Color4Extensions.FromHex("7f6ab7"),
+ Color4Extensions.FromHex("a368ad"),
+ Color4Extensions.FromHex("aa6880"),
- OsuColour.FromHex("6fad9b"),
- OsuColour.FromHex("f2e394"),
- OsuColour.FromHex("f2ae72"),
- OsuColour.FromHex("f98f8a"),
- OsuColour.FromHex("7daef4"),
- OsuColour.FromHex("a691f2"),
- OsuColour.FromHex("c894d3"),
- OsuColour.FromHex("d895b0"),
+ Color4Extensions.FromHex("6fad9b"),
+ Color4Extensions.FromHex("f2e394"),
+ Color4Extensions.FromHex("f2ae72"),
+ Color4Extensions.FromHex("f98f8a"),
+ Color4Extensions.FromHex("7daef4"),
+ Color4Extensions.FromHex("a691f2"),
+ Color4Extensions.FromHex("c894d3"),
+ Color4Extensions.FromHex("d895b0"),
- OsuColour.FromHex("53c4a1"),
- OsuColour.FromHex("eace5c"),
- OsuColour.FromHex("ea8c47"),
- OsuColour.FromHex("fc4f4f"),
- OsuColour.FromHex("3d94ea"),
- OsuColour.FromHex("7760ea"),
- OsuColour.FromHex("af52c6"),
- OsuColour.FromHex("e25696"),
+ Color4Extensions.FromHex("53c4a1"),
+ Color4Extensions.FromHex("eace5c"),
+ Color4Extensions.FromHex("ea8c47"),
+ Color4Extensions.FromHex("fc4f4f"),
+ Color4Extensions.FromHex("3d94ea"),
+ Color4Extensions.FromHex("7760ea"),
+ Color4Extensions.FromHex("af52c6"),
+ Color4Extensions.FromHex("e25696"),
- OsuColour.FromHex("677c66"),
- OsuColour.FromHex("9b8732"),
- OsuColour.FromHex("8c5129"),
- OsuColour.FromHex("8c3030"),
- OsuColour.FromHex("1f5d91"),
- OsuColour.FromHex("4335a5"),
- OsuColour.FromHex("812a96"),
- OsuColour.FromHex("992861"),
+ Color4Extensions.FromHex("677c66"),
+ Color4Extensions.FromHex("9b8732"),
+ Color4Extensions.FromHex("8c5129"),
+ Color4Extensions.FromHex("8c3030"),
+ Color4Extensions.FromHex("1f5d91"),
+ Color4Extensions.FromHex("4335a5"),
+ Color4Extensions.FromHex("812a96"),
+ Color4Extensions.FromHex("992861"),
};
}
}
diff --git a/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs b/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs
index 25a9a51638..b46ca6b040 100644
--- a/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs
+++ b/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs
@@ -41,10 +41,10 @@ namespace osu.Game.Overlays.Chat.Selection
{
RelativeSizeAxes = Axes.X;
- Waves.FirstWaveColour = OsuColour.FromHex("353535");
- Waves.SecondWaveColour = OsuColour.FromHex("434343");
- Waves.ThirdWaveColour = OsuColour.FromHex("515151");
- Waves.FourthWaveColour = OsuColour.FromHex("595959");
+ Waves.FirstWaveColour = Color4Extensions.FromHex("353535");
+ Waves.SecondWaveColour = Color4Extensions.FromHex("434343");
+ Waves.ThirdWaveColour = Color4Extensions.FromHex("515151");
+ Waves.FourthWaveColour = Color4Extensions.FromHex("595959");
Children = new Drawable[]
{
@@ -154,7 +154,7 @@ namespace osu.Game.Overlays.Chat.Selection
{
bg.Colour = colours.Gray3;
triangles.ColourDark = colours.Gray3;
- triangles.ColourLight = OsuColour.FromHex(@"353535");
+ triangles.ColourLight = Color4Extensions.FromHex(@"353535");
headerBg.Colour = colours.Gray2.Opacity(0.75f);
}
diff --git a/osu.Game/Overlays/Chat/Tabs/PrivateChannelTabItem.cs b/osu.Game/Overlays/Chat/Tabs/PrivateChannelTabItem.cs
index 1413b8fe78..5b428a3825 100644
--- a/osu.Game/Overlays/Chat/Tabs/PrivateChannelTabItem.cs
+++ b/osu.Game/Overlays/Chat/Tabs/PrivateChannelTabItem.cs
@@ -89,7 +89,7 @@ namespace osu.Game.Overlays.Chat.Tabs
{
var user = Value.Users.First();
- BackgroundActive = user.Colour != null ? OsuColour.FromHex(user.Colour) : colours.BlueDark;
+ BackgroundActive = user.Colour != null ? Color4Extensions.FromHex(user.Colour) : colours.BlueDark;
BackgroundInactive = BackgroundActive.Darken(0.5f);
}
}
diff --git a/osu.Game/Overlays/Comments/CommentEditor.cs b/osu.Game/Overlays/Comments/CommentEditor.cs
index 2fa4cb68f3..7b4bf882dc 100644
--- a/osu.Game/Overlays/Comments/CommentEditor.cs
+++ b/osu.Game/Overlays/Comments/CommentEditor.cs
@@ -158,7 +158,11 @@ namespace osu.Game.Overlays.Comments
Font = OsuFont.GetFont(weight: FontWeight.Regular),
};
- protected override Drawable GetDrawableCharacter(char c) => new OsuSpriteText { Text = c.ToString(), Font = OsuFont.GetFont(size: CalculatedTextSize) };
+ protected override Drawable GetDrawableCharacter(char c) => new FallingDownContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Child = new OsuSpriteText { Text = c.ToString(), Font = OsuFont.GetFont(size: CalculatedTextSize) },
+ };
}
private class CommitButton : LoadingButton
diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs
index 37db78faa1..02ef900dc5 100644
--- a/osu.Game/Overlays/Dialog/PopupDialog.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialog.cs
@@ -10,7 +10,6 @@ using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Events;
-using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Containers;
using osuTK;
@@ -114,13 +113,13 @@ namespace osu.Game.Overlays.Dialog
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"221a21"),
+ Colour = Color4Extensions.FromHex(@"221a21"),
},
new Triangles
{
RelativeSizeAxes = Axes.Both,
- ColourLight = OsuColour.FromHex(@"271e26"),
- ColourDark = OsuColour.FromHex(@"1e171e"),
+ ColourLight = Color4Extensions.FromHex(@"271e26"),
+ ColourDark = Color4Extensions.FromHex(@"1e171e"),
TriangleScale = 4,
},
},
diff --git a/osu.Game/Overlays/Dialog/PopupDialogButton.cs b/osu.Game/Overlays/Dialog/PopupDialogButton.cs
index 75bae25b73..76ee438d6d 100644
--- a/osu.Game/Overlays/Dialog/PopupDialogButton.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialogButton.cs
@@ -1,7 +1,7 @@
// 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.Graphics;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Overlays.Dialog
@@ -11,7 +11,7 @@ namespace osu.Game.Overlays.Dialog
public PopupDialogButton()
{
Height = 50;
- BackgroundColour = OsuColour.FromHex(@"150e14");
+ BackgroundColour = Color4Extensions.FromHex(@"150e14");
TextSize = 18;
}
}
diff --git a/osu.Game/Overlays/Direct/FilterControl.cs b/osu.Game/Overlays/Direct/FilterControl.cs
index 70a3ab54fb..e5b2b5cc34 100644
--- a/osu.Game/Overlays/Direct/FilterControl.cs
+++ b/osu.Game/Overlays/Direct/FilterControl.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Game.Graphics;
using osu.Game.Online.API.Requests;
@@ -16,7 +17,7 @@ namespace osu.Game.Overlays.Direct
{
private DirectRulesetSelector rulesetSelector;
- protected override Color4 BackgroundColour => OsuColour.FromHex(@"384552");
+ protected override Color4 BackgroundColour => Color4Extensions.FromHex(@"384552");
protected override DirectSortCriteria DefaultTab => DirectSortCriteria.Ranked;
protected override BeatmapSearchCategory DefaultCategory => BeatmapSearchCategory.Leaderboard;
diff --git a/osu.Game/Overlays/Direct/Header.cs b/osu.Game/Overlays/Direct/Header.cs
index 80870dcb68..5b3e394a18 100644
--- a/osu.Game/Overlays/Direct/Header.cs
+++ b/osu.Game/Overlays/Direct/Header.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System.ComponentModel;
+using osu.Framework.Extensions.Color4Extensions;
using osuTK.Graphics;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Sprites;
@@ -13,7 +14,7 @@ namespace osu.Game.Overlays.Direct
{
public class Header : SearchableListHeader
{
- protected override Color4 BackgroundColour => OsuColour.FromHex(@"252f3a");
+ protected override Color4 BackgroundColour => Color4Extensions.FromHex(@"252f3a");
protected override DirectTab DefaultTab => DirectTab.Search;
protected override Drawable CreateHeaderText() => new OsuSpriteText { Text = @"osu!direct", Font = OsuFont.GetFont(size: 25) };
diff --git a/osu.Game/Overlays/DirectOverlay.cs b/osu.Game/Overlays/DirectOverlay.cs
index a6f8b65a0d..61986d1cf0 100644
--- a/osu.Game/Overlays/DirectOverlay.cs
+++ b/osu.Game/Overlays/DirectOverlay.cs
@@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Humanizer;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Threading;
@@ -34,9 +35,9 @@ namespace osu.Game.Overlays
private readonly OsuSpriteText resultCountsText;
private FillFlowContainer panels;
- protected override Color4 BackgroundColour => OsuColour.FromHex(@"485e74");
- protected override Color4 TrianglesColourLight => OsuColour.FromHex(@"465b71");
- protected override Color4 TrianglesColourDark => OsuColour.FromHex(@"3f5265");
+ protected override Color4 BackgroundColour => Color4Extensions.FromHex(@"485e74");
+ protected override Color4 TrianglesColourLight => Color4Extensions.FromHex(@"465b71");
+ protected override Color4 TrianglesColourDark => Color4Extensions.FromHex(@"3f5265");
protected override SearchableListHeader CreateHeader() => new Header();
protected override SearchableListFilterControl CreateFilterControl() => new FilterControl();
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index aa28b0659d..4425c2f168 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -126,14 +126,14 @@ namespace osu.Game.Overlays
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"05262f"),
+ Colour = Color4Extensions.FromHex(@"05262f"),
},
new Triangles
{
RelativeSizeAxes = Axes.Both,
TriangleScale = 2,
- ColourDark = OsuColour.FromHex(@"04222b"),
- ColourLight = OsuColour.FromHex(@"052933"),
+ ColourDark = Color4Extensions.FromHex(@"04222b"),
+ ColourLight = Color4Extensions.FromHex(@"052933"),
},
innerSpin = new Sprite
{
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 466c953151..e9b3598625 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -63,10 +63,10 @@ namespace osu.Game.Overlays.Mods
public ModSelectOverlay()
{
- Waves.FirstWaveColour = OsuColour.FromHex(@"19b0e2");
- Waves.SecondWaveColour = OsuColour.FromHex(@"2280a2");
- Waves.ThirdWaveColour = OsuColour.FromHex(@"005774");
- Waves.FourthWaveColour = OsuColour.FromHex(@"003a4e");
+ Waves.FirstWaveColour = Color4Extensions.FromHex(@"19b0e2");
+ Waves.SecondWaveColour = Color4Extensions.FromHex(@"2280a2");
+ Waves.ThirdWaveColour = Color4Extensions.FromHex(@"005774");
+ Waves.FourthWaveColour = Color4Extensions.FromHex(@"003a4e");
RelativeSizeAxes = Axes.Both;
diff --git a/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs
index 6ed4fc3187..2cc1f6533f 100644
--- a/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs
+++ b/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -170,7 +171,7 @@ namespace osu.Game.Overlays.Profile.Header
userCountryText.Text = user?.Country?.FullName ?? "Alien";
supporterTag.SupportLevel = user?.SupportLevel ?? 0;
titleText.Text = user?.Title ?? string.Empty;
- titleText.Colour = OsuColour.FromHex(user?.Colour ?? "fff");
+ titleText.Colour = Color4Extensions.FromHex(user?.Colour ?? "fff");
userStats.Clear();
diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs
index 3e78423a5a..f7c09e33c1 100644
--- a/osu.Game/Overlays/Profile/ProfileHeader.cs
+++ b/osu.Game/Overlays/Profile/ProfileHeader.cs
@@ -7,7 +7,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using osu.Game.Overlays.Profile.Header;
using osu.Game.Users;
@@ -48,7 +47,7 @@ namespace osu.Game.Overlays.Profile
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = ColourInfo.GradientVertical(OsuColour.FromHex("222").Opacity(0.8f), OsuColour.FromHex("222").Opacity(0.2f))
+ Colour = ColourInfo.GradientVertical(Color4Extensions.FromHex("222").Opacity(0.8f), Color4Extensions.FromHex("222").Opacity(0.2f))
},
}
};
diff --git a/osu.Game/Overlays/Profile/Sections/Historical/DrawableMostPlayedBeatmap.cs b/osu.Game/Overlays/Profile/Sections/Historical/DrawableMostPlayedBeatmap.cs
index e75ad2f161..5b7c5efbe2 100644
--- a/osu.Game/Overlays/Profile/Sections/Historical/DrawableMostPlayedBeatmap.cs
+++ b/osu.Game/Overlays/Profile/Sections/Historical/DrawableMostPlayedBeatmap.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
AddRangeInternal(new Drawable[]
{
@@ -61,7 +61,7 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
CornerRadius = corner_radius,
Children = new Drawable[]
{
- new ProfileItemContainer
+ new MostPlayedBeatmapContainer
{
Child = new Container
{
@@ -78,11 +78,14 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
Children = new Drawable[]
{
new MostPlayedBeatmapMetadataContainer(beatmap),
- new LinkFlowContainer(t => t.Font = OsuFont.GetFont(size: 12, weight: FontWeight.Regular))
+ new LinkFlowContainer(t =>
+ {
+ t.Font = OsuFont.GetFont(size: 12, weight: FontWeight.Regular);
+ t.Colour = colourProvider.Foreground1;
+ })
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
- Colour = colours.GreySeafoamLighter
}.With(d =>
{
d.AddText("mapped by ");
@@ -105,6 +108,16 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
});
}
+ private class MostPlayedBeatmapContainer : ProfileItemContainer
+ {
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ IdleColour = colourProvider.Background4;
+ HoverColour = colourProvider.Background3;
+ }
+ }
+
private class MostPlayedBeatmapMetadataContainer : BeatmapMetadataContainer
{
public MostPlayedBeatmapMetadataContainer(BeatmapInfo beatmap)
diff --git a/osu.Game/Overlays/Profile/Sections/ProfileItemContainer.cs b/osu.Game/Overlays/Profile/Sections/ProfileItemContainer.cs
index f65c909155..afa6bd9f79 100644
--- a/osu.Game/Overlays/Profile/Sections/ProfileItemContainer.cs
+++ b/osu.Game/Overlays/Profile/Sections/ProfileItemContainer.cs
@@ -16,12 +16,33 @@ namespace osu.Game.Overlays.Profile.Sections
protected override Container Content => content;
- private Color4 idleColour;
- private Color4 hoverColour;
-
private readonly Box background;
private readonly Container content;
+ private Color4 idleColour;
+
+ protected Color4 IdleColour
+ {
+ get => idleColour;
+ set
+ {
+ idleColour = value;
+ fadeBackgroundColour();
+ }
+ }
+
+ private Color4 hoverColour;
+
+ protected Color4 HoverColour
+ {
+ get => hoverColour;
+ set
+ {
+ hoverColour = value;
+ fadeBackgroundColour();
+ }
+ }
+
public ProfileItemContainer()
{
RelativeSizeAxes = Axes.Both;
@@ -44,20 +65,25 @@ namespace osu.Game.Overlays.Profile.Sections
[BackgroundDependencyLoader]
private void load(OverlayColourProvider colourProvider)
{
- background.Colour = idleColour = colourProvider.Background3;
- hoverColour = colourProvider.Background2;
+ IdleColour = colourProvider.Background3;
+ HoverColour = colourProvider.Background2;
}
protected override bool OnHover(HoverEvent e)
{
- background.FadeColour(hoverColour, hover_duration, Easing.OutQuint);
- return base.OnHover(e);
+ fadeBackgroundColour(hover_duration);
+ return true;
}
protected override void OnHoverLost(HoverLostEvent e)
{
base.OnHoverLost(e);
- background.FadeColour(idleColour, hover_duration, Easing.OutQuint);
+ fadeBackgroundColour(hover_duration);
+ }
+
+ private void fadeBackgroundColour(double fadeDuration = 0)
+ {
+ background.FadeColour(IsHovered ? HoverColour : IdleColour, fadeDuration, Easing.OutQuint);
}
}
}
diff --git a/osu.Game/Overlays/Social/FilterControl.cs b/osu.Game/Overlays/Social/FilterControl.cs
index 1c2cb95dfe..93fcc3c401 100644
--- a/osu.Game/Overlays/Social/FilterControl.cs
+++ b/osu.Game/Overlays/Social/FilterControl.cs
@@ -1,16 +1,16 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using osu.Framework.Extensions.Color4Extensions;
using osuTK.Graphics;
using osu.Framework.Graphics;
-using osu.Game.Graphics;
using osu.Game.Overlays.SearchableList;
namespace osu.Game.Overlays.Social
{
public class FilterControl : SearchableListFilterControl
{
- protected override Color4 BackgroundColour => OsuColour.FromHex(@"47253a");
+ protected override Color4 BackgroundColour => Color4Extensions.FromHex(@"47253a");
protected override SocialSortCriteria DefaultTab => SocialSortCriteria.Rank;
protected override SortDirection DefaultCategory => SortDirection.Ascending;
diff --git a/osu.Game/Overlays/Social/Header.cs b/osu.Game/Overlays/Social/Header.cs
index 22bca9b421..22e0fdcd56 100644
--- a/osu.Game/Overlays/Social/Header.cs
+++ b/osu.Game/Overlays/Social/Header.cs
@@ -9,6 +9,7 @@ using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Framework.Allocation;
using System.ComponentModel;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics.Sprites;
namespace osu.Game.Overlays.Social
@@ -17,7 +18,7 @@ namespace osu.Game.Overlays.Social
{
private OsuSpriteText browser;
- protected override Color4 BackgroundColour => OsuColour.FromHex(@"38202e");
+ protected override Color4 BackgroundColour => Color4Extensions.FromHex(@"38202e");
protected override SocialTab DefaultTab => SocialTab.AllPlayers;
protected override IconUsage Icon => FontAwesome.Solid.Users;
diff --git a/osu.Game/Overlays/SocialOverlay.cs b/osu.Game/Overlays/SocialOverlay.cs
index 54c978738d..50c05e1b54 100644
--- a/osu.Game/Overlays/SocialOverlay.cs
+++ b/osu.Game/Overlays/SocialOverlay.cs
@@ -9,7 +9,6 @@ using osuTK;
using osuTK.Graphics;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
@@ -18,6 +17,7 @@ using osu.Game.Overlays.Social;
using osu.Game.Users;
using System.Threading;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Threading;
namespace osu.Game.Overlays
@@ -27,9 +27,9 @@ namespace osu.Game.Overlays
private readonly LoadingSpinner loading;
private FillFlowContainer panels;
- protected override Color4 BackgroundColour => OsuColour.FromHex(@"60284b");
- protected override Color4 TrianglesColourLight => OsuColour.FromHex(@"672b51");
- protected override Color4 TrianglesColourDark => OsuColour.FromHex(@"5c2648");
+ protected override Color4 BackgroundColour => Color4Extensions.FromHex(@"60284b");
+ protected override Color4 TrianglesColourLight => Color4Extensions.FromHex(@"672b51");
+ protected override Color4 TrianglesColourDark => Color4Extensions.FromHex(@"5c2648");
protected override SearchableListHeader CreateHeader() => new Header();
protected override SearchableListFilterControl CreateFilterControl() => new FilterControl();
diff --git a/osu.Game/Rulesets/Mods/ModPerfect.cs b/osu.Game/Rulesets/Mods/ModPerfect.cs
index 882d3ebd6a..7fe606d584 100644
--- a/osu.Game/Rulesets/Mods/ModPerfect.cs
+++ b/osu.Game/Rulesets/Mods/ModPerfect.cs
@@ -15,6 +15,8 @@ namespace osu.Game.Rulesets.Mods
public override IconUsage? Icon => OsuIcon.ModPerfect;
public override string Description => "SS or quit.";
- protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result) => result.Type != result.Judgement.MaxResult;
+ protected override bool FailCondition(HealthProcessor healthProcessor, JudgementResult result)
+ => !(result.Judgement is IgnoreJudgement)
+ && result.Type != result.Judgement.MaxResult;
}
}
diff --git a/osu.Game/Screens/Edit/Components/Menus/EditorMenuBar.cs b/osu.Game/Screens/Edit/Components/Menus/EditorMenuBar.cs
index 752615245e..afd9e3d760 100644
--- a/osu.Game/Screens/Edit/Components/Menus/EditorMenuBar.cs
+++ b/osu.Game/Screens/Edit/Components/Menus/EditorMenuBar.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -26,7 +27,7 @@ namespace osu.Game.Screens.Edit.Components.Menus
MaskingContainer.CornerRadius = 0;
ItemsContainer.Padding = new MarginPadding { Left = 100 };
- BackgroundColour = OsuColour.FromHex("111");
+ BackgroundColour = Color4Extensions.FromHex("111");
ScreenSelectionTabControl tabControl;
AddRangeInternal(new Drawable[]
diff --git a/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineArea.cs b/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineArea.cs
index 02e5db306d..b99a053859 100644
--- a/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineArea.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineArea.cs
@@ -2,11 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using osuTK;
@@ -31,7 +31,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex("111")
+ Colour = Color4Extensions.FromHex("111")
},
new GridContainer
{
@@ -49,7 +49,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex("222")
+ Colour = Color4Extensions.FromHex("222")
},
new FillFlowContainer
{
@@ -76,7 +76,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex("333")
+ Colour = Color4Extensions.FromHex("333")
},
new Container
{
diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs
index bcab73715b..ee8200321b 100644
--- a/osu.Game/Screens/Menu/Disclaimer.cs
+++ b/osu.Game/Screens/Menu/Disclaimer.cs
@@ -9,6 +9,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Screens;
+using osu.Framework.Utils;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Online.API;
@@ -33,6 +34,7 @@ namespace osu.Game.Screens.Menu
private readonly OsuScreen nextScreen;
private readonly Bindable currentUser = new Bindable();
+ private FillFlowContainer fill;
public Disclaimer(OsuScreen nextScreen = null)
{
@@ -49,16 +51,16 @@ namespace osu.Game.Screens.Menu
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Icon = FontAwesome.Solid.ExclamationTriangle,
+ Icon = FontAwesome.Solid.Poo,
Size = new Vector2(icon_size),
Y = icon_y,
},
- new FillFlowContainer
+ fill = new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
- Y = icon_y + icon_size,
+ Y = icon_y,
Anchor = Anchor.Centre,
Origin = Anchor.TopCentre,
Children = new Drawable[]
@@ -71,6 +73,8 @@ namespace osu.Game.Screens.Menu
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
Spacing = new Vector2(0, 2),
+ LayoutDuration = 2000,
+ LayoutEasing = Easing.OutQuint
},
supportFlow = new LinkFlowContainer
{
@@ -86,23 +90,16 @@ namespace osu.Game.Screens.Menu
}
};
- textFlow.AddText("This is an ", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
- textFlow.AddText("early development build", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));
+ textFlow.AddText("This project is an ongoing ", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
+ textFlow.AddText("work in progress", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));
- textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
textFlow.NewParagraph();
static void format(SpriteText t) => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);
- textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
+ textFlow.AddParagraph(getRandomTip(), t => t.Font = t.Font.With(Typeface.Exo, 20, FontWeight.SemiBold));
textFlow.NewParagraph();
- textFlow.AddText("Visit ", format);
- textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format);
- textFlow.AddText(" to help out or follow progress!", format);
-
- textFlow.NewParagraph();
- textFlow.NewParagraph();
textFlow.NewParagraph();
iconColour = colours.Yellow;
@@ -114,7 +111,7 @@ namespace osu.Game.Screens.Menu
if (e.NewValue.IsSupporter)
{
- supportFlow.AddText("Thank you for supporting osu!", format);
+ supportFlow.AddText("Eternal thanks to you for supporting osu!", format);
}
else
{
@@ -125,7 +122,7 @@ namespace osu.Game.Screens.Menu
heart = supportFlow.AddIcon(FontAwesome.Solid.Heart, t =>
{
- t.Padding = new MarginPadding { Left = 5 };
+ t.Padding = new MarginPadding { Left = 5, Top = 3 };
t.Font = t.Font.With(size: 12);
t.Origin = Anchor.Centre;
t.Colour = colours.Pink;
@@ -139,11 +136,6 @@ namespace osu.Game.Screens.Menu
}, true);
}
- private void animateHeart()
- {
- heart.FlashColour(Color4.White, 750, Easing.OutQuint).Loop();
- }
-
protected override void LoadComplete()
{
base.LoadComplete();
@@ -155,15 +147,28 @@ namespace osu.Game.Screens.Menu
{
base.OnEntering(last);
- icon.Delay(1000).FadeColour(iconColour, 200, Easing.OutQuint);
- icon.Delay(1000)
- .MoveToY(icon_y * 1.1f, 160, Easing.OutCirc)
- .RotateTo(-10, 160, Easing.OutCirc)
- .Then()
- .MoveToY(icon_y, 160, Easing.InCirc)
- .RotateTo(0, 160, Easing.InCirc);
+ icon.RotateTo(10);
+ icon.FadeOut();
+ icon.ScaleTo(0.5f);
+
+ icon.Delay(500).FadeIn(500).ScaleTo(1, 500, Easing.OutQuint);
+
+ using (BeginDelayedSequence(3000, true))
+ {
+ icon.FadeColour(iconColour, 200, Easing.OutQuint);
+ icon.MoveToY(icon_y * 1.3f, 500, Easing.OutCirc)
+ .RotateTo(-360, 520, Easing.OutQuint)
+ .Then()
+ .MoveToY(icon_y, 160, Easing.InQuart)
+ .FadeColour(Color4.White, 160);
+
+ fill.Delay(520 + 160).MoveToOffset(new Vector2(0, 15), 160, Easing.OutQuart);
+ }
supportFlow.FadeOut().Delay(2000).FadeIn(500);
+ double delay = 500;
+ foreach (var c in textFlow.Children)
+ c.FadeTo(0.001f).Delay(delay += 20).FadeIn(500);
animateHeart();
@@ -178,5 +183,35 @@ namespace osu.Game.Screens.Menu
this.Push(nextScreen);
});
}
+
+ private string getRandomTip()
+ {
+ string[] tips =
+ {
+ "You can press Ctrl-T anywhere in the game to toggle the toolbar!",
+ "You can press Ctrl-O anywhere in the game to access options!",
+ "All settings are dynamic and take effect in real-time. Try changing the skin while playing!",
+ "New features are coming online every update. Make sure to stay up-to-date!",
+ "If you find the UI too large or small, try adjusting UI scale in settings!",
+ "Try adjusting the \"Screen Scaling\" mode to change your gameplay or UI area, even in fullscreen!",
+ "For now, osu!direct is available to all users on lazer. You can access it anywhere using Ctrl-D!",
+ "Seeking in replays is available by dragging on the difficulty bar at the bottom of the screen!",
+ "Multithreading support means that even with low \"FPS\" your input and judgements will be accurate!",
+ "Try scrolling down in the mod select panel to find a bunch of new fun mods!",
+ "Most of the web content (profiles, rankings, etc.) are available natively in-game from the icons on the toolbar!",
+ "Get more details, hide or delete a beatmap by right-clicking on its panel at song select!",
+ "All delete operations are temporary until exiting. Restore accidentally deleted content from the maintenance settings!",
+ "Check out the \"timeshift\" multiplayer system, which has local permanent leaderboards and playlist support!",
+ "Toggle advanced frame / thread statistics with Ctrl-F11!",
+ "Take a look under the hood at performance counters and enable verbose performance logging with Ctrl-F2!",
+ };
+
+ return tips[RNG.Next(0, tips.Length)];
+ }
+
+ private void animateHeart()
+ {
+ heart.FlashColour(Color4.White, 750, Easing.OutQuint).Loop();
+ }
}
}
diff --git a/osu.Game/Screens/Menu/IntroSequence.cs b/osu.Game/Screens/Menu/IntroSequence.cs
index e2dd14b18c..6731fef6f7 100644
--- a/osu.Game/Screens/Menu/IntroSequence.cs
+++ b/osu.Game/Screens/Menu/IntroSequence.cs
@@ -94,7 +94,7 @@ namespace osu.Game.Screens.Menu
},
}
},
- bigRing = new Ring(OsuColour.FromHex(@"B6C5E9"), 0.85f),
+ bigRing = new Ring(Color4Extensions.FromHex(@"B6C5E9"), 0.85f),
mediumRing = new Ring(Color4.White.Opacity(130), 0.7f),
smallRing = new Ring(Color4.White, 0.6f),
welcomeText = new OsuSpriteText
@@ -121,7 +121,7 @@ namespace osu.Game.Screens.Menu
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Height = 0,
- Colour = OsuColour.FromHex(@"C6D8FF").Opacity(160),
+ Colour = Color4Extensions.FromHex(@"C6D8FF").Opacity(160),
},
foregroundFill = new Box
{
@@ -139,28 +139,28 @@ namespace osu.Game.Screens.Menu
Anchor = Anchor.Centre,
Origin = Anchor.TopCentre,
Position = new Vector2(0, circle_offset),
- Colour = OsuColour.FromHex(@"AA92FF"),
+ Colour = Color4Extensions.FromHex(@"AA92FF"),
},
blueCircle = new Circle
{
Anchor = Anchor.Centre,
Origin = Anchor.CentreRight,
Position = new Vector2(-circle_offset, 0),
- Colour = OsuColour.FromHex(@"8FE5FE"),
+ Colour = Color4Extensions.FromHex(@"8FE5FE"),
},
yellowCircle = new Circle
{
Anchor = Anchor.Centre,
Origin = Anchor.BottomCentre,
Position = new Vector2(0, -circle_offset),
- Colour = OsuColour.FromHex(@"FFD64C"),
+ Colour = Color4Extensions.FromHex(@"FFD64C"),
},
pinkCircle = new Circle
{
Anchor = Anchor.Centre,
Origin = Anchor.CentreLeft,
Position = new Vector2(circle_offset, 0),
- Colour = OsuColour.FromHex(@"e967a1"),
+ Colour = Color4Extensions.FromHex(@"e967a1"),
},
};
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index be2f29cbe9..800520100e 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -6,6 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Audio.Track;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -14,7 +15,6 @@ using osu.Framework.Graphics.Textures;
using osu.Framework.Input.Events;
using osu.Framework.Utils;
using osu.Game.Beatmaps.ControlPoints;
-using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Containers;
using osuTK;
@@ -28,7 +28,7 @@ namespace osu.Game.Screens.Menu
///
public class OsuLogo : BeatSyncedContainer
{
- public readonly Color4 OsuPink = OsuColour.FromHex(@"e967a1");
+ public readonly Color4 OsuPink = Color4Extensions.FromHex(@"e967a1");
private const double transition_length = 300;
@@ -176,8 +176,8 @@ namespace osu.Game.Screens.Menu
triangles = new Triangles
{
TriangleScale = 4,
- ColourLight = OsuColour.FromHex(@"ff7db7"),
- ColourDark = OsuColour.FromHex(@"de5b95"),
+ ColourLight = Color4Extensions.FromHex(@"ff7db7"),
+ ColourDark = Color4Extensions.FromHex(@"de5b95"),
RelativeSizeAxes = Axes.Both,
},
}
diff --git a/osu.Game/Screens/Multi/Components/DrawableGameType.cs b/osu.Game/Screens/Multi/Components/DrawableGameType.cs
index f4941dd73a..28240f0796 100644
--- a/osu.Game/Screens/Multi/Components/DrawableGameType.cs
+++ b/osu.Game/Screens/Multi/Components/DrawableGameType.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
@@ -27,7 +28,7 @@ namespace osu.Game.Screens.Multi.Components
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"545454"),
+ Colour = Color4Extensions.FromHex(@"545454"),
},
};
}
diff --git a/osu.Game/Screens/Multi/Components/ParticipantsList.cs b/osu.Game/Screens/Multi/Components/ParticipantsList.cs
index 5a2dc19b66..79d130adf5 100644
--- a/osu.Game/Screens/Multi/Components/ParticipantsList.cs
+++ b/osu.Game/Screens/Multi/Components/ParticipantsList.cs
@@ -2,12 +2,12 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Threading;
-using osu.Game.Graphics;
using osu.Game.Users;
using osu.Game.Users.Drawables;
using osuTK;
@@ -114,7 +114,7 @@ namespace osu.Game.Screens.Multi.Components
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"27252d"),
+ Colour = Color4Extensions.FromHex(@"27252d"),
},
avatar = new UpdateableAvatar { RelativeSizeAxes = Axes.Both },
};
diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs
index 1cbf2a45e7..0a05472ba3 100644
--- a/osu.Game/Screens/Multi/Header.cs
+++ b/osu.Game/Screens/Multi/Header.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -30,7 +31,7 @@ namespace osu.Game.Screens.Multi
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"2f2043"),
+ Colour = Color4Extensions.FromHex(@"2f2043"),
},
new Container
{
diff --git a/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs b/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs
index d45dac1ae6..de02d779e1 100644
--- a/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs
+++ b/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs
@@ -134,7 +134,7 @@ namespace osu.Game.Screens.Multi.Lounge.Components
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"212121"),
+ Colour = Color4Extensions.FromHex(@"212121"),
},
new StatusColouredContainer(transition_duration)
{
diff --git a/osu.Game/Screens/Multi/Match/Components/Footer.cs b/osu.Game/Screens/Multi/Match/Components/Footer.cs
index c0c866d815..94d7df6194 100644
--- a/osu.Game/Screens/Multi/Match/Components/Footer.cs
+++ b/osu.Game/Screens/Multi/Match/Components/Footer.cs
@@ -4,6 +4,7 @@
using System;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -44,7 +45,7 @@ namespace osu.Game.Screens.Multi.Match.Components
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- background.Colour = OsuColour.FromHex(@"28242d");
+ background.Colour = Color4Extensions.FromHex(@"28242d");
}
}
}
diff --git a/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs b/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
index 115ac5037a..5d68de9ce6 100644
--- a/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
+++ b/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
@@ -91,7 +91,7 @@ namespace osu.Game.Screens.Multi.Match.Components
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"28242d"),
+ Colour = Color4Extensions.FromHex(@"28242d"),
},
new GridContainer
{
@@ -270,7 +270,7 @@ namespace osu.Game.Screens.Multi.Match.Components
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"28242d").Darken(0.5f).Opacity(1f),
+ Colour = Color4Extensions.FromHex(@"28242d").Darken(0.5f).Opacity(1f),
},
new FillFlowContainer
{
diff --git a/osu.Game/Screens/Multi/Match/Components/PurpleTriangleButton.cs b/osu.Game/Screens/Multi/Match/Components/PurpleTriangleButton.cs
index 8a0369ceba..1d93116d07 100644
--- a/osu.Game/Screens/Multi/Match/Components/PurpleTriangleButton.cs
+++ b/osu.Game/Screens/Multi/Match/Components/PurpleTriangleButton.cs
@@ -2,7 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Game.Graphics;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Screens.Multi.Match.Components
@@ -12,9 +12,9 @@ namespace osu.Game.Screens.Multi.Match.Components
[BackgroundDependencyLoader]
private void load()
{
- BackgroundColour = OsuColour.FromHex(@"593790");
- Triangles.ColourLight = OsuColour.FromHex(@"7247b6");
- Triangles.ColourDark = OsuColour.FromHex(@"593790");
+ BackgroundColour = Color4Extensions.FromHex(@"593790");
+ Triangles.ColourLight = Color4Extensions.FromHex(@"7247b6");
+ Triangles.ColourDark = Color4Extensions.FromHex(@"593790");
}
}
}
diff --git a/osu.Game/Screens/Multi/Match/Components/RoomAvailabilityPicker.cs b/osu.Game/Screens/Multi/Match/Components/RoomAvailabilityPicker.cs
index 9de4a61cde..7ef39c2a74 100644
--- a/osu.Game/Screens/Multi/Match/Components/RoomAvailabilityPicker.cs
+++ b/osu.Game/Screens/Multi/Match/Components/RoomAvailabilityPicker.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Extensions;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
@@ -52,7 +53,7 @@ namespace osu.Game.Screens.Multi.Match.Components
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"3d3943"),
+ Colour = Color4Extensions.FromHex(@"3d3943"),
},
selection = new Box
{
diff --git a/osu.Game/Screens/Multi/Multiplayer.cs b/osu.Game/Screens/Multi/Multiplayer.cs
index b0d773869a..863a28609b 100644
--- a/osu.Game/Screens/Multi/Multiplayer.cs
+++ b/osu.Game/Screens/Multi/Multiplayer.cs
@@ -13,7 +13,6 @@ using osu.Framework.Logging;
using osu.Framework.Screens;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
-using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
using osu.Game.Input;
@@ -75,7 +74,7 @@ namespace osu.Game.Screens.Multi
RelativeSizeAxes = Axes.Both;
Padding = new MarginPadding { Horizontal = -HORIZONTAL_OVERFLOW_PADDING };
- var backgroundColour = OsuColour.FromHex(@"3e3a44");
+ var backgroundColour = Color4Extensions.FromHex(@"3e3a44");
InternalChild = waves = new MultiplayerWaveContainer
{
@@ -386,10 +385,10 @@ namespace osu.Game.Screens.Multi
public MultiplayerWaveContainer()
{
- FirstWaveColour = OsuColour.FromHex(@"654d8c");
- SecondWaveColour = OsuColour.FromHex(@"554075");
- ThirdWaveColour = OsuColour.FromHex(@"44325e");
- FourthWaveColour = OsuColour.FromHex(@"392850");
+ FirstWaveColour = Color4Extensions.FromHex(@"654d8c");
+ SecondWaveColour = Color4Extensions.FromHex(@"554075");
+ ThirdWaveColour = Color4Extensions.FromHex(@"44325e");
+ FourthWaveColour = Color4Extensions.FromHex(@"392850");
}
}
diff --git a/osu.Game/Screens/Play/HUD/HitErrorMeters/BarHitErrorMeter.cs b/osu.Game/Screens/Play/HUD/HitErrorMeters/BarHitErrorMeter.cs
index 9edbddc0b1..f99c84fc01 100644
--- a/osu.Game/Screens/Play/HUD/HitErrorMeters/BarHitErrorMeter.cs
+++ b/osu.Game/Screens/Play/HUD/HitErrorMeters/BarHitErrorMeter.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions;
@@ -240,7 +241,7 @@ namespace osu.Game.Screens.Play.HUD.HitErrorMeters
, arrow_move_duration, Easing.Out);
}
- private float getRelativeJudgementPosition(double value) => (float)((value / maxHitWindow) + 1) / 2;
+ private float getRelativeJudgementPosition(double value) => Math.Clamp((float)((value / maxHitWindow) + 1) / 2, 0, 1);
private class JudgementLine : CompositeDrawable
{
diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index 1db97af2f0..71744d8b80 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -189,7 +189,7 @@ namespace osu.Game.Screens.Select
root.AddChild(newSet);
- applyActiveCriteria(false, false);
+ applyActiveCriteria(false);
//check if we can/need to maintain our current selection.
if (previouslySelectedID != null)
@@ -239,7 +239,7 @@ namespace osu.Game.Screens.Select
{
Debug.Assert(bypassFilters);
- applyActiveCriteria(false, true);
+ applyActiveCriteria(false);
}
return true;
@@ -396,7 +396,7 @@ namespace osu.Game.Screens.Select
{
if (PendingFilter?.Completed == false)
{
- applyActiveCriteria(false, false);
+ applyActiveCriteria(false);
Update();
}
}
@@ -406,10 +406,10 @@ namespace osu.Game.Screens.Select
if (newCriteria != null)
activeCriteria = newCriteria;
- applyActiveCriteria(debounce, true);
+ applyActiveCriteria(debounce);
}
- private void applyActiveCriteria(bool debounce, bool scroll)
+ private void applyActiveCriteria(bool debounce)
{
if (root.Children.Any() != true) return;
@@ -419,7 +419,7 @@ namespace osu.Game.Screens.Select
root.Filter(activeCriteria);
itemsCache.Invalidate();
- if (scroll) scrollPositionCache.Invalidate();
+ scrollPositionCache.Invalidate();
}
PendingFilter?.Cancel();
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index cf49cf0228..f84aac3081 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -384,7 +384,7 @@ namespace osu.Game.Screens.Select
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.FromHex(@"441288"),
+ Colour = Color4Extensions.FromHex(@"441288"),
Icon = FontAwesome.Solid.Square,
Rotation = 45,
},
@@ -394,7 +394,7 @@ namespace osu.Game.Screens.Select
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Scale = new Vector2(0.8f),
- Colour = OsuColour.FromHex(@"f7dd55"),
+ Colour = Color4Extensions.FromHex(@"f7dd55"),
Icon = statistic.Icon,
},
}
diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs
index 2ffb73f226..8c264ce974 100644
--- a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs
+++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs
@@ -25,6 +25,13 @@ namespace osu.Game.Screens.Select.Carousel
{
base.Filter(criteria);
+ if (Beatmap.BeatmapSet?.Equals(criteria.SelectedBeatmapSet) == true)
+ {
+ // bypass filtering for selected beatmap
+ Filtered.Value = false;
+ return;
+ }
+
bool match =
criteria.Ruleset == null ||
Beatmap.RulesetID == criteria.Ruleset.ID ||
diff --git a/osu.Game/Screens/Select/Carousel/CarouselItem.cs b/osu.Game/Screens/Select/Carousel/CarouselItem.cs
index 1108b72bd2..79c1a4cb6b 100644
--- a/osu.Game/Screens/Select/Carousel/CarouselItem.cs
+++ b/osu.Game/Screens/Select/Carousel/CarouselItem.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Screens.Select.Carousel
///
/// This item is not in a hidden state.
///
- public bool Visible => State.Value == CarouselItemState.Selected || (State.Value != CarouselItemState.Collapsed && !Filtered.Value);
+ public bool Visible => State.Value != CarouselItemState.Collapsed && !Filtered.Value;
public virtual List Drawables
{
diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
index d9eeec9f85..841bbf415c 100644
--- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
+++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
@@ -69,8 +70,8 @@ namespace osu.Game.Screens.Select.Carousel
{
TriangleScale = 2,
RelativeSizeAxes = Axes.Both,
- ColourLight = OsuColour.FromHex(@"3a7285"),
- ColourDark = OsuColour.FromHex(@"123744")
+ ColourLight = Color4Extensions.FromHex(@"3a7285"),
+ ColourDark = Color4Extensions.FromHex(@"123744")
},
new FillFlowContainer
{
@@ -123,7 +124,7 @@ namespace osu.Game.Screens.Select.Carousel
},
starCounter = new StarCounter
{
- CountStars = (float)beatmap.StarDifficulty,
+ Current = (float)beatmap.StarDifficulty,
Scale = new Vector2(0.8f),
}
}
diff --git a/osu.Game/Screens/Select/FilterCriteria.cs b/osu.Game/Screens/Select/FilterCriteria.cs
index 9fa57af01d..18be4fcac8 100644
--- a/osu.Game/Screens/Select/FilterCriteria.cs
+++ b/osu.Game/Screens/Select/FilterCriteria.cs
@@ -15,6 +15,8 @@ namespace osu.Game.Screens.Select
public GroupMode Group;
public SortMode Sort;
+ public BeatmapSetInfo SelectedBeatmapSet;
+
public OptionalRange StarDifficulty;
public OptionalRange ApproachRate;
public OptionalRange DrainRate;
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index 67626d1e4f..528222a89c 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -392,7 +392,12 @@ namespace osu.Game.Screens.Select
}
// Even if a ruleset mismatch was not the cause (ie. a text filter is applied),
- // we still want to forcefully show the new beatmap, bypassing filters.
+ // we still want to temporarily show the new beatmap, bypassing filters.
+ // This will be undone the next time the user changes the filter.
+ var criteria = FilterControl.CreateCriteria();
+ criteria.SelectedBeatmapSet = e.NewValue.BeatmapInfo.BeatmapSet;
+ Carousel.Filter(criteria);
+
Carousel.SelectBeatmap(e.NewValue.BeatmapInfo);
}
}
diff --git a/osu.Game/Tests/Visual/ModPerfectTestScene.cs b/osu.Game/Tests/Visual/ModPerfectTestScene.cs
new file mode 100644
index 0000000000..798947eb40
--- /dev/null
+++ b/osu.Game/Tests/Visual/ModPerfectTestScene.cs
@@ -0,0 +1,67 @@
+// 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.Beatmaps;
+using osu.Game.Rulesets;
+using osu.Game.Rulesets.Mods;
+using osu.Game.Rulesets.Objects;
+
+namespace osu.Game.Tests.Visual
+{
+ public abstract class ModPerfectTestScene : ModTestScene
+ {
+ private readonly Ruleset ruleset;
+ private readonly ModPerfect mod;
+
+ protected ModPerfectTestScene(Ruleset ruleset, ModPerfect mod)
+ : base(ruleset)
+ {
+ this.ruleset = ruleset;
+ this.mod = mod;
+ }
+
+ protected void CreateHitObjectTest(HitObjectTestData testData, bool shouldMiss) => CreateModTest(new ModTestData
+ {
+ Mod = mod,
+ Beatmap = new Beatmap
+ {
+ BeatmapInfo = { Ruleset = ruleset.RulesetInfo },
+ HitObjects = { testData.HitObject }
+ },
+ Autoplay = !shouldMiss,
+ PassCondition = () => ((PerfectModTestPlayer)Player).CheckFailed(shouldMiss && testData.FailOnMiss)
+ });
+
+ protected override TestPlayer CreateModPlayer(Ruleset ruleset) => new PerfectModTestPlayer();
+
+ private class PerfectModTestPlayer : TestPlayer
+ {
+ public PerfectModTestPlayer()
+ : base(showResults: false)
+ {
+ }
+
+ protected override bool AllowFail => true;
+
+ public bool CheckFailed(bool failed)
+ {
+ if (!failed)
+ return ScoreProcessor.HasCompleted && !HealthProcessor.HasFailed;
+
+ return HealthProcessor.HasFailed;
+ }
+ }
+
+ protected class HitObjectTestData
+ {
+ public readonly HitObject HitObject;
+ public readonly bool FailOnMiss;
+
+ public HitObjectTestData(HitObject hitObject, bool failOnMiss = true)
+ {
+ HitObject = hitObject;
+ FailOnMiss = failOnMiss;
+ }
+ }
+ }
+}
diff --git a/osu.Game/Tests/Visual/ModTestScene.cs b/osu.Game/Tests/Visual/ModTestScene.cs
index 9abe543bf6..8b41fb5075 100644
--- a/osu.Game/Tests/Visual/ModTestScene.cs
+++ b/osu.Game/Tests/Visual/ModTestScene.cs
@@ -57,9 +57,11 @@ namespace osu.Game.Tests.Visual
SelectedMods.Value = mods;
- return new ModTestPlayer(AllowFail);
+ return CreateModPlayer(ruleset);
}
+ protected virtual TestPlayer CreateModPlayer(Ruleset ruleset) => new ModTestPlayer(AllowFail);
+
protected class ModTestPlayer : TestPlayer
{
protected override bool AllowFail { get; }
diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs
index 0b09b5c08f..9e852719e0 100644
--- a/osu.Game/Tests/Visual/PlayerTestScene.cs
+++ b/osu.Game/Tests/Visual/PlayerTestScene.cs
@@ -66,6 +66,7 @@ namespace osu.Game.Tests.Visual
var beatmap = CreateBeatmap(ruleset.RulesetInfo);
Beatmap.Value = CreateWorkingBeatmap(beatmap);
+ Ruleset.Value = ruleset.RulesetInfo;
SelectedMods.Value = Array.Empty();
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 855bda3679..cc1ab654ab 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -23,7 +23,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index e2c4c09047..04b688cfa3 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -71,7 +71,7 @@
-
+
@@ -79,7 +79,7 @@
-
+