mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 08:27:49 +08:00
Add example scenarios and configurable score multiplier
This commit is contained in:
parent
0c22ff2a80
commit
ebdc501e5b
@ -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++;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user