mirror of
https://github.com/MichaelHinrichs/Anachronox-Extractor.git
synced 2024-11-12 22:35:23 +08:00
68 lines
2.1 KiB
C#
68 lines
2.1 KiB
C#
|
//Written for Anachronox. https://store.steampowered.com/app/242940/
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.IO.Compression;
|
|||
|
|
|||
|
namespace Anachronox_Extractor
|
|||
|
{
|
|||
|
class Program
|
|||
|
{
|
|||
|
static BinaryReader br;
|
|||
|
static void Main(string[] args)
|
|||
|
{
|
|||
|
br = new(File.OpenRead(args[0]));
|
|||
|
|
|||
|
if (new string(br.ReadChars(4)) != "ADAT")
|
|||
|
throw new Exception("Not a Anachronox dat file.");
|
|||
|
|
|||
|
int fileTable = br.ReadInt32();
|
|||
|
br.ReadInt32();
|
|||
|
br.ReadInt32();
|
|||
|
|
|||
|
br.BaseStream.Position = fileTable;
|
|||
|
|
|||
|
List<Subfile> subfiles = new();
|
|||
|
|
|||
|
while(br.BaseStream.Position < br.BaseStream.Length)
|
|||
|
{
|
|||
|
subfiles.Add(new());
|
|||
|
}
|
|||
|
|
|||
|
foreach (Subfile sub in subfiles)
|
|||
|
{
|
|||
|
Extract(sub, Path.GetDirectoryName(args[0]) + "//" + Path.GetFileNameWithoutExtension(args[0]) + "//");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static void Extract(Subfile sub, string path)
|
|||
|
{
|
|||
|
br.BaseStream.Position = sub.start;
|
|||
|
if (sub.sizeCompressed == 0)
|
|||
|
{
|
|||
|
Directory.CreateDirectory(path + Path.GetDirectoryName(sub.name));
|
|||
|
using FileStream FS = File.Create(path + sub.name);
|
|||
|
BinaryWriter bw = new(FS);
|
|||
|
bw.Write(br.ReadBytes(sub.sizeUncompressed));
|
|||
|
bw.Close();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
br.ReadInt16();
|
|||
|
Directory.CreateDirectory(path + Path.GetDirectoryName(sub.name));
|
|||
|
using var ds = new DeflateStream(new MemoryStream(br.ReadBytes(sub.sizeCompressed - 2)), CompressionMode.Decompress);
|
|||
|
ds.CopyTo(File.Create(path + sub.name));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Subfile
|
|||
|
{
|
|||
|
public string name = new string(br.ReadChars(0x80)).TrimEnd((char)0x00);
|
|||
|
public int start = br.ReadInt32();
|
|||
|
public int sizeUncompressed = br.ReadInt32();
|
|||
|
public int sizeCompressed = br.ReadInt32();
|
|||
|
public float unknown = br.ReadSingle();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|