public NativeTable(Stream scriptFile, int position, int length) { IO.Reader reader = new IO.Reader(scriptFile, true); int count = 0; uint nat; reader.BaseStream.Position = position; _natives = new List <string>(); _nativehash = new List <uint>(); while (count < length) { nat = reader.SReadUInt32(); _nativehash.Add(nat); if (Program.nativefile.ContainsKey(nat)) { _natives.Add(Program.nativefile[nat]); } else { string temps = nat.ToString("X"); while (temps.Length < 8) { temps = "0" + temps; } _natives.Add("unk_0x" + temps); } count++; } }
static ScriptHeader GenerateConsoleHeader(Stream scriptStream) { ScriptHeader header = new ScriptHeader(); IO.Reader reader = new IO.Reader(scriptStream); scriptStream.Seek(0, SeekOrigin.Begin); header.RSC7Offset = (reader.SReadUInt32() == 0x52534337) ? 0x10 : 0x0; scriptStream.Seek(header.RSC7Offset, SeekOrigin.Begin); header.Magic = reader.SReadInt32(); //0x0 header.SubHeader = reader.SReadPointer(); //0x4 header.CodeBlocksOffset = reader.SReadPointer(); //0x8 header.GlobalsVersion = reader.SReadInt32(); //0x C header.CodeLength = reader.SReadInt32(); //0x10 header.ParameterCount = reader.SReadInt32(); //0x14 header.StaticsCount = reader.SReadInt32(); //0x18 header.GlobalsCount = reader.SReadInt32(); //0x1C header.NativesCount = reader.SReadInt32(); //0x20 header.StaticsOffset = reader.SReadPointer(); //0x24 header.GlobalsOffset = reader.SReadPointer(); //0x28 header.NativesOffset = reader.SReadPointer(); //0x2C header.Null1 = reader.SReadInt32(); //0x30 header.Null2 = reader.SReadInt32(); //0x34 header.NameHash = reader.SReadInt32(); header.Null3 = reader.SReadInt32(); //0x38 header.ScriptNameOffset = reader.SReadPointer(); //0x40 header.StringsOffset = reader.SReadPointer(); //0x44 header.StringsSize = reader.SReadInt32(); //0x48 header.Null4 = reader.ReadInt32(); //0x4C 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.SReadPointer() + header.RSC7Offset; } 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.SReadPointer() + header.RSC7Offset; } 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); }