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,11 +40,12 @@ public class DesignBase
}
/// <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;
ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant;
Application.Equip = equipFlags & EquipFlagExtensions.All;
Application.BonusItem = bonusFlags & BonusExtensions.All;
Application.Meta = 0;
CustomizeSet = SetCustomizationSet(customize);
}

View file

@ -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<CrestFlag>().Where(other.DoApplyCrest))
ChangeCrest(design, slot, other.DesignData.Crest(slot));

View file

@ -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;

View file

@ -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<string>() ?? 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<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)
{
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));
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)
{