Merge remote-tracking branch 'origin/master' into master

# Conflicts:
#	FModel/MainWindow.xaml.cs
This commit is contained in:
GMatrixGames 2020-10-16 09:27:51 -04:00
commit 3f3a9f8551
No known key found for this signature in database
GPG Key ID: 19B7F96FB9AF302F
20 changed files with 843 additions and 110 deletions

View File

@ -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

View File

@ -127,6 +127,8 @@
<EmbeddedResource Include="Resources\Ini.xshd" />
<EmbeddedResource Include="Resources\Json.xshd" />
<EmbeddedResource Include="Resources\Xml.xshd" />
<None Remove="Resources\Detex.dll" />
<EmbeddedResource Include="Resources\Detex.dll" />
</ItemGroup>
<ItemGroup>

View File

@ -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<string, object> Map;
internal UAkAudioEvent(PackageReader reader)
{
_ = new UObject(reader, true);
Map = new Dictionary<string, object>(1)
{
{ "MaxAttenuationRadius", reader.ReadFloat() }
};
}
public object this[string key] => Map[key];
public IEnumerable<string> Keys => Map.Keys;
public IEnumerable<object> Values => Map.Values;
public int Count => Map.Count;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool ContainsKey(string key) => Map.ContainsKey(key);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public IEnumerator<KeyValuePair<string, object>> 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);
}
}

View File

@ -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);
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -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),
};

View File

@ -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);
}
}
}
}

View File

@ -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,
}
}

View File

@ -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
),
}
}

View File

@ -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
),
}
}

View File

@ -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");
}

View File

@ -792,5 +792,59 @@ It's now the most used free software to leak on Fortnite.</value>
</data>
<data name="NoKeyWarning" xml:space="preserve">
<value>يعمل (AES)مشفر لفك تشفيرها يرجى تحديد مفتاح تشفير (.pak) تم العثور على ملف </value>
</data>
<data name="ResetSettings" xml:space="preserve">
<value>اعادة ضبط الاعدادات</value>
</data>
<data name="GameName_Fortnite" xml:space="preserve">
<value>Fortnite</value>
</data>
<data name="GameName_Valorant" xml:space="preserve">
<value>Valorant</value>
</data>
<data name="GameName_DeadByDaylight" xml:space="preserve">
<value>Dead By Daylight</value>
</data>
<data name="GameName_Borderlands3" xml:space="preserve">
<value>Borderlands 3</value>
</data>
<data name="GameName_MinecraftDungeons" xml:space="preserve">
<value>Minecraft Dungeons</value>
</data>
<data name="AustralianEnglish" xml:space="preserve">
<value>انكليزي استرالي</value>
</data>
<data name="BritishEnglish" xml:space="preserve">
<value>انكليزي بريطاني</value>
</data>
<data name="PortuguesePortugal" xml:space="preserve">
<value>اللغة البرتغالية</value>
</data>
<data name="SpanishMexico" xml:space="preserve">
<value>اللغة الاسبانية / المكسيكية</value>
</data>
<data name="Swedish" xml:space="preserve">
<value>اللغة السويدية</value>
</data>
<data name="Thai" xml:space="preserve">
<value>اللغة التايلاندية</value>
</data>
<data name="Indonesian" xml:space="preserve">
<value>اللغة الأندونيسية</value>
</data>
<data name="VietnameseVietnam" xml:space="preserve">
<value>اللغة الفيتنامية</value>
</data>
<data name="GameName_BattleBreakers" xml:space="preserve">
<value>Battle Breakers</value>
</data>
<data name="GameName_Spellbreak" xml:space="preserve">
<value>Spellbreak</value>
</data>
<data name="GameName_StateofDecay2" xml:space="preserve">
<value>State of Decay 2</value>
</data>
<data name="GameName_TheCycle" xml:space="preserve">
<value>The Cycle</value>
</data>
</root>

View File

@ -279,14 +279,6 @@
<data name="ContributorsF" xml:space="preserve">
<value>Contribuidoras</value>
</data>
<data name="ContributorsFDetails" xml:space="preserve">
<value>• Waddlesworth • Maiky
• FunGames • Not Officer
• PsychoPast • TSG
• GMatrixGames • Jackson
• XTigerHyperX • FireMonkey</value>
<comment>Do not translate</comment>
</data>
<data name="CopySuccess" xml:space="preserve">
<value>Copiado!</value>
</data>
@ -345,14 +337,6 @@
<data name="DonatorsF" xml:space="preserve">
<value>Doadores</value>
</data>
<data name="DonatorsFDetails" xml:space="preserve">
<value>• Yanteh • Maiky
• FunGames • HYPEX ♥
• Alexander • Netu ♥
• SexyNutella • imatrix
• Frenzy Leaks • LlamaLeaks</value>
<comment>Do not translate</comment>
</data>
<data name="DownloadError" xml:space="preserve">
<value>Erro Ao Fazer Download De {0}</value>
</data>
@ -738,9 +722,7 @@ FModel Lançador</value>
<comment>General Settings Window</comment>
</data>
<data name="PathChangedRestart" xml:space="preserve">
<value>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)</value>
<value>FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho (s)</value>
<comment>General Settings Window</comment>
</data>
<data name="pause" type="System.Resources.ResXFileRef, System.Windows.Forms">
@ -933,14 +915,6 @@ FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho (
<data name="TranslatorsF" xml:space="preserve">
<value>Tradutores</value>
</data>
<data name="TranslatorsFDetails" xml:space="preserve">
<value>• 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</value>
<comment>Do not translate</comment>
</data>
<data name="Turkish" xml:space="preserve">
<value>Turco</value>
</data>
@ -1063,9 +1037,6 @@ FModel está prestes a reiniciar porque você aplicou seu (s) novo (s) caminho (
<data name="Xml" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Xml.xshd;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="Trello" xml:space="preserve">
<value>Trello</value>
</data>
<data name="trello1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\trello.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

View File

@ -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);
/// <summary>
/// IMPORTANT: i believe Upgrade doesn't like int32 so use int64 (maybe because it's for x64?) for all int values

BIN
FModel/Resources/Detex.dll Normal file

Binary file not shown.

View File

@ -219,6 +219,23 @@ namespace FModel.Utils
return p;
}
var ak = p.GetExport<UAkMediaAssetData>();
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<Window>(Properties.Resources.AudioPlayer))
new AudioPlayer().LoadFile(ak.Sound, entry.GetNameWithoutExtension() + ".wem", mount + entry.GetPathWithoutFile());
else
((AudioPlayer)FWindows.GetOpenedWindow<Window>(Properties.Resources.AudioPlayer)).LoadFile(ak.Sound, entry.GetNameWithoutExtension() + ".wem", mount + entry.GetPathWithoutFile());
});
}
return p;
}
// Sound
var s = p.GetExport<USoundWave>();
if (s != null && (s.AudioFormat.String.Equals("OGG") || s.AudioFormat.String.Equals("OGG10000-1-1-1-1-1")))

View File

@ -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));

View File

@ -52,24 +52,24 @@ namespace FModel.ViewModels.ComboBox
public static ObservableCollection<ComboBoxViewModel> languageCbViewModel = new ObservableCollection<ComboBoxViewModel>
{
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 },

View File

@ -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;
}

View File

@ -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();