Skip to content

Commit

Permalink
Add swaps to and from Glasses.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ottermandias committed Oct 12, 2024
1 parent 97b310c commit e646b48
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 76 deletions.
2 changes: 1 addition & 1 deletion Penumbra.GameData
77 changes: 38 additions & 39 deletions Penumbra/Mods/ItemSwap/EquipmentSwap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,26 @@ public static EquipItem[] CreateTypeSwap(MetaFileManager manager, ObjectIdentifi
EquipSlot slotFrom, EquipItem itemFrom, EquipSlot slotTo, EquipItem itemTo)
{
LookupItem(itemFrom, out var actualSlotFrom, out var idFrom, out var variantFrom);
LookupItem(itemTo, out var actualSlotTo, out var idTo, out var variantTo);
LookupItem(itemTo, out var actualSlotTo, out var idTo, out var variantTo);
if (actualSlotFrom != slotFrom.ToSlot() || actualSlotTo != slotTo.ToSlot())
throw new ItemSwap.InvalidItemTypeException();

var (imcFileFrom, variants, affectedItems) = GetVariants(manager, identifier, slotFrom, idFrom, idTo, variantFrom);
var imcIdentifierTo = new ImcIdentifier(slotTo, idTo, variantTo);
var imcFileTo = new ImcFile(manager, imcIdentifierTo);
var imcFileTo = new ImcFile(manager, imcIdentifierTo);
var imcEntry = manips.TryGetValue(imcIdentifierTo, out var entry)
? entry
: imcFileTo.GetEntry(imcIdentifierTo.EquipSlot, imcIdentifierTo.Variant);
var mtrlVariantTo = imcEntry.MaterialId;
var skipFemale = false;
var skipMale = false;
var skipFemale = false;
var skipMale = false;
foreach (var gr in Enum.GetValues<GenderRace>())
{
switch (gr.Split().Item1)
{
case Gender.Male when skipMale: continue;
case Gender.Female when skipFemale: continue;
case Gender.MaleNpc when skipMale: continue;
case Gender.Male when skipMale: continue;
case Gender.Female when skipFemale: continue;
case Gender.MaleNpc when skipMale: continue;
case Gender.FemaleNpc when skipFemale: continue;
}

Expand Down Expand Up @@ -94,7 +94,7 @@ public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentifi
{
// Check actual ids, variants and slots. We only support using the same slot.
LookupItem(itemFrom, out var slotFrom, out var idFrom, out var variantFrom);
LookupItem(itemTo, out var slotTo, out var idTo, out var variantTo);
LookupItem(itemTo, out var slotTo, out var idTo, out var variantTo);
if (slotFrom != slotTo)
throw new ItemSwap.InvalidItemTypeException();

Expand All @@ -111,7 +111,7 @@ public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentifi
{
(var imcFileFrom, var variants, affectedItems) = GetVariants(manager, identifier, slot, idFrom, idTo, variantFrom);
var imcIdentifierTo = new ImcIdentifier(slotTo, idTo, variantTo);
var imcFileTo = new ImcFile(manager, imcIdentifierTo);
var imcFileTo = new ImcFile(manager, imcIdentifierTo);
var imcEntry = manips.TryGetValue(imcIdentifierTo, out var entry)
? entry
: imcFileTo.GetEntry(imcIdentifierTo.EquipSlot, imcIdentifierTo.Variant);
Expand All @@ -122,18 +122,18 @@ public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentifi
{
EquipSlot.Head => EstType.Head,
EquipSlot.Body => EstType.Body,
_ => (EstType)0,
_ => (EstType)0,
};

var skipFemale = false;
var skipMale = false;
var skipMale = false;
foreach (var gr in Enum.GetValues<GenderRace>())
{
switch (gr.Split().Item1)
{
case Gender.Male when skipMale: continue;
case Gender.Female when skipFemale: continue;
case Gender.MaleNpc when skipMale: continue;
case Gender.Male when skipMale: continue;
case Gender.Female when skipFemale: continue;
case Gender.MaleNpc when skipMale: continue;
case Gender.FemaleNpc when skipFemale: continue;
}

Expand All @@ -148,7 +148,7 @@ public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentifi
swaps.Add(eqdp);

var ownMdl = eqdp?.SwapToModdedEntry.Model ?? false;
var est = ItemSwap.CreateEst(manager, redirections, manips, estType, gr, idFrom, idTo, ownMdl);
var est = ItemSwap.CreateEst(manager, redirections, manips, estType, gr, idFrom, idTo, ownMdl);
if (est != null)
swaps.Add(est);
}
Expand Down Expand Up @@ -176,7 +176,6 @@ public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentifi

return affectedItems;
}

public static MetaSwap<EqdpIdentifier, EqdpEntryInternal>? CreateEqdp(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections,
MetaDictionary manips, EquipSlot slot, GenderRace gr, PrimaryId idFrom, PrimaryId idTo, byte mtrlTo)
=> CreateEqdp(manager, redirections, manips, slot, slot, gr, idFrom, idTo, mtrlTo);
Expand All @@ -186,9 +185,9 @@ public static EquipItem[] CreateItemSwap(MetaFileManager manager, ObjectIdentifi
PrimaryId idTo, byte mtrlTo)
{
var eqdpFromIdentifier = new EqdpIdentifier(idFrom, slotFrom, gr);
var eqdpToIdentifier = new EqdpIdentifier(idTo, slotTo, gr);
var eqdpFromDefault = new EqdpEntryInternal(ExpandedEqdpFile.GetDefault(manager, eqdpFromIdentifier), slotFrom);
var eqdpToDefault = new EqdpEntryInternal(ExpandedEqdpFile.GetDefault(manager, eqdpToIdentifier), slotTo);
var eqdpToIdentifier = new EqdpIdentifier(idTo, slotTo, gr);
var eqdpFromDefault = new EqdpEntryInternal(ExpandedEqdpFile.GetDefault(manager, eqdpFromIdentifier), slotFrom);
var eqdpToDefault = new EqdpEntryInternal(ExpandedEqdpFile.GetDefault(manager, eqdpToIdentifier), slotTo);
var meta = new MetaSwap<EqdpIdentifier, EqdpEntryInternal>(i => manips.TryGetValue(i, out var e) ? e : null, eqdpFromIdentifier,
eqdpFromDefault, eqdpToIdentifier,
eqdpToDefault);
Expand Down Expand Up @@ -217,7 +216,7 @@ public static FileSwap CreateMdl(MetaFileManager manager, Func<Utf8GamePath, Ful
? GamePaths.Accessory.Mdl.Path(idFrom, gr, slotFrom)
: GamePaths.Equipment.Mdl.Path(idFrom, gr, slotFrom);
var mdlPathTo = slotTo.IsAccessory() ? GamePaths.Accessory.Mdl.Path(idTo, gr, slotTo) : GamePaths.Equipment.Mdl.Path(idTo, gr, slotTo);
var mdl = FileSwap.CreateSwap(manager, ResourceType.Mdl, redirections, mdlPathFrom, mdlPathTo);
var mdl = FileSwap.CreateSwap(manager, ResourceType.Mdl, redirections, mdlPathFrom, mdlPathTo);

foreach (ref var fileName in mdl.AsMdl()!.Materials.AsSpan())
{
Expand All @@ -242,13 +241,13 @@ private static void LookupItem(EquipItem i, out EquipSlot slot, out PrimaryId mo
private static (ImcFile, Variant[], EquipItem[]) GetVariants(MetaFileManager manager, ObjectIdentification identifier, EquipSlot slotFrom,
PrimaryId idFrom, PrimaryId idTo, Variant variantFrom)
{
var ident = new ImcIdentifier(slotFrom, idFrom, variantFrom);
var imc = new ImcFile(manager, ident);
var ident = new ImcIdentifier(slotFrom, idFrom, variantFrom);
var imc = new ImcFile(manager, ident);
EquipItem[] items;
Variant[] variants;
Variant[] variants;
if (idFrom == idTo)
{
items = identifier.Identify(idFrom, 0, variantFrom, slotFrom).ToArray();
items = identifier.Identify(idFrom, 0, variantFrom, slotFrom).ToArray();
variants = [variantFrom];
}
else
Expand All @@ -271,9 +270,9 @@ private static (ImcFile, Variant[], EquipItem[]) GetVariants(MetaFileManager man
return null;

var manipFromIdentifier = new GmpIdentifier(idFrom);
var manipToIdentifier = new GmpIdentifier(idTo);
var manipFromDefault = ExpandedGmpFile.GetDefault(manager, manipFromIdentifier);
var manipToDefault = ExpandedGmpFile.GetDefault(manager, manipToIdentifier);
var manipToIdentifier = new GmpIdentifier(idTo);
var manipFromDefault = ExpandedGmpFile.GetDefault(manager, manipFromIdentifier);
var manipToDefault = ExpandedGmpFile.GetDefault(manager, manipToIdentifier);
return new MetaSwap<GmpIdentifier, GmpEntry>(i => manips.TryGetValue(i, out var e) ? e : null, manipFromIdentifier, manipFromDefault,
manipToIdentifier, manipToDefault);
}
Expand All @@ -288,9 +287,9 @@ public static MetaSwap<ImcIdentifier, ImcEntry> CreateImc(MetaFileManager manage
Variant variantFrom, Variant variantTo, ImcFile imcFileFrom, ImcFile imcFileTo)
{
var manipFromIdentifier = new ImcIdentifier(slotFrom, idFrom, variantFrom);
var manipToIdentifier = new ImcIdentifier(slotTo, idTo, variantTo);
var manipFromDefault = imcFileFrom.GetEntry(ImcFile.PartIndex(slotFrom), variantFrom);
var manipToDefault = imcFileTo.GetEntry(ImcFile.PartIndex(slotTo), variantTo);
var manipToIdentifier = new ImcIdentifier(slotTo, idTo, variantTo);
var manipFromDefault = imcFileFrom.GetEntry(ImcFile.PartIndex(slotFrom), variantFrom);
var manipToDefault = imcFileTo.GetEntry(ImcFile.PartIndex(slotTo), variantTo);
var imc = new MetaSwap<ImcIdentifier, ImcEntry>(i => manips.TryGetValue(i, out var e) ? e : null, manipFromIdentifier, manipFromDefault,
manipToIdentifier, manipToDefault);

Expand Down Expand Up @@ -329,7 +328,7 @@ public static MetaSwap<ImcIdentifier, ImcEntry> CreateImc(MetaFileManager manage
var vfxPathFrom = GamePaths.Equipment.Avfx.Path(idFrom, vfxId);
vfxPathFrom = ItemSwap.ReplaceType(vfxPathFrom, slotFrom, slotTo, idFrom);
var vfxPathTo = GamePaths.Equipment.Avfx.Path(idTo, vfxId);
var avfx = FileSwap.CreateSwap(manager, ResourceType.Avfx, redirections, vfxPathFrom, vfxPathTo);
var avfx = FileSwap.CreateSwap(manager, ResourceType.Avfx, redirections, vfxPathFrom, vfxPathTo);

foreach (ref var filePath in avfx.AsAvfx()!.Textures.AsSpan())
{
Expand All @@ -347,9 +346,9 @@ public static MetaSwap<ImcIdentifier, ImcEntry> CreateImc(MetaFileManager manage
return null;

var manipFromIdentifier = new EqpIdentifier(idFrom, slot);
var manipToIdentifier = new EqpIdentifier(idTo, slot);
var manipFromDefault = new EqpEntryInternal(ExpandedEqpFile.GetDefault(manager, idFrom), slot);
var manipToDefault = new EqpEntryInternal(ExpandedEqpFile.GetDefault(manager, idTo), slot);
var manipToIdentifier = new EqpIdentifier(idTo, slot);
var manipFromDefault = new EqpEntryInternal(ExpandedEqpFile.GetDefault(manager, idFrom), slot);
var manipToDefault = new EqpEntryInternal(ExpandedEqpFile.GetDefault(manager, idTo), slot);
return new MetaSwap<EqpIdentifier, EqpEntryInternal>(i => manips.TryGetValue(i, out var e) ? e : null, manipFromIdentifier,
manipFromDefault, manipToIdentifier, manipToDefault);
}
Expand Down Expand Up @@ -381,7 +380,7 @@ public static MetaSwap<ImcIdentifier, ImcEntry> CreateImc(MetaFileManager manage

if (newFileName != fileName)
{
fileName = newFileName;
fileName = newFileName;
dataWasChanged = true;
}

Expand All @@ -406,13 +405,13 @@ public static FileSwap CreateTex(MetaFileManager manager, Func<Utf8GamePath, Ful
EquipSlot slotTo, PrimaryId idFrom, PrimaryId idTo, ref MtrlFile.Texture texture, ref bool dataWasChanged)
{
var addedDashes = GamePaths.Tex.HandleDx11Path(texture, out var path);
var newPath = ItemSwap.ReplaceAnyId(path, prefix, idFrom);
var newPath = ItemSwap.ReplaceAnyId(path, prefix, idFrom);
newPath = ItemSwap.ReplaceSlot(newPath, slotTo, slotFrom, slotTo != slotFrom);
newPath = ItemSwap.ReplaceType(newPath, slotFrom, slotTo, idFrom);
newPath = ItemSwap.AddSuffix(newPath, ".tex", $"_{Path.GetFileName(texture.Path).GetStableHashCode():x8}");
if (newPath != path)
{
texture.Path = addedDashes ? newPath.Replace("--", string.Empty) : newPath;
texture.Path = addedDashes ? newPath.Replace("--", string.Empty) : newPath;
dataWasChanged = true;
}

Expand All @@ -430,8 +429,8 @@ public static FileSwap CreateAtex(MetaFileManager manager, Func<Utf8GamePath, Fu
PrimaryId idFrom, ref string filePath, ref bool dataWasChanged)
{
var oldPath = filePath;
filePath = ItemSwap.AddSuffix(filePath, ".atex", $"_{Path.GetFileName(filePath).GetStableHashCode():x8}");
filePath = ItemSwap.ReplaceType(filePath, slotFrom, slotTo, idFrom);
filePath = ItemSwap.AddSuffix(filePath, ".atex", $"_{Path.GetFileName(filePath).GetStableHashCode():x8}");
filePath = ItemSwap.ReplaceType(filePath, slotFrom, slotTo, idFrom);
dataWasChanged = true;

return FileSwap.CreateSwap(manager, ResourceType.Atex, redirections, filePath, oldPath, oldPath);
Expand Down
Loading

0 comments on commit e646b48

Please sign in to comment.