diff --git a/Glamourer.GameData/Customization/CustomizeIndex.cs b/Glamourer.GameData/Customization/CustomizeIndex.cs index 8485e12..1c03dd1 100644 --- a/Glamourer.GameData/Customization/CustomizeIndex.cs +++ b/Glamourer.GameData/Customization/CustomizeIndex.cs @@ -51,6 +51,9 @@ public static class CustomizationExtensions public static readonly CustomizeIndex[] All = Enum.GetValues() .Where(v => v is not CustomizeIndex.Race and not CustomizeIndex.BodyType).ToArray(); + public static readonly CustomizeIndex[] AllBasic = All + .Where(v => v is not CustomizeIndex.Gender and not CustomizeIndex.Clan).ToArray(); + [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public static (int ByteIdx, byte Mask) ToByteAndMask(this CustomizeIndex index) => index switch diff --git a/Glamourer/Designs/DesignBase.cs b/Glamourer/Designs/DesignBase.cs index 4508caf..288be0d 100644 --- a/Glamourer/Designs/DesignBase.cs +++ b/Glamourer/Designs/DesignBase.cs @@ -378,22 +378,32 @@ public class DesignBase var set = customizations.AwaitedService.GetList(clan, gender); - foreach (var idx in Enum.GetValues().Where(set.IsAvailable)) + foreach (var idx in CustomizationExtensions.AllBasic) { - var tok = json[idx.ToString()]; - var data = (CustomizeValue)(tok?["Value"]?.ToObject() ?? 0); - PrintWarning(CustomizationService.ValidateCustomizeValue(set, design.DesignData.Customize.Face, idx, data, out data, allowUnknown)); - var apply = tok?["Apply"]?.ToObject() ?? false; - design.DesignData.Customize[idx] = data; - design.SetApplyCustomize(idx, apply); + if (set.IsAvailable(idx)) + { + var tok = json[idx.ToString()]; + var data = (CustomizeValue)(tok?["Value"]?.ToObject() ?? 0); + PrintWarning(CustomizationService.ValidateCustomizeValue(set, design.DesignData.Customize.Face, idx, data, out data, + allowUnknown)); + var apply = tok?["Apply"]?.ToObject() ?? false; + design.DesignData.Customize[idx] = data; + design.SetApplyCustomize(idx, apply); + } + else + { + design.DesignData.Customize[idx] = CustomizeValue.Zero; + design.SetApplyCustomize(idx, false); + } } } - public void MigrateBase64(ItemManager items, string base64) + public void MigrateBase64(CustomizationService customizations, ItemManager items, string base64) { DesignData = DesignBase64Migration.MigrateBase64(items, base64, out var equipFlags, out var customizeFlags, out var writeProtected, out var applyHat, out var applyVisor, out var applyWeapon); - ApplyEquip = equipFlags; + ApplyEquip = equipFlags; + var set = customizations.AwaitedService.GetList(DesignData.Customize.Clan, DesignData.Customize.Gender); ApplyCustomize = customizeFlags; SetWriteProtected(writeProtected); SetApplyHatVisible(applyHat); @@ -402,5 +412,15 @@ public class DesignBase SetApplyWetness(DesignData.IsWet()); } + public void RemoveInvalidCustomize(CustomizationService customizations) + { + var set = customizations.AwaitedService.GetList(DesignData.Customize.Clan, DesignData.Customize.Gender); + foreach (var idx in CustomizationExtensions.AllBasic.Where(i => !set.IsAvailable(i))) + { + DesignData.Customize[idx] = CustomizeValue.Zero; + SetApplyCustomize(idx, false); + } + } + #endregion } diff --git a/Glamourer/Designs/DesignConverter.cs b/Glamourer/Designs/DesignConverter.cs index 4757428..3b88500 100644 --- a/Glamourer/Designs/DesignConverter.cs +++ b/Glamourer/Designs/DesignConverter.cs @@ -79,7 +79,7 @@ public class DesignConverter case 1: case 2: ret = _designs.CreateTemporary(); - ret.MigrateBase64(_items, base64); + ret.MigrateBase64(_customize, _items, base64); break; case Version: var version = bytes.DecompressToString(out var decompressed); diff --git a/Glamourer/Designs/DesignManager.cs b/Glamourer/Designs/DesignManager.cs index 7ab1657..9274f42 100644 --- a/Glamourer/Designs/DesignManager.cs +++ b/Glamourer/Designs/DesignManager.cs @@ -273,11 +273,13 @@ public class DesignManager if (_customizations.ChangeClan(ref design.DesignData.Customize, (SubRace)value.Value) == 0) return; + design.RemoveInvalidCustomize(_customizations); break; case CustomizeIndex.Gender: if (_customizations.ChangeGender(ref design.DesignData.Customize, (Gender)(value.Value + 1)) == 0) return; + design.RemoveInvalidCustomize(_customizations); break; default: if (!_customizations.IsCustomizationValid(design.DesignData.Customize.Clan, design.DesignData.Customize.Gender, @@ -517,7 +519,7 @@ public class DesignManager Identifier = CreateNewGuid(), Name = actualName, }; - design.MigrateBase64(_items, base64); + design.MigrateBase64(_customizations, _items, base64); if (!_designs.Any(d => d.Name == design.Name && d.CreationDate == design.CreationDate)) { Add(design, $"Migrated old design to {design.Identifier}."); diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs index 9e5637a..9fef3e1 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs @@ -199,7 +199,9 @@ public class DesignPanel if (ImGui.CheckboxFlags("Apply All Customizations", ref flags, 3)) { var newFlags = flags == 3; - foreach (var index in CustomizationExtensions.All) + _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Clan, newFlags); + _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Gender, newFlags); + foreach (var index in CustomizationExtensions.AllBasic.Where(set.IsAvailable)) _manager.ChangeApplyCustomize(_selector.Selected!, index, newFlags); } diff --git a/Glamourer/Services/CustomizationService.cs b/Glamourer/Services/CustomizationService.cs index 121c76e..850e19e 100644 --- a/Glamourer/Services/CustomizationService.cs +++ b/Glamourer/Services/CustomizationService.cs @@ -277,11 +277,19 @@ public sealed class CustomizationService : AsyncServiceWrapper().Where(set.IsAvailable)) + foreach (var idx in Enum.GetValues()) { - if (ValidateCustomizeValue(set, customize.Face, idx, customize[idx], out var fixedValue, false).Length > 0) + if (set.IsAvailable(idx)) { - customize[idx] = fixedValue; + if (ValidateCustomizeValue(set, customize.Face, idx, customize[idx], out var fixedValue, false).Length > 0) + { + customize[idx] = fixedValue; + flags |= idx.ToFlag(); + } + } + else + { + customize[idx] = CustomizeValue.Zero; flags |= idx.ToFlag(); } }