Exemplo n.º 1
0
        private int Disassemble(DisassembleOptions options)
        {
            string path = Path.GetFullPath(options.FileName);

            if (!File.Exists(path))
            {
                PrintError("File does not exist: " + path);
                return(2);
            }

            FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
            AcsFormat  format = AcsFormatIdentifier.IdentifyFormat(stream);

            if (format == AcsFormat.NotAcs)
            {
                stream.Dispose();
                PrintError(path + " is not an ACS file!");
                return(3);
            }

            Console.WriteLine("Detected format: " + format);

            string outputPath = Path.GetFullPath(options.OutputFile);

            if (File.Exists(outputPath))
            {
                File.Delete(outputPath);
            }

            FileStream outputStream = new FileStream(outputPath, FileMode.OpenOrCreate, FileAccess.Write);

            AcsFile file = new AcsFile(stream, format);

            file.Disassemble(outputStream);

            outputStream.Dispose();
            stream.Dispose();

            return(0);
        }
Exemplo n.º 2
0
        public AcsFile(Stream stream, AcsFormat format)
        {
            InputStream = stream;
            Format      = format;

            stream.Seek(4, SeekOrigin.Begin);

            BinaryReader reader    = new BinaryReader(InputStream);
            int          dirOffset = reader.ReadInt32();

            if (format == AcsFormat.ZDoomLower || format == AcsFormat.ZDoomUpper)
            {
                byte[] sig = new byte[4];
                stream.Seek(dirOffset - 4, SeekOrigin.Begin);
                reader.Read(sig, 0, 4);

                if (sig[0] == 'A' && sig[1] == 'C' && sig[2] == 'S' && (sig[3] == 'E' || sig[3] == 'e'))
                {
                    HexenFaked = true;
                    stream.Seek(dirOffset - 8, SeekOrigin.Begin);
                    dirOffset = reader.ReadInt32();
                }
            }

            stream.Seek(dirOffset, SeekOrigin.Begin);
            DirOffset = dirOffset;

            if (format == AcsFormat.Acs95)
            {
                ReadAcs95(ref reader);
            }
            else
            {
                ReadZDoomAcs(ref reader);
            }

            reader.Dispose();
        }