1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-15 09:42:57 +08:00

Merge pull request #11635 from bdach/storyboard-loop-type-decoding

Fix invalid numeric values for storyboard animation type parsing incorrectly
This commit is contained in:
Dean Herbert 2021-02-01 00:50:22 +09:00 committed by GitHub
commit adc57dd94b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 1 deletions

View File

@ -129,5 +129,25 @@ namespace osu.Game.Tests.Beatmaps.Formats
Assert.AreEqual(3456, ((StoryboardSprite)background.Elements.Single()).InitialPosition.X);
}
}
[Test]
public void TestDecodeOutOfRangeLoopAnimationType()
{
var decoder = new LegacyStoryboardDecoder();
using (var resStream = TestResources.OpenResource("animation-types.osb"))
using (var stream = new LineBufferedReader(resStream))
{
var storyboard = decoder.Decode(stream);
StoryboardLayer foreground = storyboard.Layers.Single(l => l.Depth == 0);
Assert.AreEqual(AnimationLoopType.LoopForever, ((StoryboardAnimation)foreground.Elements[0]).LoopType);
Assert.AreEqual(AnimationLoopType.LoopOnce, ((StoryboardAnimation)foreground.Elements[1]).LoopType);
Assert.AreEqual(AnimationLoopType.LoopForever, ((StoryboardAnimation)foreground.Elements[2]).LoopType);
Assert.AreEqual(AnimationLoopType.LoopOnce, ((StoryboardAnimation)foreground.Elements[3]).LoopType);
Assert.AreEqual(AnimationLoopType.LoopForever, ((StoryboardAnimation)foreground.Elements[4]).LoopType);
Assert.AreEqual(AnimationLoopType.LoopForever, ((StoryboardAnimation)foreground.Elements[5]).LoopType);
}
}
}
}

View File

@ -0,0 +1,9 @@
osu file format v14
[Events]
Animation,Foreground,Centre,"forever-string.png",330,240,10,108,LoopForever
Animation,Foreground,Centre,"once-string.png",330,240,10,108,LoopOnce
Animation,Foreground,Centre,"forever-number.png",330,240,10,108,0
Animation,Foreground,Centre,"once-number.png",330,240,10,108,1
Animation,Foreground,Centre,"undefined-number.png",330,240,10,108,16
Animation,Foreground,Centre,"omitted.png",330,240,10,108

View File

@ -139,7 +139,7 @@ namespace osu.Game.Beatmaps.Formats
// this is random as hell but taken straight from osu-stable.
frameDelay = Math.Round(0.015 * frameDelay) * 1.186 * (1000 / 60f);
var loopType = split.Length > 8 ? (AnimationLoopType)Enum.Parse(typeof(AnimationLoopType), split[8]) : AnimationLoopType.LoopForever;
var loopType = split.Length > 8 ? parseAnimationLoopType(split[8]) : AnimationLoopType.LoopForever;
storyboardSprite = new StoryboardAnimation(path, origin, new Vector2(x, y), frameCount, frameDelay, loopType);
storyboard.GetLayer(layer).Add(storyboardSprite);
break;
@ -341,6 +341,12 @@ namespace osu.Game.Beatmaps.Formats
}
}
private AnimationLoopType parseAnimationLoopType(string value)
{
var parsed = (AnimationLoopType)Enum.Parse(typeof(AnimationLoopType), value);
return Enum.IsDefined(typeof(AnimationLoopType), parsed) ? parsed : AnimationLoopType.LoopForever;
}
private void handleVariables(string line)
{
var pair = SplitKeyVal(line, '=');