Update for GameData changes.

This commit is contained in:
Ottermandias 2023-12-20 16:39:26 +01:00
parent 6dc5916f2b
commit 5d28904bdf
24 changed files with 160 additions and 123 deletions

View file

@ -12,7 +12,7 @@ public static class CustomizationSwap
{
/// The .mdl file for customizations is unique per racecode, slot and id, thus the .mdl redirection itself is independent of the mode.
public static FileSwap CreateMdl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, BodySlot slot, GenderRace race,
SetId idFrom, SetId idTo)
PrimaryId idFrom, PrimaryId idTo)
{
if (idFrom.Id > byte.MaxValue)
throw new Exception($"The Customization ID {idFrom} is too large for {slot}.");
@ -43,7 +43,7 @@ public static class CustomizationSwap
}
public static FileSwap CreateMtrl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, BodySlot slot, GenderRace race,
SetId idFrom, SetId idTo, byte variant,
PrimaryId idFrom, PrimaryId idTo, byte variant,
ref string fileName, ref bool dataWasChanged)
{
variant = slot is BodySlot.Face or BodySlot.Ear ? byte.MaxValue : variant;
@ -79,7 +79,7 @@ public static class CustomizationSwap
}
public static FileSwap CreateTex(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, BodySlot slot, GenderRace race,
SetId idFrom, ref MtrlFile.Texture texture,
PrimaryId idFrom, ref MtrlFile.Texture texture,
ref bool dataWasChanged)
{
var path = texture.Path;

View file

@ -185,13 +185,13 @@ public static class EquipmentSwap
}
public static MetaSwap? CreateEqdp(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections,
Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot, GenderRace gr, SetId idFrom,
SetId idTo, byte mtrlTo)
Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot, GenderRace gr, PrimaryId idFrom,
PrimaryId idTo, byte mtrlTo)
=> CreateEqdp(manager, redirections, manips, slot, slot, gr, idFrom, idTo, mtrlTo);
public static MetaSwap? CreateEqdp(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections,
Func<MetaManipulation, MetaManipulation> manips, EquipSlot slotFrom, EquipSlot slotTo, GenderRace gr, SetId idFrom,
SetId idTo, byte mtrlTo)
Func<MetaManipulation, MetaManipulation> manips, EquipSlot slotFrom, EquipSlot slotTo, GenderRace gr, PrimaryId idFrom,
PrimaryId idTo, byte mtrlTo)
{
var (gender, race) = gr.Split();
var eqdpFrom = new EqdpManipulation(ExpandedEqdpFile.GetDefault(manager, gr, slotFrom.IsAccessory(), idFrom), slotFrom, gender,
@ -214,11 +214,11 @@ public static class EquipmentSwap
}
public static FileSwap CreateMdl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, EquipSlot slot, GenderRace gr,
SetId idFrom, SetId idTo, byte mtrlTo)
PrimaryId idFrom, PrimaryId idTo, byte mtrlTo)
=> CreateMdl(manager, redirections, slot, slot, gr, idFrom, idTo, mtrlTo);
public static FileSwap CreateMdl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, EquipSlot slotFrom, EquipSlot slotTo,
GenderRace gr, SetId idFrom, SetId idTo, byte mtrlTo)
GenderRace gr, PrimaryId idFrom, PrimaryId idTo, byte mtrlTo)
{
var mdlPathFrom = slotFrom.IsAccessory()
? GamePaths.Accessory.Mdl.Path(idFrom, gr, slotFrom)
@ -236,7 +236,7 @@ public static class EquipmentSwap
return mdl;
}
private static void LookupItem(EquipItem i, out EquipSlot slot, out SetId modelId, out Variant variant)
private static void LookupItem(EquipItem i, out EquipSlot slot, out PrimaryId modelId, out Variant variant)
{
slot = i.Type.ToSlot();
if (!slot.IsEquipmentPiece())
@ -247,7 +247,7 @@ public static class EquipmentSwap
}
private static (ImcFile, Variant[], EquipItem[]) GetVariants(MetaFileManager manager, ObjectIdentification identifier, EquipSlot slotFrom,
SetId idFrom, SetId idTo, Variant variantFrom)
PrimaryId idFrom, PrimaryId idTo, Variant variantFrom)
{
var entry = new ImcManipulation(slotFrom, variantFrom.Id, idFrom, default);
var imc = new ImcFile(manager, entry);
@ -270,8 +270,8 @@ public static class EquipmentSwap
return (imc, variants, items);
}
public static MetaSwap? CreateGmp(MetaFileManager manager, Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot, SetId idFrom,
SetId idTo)
public static MetaSwap? CreateGmp(MetaFileManager manager, Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot, PrimaryId idFrom,
PrimaryId idTo)
{
if (slot is not EquipSlot.Head)
return null;
@ -283,12 +283,12 @@ public static class EquipmentSwap
public static MetaSwap CreateImc(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections,
Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot,
SetId idFrom, SetId idTo, Variant variantFrom, Variant variantTo, ImcFile imcFileFrom, ImcFile imcFileTo)
PrimaryId idFrom, PrimaryId idTo, Variant variantFrom, Variant variantTo, ImcFile imcFileFrom, ImcFile imcFileTo)
=> CreateImc(manager, redirections, manips, slot, slot, idFrom, idTo, variantFrom, variantTo, imcFileFrom, imcFileTo);
public static MetaSwap CreateImc(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections,
Func<MetaManipulation, MetaManipulation> manips,
EquipSlot slotFrom, EquipSlot slotTo, SetId idFrom, SetId idTo,
EquipSlot slotFrom, EquipSlot slotTo, PrimaryId idFrom, PrimaryId idTo,
Variant variantFrom, Variant variantTo, ImcFile imcFileFrom, ImcFile imcFileTo)
{
var entryFrom = imcFileFrom.GetEntry(ImcFile.PartIndex(slotFrom), variantFrom);
@ -322,7 +322,7 @@ public static class EquipmentSwap
// Example: Abyssos Helm / Body
public static FileSwap? CreateAvfx(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, SetId idFrom, SetId idTo, byte vfxId)
public static FileSwap? CreateAvfx(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, PrimaryId idFrom, PrimaryId idTo, byte vfxId)
{
if (vfxId == 0)
return null;
@ -340,8 +340,8 @@ public static class EquipmentSwap
return avfx;
}
public static MetaSwap? CreateEqp(MetaFileManager manager, Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot, SetId idFrom,
SetId idTo)
public static MetaSwap? CreateEqp(MetaFileManager manager, Func<MetaManipulation, MetaManipulation> manips, EquipSlot slot, PrimaryId idFrom,
PrimaryId idTo)
{
if (slot.IsAccessory())
return null;
@ -353,13 +353,13 @@ public static class EquipmentSwap
return new MetaSwap(manips, eqpFrom, eqpTo);
}
public static FileSwap? CreateMtrl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, EquipSlot slot, SetId idFrom,
SetId idTo, byte variantTo, ref string fileName,
public static FileSwap? CreateMtrl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, EquipSlot slot, PrimaryId idFrom,
PrimaryId idTo, byte variantTo, ref string fileName,
ref bool dataWasChanged)
=> CreateMtrl(manager, redirections, slot, slot, idFrom, idTo, variantTo, ref fileName, ref dataWasChanged);
public static FileSwap? CreateMtrl(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, EquipSlot slotFrom, EquipSlot slotTo,
SetId idFrom, SetId idTo, byte variantTo, ref string fileName,
PrimaryId idFrom, PrimaryId idTo, byte variantTo, ref string fileName,
ref bool dataWasChanged)
{
var prefix = slotTo.IsAccessory() ? 'a' : 'e';
@ -397,13 +397,13 @@ public static class EquipmentSwap
return mtrl;
}
public static FileSwap CreateTex(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, char prefix, SetId idFrom, SetId idTo,
public static FileSwap CreateTex(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, char prefix, PrimaryId idFrom, PrimaryId idTo,
ref MtrlFile.Texture texture, ref bool dataWasChanged)
=> CreateTex(manager, redirections, prefix, EquipSlot.Unknown, EquipSlot.Unknown, idFrom, idTo, ref texture, ref dataWasChanged);
public static FileSwap CreateTex(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections, char prefix, EquipSlot slotFrom,
EquipSlot slotTo, SetId idFrom,
SetId idTo, ref MtrlFile.Texture texture, ref bool dataWasChanged)
EquipSlot slotTo, PrimaryId idFrom,
PrimaryId idTo, ref MtrlFile.Texture texture, ref bool dataWasChanged)
{
var path = texture.Path;
var addedDashes = false;

View file

@ -150,7 +150,7 @@ public static class ItemSwap
/// <remarks> metaChanges is not manipulated, but IReadOnlySet does not support TryGetValue. </remarks>
public static MetaSwap? CreateEst(MetaFileManager manager, Func<Utf8GamePath, FullPath> redirections,
Func<MetaManipulation, MetaManipulation> manips, EstManipulation.EstType type,
GenderRace genderRace, SetId idFrom, SetId idTo, bool ownMdl)
GenderRace genderRace, PrimaryId idFrom, PrimaryId idTo, bool ownMdl)
{
if (type == 0)
return null;
@ -195,7 +195,7 @@ public static class ItemSwap
}
}
public static string ReplaceAnyId(string path, char idType, SetId id, bool condition = true)
public static string ReplaceAnyId(string path, char idType, PrimaryId id, bool condition = true)
=> condition
? Regex.Replace(path, $"{idType}\\d{{4}}", $"{idType}{id.Id:D4}")
: path;
@ -203,10 +203,10 @@ public static class ItemSwap
public static string ReplaceAnyRace(string path, GenderRace to, bool condition = true)
=> ReplaceAnyId(path, 'c', (ushort)to, condition);
public static string ReplaceAnyBody(string path, BodySlot slot, SetId to, bool condition = true)
public static string ReplaceAnyBody(string path, BodySlot slot, PrimaryId to, bool condition = true)
=> ReplaceAnyId(path, slot.ToAbbreviation(), to, condition);
public static string ReplaceId(string path, char type, SetId idFrom, SetId idTo, bool condition = true)
public static string ReplaceId(string path, char type, PrimaryId idFrom, PrimaryId idTo, bool condition = true)
=> condition
? path.Replace($"{type}{idFrom.Id:D4}", $"{type}{idTo.Id:D4}")
: path;
@ -219,7 +219,7 @@ public static class ItemSwap
public static string ReplaceRace(string path, GenderRace from, GenderRace to, bool condition = true)
=> ReplaceId(path, 'c', (ushort)from, (ushort)to, condition);
public static string ReplaceBody(string path, BodySlot slot, SetId idFrom, SetId idTo, bool condition = true)
public static string ReplaceBody(string path, BodySlot slot, PrimaryId idFrom, PrimaryId idTo, bool condition = true)
=> ReplaceId(path, slot.ToAbbreviation(), idFrom, idTo, condition);
public static string AddSuffix(string path, string ext, string suffix, bool condition = true)

View file

@ -145,7 +145,7 @@ public class ItemSwapContainer
return ret;
}
public bool LoadCustomization(MetaFileManager manager, BodySlot slot, GenderRace race, SetId from, SetId to,
public bool LoadCustomization(MetaFileManager manager, BodySlot slot, GenderRace race, PrimaryId from, PrimaryId to,
ModCollection? collection = null)
{
var pathResolver = PathResolver(collection);

View file

@ -139,7 +139,7 @@ public class ModCacheManager : IDisposable
{
case ModPathChangeType.Added:
case ModPathChangeType.Reloaded:
Refresh(mod);
RefreshWithChangedItems(mod);
break;
}
}
@ -151,10 +151,28 @@ public class ModCacheManager : IDisposable
}
private void OnModDiscoveryFinished()
=> Parallel.ForEach(_modManager, Refresh);
{
if (!_identifier.Awaiter.IsCompletedSuccessfully || _updatingItems)
{
Parallel.ForEach(_modManager, RefreshWithoutChangedItems);
}
else
{
_updatingItems = true;
Parallel.ForEach(_modManager, RefreshWithChangedItems);
_updatingItems = false;
}
}
private void OnIdentifierCreation()
=> Parallel.ForEach(_modManager, UpdateChangedItems);
{
if (_updatingItems)
return;
_updatingItems = true;
Parallel.ForEach(_modManager, UpdateChangedItems);
_updatingItems = false;
}
private static void UpdateFileCount(Mod mod)
=> mod.TotalFileCount = mod.AllSubMods.Sum(s => s.Files.Count);
@ -173,15 +191,8 @@ public class ModCacheManager : IDisposable
private void UpdateChangedItems(Mod mod)
{
if (_updatingItems)
return;
_updatingItems = true;
var changedItems = (SortedList<string, object?>)mod.ChangedItems;
changedItems.Clear();
if (!_identifier.Awaiter.IsCompletedSuccessfully)
return;
foreach (var gamePath in mod.AllSubMods.SelectMany(m => m.Files.Keys.Concat(m.FileSwaps.Keys)))
_identifier.Identify(changedItems, gamePath.ToString());
@ -189,7 +200,6 @@ public class ModCacheManager : IDisposable
ComputeChangedItems(_identifier, changedItems, manip);
mod.LowerChangedItemsString = string.Join("\0", mod.ChangedItems.Keys.Select(k => k.ToLowerInvariant()));
_updatingItems = false;
}
private static void UpdateCounts(Mod mod)
@ -210,10 +220,16 @@ public class ModCacheManager : IDisposable
}
}
private void Refresh(Mod mod)
private void RefreshWithChangedItems(Mod mod)
{
UpdateTags(mod);
UpdateCounts(mod);
UpdateChangedItems(mod);
}
private void RefreshWithoutChangedItems(Mod mod)
{
UpdateTags(mod);
UpdateCounts(mod);
}
}

View file

@ -30,9 +30,9 @@ public sealed class SubMod : ISubMod
public bool IsDefault
=> GroupIdx < 0;
public Dictionary<Utf8GamePath, FullPath> FileData = new();
public Dictionary<Utf8GamePath, FullPath> FileSwapData = new();
public HashSet<MetaManipulation> ManipulationData = new();
public Dictionary<Utf8GamePath, FullPath> FileData = [];
public Dictionary<Utf8GamePath, FullPath> FileSwapData = [];
public HashSet<MetaManipulation> ManipulationData = [];
public SubMod(IMod parentMod)
=> ParentMod = parentMod;