예제 #1
0
        private IList <Function> ParseFunctions(BinaryReaderX br, Xq32Header header, IList <Jump> jumps, IList <Instruction> instructions)
        {
            var functionStream = Decompress(br.BaseStream, header.table0Offset << 2);
            var functions      = new BinaryReaderX(functionStream).ReadMultiple <Xq32Function>(header.table0EntryCount);

            var result = new List <Function>();

            foreach (var function in functions.OrderBy(x => x.instructionOffset))
            {
                var functionName         = _stringReader.Read(function.nameOffset);
                var functionInstructions = instructions
                                           .Skip(function.instructionOffset)
                                           .Take(function.instructionEndOffset - function.instructionOffset)
                                           .ToArray();

                var functionJumps = jumps
                                    .Skip(function.jumpOffset)
                                    .Take(function.jumpCount)
                                    .ToArray();

                var functionUnknowns = new int[] { function.unk1, function.unk2 };

                result.Add(new Function(functionName, function.parameterCount, functionJumps, functionInstructions, functionUnknowns));
            }

            return(result);
        }