mirror of
https://github.com/ppy/osu.git
synced 2024-12-05 09:42:54 +08:00
Refactor skin migration to allow mutating multiple layouts at once
This commit is contained in:
parent
8dca69e3f9
commit
f1b5686904
@ -148,6 +148,28 @@ namespace osu.Game.Skinning
|
|||||||
Logger.Error(ex, "Failed to load skin configuration.");
|
Logger.Error(ex, "Failed to load skin configuration.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (layoutInfos.Values.Any())
|
||||||
|
{
|
||||||
|
int version = layoutInfos.Values.Min(l => l.Version);
|
||||||
|
|
||||||
|
for (int i = version + 1; i <= SkinLayoutInfo.LATEST_VERSION; i++)
|
||||||
|
applyMigration(i);
|
||||||
|
|
||||||
|
foreach (var layout in layoutInfos.Values)
|
||||||
|
{
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual IResourceStore<TextureUpload> CreateTextureLoaderStore(IStorageResourceProvider resources, IResourceStore<byte[]> storage)
|
protected virtual IResourceStore<TextureUpload> CreateTextureLoaderStore(IStorageResourceProvider resources, IResourceStore<byte[]> storage)
|
||||||
@ -244,20 +266,6 @@ namespace osu.Game.Skinning
|
|||||||
Logger.Log($"Ferrying {deserializedContent.Count()} components in {target} to global section of new {nameof(SkinLayoutInfo)} format");
|
Logger.Log($"Ferrying {deserializedContent.Count()} components in {target} to global section of new {nameof(SkinLayoutInfo)} format");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = layout.Version + 1; i <= SkinLayoutInfo.LATEST_VERSION; i++)
|
|
||||||
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;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,7 +283,7 @@ namespace osu.Game.Skinning
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyMigration(SkinLayoutInfo layout, GlobalSkinnableContainers target, int version)
|
private void applyMigration(int version)
|
||||||
{
|
{
|
||||||
switch (version)
|
switch (version)
|
||||||
{
|
{
|
||||||
@ -283,8 +291,10 @@ namespace osu.Game.Skinning
|
|||||||
{
|
{
|
||||||
// Combo counters were moved out of the global HUD components into per-ruleset.
|
// Combo counters were moved out of the global HUD components into per-ruleset.
|
||||||
// This is to allow some rulesets to customise further (ie. mania and catch moving the combo to within their play area).
|
// This is to allow some rulesets to customise further (ie. mania and catch moving the combo to within their play area).
|
||||||
if (target != GlobalSkinnableContainers.MainHUDComponents ||
|
if (!layoutInfos.TryGetValue(GlobalSkinnableContainers.MainHUDComponents, out var hudLayout))
|
||||||
!layout.TryGetDrawableInfo(null, out var globalHUDComponents) ||
|
break;
|
||||||
|
|
||||||
|
if (!hudLayout.TryGetDrawableInfo(null, out var globalHUDComponents) ||
|
||||||
resources == null)
|
resources == null)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -293,13 +303,13 @@ namespace osu.Game.Skinning
|
|||||||
c.Type.Name == nameof(DefaultComboCounter) ||
|
c.Type.Name == nameof(DefaultComboCounter) ||
|
||||||
c.Type.Name == nameof(ArgonComboCounter)).ToArray();
|
c.Type.Name == nameof(ArgonComboCounter)).ToArray();
|
||||||
|
|
||||||
layout.Update(null, globalHUDComponents.Except(comboCounters).ToArray());
|
hudLayout.Update(null, globalHUDComponents.Except(comboCounters).ToArray());
|
||||||
|
|
||||||
resources.RealmAccess.Run(r =>
|
resources.RealmAccess.Run(r =>
|
||||||
{
|
{
|
||||||
foreach (var ruleset in r.All<RulesetInfo>())
|
foreach (var ruleset in r.All<RulesetInfo>())
|
||||||
{
|
{
|
||||||
layout.Update(ruleset, layout.TryGetDrawableInfo(ruleset, out var rulesetHUDComponents)
|
hudLayout.Update(ruleset, hudLayout.TryGetDrawableInfo(ruleset, out var rulesetHUDComponents)
|
||||||
? rulesetHUDComponents.Concat(comboCounters).ToArray()
|
? rulesetHUDComponents.Concat(comboCounters).ToArray()
|
||||||
: comboCounters);
|
: comboCounters);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user