static void runTest(string filename) { Console.WriteLine($"Unit test for {filename}"); var inFile = filename; cmdarg.assert(!File.Exists(inFile), $"Halt: {inFile} doesn't exist."); var fileStream = File.OpenRead(inFile); var fileReader = new BinaryReader(fileStream); var afsData = AFSFile.load(fileReader); var scene = afsData.sections[0]; var wl = new JSRDemoBin(scene); wl.parse(); Console.ReadLine(); /* * * * * // Scene Parse * var sceneSectData = afsData.sections[0].data; * var sceneSectReader = new MemoryStream(sceneSectData); * var sceneSect = new BinaryReader(sceneSectReader); * * var scenePointers = new Stack<uint>(); * uint b = 0; * uint largestPointer = 0; * uint smallestPointer = 0xFFFFFFFF; * * while (((b = sceneSect.ReadUInt32()) & 0x8C000000) == 0x8C000000)// bruh * { * if (!((b & 0x8C000000) == 0x8C000000)) * break; * if (b > 0x8CFFFFFF) * break; * scenePointers.Push(b); * if (b > largestPointer) * largestPointer = b; * if (b < smallestPointer) * smallestPointer = b; * * } * // UNWRAP STACK HERE * var sections = new uint[scenePointers.Count]; * for (int i = scenePointers.Count - 1; i >= 0; i--) * sections[i] = scenePointers.Pop(); * // * * Console.WriteLine(); * Console.WriteLine($"Offset high = 0x{largestPointer:X}, low = {smallestPointer:X}"); * Console.WriteLine($"Virtual allocation address = 0x8c800000"); */ }
public AFSSection[] sections; // sections are relative to file base public static AFSFile load(BinaryReader reader) { var head = reader.ReadInt32(); if (head != AFS_HEAD) { throw new InvalidDataException($"AFSFile.load expected 0x{AFS_HEAD:X} 'AFS\\x00', got {head:X}"); } var AFS = new AFSFile(); AFS.sectionCount = reader.ReadInt32(); AFS.sections = new AFSSection[AFS.sectionCount]; for (int i = 0; i < AFS.sectionCount; i++) { AFS.sections[i] = AFSSection.load(reader); } for (int i = 0; i < AFS.sectionCount; i++) { reader.BaseStream.Position = AFS.sections[i].offset; //Console.WriteLine($"{reader.BaseStream.Position:X}, {AFS.sections[i].length:X} "); AFS.sections[i].data = reader.ReadBytes(AFS.sections[i].length); } // we're at the end anchor of the second section /* * // locate filetable offset * // there's probably better way to do this * Console.WriteLine("Finding filetable..."); * while ((reader.ReadByte()) == 0) ; * * reader.BaseStream.Position -= 1; // Dec one pos. * //NNGHGHGNGHH */ reader.BaseStream.Position = AFS.sections[0].offset - 0x10; reader.ReadUInt64(); var filetable_offset = reader.ReadUInt32(); // Console.WriteLine($"{filetable_offset:X}"); reader.BaseStream.Position = filetable_offset; for (int i = 0; i < AFS.sectionCount; i++) { AFS.sections[i].descriptor = AFSSectionDescriptor.load(reader); } return(AFS); }