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;
        }
示例#2
0
        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);
        }
示例#3
0
        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;
        }