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)
{