using FSO.Files.Formats.IFF.Chunks; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace FSO.Files.Formats.IFF { public static class PIFFRegistry { private static Dictionary> PIFFsByName = new Dictionary>(); private static Dictionary OtfRewrite = new Dictionary(); private static Dictionary IsPIFFUser = new Dictionary(); //if a piff is User, all other piffs for that file are ignored. private static HashSet OBJDAdded = new HashSet(); public static void Init(string basePath) { if (!Directory.Exists(basePath)) return; string[] paths = Directory.GetFiles(basePath, "*.piff", SearchOption.AllDirectories); for (int i = 0; i < paths.Length; i++) { string entry = paths[i].Replace('\\', '/'); bool user = entry.Contains("User/"); string filename = Path.GetFileName(entry); PIFF piff; IffFile piffFile; try { piffFile = new IffFile(entry); piff = piffFile.List()[0]; } catch (Exception) { continue; } if (piff.Version < 2) { piff.AppendAddedChunks(piffFile); } if (IsPIFFUser.ContainsKey(piff.SourceIff)) { var old = IsPIFFUser[piff.SourceIff]; if (old != user) { if (user) { //remove old piffs, as they have been overwritten by this user piff. PIFFsByName[piff.SourceIff].Clear(); IsPIFFUser[piff.SourceIff] = true; } else continue; //a user piff exists. ignore these ones. } } else IsPIFFUser.Add(piff.SourceIff, user); if (!PIFFsByName.ContainsKey(piff.SourceIff)) PIFFsByName.Add(piff.SourceIff, new List()); PIFFsByName[piff.SourceIff].Add(piffFile); } string[] otfs = Directory.GetFiles(basePath, "*.otf", SearchOption.AllDirectories); foreach (var otf in otfs) { string entry = otf.Replace('\\', '/'); OtfRewrite[Path.GetFileName(entry)] = entry; } foreach (var piffs in PIFFsByName) { foreach (var piff in piffs.Value) { var addedOBJD = piff.List(); if (addedOBJD != null) { OBJDAdded.Add(piffs.Key); continue; } var pChunk = piff.List()?.FirstOrDefault(); if (pChunk != null && pChunk.Entries.Any(x => x.Type == "OBJD")) { OBJDAdded.Add(piffs.Key); continue; } } } } public static HashSet GetOBJDRewriteNames() { return OBJDAdded; } public static string GetOTFRewrite(string srcFile) { string result = null; OtfRewrite.TryGetValue(srcFile, out result); return result; } public static List GetPIFFs(string srcFile) { List result = null; PIFFsByName.TryGetValue(srcFile, out result); return result; } } }