Beispiel #1
0
        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");
             */
        }
Beispiel #2
0
        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);
        }