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