From cd7a304640d247fc4abb3075b5ee87c2b97bfc1d Mon Sep 17 00:00:00 2001 From: clayton Date: Sun, 10 Aug 2025 07:16:18 -0700 Subject: [PATCH] Add tick judgement gallery test scene --- .../Resources/old-skin/sliderpoint10.png | Bin 0 -> 2349 bytes .../Resources/old-skin/sliderpoint30.png | Bin 0 -> 2718 bytes .../TestSceneDrawableJudgementSliderTicks.cs | 173 ++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/sliderpoint10.png create mode 100644 osu.Game.Rulesets.Osu.Tests/Resources/old-skin/sliderpoint30.png create mode 100644 osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgementSliderTicks.cs diff --git a/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/sliderpoint10.png b/osu.Game.Rulesets.Osu.Tests/Resources/old-skin/sliderpoint10.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2fe66a1c0a91e6f21d9bf670d4515ef8cdb3b6 GIT binary patch literal 2349 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 Y0Sy+ultD$RxBvhE07*qoM6N<$g5gp;DgXcg literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgementSliderTicks.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgementSliderTicks.cs new file mode 100644 index 0000000000..c03c371015 --- /dev/null +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneDrawableJudgementSliderTicks.cs @@ -0,0 +1,173 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Diagnostics; +using System.Linq; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Game.Graphics.Sprites; +using osu.Game.Rulesets.Osu.Judgements; +using osu.Game.Rulesets.Osu.Objects; +using osu.Game.Rulesets.Osu.Objects.Drawables; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; +using osuTK; + +namespace osu.Game.Rulesets.Osu.Tests +{ + public partial class TestSceneDrawableJudgementSliderTicks : OsuSkinnableTestScene + { + private bool classic; + private readonly Container[,,] judgementContainers; + private readonly JudgementPooler[] judgementPools; + + public TestSceneDrawableJudgementSliderTicks() + { + judgementContainers = new Container[Rows * Cols, 5, 2]; + judgementPools = new JudgementPooler[Rows * Cols]; + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + int cellIndex = 0; + + SetContents(_ => + { + var container = new Container + { + RelativeSizeAxes = Axes.Both, + Children = new Drawable[] + { + judgementPools[cellIndex] = new JudgementPooler(new[] + { + HitResult.Great, + HitResult.Miss, + HitResult.LargeTickHit, + HitResult.SliderTailHit, + HitResult.LargeTickMiss, + HitResult.IgnoreMiss, + }), + new GridContainer + { + Padding = new MarginPadding { Top = 26f }, + RelativeSizeAxes = Axes.Both, + RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, + ColumnDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, + Content = + new[] + { + new[] + { + Empty(), + new OsuSpriteText + { + Text = "hit", + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre, + }, + new OsuSpriteText + { + Text = "miss", + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre, + }, + }, + }.Concat(new[] + { + "head", + "tick", + "repeat", + "tail", + "slider", + }.Select((label, hitObjectIndex) => new Drawable[] + { + new OsuSpriteText + { + Text = label, + Anchor = Anchor.CentreRight, + Origin = Anchor.CentreRight, + }, + judgementContainers[cellIndex, hitObjectIndex, 0] = + new Container { RelativeSizeAxes = Axes.Both }, + judgementContainers[cellIndex, hitObjectIndex, 1] = + new Container { RelativeSizeAxes = Axes.Both }, + })).ToArray(), + }, + }, + }; + + cellIndex++; + + return container; + }); + + AddToggleStep("Toggle classic behaviour", c => classic = c); + + AddStep("Show judgements", createAllJudgements); + } + + private void createAllJudgements() + { + for (int cellIndex = 0; cellIndex < Rows * Cols; cellIndex++) + { + for (int hitObjectIndex = 0; hitObjectIndex < 5; hitObjectIndex++) + { + createJudgement(cellIndex, hitObjectIndex, true); + createJudgement(cellIndex, hitObjectIndex, false); + } + } + } + + private void createJudgement(int cellIndex, int hitObjectIndex, bool hit) + { + var container = judgementContainers[cellIndex, hitObjectIndex, hit ? 0 : 1]; + container.Clear(false); + + var slider = new Slider { StartTime = Time.Current, ClassicSliderBehaviour = classic }; + OsuHitObject hitObject = hitObjectIndex switch + { + 0 => new SliderHeadCircle { StartTime = Time.Current, ClassicSliderBehaviour = classic }, + 1 => new SliderTick { StartTime = Time.Current }, + 2 => new SliderRepeat(slider) { StartTime = Time.Current }, + 3 => new SliderTailCircle(slider) { StartTime = Time.Current, ClassicSliderBehaviour = classic }, + 4 => slider, + _ => throw new UnreachableException(), + }; + + DrawableOsuHitObject drawableHitObject = hitObject switch + { + SliderHeadCircle head => new DrawableSliderHead(head), + SliderTick tick => new DrawableSliderTick(tick), + SliderRepeat repeat => new DrawableSliderRepeat(repeat), + SliderTailCircle tail => new DrawableSliderTail(tail), + Slider s => new DrawableSlider(s), + _ => throw new UnreachableException(), + }; + + if (!drawableHitObject.DisplayResult) + return; + + // TODO: This shouldn't be here. Removing it causes a crash on classic behaviour and I don't know why -- it happens any time the slider from above is applied to a DrawableJudgement, but the error comes from something about transforms on the Argon judgement piece, which doesn't seem to be related to the hit object. + if (hitObject is Slider) + return; + + var result = new OsuJudgementResult(hitObject, hitObject.Judgement) + { + Type = hit ? hitObject.Judgement.MaxResult : hitObject.Judgement.MinResult, + }; + + var judgement = judgementPools[cellIndex].Get(result.Type, d => + { + d.Anchor = Anchor.Centre; + d.Origin = Anchor.Centre; + d.Scale = new Vector2(0.7f); + d.Apply(result, null); + }); + + if (judgement != null) + container.Add(judgement); + } + } +}