1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 17:27:24 +08:00

Add example scenarios and configurable score multiplier

This commit is contained in:
Bartłomiej Dach 2023-09-13 14:19:49 +02:00
parent 0c22ff2a80
commit ebdc501e5b
No known key found for this signature in database
2 changed files with 53 additions and 14 deletions

View File

@ -3,6 +3,7 @@
using System; using System;
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Bindables;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Osu.Beatmaps; using osu.Game.Rulesets.Osu.Beatmaps;
@ -17,6 +18,12 @@ namespace osu.Game.Rulesets.Osu.Tests
[TestFixture] [TestFixture]
public partial class TestSceneScoring : ScoringTestScene public partial class TestSceneScoring : ScoringTestScene
{ {
private Bindable<double> scoreMultiplier { get; } = new BindableDouble
{
Default = 4,
Value = 4
};
protected override IBeatmap CreateBeatmap(int maxCombo) protected override IBeatmap CreateBeatmap(int maxCombo)
{ {
var beatmap = new OsuBeatmap(); var beatmap = new OsuBeatmap();
@ -25,10 +32,40 @@ namespace osu.Game.Rulesets.Osu.Tests
return beatmap; return beatmap;
} }
protected override IScoringAlgorithm CreateScoreV1() => new ScoreV1(); protected override IScoringAlgorithm CreateScoreV1() => new ScoreV1 { ScoreMultiplier = { BindTarget = scoreMultiplier } };
protected override IScoringAlgorithm CreateScoreV2(int maxCombo) => new ScoreV2(maxCombo); protected override IScoringAlgorithm CreateScoreV2(int maxCombo) => new ScoreV2(maxCombo);
protected override ProcessorBasedScoringAlgorithm CreateScoreAlgorithm(IBeatmap beatmap, ScoringMode mode) => new OsuProcessorBasedScoringAlgorithm(beatmap, mode); protected override ProcessorBasedScoringAlgorithm CreateScoreAlgorithm(IBeatmap beatmap, ScoringMode mode) => new OsuProcessorBasedScoringAlgorithm(beatmap, mode);
[Test]
public void TestBasicScenarios()
{
AddStep("set up score multiplier", () =>
{
scoreMultiplier.BindValueChanged(_ => Rerun());
});
AddStep("set max combo to 100", () => MaxCombo.Value = 100);
AddStep("set perfect score", () =>
{
NonPerfectLocations.Clear();
MissLocations.Clear();
});
AddStep("set score with misses", () =>
{
NonPerfectLocations.Clear();
MissLocations.Clear();
MissLocations.AddRange(new[] { 24d, 49 });
});
AddStep("set score with misses and OKs", () =>
{
NonPerfectLocations.Clear();
MissLocations.Clear();
NonPerfectLocations.AddRange(new[] { 9d, 19, 29, 39, 59, 69, 79, 89, 99 });
MissLocations.AddRange(new[] { 24d, 49 });
});
AddSliderStep("adjust score multiplier", 0, 10, (int)scoreMultiplier.Default, multiplier => scoreMultiplier.Value = multiplier);
}
private const int base_great = 300; private const int base_great = 300;
private const int base_ok = 100; private const int base_ok = 100;
@ -36,9 +73,7 @@ namespace osu.Game.Rulesets.Osu.Tests
{ {
private int currentCombo; private int currentCombo;
// this corresponds to stable's `ScoreMultiplier`. public BindableDouble ScoreMultiplier { get; } = new BindableDouble();
// value is chosen arbitrarily, towards the upper range.
private const float score_multiplier = 4;
public void ApplyHit() => applyHitV1(base_great); public void ApplyHit() => applyHitV1(base_great);
public void ApplyNonPerfect() => applyHitV1(base_ok); public void ApplyNonPerfect() => applyHitV1(base_ok);
@ -56,7 +91,7 @@ namespace osu.Game.Rulesets.Osu.Tests
// combo multiplier // combo multiplier
// ReSharper disable once PossibleLossOfFraction // ReSharper disable once PossibleLossOfFraction
TotalScore += (int)(Math.Max(0, currentCombo - 1) * (baseScore / 25 * score_multiplier)); TotalScore += (int)(Math.Max(0, currentCombo - 1) * (baseScore / 25 * ScoreMultiplier.Value));
currentCombo++; currentCombo++;
} }

View File

@ -3,7 +3,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
@ -13,6 +12,7 @@ using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Events; using osu.Framework.Input.Events;
using osu.Framework.Testing;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Containers; using osu.Game.Graphics.Containers;
@ -36,6 +36,10 @@ namespace osu.Game.Tests.Visual.Gameplay
protected abstract IScoringAlgorithm CreateScoreV2(int maxCombo); protected abstract IScoringAlgorithm CreateScoreV2(int maxCombo);
protected abstract ProcessorBasedScoringAlgorithm CreateScoreAlgorithm(IBeatmap beatmap, ScoringMode mode); protected abstract ProcessorBasedScoringAlgorithm CreateScoreAlgorithm(IBeatmap beatmap, ScoringMode mode);
protected Bindable<int> MaxCombo => sliderMaxCombo.Current;
protected BindableList<double> NonPerfectLocations => graphs.NonPerfectLocations;
protected BindableList<double> MissLocations => graphs.MissLocations;
private GraphContainer graphs = null!; private GraphContainer graphs = null!;
private SettingsSlider<int> sliderMaxCombo = null!; private SettingsSlider<int> sliderMaxCombo = null!;
private SettingsCheckbox scaleToMax = null!; private SettingsCheckbox scaleToMax = null!;
@ -50,8 +54,8 @@ namespace osu.Game.Tests.Visual.Gameplay
[Resolved] [Resolved]
private OsuColour colours { get; set; } = null!; private OsuColour colours { get; set; } = null!;
[Test] [SetUpSteps]
public void TestBasic() public void SetUpSteps()
{ {
AddStep("setup tests", () => AddStep("setup tests", () =>
{ {
@ -130,24 +134,24 @@ namespace osu.Game.Tests.Visual.Gameplay
} }
}; };
sliderMaxCombo.Current.BindValueChanged(_ => rerun()); sliderMaxCombo.Current.BindValueChanged(_ => Rerun());
scaleToMax.Current.BindValueChanged(_ => rerun()); scaleToMax.Current.BindValueChanged(_ => Rerun());
standardisedVisible.BindValueChanged(_ => rescalePlots()); standardisedVisible.BindValueChanged(_ => rescalePlots());
classicVisible.BindValueChanged(_ => rescalePlots()); classicVisible.BindValueChanged(_ => rescalePlots());
scoreV1Visible.BindValueChanged(_ => rescalePlots()); scoreV1Visible.BindValueChanged(_ => rescalePlots());
scoreV2Visible.BindValueChanged(_ => rescalePlots()); scoreV2Visible.BindValueChanged(_ => rescalePlots());
graphs.MissLocations.BindCollectionChanged((_, __) => rerun()); graphs.MissLocations.BindCollectionChanged((_, __) => Rerun());
graphs.NonPerfectLocations.BindCollectionChanged((_, __) => rerun()); graphs.NonPerfectLocations.BindCollectionChanged((_, __) => Rerun());
graphs.MaxCombo.BindTo(sliderMaxCombo.Current); graphs.MaxCombo.BindTo(sliderMaxCombo.Current);
rerun(); Rerun();
}); });
} }
private void rerun() protected void Rerun()
{ {
graphs.Clear(); graphs.Clear();
legend.Clear(); legend.Clear();