diff --git a/Extractor/Deep/FileType.cs b/Extractor/Deep/FileType.cs index 7400f54..8b34265 100644 --- a/Extractor/Deep/FileType.cs +++ b/Extractor/Deep/FileType.cs @@ -3,11 +3,29 @@ public enum FileType { Unknown, + Bmp, Dds, Font, + Fbx, Ini, + GimpXcf, Jpeg, + MapRoot, + MapBase, + MapAux, + MapSnd, + MapData, + MapDesc, + MapLayer, + MapSelection, Material, + MayaAsciiScene, + MayaBinaryScene, + MayaFile, + MayaSwatch, + MayaSwatches, + Ogg, + OpenExr, Pdn, Pma, Pmc, @@ -16,13 +34,19 @@ public enum FileType Png, Ppd, Psd, + Rar, + Replay, + Sct, Sii, SoundBank, SoundBankGuids, SoundRef, + SubstanceDesignerSource, Sui, + Svg, TgaMask, Tobj, + WxWidgetsResource, ZlibBlob, } } diff --git a/Extractor/Deep/FileTypeHelper.cs b/Extractor/Deep/FileTypeHelper.cs index db5b181..86ab01a 100644 --- a/Extractor/Deep/FileTypeHelper.cs +++ b/Extractor/Deep/FileTypeHelper.cs @@ -13,9 +13,13 @@ public static class FileTypeHelper private static readonly Dictionary> FileTypeCheckers = new() { { FileType.Dds, IsDdsFile }, + { FileType.OpenExr, IsExrFile }, + { FileType.Fbx, IsFbxFile }, { FileType.Font, IsFontFile }, { FileType.Jpeg, IsJpegFile }, { FileType.Material, IsMatFile }, + { FileType.MayaFile, IsMayaFile }, + { FileType.Ogg, IsOggFile }, { FileType.Pdn, IsPdnFile }, { FileType.Pmg, IsPmgFile }, { FileType.Pmc, IsPmcFile }, @@ -23,11 +27,14 @@ public static class FileTypeHelper { FileType.Pma, IsPmaFile }, { FileType.Png, IsPngFile }, { FileType.Psd, IsPsdFile }, + { FileType.Ppd, IsPpdFile }, + { FileType.Rar, IsRarFile }, { FileType.Sii, IsSiiFile }, { FileType.SoundBank, IsSoundBankFile }, { FileType.SoundBankGuids, IsSoundBankGuidsFile }, { FileType.TgaMask, IsTgaFile }, { FileType.Tobj, IsTobjFile }, + { FileType.GimpXcf, IsXcfFile }, { FileType.ZlibBlob, IsZlibBlob }, { FileType.SoundRef, IsSoundRefFile }, }; @@ -210,6 +217,54 @@ private static bool IsZlibBlob(byte[] fileBuffer) || fileBuffer[1] == 0x5E || fileBuffer[1] == 0x01); } + private static bool IsPpdFile(byte[] fileBuffer) + { + if (fileBuffer.Length < 4) + return false; + + var version = BitConverter.ToInt32(fileBuffer.AsSpan()[0..4]); + return version is >= 0x15 and <= 0x18; + } + + private static bool IsMayaFile(byte[] fileBuffer) + { + return fileBuffer.Length > 4 && + Encoding.ASCII.GetString(fileBuffer[0..4]) == "FOR4"; + } + + private static bool IsOggFile(byte[] fileBuffer) + { + return fileBuffer.Length > 4 && + Encoding.ASCII.GetString(fileBuffer[0..4]) == "OggS"; + } + + private static bool IsRarFile(byte[] fileBuffer) + { + return fileBuffer.Length > 4 && + Encoding.ASCII.GetString(fileBuffer[0..4]) == "Rar!"; + } + + private static bool IsFbxFile(byte[] fileBuffer) + { + return fileBuffer.Length > 18 && + Encoding.ASCII.GetString(fileBuffer[0..18]) == "Kaydara FBX Binary"; + } + + private static bool IsXcfFile(byte[] fileBuffer) + { + return fileBuffer.Length > 13 && + Encoding.ASCII.GetString(fileBuffer[0..13]) == "gimp xcf file"; + } + + private static bool IsExrFile(byte[] fileBuffer) + { + if (fileBuffer.Length < 4) + return false; + + byte[] magic = [0x76, 0x2F, 0x31, 0x01]; + return magic.SequenceEqual(fileBuffer[0..4]); + } + public static FileType PathToFileType(string filePath) { var extension = Path.GetExtension(filePath).ToLowerInvariant(); @@ -222,10 +277,17 @@ public static FileType PathToFileType(string filePath) public static FileType ExtensionToFileType(string extension) { + // Maya junk; presumably autosaves? I've never used it + if (extension.StartsWith(".maa")) + return FileType.MayaAsciiScene; + return extension switch { ".bank" => FileType.SoundBank, + ".bmp" => FileType.Bmp, ".dds" => FileType.Dds, + ".exr" => FileType.OpenExr, + ".fbx" => FileType.Fbx, ".font" => FileType.Font, ".guids" => FileType.SoundBankGuids, ".bank.guids" => FileType.SoundBankGuids, @@ -233,6 +295,11 @@ public static FileType ExtensionToFileType(string extension) ".jpg" => FileType.Jpeg, ".mask" => FileType.TgaMask, ".mat" => FileType.Material, + ".ma" => FileType.MayaAsciiScene, + ".mb" => FileType.MayaBinaryScene, + ".oga" => FileType.Ogg, + ".ogg" => FileType.Ogg, + ".ogv" => FileType.Ogg, ".pdn" => FileType.Pdn, ".pma" => FileType.Pma, ".pmc" => FileType.Pmc, @@ -241,10 +308,27 @@ public static FileType ExtensionToFileType(string extension) ".png" => FileType.Png, ".ppd" => FileType.Ppd, ".psd" => FileType.Psd, + ".rar" => FileType.Rar, + ".rpl" => FileType.Replay, + ".sbs" => FileType.SubstanceDesignerSource, + ".sct" => FileType.Sct, ".sii" => FileType.Sii, + ".xcf" => FileType.GimpXcf, + ".xrc" => FileType.WxWidgetsResource, ".soundref" => FileType.SoundRef, + ".swatch" => FileType.MayaSwatch, + ".swatches" => FileType.MayaSwatches, ".sui" => FileType.Sui, + ".svg" => FileType.Svg, ".tobj" => FileType.Tobj, + ".mbd" => FileType.MapRoot, + ".base" => FileType.MapBase, + ".aux" => FileType.MapAux, + ".snd" => FileType.MapSnd, + ".data" => FileType.MapData, + ".desc" => FileType.MapDesc, + ".layer" => FileType.MapLayer, + ".sbd" => FileType.MapSelection, _ => FileType.Unknown, }; } @@ -254,13 +338,19 @@ public static string FileTypeToExtension(FileType fileType) return fileType switch { FileType.SoundBank => ".bank", + FileType.Bmp => ".bmp", FileType.Dds => ".dds", + FileType.OpenExr => ".exr", + FileType.Fbx => ".fbx", FileType.Font => ".font", FileType.Ini => ".ini", FileType.SoundBankGuids => ".bank.guids", FileType.Jpeg => ".jpg", FileType.TgaMask => ".mask", FileType.Material => ".mat", + FileType.MayaAsciiScene => ".ma", + FileType.MayaBinaryScene => ".mb", + FileType.Ogg => ".ogg", FileType.Pdn => ".pdn", FileType.Pma => ".pma", FileType.Pmc => ".pmc", @@ -269,10 +359,27 @@ public static string FileTypeToExtension(FileType fileType) FileType.Png => ".png", FileType.Ppd => ".ppd", FileType.Psd => ".psd", + FileType.Rar => ".rar", + FileType.Replay => ".rpl", + FileType.SubstanceDesignerSource => ".sbs", + FileType.Sct => ".sct", FileType.Sii => ".sii", FileType.SoundRef => ".soundref", FileType.Sui => ".sui", + FileType.Svg => ".svg", + FileType.MayaSwatch => ".swatch", + FileType.MayaSwatches => ".swatches", FileType.Tobj => ".tobj", + FileType.GimpXcf => ".xcf", + FileType.WxWidgetsResource => ".xrc", + FileType.MapRoot => ".mbd", + FileType.MapBase => ".base", + FileType.MapAux => ".aux", + FileType.MapSnd => ".snd", + FileType.MapData => ".data", + FileType.MapDesc => ".desc", + FileType.MapLayer => ".layer", + FileType.MapSelection => ".sbd", _ => string.Empty, }; } diff --git a/Extractor/Deep/PathFinder.cs b/Extractor/Deep/PathFinder.cs index f0a5612..bf6e43b 100644 --- a/Extractor/Deep/PathFinder.cs +++ b/Extractor/Deep/PathFinder.cs @@ -38,18 +38,43 @@ internal class PathFinder /// any path references. /// private static readonly FileType[] IgnorableFileTypes = [ + FileType.Bmp, FileType.Dds, + FileType.Fbx, + FileType.GimpXcf, FileType.Ini, FileType.Jpeg, + FileType.MapRoot, + FileType.MapBase, + FileType.MapAux, + FileType.MapSnd, + FileType.MapData, + FileType.MapDesc, + FileType.MapLayer, + FileType.MapSelection, + FileType.MayaAsciiScene, + FileType.MayaBinaryScene, + FileType.MayaFile, + FileType.MayaSwatch, + FileType.MayaSwatches, + FileType.Ogg, + FileType.OpenExr, FileType.Pma, FileType.Pmc, FileType.Pmg, FileType.Png, + FileType.Ppd, FileType.Psd, + FileType.Rar, + FileType.Replay, + FileType.Sct, FileType.SoundBank, FileType.SoundBankGuids, + FileType.SubstanceDesignerSource, FileType.Sui, // handled by the including .sii files + FileType.Svg, FileType.TgaMask, + FileType.WxWidgetsResource, FileType.ZlibBlob, ];