diff --git a/Glamourer/Designs/DesignBase.cs b/Glamourer/Designs/DesignBase.cs index 5c4996a..a8e9986 100644 --- a/Glamourer/Designs/DesignBase.cs +++ b/Glamourer/Designs/DesignBase.cs @@ -40,13 +40,14 @@ public class DesignBase } /// Used when importing .cma or .chara files. - internal DesignBase(CustomizeService customize, in DesignData designData, EquipFlag equipFlags, CustomizeFlag customizeFlags) + internal DesignBase(CustomizeService customize, in DesignData designData, EquipFlag equipFlags, CustomizeFlag customizeFlags, BonusItemFlag bonusFlags) { - _designData = designData; - ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant; - Application.Equip = equipFlags & EquipFlagExtensions.All; - Application.Meta = 0; - CustomizeSet = SetCustomizationSet(customize); + _designData = designData; + ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant; + Application.Equip = equipFlags & EquipFlagExtensions.All; + Application.BonusItem = bonusFlags & BonusExtensions.All; + Application.Meta = 0; + CustomizeSet = SetCustomizationSet(customize); } internal DesignBase(DesignBase clone) diff --git a/Glamourer/Designs/DesignEditor.cs b/Glamourer/Designs/DesignEditor.cs index a3e86a5..a42971e 100644 --- a/Glamourer/Designs/DesignEditor.cs +++ b/Glamourer/Designs/DesignEditor.cs @@ -330,6 +330,12 @@ public class DesignEditor( _forceFullItemOff = false; + foreach (var slot in BonusExtensions.AllFlags) + { + if (other.DoApplyBonusItem(slot)) + ChangeBonusItem(design, slot, other.DesignData.BonusItem(slot)); + } + foreach (var slot in Enum.GetValues().Where(other.DoApplyCrest)) ChangeCrest(design, slot, other.DesignData.Crest(slot)); diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs index e11a032..5fb2d57 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs @@ -9,7 +9,6 @@ using Glamourer.GameData; using Glamourer.Gui.Customization; using Glamourer.Gui.Equipment; using Glamourer.Gui.Materials; -using Glamourer.Gui.Tabs.ActorTab; using Glamourer.Interop; using Glamourer.State; using ImGuiNET; diff --git a/Glamourer/Interop/CharaFile/CharaFile.cs b/Glamourer/Interop/CharaFile/CharaFile.cs index 4bf08cd..f956379 100644 --- a/Glamourer/Interop/CharaFile/CharaFile.cs +++ b/Glamourer/Interop/CharaFile/CharaFile.cs @@ -13,6 +13,7 @@ public sealed class CharaFile public DesignData Data = new(); public CustomizeFlag ApplyCustomize; public EquipFlag ApplyEquip; + public BonusItemFlag ApplyBonus; public static CharaFile ParseData(ItemManager items, string data, string? name = null) { @@ -24,6 +25,7 @@ public sealed class CharaFile ret.Name = jObj["Nickname"]?.ToObject() ?? name ?? "New Design"; ret.ApplyCustomize = ParseCustomize(jObj, ref ret.Data.Customize); ret.ApplyEquip = ParseEquipment(items, jObj, ref ret.Data); + ret.ApplyBonus = ParseBonusItems(items, jObj, ref ret.Data); return ret; } @@ -45,6 +47,13 @@ public sealed class CharaFile return ret; } + private static BonusItemFlag ParseBonusItems(ItemManager items, JObject jObj, ref DesignData data) + { + BonusItemFlag ret = 0; + ParseBonus(items, jObj, "Glasses", "GlassesId", BonusItemFlag.Glasses, ref data, ref ret); + return ret; + } + private static void ParseWeapon(ItemManager items, JObject jObj, string property, EquipSlot slot, ref DesignData data, ref EquipFlag flags) { var jTok = jObj[property]; @@ -61,6 +70,8 @@ public sealed class CharaFile data.SetItem(slot, item); data.SetStain(slot, new StainIds(dye)); + if (slot is EquipSlot.MainHand) + data.SetItem(EquipSlot.OffHand, items.GetDefaultOffhand(item)); flags |= slot.ToFlag(); flags |= slot.ToStainFlag(); } @@ -84,6 +95,26 @@ public sealed class CharaFile flags |= slot.ToStainFlag(); } + private static void ParseBonus(ItemManager items, JObject jObj, string property, string subProperty, BonusItemFlag slot, + ref DesignData data, ref BonusItemFlag flags) + { + var id = jObj[property]?[subProperty]?.ToObject(); + if (id is null) + return; + + if (id is 0) + { + data.SetBonusItem(slot, BonusItem.Empty(slot)); + flags |= slot; + } + + if (!items.DictBonusItems.TryGetValue((BonusItemId)id.Value, out var item) || item.Slot != slot) + return; + + data.SetBonusItem(slot, item); + flags |= slot; + } + private static CustomizeFlag ParseCustomize(JObject jObj, ref CustomizeArray customize) { CustomizeFlag ret = 0; diff --git a/Glamourer/Interop/ImportService.cs b/Glamourer/Interop/ImportService.cs index 7dc3313..b9dfbe1 100644 --- a/Glamourer/Interop/ImportService.cs +++ b/Glamourer/Interop/ImportService.cs @@ -65,7 +65,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d var file = CharaFile.CharaFile.ParseData(_items, text, Path.GetFileNameWithoutExtension(path)); name = file.Name; - design = new DesignBase(_customizations, file.Data, file.ApplyEquip, file.ApplyCustomize); + design = new DesignBase(_customizations, file.Data, file.ApplyEquip, file.ApplyCustomize, file.ApplyBonus); } catch (Exception ex) { @@ -95,7 +95,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d throw new Exception(); name = file.Name; - design = new DesignBase(_customizations, file.Data, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant); + design = new DesignBase(_customizations, file.Data, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant, 0); } catch (Exception ex) {