Showing with 2,512 additions and 809 deletions.
  1. +6 −8 README.md
  2. +11 −7 TextureExtraction tool/Data/ScanBase.cs
  3. +11 −2 TextureExtraction tool/Data/Unpack.cs
  4. +2 −2 TextureExtraction tool/Properties/AssemblyInfo.cs
  5. +2 −2 lib/AuroraLip/Archives/Formats/GCDisk.cs
  6. +2 −2 lib/AuroraLip/Archives/Formats/RARC.cs
  7. +3 −2 lib/AuroraLip/Archives/Formats/U8.cs
  8. +13 −0 lib/AuroraLip/AuroraLip.csproj
  9. +230 −0 lib/AuroraLip/Common/BitReader.cs
  10. +318 −1 lib/AuroraLip/Common/Extensions/BitConverterEx.cs
  11. +0 −72 lib/AuroraLip/Common/Extensions/EncodingEX.cs
  12. +1 −1 lib/AuroraLip/Common/Extensions/GenericEx.cs
  13. +35 −3 lib/AuroraLip/Common/Extensions/StreamEx.cs
  14. +7 −0 lib/AuroraLip/Common/Extensions/StreamExBitConverter.cs
  15. +53 −7 lib/AuroraLip/Common/Extensions/StreamExString.cs
  16. +7 −1 lib/AuroraLip/Common/FileAccessReflection(T).cs
  17. +1 −1 lib/AuroraLip/Common/FormatDictionary.cs
  18. +26 −15 lib/AuroraLip/Common/FormatDictionary_List.cs
  19. +11 −39 lib/AuroraLip/Compression/Compression(T).cs
  20. +18 −58 lib/AuroraLip/Compression/CompressionEx.cs
  21. +9 −4 lib/AuroraLip/Compression/CompressionReflection.cs
  22. +5 −6 lib/AuroraLip/Compression/Formats/CLZ.cs
  23. +233 −0 lib/AuroraLip/Compression/Formats/CNX.cs
  24. +48 −0 lib/AuroraLip/Compression/Formats/COMP.cs
  25. +5 −7 lib/AuroraLip/Compression/Formats/CRILAYLA.cs
  26. +42 −0 lib/AuroraLip/Compression/Formats/CXLZ.cs
  27. +42 −0 lib/AuroraLip/Compression/Formats/FCMP.cs
  28. +42 −0 lib/AuroraLip/Compression/Formats/GCLZ.cs
  29. +9 −3 lib/AuroraLip/Compression/Formats/GZip.cs
  30. +108 −6 lib/AuroraLip/Compression/Formats/LH.cs
  31. +221 −0 lib/AuroraLip/Compression/Formats/LZ00.cs
  32. +162 −0 lib/AuroraLip/Compression/Formats/LZ01.cs
  33. +174 −0 lib/AuroraLip/Compression/Formats/LZ10.cs
  34. +133 −226 lib/AuroraLip/Compression/Formats/LZ11.cs
  35. +19 −92 lib/AuroraLip/Compression/Formats/LZ77.cs
  36. +11 −5 lib/AuroraLip/Compression/Formats/LZS.cs
  37. +7 −9 lib/AuroraLip/Compression/Formats/LZSS.cs
  38. +3 −5 lib/AuroraLip/Compression/Formats/PRS.cs
  39. +24 −27 lib/AuroraLip/Compression/Formats/YAY0.cs
  40. +63 −173 lib/AuroraLip/Compression/Formats/YAZ0.cs
  41. +17 −0 lib/AuroraLip/Compression/Formats/YAZ1.cs
  42. +11 −6 lib/AuroraLip/Compression/Formats/ZLib.cs
  43. +4 −3 lib/AuroraLip/Compression/Interfaces/ICompression.cs
  44. +122 −0 lib/AuroraLip/Compression/LzBufferDictionary.cs
  45. +118 −0 lib/AuroraLip/Compression/LzWindowDictionary.cs
  46. +2 −2 lib/AuroraLip/Properties/AssemblyInfo.cs
  47. +102 −0 lib/AuroraLip/Texture/Formats/GTX.cs
  48. +8 −1 lib/AuroraLip/Texture/J3DTextureConverter.cs
  49. +1 −1 lib/AuroraLip/Texture/JUTFormatInfo.cs
  50. +1 −1 lib/AuroraLip/Texture/TexEntry.cs
  51. +1 −1 lib/Hack.io/BMD.cs
  52. +1 −1 lib/Hack.io/Content/BMD.DRW1.cs
  53. +1 −1 lib/Hack.io/Content/BMD.EVP1.cs
  54. +1 −1 lib/Hack.io/Content/BMD.INF1.cs
  55. +1 −1 lib/Hack.io/Content/BMD.JNT1.cs
  56. +1 −1 lib/Hack.io/Content/BMD.MAT3.cs
  57. +1 −1 lib/Hack.io/Content/BMD.SHP1.cs
  58. +1 −1 lib/Hack.io/Content/BMD.TEX1.cs
  59. +1 −1 lib/Hack.io/Content/BMD.VTX1.cs
@@ -42,20 +42,22 @@ List of all [commands](https://github.com/Venomalia/DolphinTextureExtraction-too

## Supported formats
### ROM images
- GCDisk (ISO), WiiDisk (ISO)
- GCDisk (ISO), WiiDisk (ISO), WAD
### Archives
- ALAR, RARC, NARC, U8, CPK, bres, BIN_MP, AFS, ARC0, RKV2, ONE_SB, ONE_UN, FBC, GVMH, FBTI, NLCM, PCKG, RTDP, TXAG, PAK_FE, PAK_Retro, PAK_RetroWii, RMHG, POD5, pBin, FSYS, POSD, SevenZip(zip, 7z, tar, deb, dmg, rpm, xar, bz2, lzh, cab, vhd)
- AFS, ALAR, ARC0, BIN_MP, CPK, FBC, FBTI, FSYS, GVMH, NARC, NLCM, ONE_SB, ONE_UN, PAK_FE, PAK_Retro, PAK_RetroWii, PCKG, POD5, POSD, RARC, RKV2, RMHG, RTDP, TXAG, U8, bres, pBin, SevenZip(zip, 7z, tar, deb, dmg, rpm, xar, bz2, lzh, cab, vhd)
### Compressing
- YAZ, YAY, CLZ, PRS, GZIP, LZ11, LZ77, LZS, LZSS, ZLib, CRILAYLA
- CNX, CLZ, COMP, CRILAYLA, CXLZ, FCMP, GCLZ, GZIP, LH, LZ00, LZ01, LZ10, LZ11, LZ77, LZS, LZSS, PRS, YAY0, YAZ0, YAZ1, ZLib
### Textures
- ATB, BTI, TPL, TPL_0, NUTC, REFT, TEX_KS, TEX_RFS, TEX, TEX1, TEX0, TXE, TXTR, PTLG, HXTB, WTMD, GCT0, GBIX, GCIX, GVRT, FIPAFTEX.
- BTI, FIPAFTEX, GBIX, GCIX, GCT0, GTX, GVRT, HXTB, NUTC, PTLG, REFT, TEX, TEX0, TEX1, TEX_KS, TEX_RFS, TPL, TPL_0, TXE, TXTR, WTMD, ATB
### Model archives
- MOD, BMD3, BDL4, MDL_LM, HSF

## Credits

- [Hack.io](https://github.com/SuperHackio/Hack.io) to read RARC, U8, YAZ, YAY, BTI, TPL, TEX1, BMD and BDL Format

- [Puyo Tools](https://github.com/nickworonekin/puyotools) Code reference for ONE GVMH, GBIX, GCIX, GVRT, Format and to read PRS, CNX, Lz00, lz01 Lz10, Lz11 Compressing.

- [HashDepot](https://github.com/ssg/HashDepot) used for xxHash generation

- [SevenZip](https://github.com/adoconnection/SevenZipExtractor) to read formats supported by 7Zip
@@ -68,8 +70,6 @@ List of all [commands](https://github.com/Venomalia/DolphinTextureExtraction-too

- [CLZ-Compression](https://github.com/sukharah/CLZ-Compression) Code reference for CLZ Compressing

- [Wexos's_Toolbox](https://wiki.tockdom.com/wiki/Wexos's_Toolbox) Code reference for LZ11, LZ77 Compressing

- [Switch-Toolbox](https://github.com/KillzXGaming/Switch-Toolbox/blob/12dfbaadafb1ebcd2e07d239361039a8d05df3f7/File_Format_Library/FileFormats/NLG/MarioStrikers/StrikersRLT.cs) Code reference for PTLG Format

- [Rune Factory Frontier Tools](https://github.com/master801/Rune-Factory-Frontier-Tools) Code reference for NLCM Archives
@@ -82,6 +82,4 @@ List of all [commands](https://github.com/Venomalia/DolphinTextureExtraction-too

- [mpatbtools](https://github.com/gamemasterplc/mpatbtools) reference for ATB Format.

- [Puyo Tools](https://github.com/nickworonekin/puyotools) Code reference for ONE GVMH, GBIX, GCIX, GVRT Format and to read PRS Compressing.

- [BrawlCrate](https://github.com/soopercool101/BrawlCrate) reference for ARC0 Format.
@@ -190,7 +190,11 @@ public virtual Results StartScan()
Result.Worke = 1;
Result.WorkeLength = file.Length;
Option.ProgressUpdate(Result);
Scan(file);

Stream stream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
Scan(new ScanObjekt(stream, file.Name.AsSpan(), 0, file.Extension));
stream.Close();

Result.Progress++;
Result.ProgressLength += file.Length;
Option.ProgressUpdate(Result);
@@ -266,7 +270,7 @@ protected void Scan(ArchiveDirectory archivdirectory, ReadOnlySpan<char> subPath
}


internal static readonly Regex illegalChars = new Regex(@"^(.*(//|\\))?(?'X'PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*| )((//|\\).*)?$|[\x00-\x1f?*:""<>|]", RegexOptions.CultureInvariant);
internal static readonly Regex illegalChars = new Regex(@"^(.*(//|\\))?(?'X'PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*| )((//|\\).*)?$|[\x00-\x1f\x7F?*:""<>|]| ((//|\\).*)?$", RegexOptions.CultureInvariant);

private double Scan(string subPath, int deep, List<ArchiveFile> fileInfos)
{
@@ -291,7 +295,7 @@ private double Scan(string subPath, int deep, List<ArchiveFile> fileInfos)
match = illegalChars.Match(path);
}

Scan(new ScanObjekt(file, Path.Combine(subPath, path.TrimEnd(' ','\\','/')).AsSpan(), deep));
Scan(new ScanObjekt(file, Path.Combine(subPath, path.TrimEnd(' ', '\\', '/')).AsSpan(), deep));
lock (Result)
{
ArchLength += Length;
@@ -377,7 +381,7 @@ protected virtual bool TryExtract(ScanObjekt so)
case ".cmp":
case ".cmparc":
case ".cmpres":
if (Reflection.Compression.TryToDecompress(so.Stream, out Stream test, out _))
if (Reflection.Compression.TryToDecompress(so.Stream, out Stream test, out Type type))
{
Scan(new ScanObjekt(test, so.SubPath, so.Deep + 1, PathEX.GetExtension(PathEX.WithoutExtension(so.SubPath)).ToString()));
return true;
@@ -436,8 +440,8 @@ protected virtual bool TryExtract(ScanObjekt so)
}
if (so.Format.Class.GetInterface(nameof(ICompression)) != null)
{
Stream destream = ((ICompression)Activator.CreateInstance(so.Format.Class)).Decompress(so.Stream);
Scan(new ScanObjekt(destream, so.SubPath, so.Deep, so.Extension));
Stream destream = new MemoryStream(((ICompression)Activator.CreateInstance(so.Format.Class)).Decompress(so.Stream));
Scan(new ScanObjekt(destream, so.SubPath, so.Deep + 1, so.Extension));
return true;
}
//External classes
@@ -461,7 +465,7 @@ protected virtual bool TryForce(ScanObjekt so)
if (so.Stream.Length < 25165824) // 24 MB
if (Reflection.Compression.TryToDecompress(so.Stream, out Stream test, out _))
{
Scan(new ScanObjekt(test, so.SubPath, so.Deep, so.Extension));
Scan(new ScanObjekt(test, so.SubPath, so.Deep +1, so.Extension));
return true;
}
so.Stream.Seek(0, SeekOrigin.Begin);
@@ -33,8 +33,17 @@ protected override void Scan(ScanObjekt so)
switch (so.Format.Typ)
{
case FormatType.Unknown:
if (Option.Force && TryForce(so))
break;
if (Option.Force)
{
if (TryForce(so))
break;
}
else
{
if (TryExtract(so))
break;
}


AddResultUnknown(so.Stream, so.Format, so.SubPath.ToString() + so.Extension);
if (so.Deep != 0)
@@ -31,5 +31,5 @@
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.2.1")]
[assembly: AssemblyFileVersion("1.0.2.1")]
[assembly: AssemblyVersion("1.0.12.10")]
[assembly: AssemblyFileVersion("1.0.12.10")]
@@ -128,15 +128,15 @@ public byte[] Data
get
{
MemoryStream stream = new MemoryStream();
stream.WriteString((string)GameID);
stream.Write((string)GameID);
stream.WriteByte(DiskID);
stream.WriteByte(Version);
stream.WriteByte(streaming);
stream.WriteByte(StreamBufSize);
stream.WriteX(14);
stream.Write(WiiMagicWord, Endian.Big);
stream.Write(GCMagicWord, Endian.Big);
stream.WriteString(GameName);
stream.Write(GameName);
stream.WriteX(0x03e0 - GameName.Length);
stream.Write(debugMonitorOffset, Endian.Big);
stream.Write(debugMonitorAddress, Endian.Big);
@@ -437,7 +437,7 @@ protected override void Write(Stream stream)
byte[] StringDataBuffer = GetStringTableBytes(FlatFileList, Root.Name, ref StringLocations).ToArray();

#region File Writing
stream.WriteString(Magic);
stream.Write(Magic);
stream.Write(new byte[16] { 0xDD, 0xDD, 0xDD, 0xDD, 0x00, 0x00, 0x00, 0x20, 0xDD, 0xDD, 0xDD, 0xDD, 0xEE, 0xEE, 0xEE, 0xEE }, 0, 16);
stream.WriteBigEndian(BitConverter.GetBytes(MRAMSize), 4);
stream.WriteBigEndian(BitConverter.GetBytes(ARAMSize), 4);
@@ -457,7 +457,7 @@ protected override void Write(Stream stream)
#region Directory Nodes
for (int i = 0; i < FlatDirectoryList.Count; i++)
{
stream.WriteString(FlatDirectoryList[i].Type);
stream.Write(FlatDirectoryList[i].Type);
stream.WriteBigEndian(BitConverter.GetBytes(StringLocations[FlatDirectoryList[i].Name]), 4);
stream.WriteBigEndian(BitConverter.GetBytes(FlatDirectoryList[i].NameHash), 2);
stream.WriteBigEndian(BitConverter.GetBytes(FlatDirectoryList[i].FileCount), 2);
@@ -1,4 +1,5 @@
using AuroraLip.Common;
using AuroraLip.Common.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
@@ -129,7 +130,7 @@ protected override void Read(Stream stream)
if (DirectoryStack.Peek().Items.ContainsKey((FlatItems[i]).Name))
{
string name = ((ArchiveFile)FlatItems[i]).Name;
((ArchiveFile)FlatItems[i]).Name = Path.GetFileName(name) + i + Path.GetExtension(name);
((ArchiveFile)FlatItems[i]).Name = $"{PathEX.WithoutExtension(name.AsSpan()).ToString()}_{i}{PathEX.GetExtension(name.AsSpan()).ToString()}";
}

FlatItems[i].Parent = DirectoryStack.Peek();
@@ -204,7 +205,7 @@ protected override void Write(Stream stream)
}

//Write the Header
stream.WriteString(Magic);
stream.Write(Magic);
stream.WriteBigEndian(BitConverter.GetBytes(0x20), 4);
stream.WriteBigEndian(BitConverter.GetBytes(Nodes.Count * 0x0C + StringBytes.Count), 4);
stream.WriteBigEndian(BitConverter.GetBytes(DataOffset), 4);
@@ -81,6 +81,7 @@
<Compile Include="Archives\DiscImage\V0Ticket.cs" />
<Compile Include="Archives\Formats\WAD.cs" />
<Compile Include="Archives\Formats\WiiDisk.cs" />
<Compile Include="Common\BitReader.cs" />
<Compile Include="Common\Extensions\MiscEX.cs" />
<Compile Include="Common\Extensions\PathEX.cs" />
<Compile Include="Common\Extensions\StringEx.cs" />
@@ -119,12 +120,21 @@
<Compile Include="Compression\CompressionReflection.cs" />
<Compile Include="Compression\Enums\CompressionLevel.cs" />
<Compile Include="Common\Exceptions.cs" />
<Compile Include="Compression\Formats\CNX.cs" />
<Compile Include="Compression\Formats\COMP.cs" />
<Compile Include="Compression\Formats\GCLZ.cs" />
<Compile Include="Compression\Formats\CXLZ.cs" />
<Compile Include="Compression\Formats\FCMP.cs" />
<Compile Include="Compression\Formats\CRILAYLA.cs" />
<Compile Include="Compression\Formats\LZ00.cs" />
<Compile Include="Compression\Formats\LZ01.cs" />
<Compile Include="Compression\Formats\LZ10.cs" />
<Compile Include="Compression\Formats\LZ77.cs" />
<Compile Include="Archives\Formats\SevenZip.cs" />
<Compile Include="Compression\Formats\LH.cs" />
<Compile Include="Compression\Formats\LZSS.cs" />
<Compile Include="Compression\Formats\PRS.cs" />
<Compile Include="Compression\Formats\YAZ1.cs" />
<Compile Include="Compression\Formats\ZLib.cs" />
<Compile Include="Compression\Formats\LZS.cs" />
<Compile Include="Compression\Formats\GZip.cs" />
@@ -135,9 +145,12 @@
<Compile Include="Compression\Interfaces\ICompressionLevel.cs" />
<Compile Include="Compression\Interfaces\ICompression.cs" />
<Compile Include="Archives\DiscImage\GameID_MakerCodes.cs" />
<Compile Include="Compression\LzBufferDictionary.cs" />
<Compile Include="Compression\LzWindowDictionary.cs" />
<Compile Include="Palette\Formats\PLT0.cs" />
<Compile Include="Palette\JUTTlut.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Texture\Formats\GTX.cs" />
<Compile Include="Texture\J3DColorConverter .cs" />
<Compile Include="Texture\DolphinTextureHash.cs" />
<Compile Include="Texture\Formats\ATB.cs" />