Stare pliki OWP (z demo amerykańskiego)

Wszystko o modach, patchach i błędach w OW oraz ogólnym programowaniu.
Post Reply
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Stare pliki OWP (z demo amerykańskiego)

Post by Gothuk »

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

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

    }
}
Sama appka do pobrania z http://patryk.tenderenda.net/OldOWPExtractor.zip
Jest to appka konsolowa, uruchamia się ją następująco:

Code: Select all

OldOWPExtractor.exe <in owp file> <out dir>
np.:

Code: Select all

OldOWPExtractor.exe "D:\Gry\ALTAR\Original War Demo" "D:\out"
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 ;).
User avatar
zoNE
The Great Uniter & Site Administrator
The Great Uniter & Site Administrator
Posts: 2059
Joined: Fri Feb 17, 2006 3:44 pm
Location: Poland
Contact:

Re: Stare pliki OWP (z demo amerykańskiego)

Post by zoNE »

Like :disco:.
Last edited by zoNE on Tue Feb 20, 2018 12:44 am, edited 1 time in total.
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: Stare pliki OWP (z demo amerykańskiego)

Post by Gothuk »

Okej, Stu poinformował mnie, że w sumie opcja ta jest wbudowana w PakViewa oryginalnego:

https://imgur.com/a/pCtes

:)
User avatar
Prażanin
Soldier level 3
Soldier level 3
Poland
Posts: 65
Joined: Sat Dec 09, 2017 9:14 pm
Location: Praga Północ

Re: Stare pliki OWP (z demo amerykańskiego)

Post by Prażanin »

Jasny gwint, to my się głowiliśmy jak to otworzyć kilka godzin, a tu wszystko było podane na tacy...

Mimo wszystko dobrze się stało, bo przynajmniej wiemy już że się da xD
User avatar
zoNE
The Great Uniter & Site Administrator
The Great Uniter & Site Administrator
Posts: 2059
Joined: Fri Feb 17, 2006 3:44 pm
Location: Poland
Contact:

Re: Stare pliki OWP (z demo amerykańskiego)

Post by zoNE »

No, jak rozmawiałem o tym ze Stucikiem w 2007, to mówił że się nie da, ale chyba pracował nad tym jeszcze później i jednak to dodał.
Post Reply