1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-13 19:54:15 +08:00

Add judgement counter mode to show misses only (#37664)

Not sure if valuable. Came from
https://github.com/ppy/osu/discussions/37261 but that wants slider ends
as well, which is like, weird.

🤷
This commit is contained in:
Dean Herbert
2026-05-08 17:19:40 +09:00
committed by GitHub
Unverified
parent b578d34da4
commit 7d93c242b7
5 changed files with 45 additions and 40 deletions
@@ -91,7 +91,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddRepeatStep("Add judgement", () => applyOneJudgement(HitResult.LargeTickHit), 2);
AddAssert("Check value added whilst hidden", () => hiddenCount() == 2);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = ArgonJudgementCounterDisplay.DisplayMode.All);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.All);
}
[Test]
@@ -156,7 +156,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("create counter", () => Child = counterDisplay = new TestArgonJudgementCounterDisplay());
AddStep("Set max judgement to hide itself", () => counterDisplay.ShowMaxJudgement.Value = false);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = ArgonJudgementCounterDisplay.DisplayMode.All);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.All);
AddWaitStep("wait some", 2);
AddAssert("Assert max judgement hidden", () => counterDisplay.CounterFlow.ChildrenOfType<ArgonJudgementCounter>().First().Alpha == 0);
}
@@ -165,7 +165,7 @@ namespace osu.Game.Tests.Visual.Gameplay
public void TestNoDuplicates()
{
AddStep("create counter", () => Child = counterDisplay = new TestArgonJudgementCounterDisplay());
AddStep("Show all judgements", () => counterDisplay.Mode.Value = ArgonJudgementCounterDisplay.DisplayMode.All);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.All);
AddAssert("Check no duplicates",
() => counterDisplay.CounterFlow.ChildrenOfType<ArgonJudgementCounter>().Count(),
() => Is.EqualTo(counterDisplay.CounterFlow.ChildrenOfType<ArgonJudgementCounter>().Select(c => c.Result.DisplayName).Distinct().Count()));
@@ -176,11 +176,11 @@ namespace osu.Game.Tests.Visual.Gameplay
{
AddStep("create counter", () => Child = counterDisplay = new TestArgonJudgementCounterDisplay());
AddStep("Show basic judgements", () => counterDisplay.Mode.Value = ArgonJudgementCounterDisplay.DisplayMode.Simple);
AddStep("Show basic judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.Simple);
AddWaitStep("wait some", 2);
AddAssert("Check only basic", () => counterDisplay.CounterFlow.ChildrenOfType<ArgonJudgementCounter>().Last().Alpha == 0);
AddStep("Show normal judgements", () => counterDisplay.Mode.Value = ArgonJudgementCounterDisplay.DisplayMode.Normal);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = ArgonJudgementCounterDisplay.DisplayMode.All);
AddStep("Show normal judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.Normal);
AddStep("Show all judgements", () => counterDisplay.Mode.Value = JudgementCounterDisplay.DisplayMode.All);
AddWaitStep("wait some", 2);
AddAssert("Check all visible", () => counterDisplay.CounterFlow.ChildrenOfType<ArgonJudgementCounter>().Last().Alpha == 1);
AddToggleStep("toggle wireframe display", t => counterDisplay.WireframeOpacity.Value = t ? 0.3f : 0);
@@ -73,6 +73,15 @@ namespace osu.Game.Tests.Visual.Gameplay
iteration++;
}
[Test]
public void TestDisplayModes()
{
AddStep("create counter", () => Child = counterDisplay = new TestJudgementCounterDisplay());
foreach (JudgementCounterDisplay.DisplayMode mode in Enum.GetValues<JudgementCounterDisplay.DisplayMode>())
AddStep($"Change mode to {mode}", () => counterDisplay.Mode.Value = mode);
}
[Test]
public void TestAddJudgementsToCounters()
{
@@ -12,38 +12,43 @@ namespace osu.Game.Localisation.HUD
/// <summary>
/// "Display mode"
/// </summary>
public static LocalisableString JudgementDisplayMode => new TranslatableString(getKey(@"judgement_display_mode"), "Display mode");
public static LocalisableString JudgementDisplayMode => new TranslatableString(getKey(@"judgement_display_mode"), @"Display mode");
/// <summary>
/// "Counter direction"
/// </summary>
public static LocalisableString FlowDirection => new TranslatableString(getKey(@"flow_direction"), "Counter direction");
public static LocalisableString FlowDirection => new TranslatableString(getKey(@"flow_direction"), @"Counter direction");
/// <summary>
/// "Show judgement names"
/// </summary>
public static LocalisableString ShowJudgementNames => new TranslatableString(getKey(@"show_judgement_names"), "Show judgement names");
public static LocalisableString ShowJudgementNames => new TranslatableString(getKey(@"show_judgement_names"), @"Show judgement names");
/// <summary>
/// "Show max judgement"
/// </summary>
public static LocalisableString ShowMaxJudgement => new TranslatableString(getKey(@"show_max_judgement"), "Show max judgement");
public static LocalisableString ShowMaxJudgement => new TranslatableString(getKey(@"show_max_judgement"), @"Show max judgement");
/// <summary>
/// "Simple"
/// </summary>
public static LocalisableString JudgementDisplayModeSimple => new TranslatableString(getKey(@"judgement_display_mode_simple"), "Simple");
public static LocalisableString JudgementDisplayModeSimple => new TranslatableString(getKey(@"judgement_display_mode_simple"), @"Simple");
/// <summary>
/// "Misses only"
/// </summary>
public static LocalisableString JudgementDisplayModeMissesOnly => new TranslatableString(getKey(@"judgement_display_mode_misses_only"), @"Misses only");
/// <summary>
/// "Normal"
/// </summary>
public static LocalisableString JudgementDisplayModeNormal => new TranslatableString(getKey(@"judgement_display_mode_normal"), "Normal");
public static LocalisableString JudgementDisplayModeNormal => new TranslatableString(getKey(@"judgement_display_mode_normal"), @"Normal");
/// <summary>
/// "All"
/// </summary>
public static LocalisableString JudgementDisplayModeAll => new TranslatableString(getKey(@"judgement_display_mode_all"), "All");
public static LocalisableString JudgementDisplayModeAll => new TranslatableString(getKey(@"judgement_display_mode_all"), @"All");
private static string getKey(string key) => $"{prefix}:{key}";
private static string getKey(string key) => $@"{prefix}:{key}";
}
}
@@ -91,13 +91,13 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter
var hitResult = counter.Result.Types.First();
if (hitResult.IsBasic())
return true;
switch (Mode.Value)
{
case DisplayMode.MissesOnly:
return hitResult.IsMiss();
case DisplayMode.Simple:
return false;
return hitResult.IsBasic();
case DisplayMode.Normal:
return !hitResult.IsBonus();
@@ -106,7 +106,7 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter
return true;
default:
throw new ArgumentOutOfRangeException();
throw new ArgumentOutOfRangeException(nameof(Mode), Mode.Value, null);
}
}
}
@@ -142,7 +142,10 @@ namespace osu.Game.Screens.Play.HUD.JudgementCounter
Normal,
[LocalisableDescription(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.JudgementDisplayModeAll))]
All
All,
[LocalisableDescription(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.JudgementDisplayModeMissesOnly))]
MissesOnly,
}
}
}
@@ -8,7 +8,6 @@ using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Localisation;
using osu.Game.Configuration;
using osu.Game.Localisation.HUD;
using osu.Game.Localisation.SkinComponents;
@@ -39,7 +38,7 @@ namespace osu.Game.Skinning.Components
public BindableBool ShowMaxJudgement { get; } = new BindableBool(true);
[SettingSource(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.JudgementDisplayMode))]
public Bindable<DisplayMode> Mode { get; } = new Bindable<DisplayMode>();
public Bindable<JudgementCounterDisplay.DisplayMode> Mode { get; } = new Bindable<JudgementCounterDisplay.DisplayMode>();
[SettingSource(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.FlowDirection))]
public Bindable<Direction> FlowDirection { get; } = new Bindable<Direction>();
@@ -119,18 +118,19 @@ namespace osu.Game.Skinning.Components
return false;
var hitResult = counter.Result.Types.First();
if (hitResult.IsBasic())
return true;
switch (Mode.Value)
{
case DisplayMode.Simple:
return false;
case JudgementCounterDisplay.DisplayMode.MissesOnly:
return hitResult.IsMiss();
case DisplayMode.Normal:
case JudgementCounterDisplay.DisplayMode.Simple:
return hitResult.IsBasic();
case JudgementCounterDisplay.DisplayMode.Normal:
return !hitResult.IsBonus();
case DisplayMode.All:
case JudgementCounterDisplay.DisplayMode.All:
return true;
default:
@@ -153,18 +153,6 @@ namespace osu.Game.Skinning.Components
}
}
public enum DisplayMode
{
[LocalisableDescription(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.JudgementDisplayModeSimple))]
Simple,
[LocalisableDescription(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.JudgementDisplayModeNormal))]
Normal,
[LocalisableDescription(typeof(JudgementCounterDisplayStrings), nameof(JudgementCounterDisplayStrings.JudgementDisplayModeAll))]
All
}
public bool UsesFixedAnchor { get; set; }
}
}