diff --git a/FModel/Enums.cs b/FModel/Enums.cs index 1c65c51a..7aba5152 100644 --- a/FModel/Enums.cs +++ b/FModel/Enums.cs @@ -41,29 +41,29 @@ public enum ELanguage : long { - English, - AustralianEnglish, - BritishEnglish, - French, - German, - Italian, - Spanish, - SpanishLatin, - SpanishMexico, - Arabic, - Japanese, - Korean, - Polish, - PortugueseBrazil, - PortuguesePortugal, - Russian, - Turkish, - Chinese, - TraditionalChinese, - Swedish, - Thai, - Indonesian, - VietnameseVietnam + English = 0, + AustralianEnglish = 15, + BritishEnglish = 16, + French = 1, + German = 2, + Italian = 3, + Spanish = 4, + SpanishLatin = 5, + SpanishMexico = 17, + Arabic = 6, + Japanese = 7, + Korean = 8, + Polish = 9, + PortugueseBrazil = 10, + PortuguesePortugal = 18, + Russian = 11, + Turkish = 12, + Chinese = 13, + TraditionalChinese = 14, + Swedish = 19, + Thai = 20, + Indonesian = 21, + VietnameseVietnam = 22 } public enum EJsonType: long diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 50d7786d..04e88c80 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -127,6 +127,8 @@ + + diff --git a/FModel/PakReader/Parsers/Class/UAkAudioEvent.cs b/FModel/PakReader/Parsers/Class/UAkAudioEvent.cs deleted file mode 100644 index e8f432dd..00000000 --- a/FModel/PakReader/Parsers/Class/UAkAudioEvent.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace PakReader.Parsers.Class -{ - public sealed class UAkAudioEvent : IUExport - { - readonly Dictionary Map; - - internal UAkAudioEvent(PackageReader reader) - { - _ = new UObject(reader, true); - Map = new Dictionary(1) - { - { "MaxAttenuationRadius", reader.ReadFloat() } - }; - } - - public object this[string key] => Map[key]; - public IEnumerable Keys => Map.Keys; - public IEnumerable Values => Map.Values; - public int Count => Map.Count; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool ContainsKey(string key) => Map.ContainsKey(key); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IEnumerator> GetEnumerator() => Map.GetEnumerator(); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - IEnumerator IEnumerable.GetEnumerator() => Map.GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool TryGetValue(string key, out object value) => Map.TryGetValue(key, out value); - } -} diff --git a/FModel/PakReader/Parsers/Class/UAkMediaAssetData.cs b/FModel/PakReader/Parsers/Class/UAkMediaAssetData.cs new file mode 100644 index 00000000..94312972 --- /dev/null +++ b/FModel/PakReader/Parsers/Class/UAkMediaAssetData.cs @@ -0,0 +1,40 @@ +using PakReader.Parsers.Objects; +using System; +using System.IO; +using System.Linq; + +namespace PakReader.Parsers.Class +{ + public sealed class UAkMediaAssetData : UObject + { + public FAkMediaDataChunk[] DataChunks { get; } + + byte[] sound; + public byte[] Sound + { + get + { + if (sound == null) + { + sound = new byte[this.DataChunks.Sum(x => x.Data.Data.Length)]; + int offset = 0; + for (int i = 0; i < this.DataChunks.Length; i++) + { + Buffer.BlockCopy(this.DataChunks[i].Data.Data, 0, sound, offset, this.DataChunks[i].Data.Data.Length); + offset += this.DataChunks[i].Data.Data.Length; + } + } + return sound; + } + } + + internal UAkMediaAssetData(PackageReader reader, Stream ubulk, long bulkOffset) : base(reader) + { + DataChunks = new FAkMediaDataChunk[reader.ReadInt32()]; + for (int i = 0; i < DataChunks.Length; ++i) + { + DataChunks[i] = new FAkMediaDataChunk(reader, ubulk, bulkOffset); + } + } + } +} diff --git a/FModel/PakReader/Parsers/Objects/FAkMediaDataChunk.cs b/FModel/PakReader/Parsers/Objects/FAkMediaDataChunk.cs new file mode 100644 index 00000000..30b15729 --- /dev/null +++ b/FModel/PakReader/Parsers/Objects/FAkMediaDataChunk.cs @@ -0,0 +1,16 @@ +using System.IO; + +namespace PakReader.Parsers.Objects +{ + public readonly struct FAkMediaDataChunk : IUStruct + { + public readonly FByteBulkData Data; + public readonly bool IsPrefetch; + + internal FAkMediaDataChunk(PackageReader reader, Stream ubulk, long bulkOffset) + { + IsPrefetch = reader.ReadInt32() != 0; + Data = new FByteBulkData(reader, ubulk, bulkOffset); + } + } +} diff --git a/FModel/PakReader/Parsers/PackageReader.cs b/FModel/PakReader/Parsers/PackageReader.cs index 7c61514d..b3ba3fd2 100644 --- a/FModel/PakReader/Parsers/PackageReader.cs +++ b/FModel/PakReader/Parsers/PackageReader.cs @@ -57,7 +57,7 @@ namespace PakReader.Parsers "FontFace" => new UFontFace(this, ubulk), "SoundWave" => new USoundWave(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize), "StringTable" => new UStringTable(this), - //"AkAudioEvent" => new UAkAudioEvent(this), + "AkMediaAssetData" => new UAkMediaAssetData(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize), _ => new UObject(this), }; diff --git a/FModel/PakReader/Textures/BC/Detex.cs b/FModel/PakReader/Textures/BC/Detex.cs new file mode 100644 index 00000000..bcd032aa --- /dev/null +++ b/FModel/PakReader/Textures/BC/Detex.cs @@ -0,0 +1,106 @@ +using System; +using System.IO; +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security.Cryptography; + +namespace PakReader.Textures.BC +{ + public static class Detex + { + private const string DETEX_DLL_NAME = "Detex.dll"; + + static Detex() + { + PrepareDllFile(); + } + + [StructLayout(LayoutKind.Sequential)] + private unsafe struct detexTexture + { + public uint format; + public byte* data; + public int width; + public int height; + public int width_in_blocks; + public int height_in_blocks; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] DecodeDetexLinear(byte[] inp, int width, int height, bool isFloat, DetexTextureFormat inputFormat, + DetexPixelFormat outputPixelFormat, int blockSizeX = 4, int blockSizeY = 4) + { + var dst = new byte[width * height * (isFloat ? 16 : 4)]; + DecodeDetexLinear(inp, dst, width, height, inputFormat, outputPixelFormat, blockSizeX, blockSizeY); + return dst; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool DecodeDetexLinear(byte[] inp, byte[] dst, int width, int height, DetexTextureFormat inputFormat, DetexPixelFormat outputPixelFormat, int blockSizeX = 4, int blockSizeY = 4) + { + unsafe + { + detexTexture tex; + tex.format = (uint) inputFormat; + tex.data = (byte*) Unsafe.AsPointer(ref inp[0]); + tex.width = width; + tex.height = height; + tex.width_in_blocks = width / 4; + tex.height_in_blocks = height / 4; + return detexDecompressTextureLinear(&tex, (byte*) Unsafe.AsPointer(ref dst[0]), + (uint) outputPixelFormat); + } + } + + public static byte[] DecodeBC6H(byte[] inp, int width, int height) + { + const int PIXEL_SIZE = 16; + var dst = new byte[width * height * PIXEL_SIZE]; + + DecodeDetexLinear(inp, dst, width, height, DetexTextureFormat.DETEX_TEXTURE_FORMAT_BPTC_FLOAT, + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBX8); + + return dst; + } + + [DllImport(DETEX_DLL_NAME)] + private static extern unsafe bool detexDecompressTextureLinear(detexTexture* texture, byte* pixelBuffer, + uint pixelFormat); + + private static void PrepareDllFile() + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("FModel.Resources.Detex.dll"); + if (stream == null) + throw new MissingManifestResourceException("Couldn't find Detex.dll in Embedded Resources"); + var ba = new byte[(int) stream.Length]; + stream.Read(ba, 0, (int) stream.Length); + + bool fileOk; + var dllFile = DETEX_DLL_NAME; + + using (var sha1 = new SHA1CryptoServiceProvider()) + { + var fileHash = BitConverter.ToString(sha1.ComputeHash(ba)).Replace("-", string.Empty); + + if (File.Exists(dllFile)) + { + var bb = File.ReadAllBytes(dllFile); + var fileHash2 = BitConverter.ToString(sha1.ComputeHash(bb)).Replace("-", string.Empty); + + fileOk = fileHash == fileHash2; + } + else + { + fileOk = false; + } + } + + if (!fileOk) + { + File.WriteAllBytes(dllFile, ba); + } + } + } +} \ No newline at end of file diff --git a/FModel/PakReader/Textures/BC/DetexCompressedTextureFormatIndex.cs b/FModel/PakReader/Textures/BC/DetexCompressedTextureFormatIndex.cs new file mode 100644 index 00000000..88d1b30c --- /dev/null +++ b/FModel/PakReader/Textures/BC/DetexCompressedTextureFormatIndex.cs @@ -0,0 +1,39 @@ +namespace PakReader.Textures.BC +{ + internal enum DetexCompressedTextureFormatIndex : uint + { + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_UNCOMPRESSED = 0, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1 = 1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT1 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_S3TC = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1A, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT1A = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1A, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT3 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC3, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT5 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC3, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC4_UNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC4_SNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC5_UNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC5_SNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_FLOAT, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC6H_UF16 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_FLOAT, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_SIGNED_FLOAT, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC6H_SF16 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_SIGNED_FLOAT, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC7 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC1, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_PUNCHTHROUGH, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_EAC, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_R11, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_R11, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_RG11, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_RG11, + DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ASTC_4X4, + } +} \ No newline at end of file diff --git a/FModel/PakReader/Textures/BC/DetexPixelFormat.cs b/FModel/PakReader/Textures/BC/DetexPixelFormat.cs new file mode 100644 index 00000000..9dcc2f0b --- /dev/null +++ b/FModel/PakReader/Textures/BC/DetexPixelFormat.cs @@ -0,0 +1,361 @@ +namespace PakReader.Textures.BC +{ + public enum DetexPixelFormat : uint + { + /* The format has 16-bit components. */ + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT = 0x1, + + /* The format has 32-bit components. */ + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT = 0x2, + + /* The format has an alpha component. */ + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT = 0x4, + + /* The sequential component order is RGB. */ + DETEX_PIXEL_FORMAT_RGB_COMPONENT_ORDER_BIT = 0x0, + + /* The sequential component order is BGR. */ + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT = 0x8, + + /* The format has one component. */ + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS = 0x0, + + /* The format has two components. */ + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS = 0x10, + + /* The format has three components. */ + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS = 0x20, + + /* The format has four components. */ + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS = 0x30, + + /* The format is stored as 8-bit pixels. */ + DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS = 0x000, + + /* The format is stored as 16-bit pixels. */ + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS = 0x100, + + /* The format is stored as 24-bit pixels. */ + DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS = 0x200, + + /* The format is stored as 32-bit pixels. */ + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS = 0x300, + + /* The format is stored as 48-bit pixels. */ + DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS = 0x500, + + /* The format is stored as 64-bit pixels. */ + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS = 0x700, + + /* The format is stored as 96-bit pixels. */ + DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS = 0xB00, + + /* The format is stored as 128-bit pixels. */ + DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS = 0xF00, + + /* The format has signed integer components. */ + DETEX_PIXEL_FORMAT_SIGNED_BIT = 0x1000, + + /* The format has (half-)float components. */ + DETEX_PIXEL_FORMAT_FLOAT_BIT = 0x2000, + + /* The fomat is HDR (high dynamic range). */ + DETEX_PIXEL_FORMAT_HDR_BIT = 0x4000, + + DETEX_PIXEL_FORMAT_RGBA8 = ( + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_BGRA8 = ( + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_RGBX8 = ( + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_BGRX8 = ( + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_RGB8 = ( + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_BGR8 = ( + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_R8 = ( + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_SIGNED_R8 = ( + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_SIGNED_BIT + ), + + DETEX_PIXEL_FORMAT_RG8 = ( + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_SIGNED_RG8 = ( + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_SIGNED_BIT + ), + + DETEX_PIXEL_FORMAT_R16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_SIGNED_R16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_SIGNED_BIT + ), + + DETEX_PIXEL_FORMAT_RG16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_SIGNED_RG16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_SIGNED_BIT + ), + + DETEX_PIXEL_FORMAT_RGB16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_RGBX16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_RGBA16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS + ), + + DETEX_PIXEL_FORMAT_FLOAT_R16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_R16_HDR = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RG16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RG16_HDR = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBX16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBX16_HDR = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBA16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBA16_HDR = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGB16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGB16_HDR = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_BGRX16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_BGRX16_HDR = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_SIGNED_BIT | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_SIGNED_FLOAT_BGRX16 = ( + DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_SIGNED_BIT | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_R32 = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_R32_HDR = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RG32 = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RG32_HDR = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGB32 = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGB32_HDR = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBX32 = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBX32_HDR = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBA32 = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT + ), + + DETEX_PIXEL_FORMAT_FLOAT_RGBA32_HDR = ( + DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS | + DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS | + DETEX_PIXEL_FORMAT_FLOAT_BIT | + DETEX_PIXEL_FORMAT_HDR_BIT + ), + + DETEX_PIXEL_FORMAT_A8 = ( + DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT | + DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS | + DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS + ), + } +} \ No newline at end of file diff --git a/FModel/PakReader/Textures/BC/DetexTextureFormat.cs b/FModel/PakReader/Textures/BC/DetexTextureFormat.cs new file mode 100644 index 00000000..23247a13 --- /dev/null +++ b/FModel/PakReader/Textures/BC/DetexTextureFormat.cs @@ -0,0 +1,119 @@ +namespace PakReader.Textures.BC +{ + public enum DetexTextureFormat : uint + { + DETEX_TEXTURE_FORMAT_PIXEL_FORMAT_MASK = 0x0000FFFF, + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT = 0x00800000, + + DETEX_TEXTURE_FORMAT_BC1 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBX8 + ), + + DETEX_TEXTURE_FORMAT_BC1A = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1A << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + + DETEX_TEXTURE_FORMAT_BC2 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC2 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + + DETEX_TEXTURE_FORMAT_BC3 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC3 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + + DETEX_TEXTURE_FORMAT_RGTC1 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC1 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_R8 + ), + + DETEX_TEXTURE_FORMAT_SIGNED_RGTC1 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC1 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_SIGNED_R16 + ), + + DETEX_TEXTURE_FORMAT_RGTC2 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC2 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RG8 + ), + + DETEX_TEXTURE_FORMAT_SIGNED_RGTC2 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC2 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_SIGNED_RG16 + ), + + DETEX_TEXTURE_FORMAT_BPTC_FLOAT = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_FLOAT << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_FLOAT_RGBX16 + ), + + DETEX_TEXTURE_FORMAT_BPTC_SIGNED_FLOAT = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_SIGNED_FLOAT << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16 + ), + + DETEX_TEXTURE_FORMAT_BPTC = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + + DETEX_TEXTURE_FORMAT_ETC1 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC1 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBX8 + ), + + DETEX_TEXTURE_FORMAT_ETC2 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBX8 + ), + + DETEX_TEXTURE_FORMAT_ETC2_PUNCHTHROUGH = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_PUNCHTHROUGH << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + + DETEX_TEXTURE_FORMAT_ETC2_EAC = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_EAC << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + + DETEX_TEXTURE_FORMAT_EAC_R11 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_R11 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_R16 + ), + + DETEX_TEXTURE_FORMAT_EAC_SIGNED_R11 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_R11 << 24) | + DetexPixelFormat.DETEX_PIXEL_FORMAT_SIGNED_R16 + ), + + DETEX_TEXTURE_FORMAT_EAC_RG11 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_RG11 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RG16 + ), + + DETEX_TEXTURE_FORMAT_EAC_SIGNED_RG11 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_RG11 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_SIGNED_RG16 + ), + + DETEX_TEXTURE_FORMAT_ASTC_4X4 = ( + (DetexCompressedTextureFormatIndex.DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ASTC_4X4 << 24) | + DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT | + DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8 + ), + } +} \ No newline at end of file diff --git a/FModel/PakReader/Textures/TextureDecoder.cs b/FModel/PakReader/Textures/TextureDecoder.cs index d929915c..6c0a557d 100644 --- a/FModel/PakReader/Textures/TextureDecoder.cs +++ b/FModel/PakReader/Textures/TextureDecoder.cs @@ -50,6 +50,37 @@ namespace PakReader.Textures data = sequence; colorType = SKColorType.RgbaF16; break; + case EPixelFormat.PF_BC7: + data = Detex.DecodeDetexLinear(sequence, width, height, isFloat: false, + inputFormat: DetexTextureFormat.DETEX_TEXTURE_FORMAT_BPTC, + outputPixelFormat: DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8); + colorType = SKColorType.Rgba8888; + break; + case EPixelFormat.PF_BC6H: + data = Detex.DecodeDetexLinear(sequence, width, height, isFloat: true, + inputFormat: DetexTextureFormat.DETEX_TEXTURE_FORMAT_BPTC_FLOAT, + outputPixelFormat: DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBX8); // Not sure whether that works, would actually be DETEX_PIXEL_FORMAT_FLOAT_RGBX32 + data = Detex.DecodeBC6H(sequence, width, height); + colorType = SKColorType.Rgb888x; + break; + case EPixelFormat.PF_ETC1: + data = Detex.DecodeDetexLinear(sequence, width, height, isFloat: false, + inputFormat: DetexTextureFormat.DETEX_TEXTURE_FORMAT_ETC1, + outputPixelFormat: DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8); + colorType = SKColorType.Rgba8888; + break; + case EPixelFormat.PF_ETC2_RGB: + data = Detex.DecodeDetexLinear(sequence, width, height, isFloat: false, + inputFormat: DetexTextureFormat.DETEX_TEXTURE_FORMAT_ETC2, + outputPixelFormat: DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8); + colorType = SKColorType.Rgba8888; + break; + case EPixelFormat.PF_ETC2_RGBA: + data = Detex.DecodeDetexLinear(sequence, width, height, isFloat: false, + inputFormat: DetexTextureFormat.DETEX_TEXTURE_FORMAT_ETC2_EAC, + outputPixelFormat: DetexPixelFormat.DETEX_PIXEL_FORMAT_RGBA8); + colorType = SKColorType.Rgba8888; + break; default: throw new NotImplementedException($"Cannot decode {format} format"); } diff --git a/FModel/Properties/Resources.ar.resx b/FModel/Properties/Resources.ar.resx index ea8bd936..0dbc2f7c 100644 --- a/FModel/Properties/Resources.ar.resx +++ b/FModel/Properties/Resources.ar.resx @@ -792,5 +792,59 @@ It's now the most used free software to leak on Fortnite. يعمل (AES)مشفر لفك تشفيرها يرجى تحديد مفتاح تشفير (.pak) تم العثور على ملف + + + اعادة ضبط الاعدادات + + + Fortnite + + + Valorant + + + Dead By Daylight + + + Borderlands 3 + + + Minecraft Dungeons + + + انكليزي استرالي + + + انكليزي بريطاني + + + اللغة البرتغالية + + + اللغة الاسبانية / المكسيكية + + + اللغة السويدية + + + اللغة التايلاندية + + + اللغة الأندونيسية + + + اللغة الفيتنامية + + + Battle Breakers + + + Spellbreak + + + State of Decay 2 + + + The Cycle \ No newline at end of file diff --git a/FModel/Properties/Resources.pt-PT.resx b/FModel/Properties/Resources.pt-PT.resx index e5e8d6e4..29995e51 100644 --- a/FModel/Properties/Resources.pt-PT.resx +++ b/FModel/Properties/Resources.pt-PT.resx @@ -279,14 +279,6 @@ Contribuidoras - - • Waddlesworth • Maiky -• FunGames • Not Officer -• PsychoPast • TSG -• GMatrixGames • Jackson -• XTigerHyperX • FireMonkey - Do not translate - Copiado! @@ -345,14 +337,6 @@ Doadores - - • Yanteh • Maiky -• FunGames • HYPEX ♥ -• Alexander • Netu ♥ -• SexyNutella • imatrix -• Frenzy Leaks • LlamaLeaks - Do not translate - Erro Ao Fazer Download De {0} @@ -738,9 +722,7 @@ FModel Lançador General Settings Window - FModel Está Prestes A Reiniciar Porque Você Aplicou Seu (s) Novo (s) Caminho ( -FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho -FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho (s) + FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho (s) General Settings Window @@ -933,14 +915,6 @@ FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho ( Tradutores - - • EN: Asval#2291 • FR: Asval#2291 -• DE: FunGames#6822 • IT: arianaglande#5581 -• ES: Maiky.M#9879 • AR: PsychoPast#0001 -• JA: FNJPNews#7820 • RU: Seawod#4311 -• CN: GMatrixGames#6929 - Do not translate - Turco @@ -1063,9 +1037,6 @@ FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho ( ..\Resources\Xml.xshd;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Trello - ..\Resources\trello.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/FModel/Properties/Settings.cs b/FModel/Properties/Settings.cs index dfa638f3..153f0445 100644 --- a/FModel/Properties/Settings.cs +++ b/FModel/Properties/Settings.cs @@ -11,7 +11,6 @@ namespace FModel.Properties public sealed partial class Settings { private static string _userSettings = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\FModel\\DoNotDelete.json"; - private static readonly Regex _pakFileRegex = new Regex(@"^FortniteGame/Content/Paks/pakchunk(?:0|10.*|\w+)-WindowsClient\.pak$", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); /// /// IMPORTANT: i believe Upgrade doesn't like int32 so use int64 (maybe because it's for x64?) for all int values diff --git a/FModel/Resources/Detex.dll b/FModel/Resources/Detex.dll new file mode 100644 index 00000000..a05872ba Binary files /dev/null and b/FModel/Resources/Detex.dll differ diff --git a/FModel/Utils/Assets.cs b/FModel/Utils/Assets.cs index ba8a74ac..1ca584e7 100644 --- a/FModel/Utils/Assets.cs +++ b/FModel/Utils/Assets.cs @@ -219,6 +219,23 @@ namespace FModel.Utils return p; } + var ak = p.GetExport(); + if (ak != null) + { + if (Properties.Settings.Default.AutoOpenSounds) + { + Application.Current.Dispatcher.Invoke(delegate + { + DebugHelper.WriteLine("{0} {1} {2}", "[FModel]", "[Window]", $"Opening Audio Player for {entry.GetNameWithExtension()}"); + if (!FWindows.IsWindowOpen(Properties.Resources.AudioPlayer)) + new AudioPlayer().LoadFile(ak.Sound, entry.GetNameWithoutExtension() + ".wem", mount + entry.GetPathWithoutFile()); + else + ((AudioPlayer)FWindows.GetOpenedWindow(Properties.Resources.AudioPlayer)).LoadFile(ak.Sound, entry.GetNameWithoutExtension() + ".wem", mount + entry.GetPathWithoutFile()); + }); + } + return p; + } + // Sound var s = p.GetExport(); if (s != null && (s.AudioFormat.String.Equals("OGG") || s.AudioFormat.String.Equals("OGG10000-1-1-1-1-1"))) diff --git a/FModel/Utils/EGL2.cs b/FModel/Utils/EGL2.cs index 6e896231..1b760102 100644 --- a/FModel/Utils/EGL2.cs +++ b/FModel/Utils/EGL2.cs @@ -18,10 +18,10 @@ namespace FModel.Utils using Stream stream = new BufferedStream(new FileInfo(configFile).Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); using BinaryReader reader = new BinaryReader(stream, Encoding.Default); if (reader.ReadUInt32() != FILE_CONFIG_MAGIC) - throw new FileLoadException("Invalid EGL2 Config Magic"); + return string.Empty; if (reader.ReadUInt16BE() < FILE_CONFIG_VERSION) - throw new FileLoadException("Invalid EGL2 Config Version"); + return string.Empty; int stringLength = reader.ReadUInt16BE(); string cacheDirectory = Encoding.UTF8.GetString(reader.ReadBytes(stringLength)); diff --git a/FModel/ViewModels/ComboBox/ComboBoxViewModel.cs b/FModel/ViewModels/ComboBox/ComboBoxViewModel.cs index aadb116b..19f78868 100644 --- a/FModel/ViewModels/ComboBox/ComboBoxViewModel.cs +++ b/FModel/ViewModels/ComboBox/ComboBoxViewModel.cs @@ -52,24 +52,24 @@ namespace FModel.ViewModels.ComboBox public static ObservableCollection languageCbViewModel = new ObservableCollection { new ComboBoxViewModel { Id = 0, Content = Properties.Resources.English, Property = ELanguage.English }, - new ComboBoxViewModel { Id = 1, Content = Properties.Resources.AustralianEnglish, Property = ELanguage.AustralianEnglish }, - new ComboBoxViewModel { Id = 2, Content = Properties.Resources.BritishEnglish, Property = ELanguage.BritishEnglish }, - new ComboBoxViewModel { Id = 3, Content = Properties.Resources.French, Property = ELanguage.French }, - new ComboBoxViewModel { Id = 4, Content = Properties.Resources.German, Property = ELanguage.German }, - new ComboBoxViewModel { Id = 5, Content = Properties.Resources.Italian, Property = ELanguage.Italian }, - new ComboBoxViewModel { Id = 6, Content = Properties.Resources.Spanish, Property = ELanguage.Spanish }, - new ComboBoxViewModel { Id = 7, Content = Properties.Resources.SpanishLatin, Property = ELanguage.SpanishLatin }, - new ComboBoxViewModel { Id = 8, Content = Properties.Resources.SpanishMexico, Property = ELanguage.SpanishMexico }, - new ComboBoxViewModel { Id = 9, Content = Properties.Resources.Arabic, Property = ELanguage.Arabic }, - new ComboBoxViewModel { Id = 10, Content = Properties.Resources.Japanese, Property = ELanguage.Japanese }, - new ComboBoxViewModel { Id = 11, Content = Properties.Resources.Korean, Property = ELanguage.Korean }, - new ComboBoxViewModel { Id = 12, Content = Properties.Resources.Polish, Property = ELanguage.Polish }, - new ComboBoxViewModel { Id = 13, Content = Properties.Resources.PortugueseBrazil, Property = ELanguage.PortugueseBrazil }, - new ComboBoxViewModel { Id = 14, Content = Properties.Resources.PortuguesePortugal, Property = ELanguage.PortuguesePortugal }, - new ComboBoxViewModel { Id = 15, Content = Properties.Resources.Russian, Property = ELanguage.Russian }, - new ComboBoxViewModel { Id = 16, Content = Properties.Resources.Turkish, Property = ELanguage.Turkish }, - new ComboBoxViewModel { Id = 17, Content = Properties.Resources.Chinese, Property = ELanguage.Chinese }, - new ComboBoxViewModel { Id = 18, Content = Properties.Resources.TraditionalChinese, Property = ELanguage.TraditionalChinese }, + new ComboBoxViewModel { Id = 15, Content = Properties.Resources.AustralianEnglish, Property = ELanguage.AustralianEnglish }, + new ComboBoxViewModel { Id = 16, Content = Properties.Resources.BritishEnglish, Property = ELanguage.BritishEnglish }, + new ComboBoxViewModel { Id = 1, Content = Properties.Resources.French, Property = ELanguage.French }, + new ComboBoxViewModel { Id = 2, Content = Properties.Resources.German, Property = ELanguage.German }, + new ComboBoxViewModel { Id = 3, Content = Properties.Resources.Italian, Property = ELanguage.Italian }, + new ComboBoxViewModel { Id = 4, Content = Properties.Resources.Spanish, Property = ELanguage.Spanish }, + new ComboBoxViewModel { Id = 5, Content = Properties.Resources.SpanishLatin, Property = ELanguage.SpanishLatin }, + new ComboBoxViewModel { Id = 17, Content = Properties.Resources.SpanishMexico, Property = ELanguage.SpanishMexico }, + new ComboBoxViewModel { Id = 6, Content = Properties.Resources.Arabic, Property = ELanguage.Arabic }, + new ComboBoxViewModel { Id = 7, Content = Properties.Resources.Japanese, Property = ELanguage.Japanese }, + new ComboBoxViewModel { Id = 8, Content = Properties.Resources.Korean, Property = ELanguage.Korean }, + new ComboBoxViewModel { Id = 9, Content = Properties.Resources.Polish, Property = ELanguage.Polish }, + new ComboBoxViewModel { Id = 10, Content = Properties.Resources.PortugueseBrazil, Property = ELanguage.PortugueseBrazil }, + new ComboBoxViewModel { Id = 18, Content = Properties.Resources.PortuguesePortugal, Property = ELanguage.PortuguesePortugal }, + new ComboBoxViewModel { Id = 11, Content = Properties.Resources.Russian, Property = ELanguage.Russian }, + new ComboBoxViewModel { Id = 12, Content = Properties.Resources.Turkish, Property = ELanguage.Turkish }, + new ComboBoxViewModel { Id = 13, Content = Properties.Resources.Chinese, Property = ELanguage.Chinese }, + new ComboBoxViewModel { Id = 14, Content = Properties.Resources.TraditionalChinese, Property = ELanguage.TraditionalChinese }, new ComboBoxViewModel { Id = 19, Content = Properties.Resources.Swedish, Property = ELanguage.Swedish }, new ComboBoxViewModel { Id = 20, Content = Properties.Resources.Thai, Property = ELanguage.Thai }, new ComboBoxViewModel { Id = 21, Content = Properties.Resources.Indonesian, Property = ELanguage.Indonesian }, diff --git a/FModel/Windows/Launcher/FLauncher.xaml.cs b/FModel/Windows/Launcher/FLauncher.xaml.cs index 5993fe59..a4388926 100644 --- a/FModel/Windows/Launcher/FLauncher.xaml.cs +++ b/FModel/Windows/Launcher/FLauncher.xaml.cs @@ -144,7 +144,7 @@ namespace FModel.Windows.Launcher { if (e.Source is TextBox text) { - bool m = Regex.IsMatch(text.Text, @"^donotedit-youcanteditanyway-(?:\w+)\.manifest$"); + bool m = Regex.IsMatch(text.Text, @"^donotedit-youcanteditanyway-\w+\.manifest$"); BrowsePath.IsEnabled = !m; text.IsReadOnly = m; } diff --git a/FModel/Windows/SoundPlayer/AudioPlayer.xaml.cs b/FModel/Windows/SoundPlayer/AudioPlayer.xaml.cs index 9d63728d..817a6e70 100644 --- a/FModel/Windows/SoundPlayer/AudioPlayer.xaml.cs +++ b/FModel/Windows/SoundPlayer/AudioPlayer.xaml.cs @@ -121,6 +121,18 @@ namespace FModel.Windows.SoundPlayer } } + public void LoadFile(byte[] sound, string assetName, string gameFolder) + { + Focus(); + ListBoxVm.soundFiles.Add(new ListBoxViewModel2 + { + Content = assetName, + Data = sound, + FullPath = string.Empty, + Folder = gameFolder + }); + } + public void LoadFile(string filepath) { ListBoxViewModel2 item = ListBoxVm.soundFiles.Where(x => x.FullPath.Equals(filepath)).FirstOrDefault();