mirror of
https://github.com/ppy/osu.git
synced 2025-01-13 16:32:54 +08:00
Merge pull request #23768 from peppy/fix-editor-drum-roll
Fix ticks being created after the end of drum rolls in osu!taiko editor
This commit is contained in:
commit
0ec6bc1bb8
@ -15,187 +15,175 @@ namespace osu.Game.Rulesets.Taiko.Tests.Judgements
|
|||||||
[Test]
|
[Test]
|
||||||
public void TestHitAllDrumRoll()
|
public void TestHitAllDrumRoll()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
new TaikoReplayFrame(1000, TaikoAction.LeftCentre),
|
new TaikoReplayFrame(1000, TaikoAction.LeftCentre),
|
||||||
new TaikoReplayFrame(1001),
|
new TaikoReplayFrame(1001),
|
||||||
|
new TaikoReplayFrame(1250, TaikoAction.LeftCentre),
|
||||||
|
new TaikoReplayFrame(1251),
|
||||||
|
new TaikoReplayFrame(1500, TaikoAction.LeftCentre),
|
||||||
|
new TaikoReplayFrame(1501),
|
||||||
|
new TaikoReplayFrame(1750, TaikoAction.LeftCentre),
|
||||||
|
new TaikoReplayFrame(1751),
|
||||||
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
||||||
new TaikoReplayFrame(2001),
|
new TaikoReplayFrame(2001),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(false)));
|
||||||
{
|
|
||||||
StartTime = hit_time,
|
|
||||||
Duration = 1000
|
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(3);
|
AssertJudgementCount(6);
|
||||||
AssertResult<DrumRollTick>(0, HitResult.SmallBonus);
|
AssertResult<DrumRollTick>(0, HitResult.SmallBonus);
|
||||||
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
||||||
|
AssertResult<DrumRollTick>(2, HitResult.SmallBonus);
|
||||||
|
AssertResult<DrumRollTick>(3, HitResult.SmallBonus);
|
||||||
|
AssertResult<DrumRollTick>(4, HitResult.SmallBonus);
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestHitSomeDrumRoll()
|
public void TestHitSomeDrumRoll()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
||||||
new TaikoReplayFrame(2001),
|
new TaikoReplayFrame(2001),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(false)));
|
||||||
{
|
|
||||||
StartTime = hit_time,
|
|
||||||
Duration = 1000
|
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(3);
|
AssertJudgementCount(6);
|
||||||
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
||||||
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
AssertResult<DrumRollTick>(1, HitResult.IgnoreMiss);
|
||||||
|
AssertResult<DrumRollTick>(2, HitResult.IgnoreMiss);
|
||||||
|
AssertResult<DrumRollTick>(3, HitResult.IgnoreMiss);
|
||||||
|
AssertResult<DrumRollTick>(4, HitResult.SmallBonus);
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestHitNoneDrumRoll()
|
public void TestHitNoneDrumRoll()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(false)));
|
||||||
{
|
|
||||||
StartTime = hit_time,
|
|
||||||
Duration = 1000
|
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(3);
|
AssertJudgementCount(6);
|
||||||
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
||||||
AssertResult<DrumRollTick>(1, HitResult.IgnoreMiss);
|
AssertResult<DrumRollTick>(1, HitResult.IgnoreMiss);
|
||||||
|
AssertResult<DrumRollTick>(2, HitResult.IgnoreMiss);
|
||||||
|
AssertResult<DrumRollTick>(3, HitResult.IgnoreMiss);
|
||||||
|
AssertResult<DrumRollTick>(4, HitResult.IgnoreMiss);
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestHitAllStrongDrumRollWithOneKey()
|
public void TestHitAllStrongDrumRollWithOneKey()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
new TaikoReplayFrame(1000, TaikoAction.LeftCentre),
|
new TaikoReplayFrame(1000, TaikoAction.LeftCentre),
|
||||||
new TaikoReplayFrame(1001),
|
new TaikoReplayFrame(1001),
|
||||||
|
new TaikoReplayFrame(1250, TaikoAction.LeftCentre),
|
||||||
|
new TaikoReplayFrame(1251),
|
||||||
|
new TaikoReplayFrame(1500, TaikoAction.LeftCentre),
|
||||||
|
new TaikoReplayFrame(1501),
|
||||||
|
new TaikoReplayFrame(1750, TaikoAction.LeftCentre),
|
||||||
|
new TaikoReplayFrame(1751),
|
||||||
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
||||||
new TaikoReplayFrame(2001),
|
new TaikoReplayFrame(2001),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(true)));
|
||||||
|
|
||||||
|
AssertJudgementCount(12);
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
StartTime = hit_time,
|
AssertResult<DrumRollTick>(i, HitResult.SmallBonus);
|
||||||
Duration = 1000,
|
AssertResult<StrongNestedHitObject>(i, HitResult.LargeBonus);
|
||||||
IsStrong = true
|
}
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(6);
|
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(0, HitResult.SmallBonus);
|
|
||||||
AssertResult<StrongNestedHitObject>(0, HitResult.LargeBonus);
|
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
|
||||||
AssertResult<StrongNestedHitObject>(1, HitResult.LargeBonus);
|
|
||||||
|
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
AssertResult<StrongNestedHitObject>(2, HitResult.IgnoreHit);
|
AssertResult<StrongNestedHitObject>(5, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestHitSomeStrongDrumRollWithOneKey()
|
public void TestHitSomeStrongDrumRollWithOneKey()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
new TaikoReplayFrame(2000, TaikoAction.LeftCentre),
|
||||||
new TaikoReplayFrame(2001),
|
new TaikoReplayFrame(2001),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(true)));
|
||||||
{
|
|
||||||
StartTime = hit_time,
|
|
||||||
Duration = 1000,
|
|
||||||
IsStrong = true
|
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(6);
|
AssertJudgementCount(12);
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
||||||
AssertResult<StrongNestedHitObject>(0, HitResult.IgnoreMiss);
|
AssertResult<StrongNestedHitObject>(0, HitResult.IgnoreMiss);
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
AssertResult<DrumRollTick>(4, HitResult.SmallBonus);
|
||||||
AssertResult<StrongNestedHitObject>(1, HitResult.LargeBonus);
|
AssertResult<StrongNestedHitObject>(4, HitResult.LargeBonus);
|
||||||
|
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
AssertResult<StrongNestedHitObject>(2, HitResult.IgnoreHit);
|
AssertResult<StrongNestedHitObject>(5, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestHitAllStrongDrumRollWithBothKeys()
|
public void TestHitAllStrongDrumRollWithBothKeys()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
new TaikoReplayFrame(1000, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
new TaikoReplayFrame(1000, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
||||||
new TaikoReplayFrame(1001),
|
new TaikoReplayFrame(1001),
|
||||||
|
new TaikoReplayFrame(1250, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
||||||
|
new TaikoReplayFrame(1251),
|
||||||
|
new TaikoReplayFrame(1500, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
||||||
|
new TaikoReplayFrame(1501),
|
||||||
|
new TaikoReplayFrame(1750, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
||||||
|
new TaikoReplayFrame(1751),
|
||||||
new TaikoReplayFrame(2000, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
new TaikoReplayFrame(2000, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
||||||
new TaikoReplayFrame(2001),
|
new TaikoReplayFrame(2001),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(true)));
|
||||||
|
|
||||||
|
AssertJudgementCount(12);
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
StartTime = hit_time,
|
AssertResult<DrumRollTick>(i, HitResult.SmallBonus);
|
||||||
Duration = 1000,
|
AssertResult<StrongNestedHitObject>(i, HitResult.LargeBonus);
|
||||||
IsStrong = true
|
}
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(6);
|
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(0, HitResult.SmallBonus);
|
|
||||||
AssertResult<StrongNestedHitObject>(0, HitResult.LargeBonus);
|
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
|
||||||
AssertResult<StrongNestedHitObject>(1, HitResult.LargeBonus);
|
|
||||||
|
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
AssertResult<StrongNestedHitObject>(2, HitResult.IgnoreHit);
|
AssertResult<StrongNestedHitObject>(5, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestHitSomeStrongDrumRollWithBothKeys()
|
public void TestHitSomeStrongDrumRollWithBothKeys()
|
||||||
{
|
{
|
||||||
const double hit_time = 1000;
|
|
||||||
|
|
||||||
PerformTest(new List<ReplayFrame>
|
PerformTest(new List<ReplayFrame>
|
||||||
{
|
{
|
||||||
new TaikoReplayFrame(0),
|
new TaikoReplayFrame(0),
|
||||||
new TaikoReplayFrame(2000, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
new TaikoReplayFrame(2000, TaikoAction.LeftCentre, TaikoAction.RightCentre),
|
||||||
new TaikoReplayFrame(2001),
|
new TaikoReplayFrame(2001),
|
||||||
}, CreateBeatmap(new DrumRoll
|
}, CreateBeatmap(createDrumRoll(true)));
|
||||||
{
|
|
||||||
StartTime = hit_time,
|
|
||||||
Duration = 1000,
|
|
||||||
IsStrong = true
|
|
||||||
}));
|
|
||||||
|
|
||||||
AssertJudgementCount(6);
|
AssertJudgementCount(12);
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
AssertResult<DrumRollTick>(0, HitResult.IgnoreMiss);
|
||||||
AssertResult<StrongNestedHitObject>(0, HitResult.IgnoreMiss);
|
AssertResult<StrongNestedHitObject>(0, HitResult.IgnoreMiss);
|
||||||
|
|
||||||
AssertResult<DrumRollTick>(1, HitResult.SmallBonus);
|
AssertResult<DrumRollTick>(4, HitResult.SmallBonus);
|
||||||
AssertResult<StrongNestedHitObject>(1, HitResult.LargeBonus);
|
AssertResult<StrongNestedHitObject>(4, HitResult.LargeBonus);
|
||||||
|
|
||||||
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
AssertResult<DrumRoll>(0, HitResult.IgnoreHit);
|
||||||
AssertResult<StrongNestedHitObject>(2, HitResult.IgnoreHit);
|
AssertResult<StrongNestedHitObject>(5, HitResult.IgnoreHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DrumRoll createDrumRoll(bool strong) => new DrumRoll
|
||||||
|
{
|
||||||
|
StartTime = 1000,
|
||||||
|
Duration = 1000,
|
||||||
|
IsStrong = strong
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,14 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: stable makes the last tick of a drumroll non-required when the next object is too close.
|
||||||
|
// This probably needs to be reimplemented:
|
||||||
|
//
|
||||||
|
// List<HitObject> hitobjects = hitObjectManager.hitObjects;
|
||||||
|
// int ind = hitobjects.IndexOf(this);
|
||||||
|
// if (i < hitobjects.Count - 1 && hitobjects[i + 1].HittableStartTime - (EndTime + (int)TickSpacing) <= (int)TickSpacing)
|
||||||
|
// lastTickHittable = false;
|
||||||
|
|
||||||
return converted;
|
return converted;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,7 +141,6 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
StartTime = obj.StartTime,
|
StartTime = obj.StartTime,
|
||||||
Samples = obj.Samples,
|
Samples = obj.Samples,
|
||||||
Duration = taikoDuration,
|
Duration = taikoDuration,
|
||||||
TickRate = beatmap.Difficulty.SliderTickRate == 3 ? 3 : 4,
|
|
||||||
SliderVelocity = obj is IHasSliderVelocity velocityData ? velocityData.SliderVelocity : 1
|
SliderVelocity = obj is IHasSliderVelocity velocityData ? velocityData.SliderVelocity : 1
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
@ -69,6 +67,8 @@ namespace osu.Game.Rulesets.Taiko.Objects
|
|||||||
double scoringDistance = base_distance * difficulty.SliderMultiplier * SliderVelocity;
|
double scoringDistance = base_distance * difficulty.SliderMultiplier * SliderVelocity;
|
||||||
Velocity = scoringDistance / timingPoint.BeatLength;
|
Velocity = scoringDistance / timingPoint.BeatLength;
|
||||||
|
|
||||||
|
TickRate = difficulty.SliderTickRate == 3 ? 3 : 4;
|
||||||
|
|
||||||
tickSpacing = timingPoint.BeatLength / TickRate;
|
tickSpacing = timingPoint.BeatLength / TickRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user