コード例 #1
0
        public void loadfile()
        {
            Natives = new Dictionary <uint, Tuple <Stack.DataType, Stack.DataType[]> >();
            string file = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
                                       "nativeinfo.dat");

            if (!File.Exists(file))
            {
                return;
            }
            Stream natfile = File.OpenRead(file);

            IO.Reader reader = new IO.Reader(natfile, true);
            while (natfile.Position < natfile.Length)
            {
                uint             native     = reader.ReadUInt32();
                Stack.DataType   returntype = Types.getatindex(reader.ReadByte());
                byte             count      = reader.ReadByte();
                Stack.DataType[] param      = new Stack.DataType[count];
                for (byte i = 0; i < count; i++)
                {
                    param[i] = Types.getatindex(reader.ReadByte());
                }
                Natives.Add(native, new Tuple <Stack.DataType, Stack.DataType[]>(returntype, param));
            }
        }
コード例 #2
0
        static ScriptHeader GeneratePcHeader(Stream scriptStream)
        {
            ScriptHeader header = new ScriptHeader();

            IO.Reader reader = new IO.Reader(scriptStream);
            scriptStream.Seek(0, SeekOrigin.Begin);
            header.RSC7Offset = (reader.ReadUInt32() == 0x37435352) ? 0x10 : 0x0;
            scriptStream.Seek(header.RSC7Offset, SeekOrigin.Begin);
            header.Magic = reader.ReadInt32();              //0x0
            reader.Advance();
            header.SubHeader = reader.ReadPointer();        //0x8
            reader.Advance();
            header.CodeBlocksOffset = reader.ReadPointer(); //0x10
            reader.Advance();
            header.GlobalsVersion = reader.ReadInt32();     //0x18
            header.CodeLength     = reader.ReadInt32();     //0x1C
            header.ParameterCount = reader.ReadInt32();     //0x20
            header.StaticsCount   = reader.ReadInt32();     //0x24
            header.GlobalsCount   = reader.ReadInt32();     //0x28
            header.NativesCount   = reader.ReadInt32();     //0x2C
            header.StaticsOffset  = reader.ReadPointer();   //0x30
            reader.Advance();
            header.GlobalsOffset = reader.ReadPointer();    //0x38
            reader.Advance();
            header.NativesOffset = reader.ReadPointer();    //0x40
            reader.Advance();
            header.Null1 = reader.ReadInt32();              //0x48
            reader.Advance();
            header.Null2 = reader.ReadInt32();              //0x50
            reader.Advance();
            header.NameHash         = reader.ReadInt32();   //0x58
            header.Null3            = reader.ReadInt32();   //0x5C
            header.ScriptNameOffset = reader.ReadPointer(); //0x60
            reader.Advance();
            header.StringsOffset = reader.ReadPointer();    //0x68
            reader.Advance();
            header.StringsSize = reader.ReadInt32();        //0x70
            reader.Advance();
            header.Null4 = reader.ReadInt32();              //0x78
            reader.Advance();

            header.StringBlocks = (header.StringsSize + 0x3FFF) >> 14;
            header.CodeBlocks   = (header.CodeLength + 0x3FFF) >> 14;

            header.StringTableOffsets = new Int32[header.StringBlocks];
            scriptStream.Seek(header.StringsOffset + header.RSC7Offset, SeekOrigin.Begin);
            for (int i = 0; i < header.StringBlocks; i++)
            {
                header.StringTableOffsets[i] = reader.ReadPointer() + header.RSC7Offset;
                reader.Advance();
            }


            header.CodeTableOffsets = new Int32[header.CodeBlocks];
            scriptStream.Seek(header.CodeBlocksOffset + header.RSC7Offset, SeekOrigin.Begin);
            for (int i = 0; i < header.CodeBlocks; i++)
            {
                header.CodeTableOffsets[i] = reader.ReadPointer() + header.RSC7Offset;
                reader.Advance();
            }
            scriptStream.Position = header.ScriptNameOffset + header.RSC7Offset;
            int data = scriptStream.ReadByte();

            header.ScriptName = "";
            while (data != 0 && data != -1)
            {
                header.ScriptName += (char)data;
                data = scriptStream.ReadByte();
            }
            return(header);
        }