mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 18:27:26 +08:00
Merge pull request #2167 from smoogipoo/fix-taiko-conversion
Fix incorrect slider-to-drumroll conversions in taiko
This commit is contained in:
commit
a6460832f4
@ -101,16 +101,16 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
// The duration of the taiko hit object
|
// The duration of the taiko hit object
|
||||||
double taikoDuration = distance / taikoVelocity;
|
double taikoDuration = distance / taikoVelocity;
|
||||||
|
|
||||||
// For some reason, old osu! always uses speedAdjustment to determine the taiko velocity, but
|
|
||||||
// only uses it to determine osu! velocity if beatmap version < 8. Let's account for that here.
|
|
||||||
if (beatmap.BeatmapInfo.BeatmapVersion >= 8)
|
|
||||||
speedAdjustedBeatLength *= speedAdjustment;
|
|
||||||
|
|
||||||
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
||||||
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * legacy_velocity_multiplier / speedAdjustedBeatLength;
|
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * legacy_velocity_multiplier / speedAdjustedBeatLength;
|
||||||
// The duration of the osu! hit object
|
// The duration of the osu! hit object
|
||||||
double osuDuration = distance / osuVelocity;
|
double osuDuration = distance / osuVelocity;
|
||||||
|
|
||||||
|
// osu-stable always uses the speed-adjusted beatlength to determine the velocities, but
|
||||||
|
// only uses it for tick rate if beatmap version < 8
|
||||||
|
if (beatmap.BeatmapInfo.BeatmapVersion >= 8)
|
||||||
|
speedAdjustedBeatLength *= speedAdjustment;
|
||||||
|
|
||||||
// If the drum roll is to be split into hit circles, assume the ticks are 1/8 spaced within the duration of one beat
|
// If the drum roll is to be split into hit circles, assume the ticks are 1/8 spaced within the duration of one beat
|
||||||
double tickSpacing = Math.Min(speedAdjustedBeatLength / beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate, taikoDuration / spans);
|
double tickSpacing = Math.Min(speedAdjustedBeatLength / beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate, taikoDuration / spans);
|
||||||
|
|
||||||
|
@ -0,0 +1,87 @@
|
|||||||
|
{
|
||||||
|
"Mappings": [{
|
||||||
|
"StartTime": 6590,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 6590,
|
||||||
|
"EndTime": 8320,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 8436,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 8436,
|
||||||
|
"EndTime": 10166,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 10282,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 10282,
|
||||||
|
"EndTime": 12012,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 12128,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 12128,
|
||||||
|
"EndTime": 13858,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 41666,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 41666,
|
||||||
|
"EndTime": 42589,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 62666,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 62666,
|
||||||
|
"EndTime": 63127,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 208743,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 208743,
|
||||||
|
"EndTime": 209204,
|
||||||
|
"IsRim": false,
|
||||||
|
"IsCentre": false,
|
||||||
|
"IsDrumRoll": true,
|
||||||
|
"IsSwell": false,
|
||||||
|
"IsStrong": false
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
HPDrainRate:6
|
||||||
|
CircleSize:4.2
|
||||||
|
OverallDifficulty:9
|
||||||
|
ApproachRate:9.8
|
||||||
|
SliderMultiplier:1.87
|
||||||
|
SliderTickRate:1
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
6590,461.538461538462,4,2,2,15,1,0
|
||||||
|
6590,-200,4,2,2,15,0,0
|
||||||
|
49051,230.769230769231,4,2,1,15,1,0
|
||||||
|
62666,-200,4,2,1,60,0,0
|
||||||
|
197666,-100,4,2,1,85,0,1
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
88,104,6590,6,0,B|176:156|256:108|256:108|336:60|423:112,1,350.625,6|0,0:0|0:0,0:0:0:0:
|
||||||
|
396,213,8436,2,0,P|277:247|376:172,1,350.625,6|0,0:0|0:0,0:0:0:0:
|
||||||
|
472,220,10282,2,0,P|456:288|220:300,1,350.625,6|0,0:0|0:0,0:0:0:0:
|
||||||
|
277,200,12128,2,0,P|398:225|276:244,1,350.625,6|0,0:0|0:0,0:0:0:0:
|
||||||
|
268,229,41666,2,0,L|473:210,1,187,2|2,0:0|0:0,0:0:0:0:
|
||||||
|
133,342,62666,2,0,B|132:316|132:316|128:316|128:316|130:295|130:295|126:296|126:296|129:275|129:275|125:275|125:275|127:254|127:254|123:255|123:255|125:234|125:234|121:234|121:234|123:213|123:213|119:214|119:214|121:193|121:193|118:193|118:193|118:172,1,187,8|8,0:0|0:0,0:0:0:0:
|
||||||
|
481,338,208743,6,0,P|492:262|383:195,2,187,2|8|2,0:0|0:0|0:0,0:0:0:0:
|
@ -22,6 +22,7 @@ namespace osu.Game.Rulesets.Taiko.Tests
|
|||||||
|
|
||||||
[NonParallelizable]
|
[NonParallelizable]
|
||||||
[TestCase("basic", false), Ignore("See: https://github.com/ppy/osu/issues/2152")]
|
[TestCase("basic", false), Ignore("See: https://github.com/ppy/osu/issues/2152")]
|
||||||
|
[TestCase("slider-generating-drumroll", false)]
|
||||||
public void Test(string name, bool isForCurrentRuleset)
|
public void Test(string name, bool isForCurrentRuleset)
|
||||||
{
|
{
|
||||||
this.isForCurrentRuleset = isForCurrentRuleset;
|
this.isForCurrentRuleset = isForCurrentRuleset;
|
||||||
|
@ -149,6 +149,8 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Resources\Testing\Beatmaps\basic-expected-conversion.json" />
|
<EmbeddedResource Include="Resources\Testing\Beatmaps\basic-expected-conversion.json" />
|
||||||
<EmbeddedResource Include="Resources\Testing\Beatmaps\basic.osu" />
|
<EmbeddedResource Include="Resources\Testing\Beatmaps\basic.osu" />
|
||||||
|
<EmbeddedResource Include="Resources\Testing\Beatmaps\slider-generating-drumroll-expected-conversion.json" />
|
||||||
|
<EmbeddedResource Include="Resources\Testing\Beatmaps\slider-generating-drumroll.osu" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" />
|
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" />
|
||||||
|
@ -102,7 +102,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual(4, difficulty.CircleSize);
|
Assert.AreEqual(4, difficulty.CircleSize);
|
||||||
Assert.AreEqual(8, difficulty.OverallDifficulty);
|
Assert.AreEqual(8, difficulty.OverallDifficulty);
|
||||||
Assert.AreEqual(9, difficulty.ApproachRate);
|
Assert.AreEqual(9, difficulty.ApproachRate);
|
||||||
Assert.AreEqual(1.8f, difficulty.SliderMultiplier);
|
Assert.AreEqual(1.8, difficulty.SliderMultiplier);
|
||||||
Assert.AreEqual(2, difficulty.SliderTickRate);
|
Assert.AreEqual(2, difficulty.SliderTickRate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual(4, difficulty.CircleSize);
|
Assert.AreEqual(4, difficulty.CircleSize);
|
||||||
Assert.AreEqual(8, difficulty.OverallDifficulty);
|
Assert.AreEqual(8, difficulty.OverallDifficulty);
|
||||||
Assert.AreEqual(9, difficulty.ApproachRate);
|
Assert.AreEqual(9, difficulty.ApproachRate);
|
||||||
Assert.AreEqual(1.8f, difficulty.SliderMultiplier);
|
Assert.AreEqual(1.8, difficulty.SliderMultiplier);
|
||||||
Assert.AreEqual(2, difficulty.SliderTickRate);
|
Assert.AreEqual(2, difficulty.SliderTickRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ namespace osu.Game.Beatmaps
|
|||||||
set => approachRate = value;
|
set => approachRate = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float SliderMultiplier { get; set; } = 1;
|
public double SliderMultiplier { get; set; } = 1;
|
||||||
public float SliderTickRate { get; set; } = 1;
|
public double SliderTickRate { get; set; } = 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Maps a difficulty value [0, 10] to a two-piece linear range of values.
|
/// Maps a difficulty value [0, 10] to a two-piece linear range of values.
|
||||||
|
@ -249,10 +249,10 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
difficulty.ApproachRate = float.Parse(pair.Value, NumberFormatInfo.InvariantInfo);
|
difficulty.ApproachRate = float.Parse(pair.Value, NumberFormatInfo.InvariantInfo);
|
||||||
break;
|
break;
|
||||||
case @"SliderMultiplier":
|
case @"SliderMultiplier":
|
||||||
difficulty.SliderMultiplier = float.Parse(pair.Value, NumberFormatInfo.InvariantInfo);
|
difficulty.SliderMultiplier = double.Parse(pair.Value, NumberFormatInfo.InvariantInfo);
|
||||||
break;
|
break;
|
||||||
case @"SliderTickRate":
|
case @"SliderTickRate":
|
||||||
difficulty.SliderTickRate = float.Parse(pair.Value, NumberFormatInfo.InvariantInfo);
|
difficulty.SliderTickRate = double.Parse(pair.Value, NumberFormatInfo.InvariantInfo);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,10 +109,13 @@ namespace osu.Game.Tests.Beatmaps
|
|||||||
|
|
||||||
private Beatmap getBeatmap(string name)
|
private Beatmap getBeatmap(string name)
|
||||||
{
|
{
|
||||||
var decoder = new LegacyBeatmapDecoder { ApplyOffsets = false };
|
|
||||||
using (var resStream = openResource($"{resource_namespace}.{name}.osu"))
|
using (var resStream = openResource($"{resource_namespace}.{name}.osu"))
|
||||||
using (var stream = new StreamReader(resStream))
|
using (var stream = new StreamReader(resStream))
|
||||||
|
{
|
||||||
|
var decoder = Decoder.GetDecoder(stream);
|
||||||
|
((LegacyBeatmapDecoder)decoder).ApplyOffsets = false;
|
||||||
return decoder.DecodeBeatmap(stream);
|
return decoder.DecodeBeatmap(stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Stream openResource(string name)
|
private Stream openResource(string name)
|
||||||
|
Loading…
Reference in New Issue
Block a user