private static List<ScenarioFileEntry> FindText( Stream stream, uint textStart, bool isUtf8 ) { var list = new List<ScenarioFileEntry>(); while ( stream.Position < textStart ) { uint identifyingBytes = stream.ReadUInt32(); if ( identifyingBytes == 0x18000C04 ) { uint pos = (uint)stream.Position; uint pointerToText = stream.ReadUInt32().SwapEndian() + textStart; stream.Position = pointerToText; stream.ReadUInt32().SwapEndian(); stream.ReadUInt32().SwapEndian(); uint jpNamePtr = stream.ReadUInt32().SwapEndian(); uint jpTextPtr = stream.ReadUInt32().SwapEndian(); uint enNamePtr = stream.ReadUInt32().SwapEndian(); uint enTextPtr = stream.ReadUInt32().SwapEndian(); stream.Position = jpNamePtr + textStart; string jpName = isUtf8 ? stream.ReadUTF8Nullterm() : stream.ReadShiftJisNullterm(); stream.Position = jpTextPtr + textStart; string jpText = isUtf8 ? stream.ReadUTF8Nullterm() : stream.ReadShiftJisNullterm(); stream.Position = enNamePtr + textStart; string enName = isUtf8 ? stream.ReadUTF8Nullterm() : stream.ReadShiftJisNullterm(); stream.Position = enTextPtr + textStart; string enText = isUtf8 ? stream.ReadUTF8Nullterm() : stream.ReadShiftJisNullterm(); var entry = new ScenarioFileEntry() { Pointer = pos, JpName = jpName, EnName = enName, JpText = jpText, EnText = enText }; list.Add( entry ); stream.Position = pos + 4; } } return list; }
private bool LoadFile(Stream stream, EndianUtils.Endianness endian, TextUtils.GameTextEncoding encoding, uint textPointerLocationDiff) { string magic = stream.ReadAscii(8); uint alwaysSame = stream.ReadUInt32().FromEndian(endian); uint filesize = stream.ReadUInt32().FromEndian(endian); uint lengthSection1 = stream.ReadUInt32().FromEndian(endian); stream.Position = 0x50; int textPointerDiffDiff = (int)stream.ReadUInt32().FromEndian(endian); stream.Position = 0x20; uint textStart = stream.ReadUInt32().FromEndian(endian); int textPointerDiff = (int)stream.ReadUInt32().FromEndian(endian) - textPointerDiffDiff; EntryList = new List <ScenarioFileEntry>(); // i wonder what the actual logic behind this is... uint textPointersLocation = (lengthSection1 + 0x80).Align(0x10) + textPointerLocationDiff; // + 0x1888; // + 0x1B4C // diff of 2C4 // Actually this isn't constant, dammit. if (textStart != textPointersLocation) { stream.Position = textPointersLocation; while (true) { long loc = stream.Position; stream.DiscardBytes(8); uint[] ptrs = new uint[4]; ptrs[0] = stream.ReadUInt32().FromEndian(endian); ptrs[1] = stream.ReadUInt32().FromEndian(endian); ptrs[2] = stream.ReadUInt32().FromEndian(endian); ptrs[3] = stream.ReadUInt32().FromEndian(endian); if (stream.Position > textStart) { break; } if (ptrs.Any(x => x == 0)) { break; } if (ptrs.Any(x => x + textPointerDiff < textStart)) { break; } if (ptrs.Any(x => x + textPointerDiff >= filesize)) { break; } var s = new ScenarioFileEntry(); s.Pointer = (uint)loc; s.JpName = stream.ReadNulltermStringFromLocationAndReset(ptrs[0] + textPointerDiff, encoding); s.JpText = stream.ReadNulltermStringFromLocationAndReset(ptrs[1] + textPointerDiff, encoding); s.EnName = stream.ReadNulltermStringFromLocationAndReset(ptrs[2] + textPointerDiff, encoding); s.EnText = stream.ReadNulltermStringFromLocationAndReset(ptrs[3] + textPointerDiff, encoding); EntryList.Add(s); stream.Position = loc + 0x18; } } return(true); }
private bool LoadFile( Stream stream, uint textPointerLocationDiff ) { string magic = stream.ReadAscii( 8 ); uint alwaysSame = stream.ReadUInt32().SwapEndian(); uint filesize = stream.ReadUInt32().SwapEndian(); uint lengthSection1 = stream.ReadUInt32().SwapEndian(); stream.Position = 0x50; int textPointerDiffDiff = (int)stream.ReadUInt32().SwapEndian(); stream.Position = 0x20; uint textStart = stream.ReadUInt32().SwapEndian(); int textPointerDiff = (int)stream.ReadUInt32().SwapEndian() - textPointerDiffDiff; EntryList = new List<ScenarioFileEntry>(); // i wonder what the actual logic behind this is... uint textPointersLocation = ( lengthSection1 + 0x80 ).Align( 0x10 ) + textPointerLocationDiff; // + 0x1888; // + 0x1B4C // diff of 2C4 // Actually this isn't constant, dammit. if ( textStart != textPointersLocation ) { stream.Position = textPointersLocation; while ( true ) { long loc = stream.Position; stream.DiscardBytes( 8 ); uint[] ptrs = new uint[4]; ptrs[0] = stream.ReadUInt32().SwapEndian(); ptrs[1] = stream.ReadUInt32().SwapEndian(); ptrs[2] = stream.ReadUInt32().SwapEndian(); ptrs[3] = stream.ReadUInt32().SwapEndian(); if ( stream.Position > textStart ) { break; } if ( ptrs.Any( x => x == 0 ) ) { break; } if ( ptrs.Any( x => x + textPointerDiff < textStart ) ) { break; } if ( ptrs.Any( x => x + textPointerDiff >= filesize ) ) { break; } var s = new ScenarioFileEntry(); s.Pointer = (uint)loc; stream.Position = ptrs[0] + textPointerDiff; s.JpName = stream.ReadShiftJisNullterm(); stream.Position = ptrs[1] + textPointerDiff; s.JpText = stream.ReadShiftJisNullterm(); stream.Position = ptrs[2] + textPointerDiff; s.EnName = stream.ReadShiftJisNullterm(); stream.Position = ptrs[3] + textPointerDiff; s.EnText = stream.ReadShiftJisNullterm(); EntryList.Add( s ); stream.Position = loc + 0x18; } } return true; }