Add bonus item import from .chara files, fix small bugs when applying designs.

This commit is contained in:
Ottermandias 2024-09-21 21:17:24 +02:00
parent 1f1b04bdfe
commit be9c3eab40
5 changed files with 46 additions and 9 deletions

View file

@ -40,13 +40,14 @@ public class DesignBase
} }
/// <summary> Used when importing .cma or .chara files. </summary> /// <summary> Used when importing .cma or .chara files. </summary>
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; _designData = designData;
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant; ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
Application.Equip = equipFlags & EquipFlagExtensions.All; Application.Equip = equipFlags & EquipFlagExtensions.All;
Application.Meta = 0; Application.BonusItem = bonusFlags & BonusExtensions.All;
CustomizeSet = SetCustomizationSet(customize); Application.Meta = 0;
CustomizeSet = SetCustomizationSet(customize);
} }
internal DesignBase(DesignBase clone) internal DesignBase(DesignBase clone)

View file

@ -330,6 +330,12 @@ public class DesignEditor(
_forceFullItemOff = false; _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<CrestFlag>().Where(other.DoApplyCrest)) foreach (var slot in Enum.GetValues<CrestFlag>().Where(other.DoApplyCrest))
ChangeCrest(design, slot, other.DesignData.Crest(slot)); ChangeCrest(design, slot, other.DesignData.Crest(slot));

View file

@ -9,7 +9,6 @@ using Glamourer.GameData;
using Glamourer.Gui.Customization; using Glamourer.Gui.Customization;
using Glamourer.Gui.Equipment; using Glamourer.Gui.Equipment;
using Glamourer.Gui.Materials; using Glamourer.Gui.Materials;
using Glamourer.Gui.Tabs.ActorTab;
using Glamourer.Interop; using Glamourer.Interop;
using Glamourer.State; using Glamourer.State;
using ImGuiNET; using ImGuiNET;

View file

@ -13,6 +13,7 @@ public sealed class CharaFile
public DesignData Data = new(); public DesignData Data = new();
public CustomizeFlag ApplyCustomize; public CustomizeFlag ApplyCustomize;
public EquipFlag ApplyEquip; public EquipFlag ApplyEquip;
public BonusItemFlag ApplyBonus;
public static CharaFile ParseData(ItemManager items, string data, string? name = null) public static CharaFile ParseData(ItemManager items, string data, string? name = null)
{ {
@ -24,6 +25,7 @@ public sealed class CharaFile
ret.Name = jObj["Nickname"]?.ToObject<string>() ?? name ?? "New Design"; ret.Name = jObj["Nickname"]?.ToObject<string>() ?? name ?? "New Design";
ret.ApplyCustomize = ParseCustomize(jObj, ref ret.Data.Customize); ret.ApplyCustomize = ParseCustomize(jObj, ref ret.Data.Customize);
ret.ApplyEquip = ParseEquipment(items, jObj, ref ret.Data); ret.ApplyEquip = ParseEquipment(items, jObj, ref ret.Data);
ret.ApplyBonus = ParseBonusItems(items, jObj, ref ret.Data);
return ret; return ret;
} }
@ -45,6 +47,13 @@ public sealed class CharaFile
return ret; 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) private static void ParseWeapon(ItemManager items, JObject jObj, string property, EquipSlot slot, ref DesignData data, ref EquipFlag flags)
{ {
var jTok = jObj[property]; var jTok = jObj[property];
@ -61,6 +70,8 @@ public sealed class CharaFile
data.SetItem(slot, item); data.SetItem(slot, item);
data.SetStain(slot, new StainIds(dye)); data.SetStain(slot, new StainIds(dye));
if (slot is EquipSlot.MainHand)
data.SetItem(EquipSlot.OffHand, items.GetDefaultOffhand(item));
flags |= slot.ToFlag(); flags |= slot.ToFlag();
flags |= slot.ToStainFlag(); flags |= slot.ToStainFlag();
} }
@ -84,6 +95,26 @@ public sealed class CharaFile
flags |= slot.ToStainFlag(); 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<int>();
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) private static CustomizeFlag ParseCustomize(JObject jObj, ref CustomizeArray customize)
{ {
CustomizeFlag ret = 0; CustomizeFlag ret = 0;

View file

@ -65,7 +65,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d
var file = CharaFile.CharaFile.ParseData(_items, text, Path.GetFileNameWithoutExtension(path)); var file = CharaFile.CharaFile.ParseData(_items, text, Path.GetFileNameWithoutExtension(path));
name = file.Name; 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) catch (Exception ex)
{ {
@ -95,7 +95,7 @@ public class ImportService(CustomizeService _customizations, IDragDropManager _d
throw new Exception(); throw new Exception();
name = file.Name; 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) catch (Exception ex)
{ {