Stare pliki OWP (z demo amerykańskiego)
Posted: Tue Feb 20, 2018 12:19 am
Jako, że na streamie Livida padł temat możliwości wypakowania plików ze starego formatu OWP - posiedziałem chwilę i napisałem kilka linijek.
Kod jest w c# jakby ktoś byłby zainteresowany
Sama appka do pobrania z http://patryk.tenderenda.net/OldOWPExtractor.zip
Jest to appka konsolowa, uruchamia się ją następująco:
np.:
Z moich krótkich testów radzi sobie z demo AM - https://original-war.net/files.php?id=54 - z wyłączeniem plików dzwiękowych - prawdopodobnie są one zakodowane czymś jeszcze
.
Kod jest w c# jakby ktoś byłby zainteresowany
Code: Select all
using System;
using System.IO;
namespace OldOWPExtractor
{
struct FileHeader
{
// 8 bytes - unknown ??
public byte[] Unknown;
// 4 bytes - file length
public uint Size;
// 4 bytes - fule start position
public uint StartPositon;
// 131 bytes = 1 byte (length) + 130 bytes (file path)
public string Path;
}
class Program
{
private static int FilesCountHeader = 8;
private static int HeaderLength = 148;
static void Main(string[] args)
{
string file;
string outputDirectory;
if (args.Length != 2)
{
Console.Out.WriteLine("Usage: program <input owp file> <output directory>");
return;
}
else
{
file = args[0];
outputDirectory = args[1];
}
if (!File.Exists(file))
{
Console.Out.WriteLine("Given file doesn't exists.");
return;
}
Run(file, outputDirectory);
Console.WriteLine("Done.\nPress key to close...");
Console.ReadKey();
}
private static void Run(string file, string outputDirectory)
{
var fileContent = File.ReadAllBytes(file);
var fileSize = fileContent.Length;
Console.WriteLine($"File size: {fileSize:0,0}");
int i = 0;
var position = fileSize - FilesCountHeader;
if (!Directory.Exists(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
}
using (var ms = new MemoryStream(fileContent))
using (var br = new BinaryReader(ms))
{
br.BaseStream.Seek(position, SeekOrigin.Begin);
var filesCount = br.ReadUInt64();
while (filesCount-- > 0)
{
position -= HeaderLength;
br.BaseStream.Seek(position, SeekOrigin.Begin);
var tmp = br.ReadBytes(HeaderLength);
var header = ReadHeader(tmp);
Console.WriteLine($"[{i++}] File: {header.Path} | Size: {header.Size:0,0} bytes | Start: {header.StartPositon:0,0} bytes");
var dir = Path.Combine(outputDirectory, Path.GetDirectoryName(header.Path));
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var fullPath = Path.Combine(dir, Path.GetFileName(header.Path));
br.BaseStream.Seek(header.StartPositon, SeekOrigin.Begin);
var fileBytes = br.ReadBytes((int)header.Size);
File.WriteAllBytes(fullPath, fileBytes);
}
}
Console.WriteLine($"All files: {i}" );
}
private static FileHeader ReadHeader(byte[] data)
{
FileHeader header = new FileHeader();
using (var ms = new MemoryStream(data))
using (var br = new BinaryReader(ms))
{
header.Unknown = br.ReadBytes(8);
header.Size = br.ReadUInt32();
header.StartPositon = br.ReadUInt32();
header.Path = br.ReadString();
}
return header;
}
}
}
Jest to appka konsolowa, uruchamia się ją następująco:
Code: Select all
OldOWPExtractor.exe <in owp file> <out dir>
Code: Select all
OldOWPExtractor.exe "D:\Gry\ALTAR\Original War Demo" "D:\out"
