Skip to content

Commit

Permalink
Merge pull request #29577 from peppy/skin-deserialise-fix
Browse files Browse the repository at this point in the history
Fix some older lazer skins failing to load properly
  • Loading branch information
peppy authored Aug 23, 2024
2 parents 1e39af8 + 885d832 commit a30fe9d
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
Binary file not shown.
13 changes: 13 additions & 0 deletions osu.Game.Tests/Skins/SkinDeserialisationTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using osu.Game.Audio;
using osu.Game.IO;
using osu.Game.IO.Archives;
using osu.Game.Screens.Menu;
using osu.Game.Screens.Play.HUD;
using osu.Game.Screens.Play.HUD.HitErrorMeters;
using osu.Game.Skinning;
Expand Down Expand Up @@ -125,6 +126,18 @@ public void TestDeserialiseModifiedArgon()
}
}

[Test]
public void TestDeserialiseInvalidDrawables()
{
using (var stream = TestResources.OpenResource("Archives/argon-invalid-drawable.osk"))
using (var storage = new ZipArchiveReader(stream))
{
var skin = new TestSkin(new SkinInfo(), null, storage);

Assert.That(skin.LayoutInfos.Any(kvp => kvp.Value.AllDrawables.Any(d => d.Type == typeof(StarFountain))), Is.False);
}
}

[Test]
public void TestDeserialiseModifiedClassic()
{
Expand Down
24 changes: 24 additions & 0 deletions osu.Game/Skinning/Skin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -248,9 +248,33 @@ public void UpdateDrawableTarget(SkinnableContainer targetContainer)
applyMigration(layout, target, i);

layout.Version = SkinLayoutInfo.LATEST_VERSION;

foreach (var kvp in layout.DrawableInfo.ToArray())
{
foreach (var di in kvp.Value)
{
if (!isValidDrawable(di))
layout.DrawableInfo[kvp.Key] = kvp.Value.Where(i => i.Type != di.Type).ToArray();
}
}

return layout;
}

private bool isValidDrawable(SerialisedDrawableInfo di)
{
if (!typeof(ISerialisableDrawable).IsAssignableFrom(di.Type))
return false;

foreach (var child in di.Children)
{
if (!isValidDrawable(child))
return false;
}

return true;
}

private void applyMigration(SkinLayoutInfo layout, GlobalSkinnableContainers target, int version)
{
switch (version)
Expand Down

0 comments on commit a30fe9d

Please sign in to comment.