Пример #1
0
        public override void Write(EndianBinWriter writer, int baseOffset, int baseDataOffset)
        {
            writer.BaseStream.Position = baseDataOffset;
            int baseNameOffset = (int)writer.BaseStream.Position;

            writer.WriteNullTerminatedString(Name, 0x04);
            int pairUnitOffset = (int)writer.BaseStream.Position;

            // Proceed to write the string tree, skip the entry map for now
            writer.BaseStream.Position += EntrySize * PairUnits.Count;
            int lastStringPos = (int)writer.BaseStream.Position;

            // Write our strings
            int j = 0;

            foreach (var pair in PairUnits)
            {
                writer.BaseStream.Position = lastStringPos;

                int labelOffset = (int)writer.BaseStream.Position;
                writer.WriteNullTerminatedString(pair.Value.Label, 4);

                int valueOffset = (int)writer.BaseStream.Position;
                writer.WriteNullTerminatedString(pair.Value.Value, 4);

                lastStringPos = (int)writer.BaseStream.Position;

                // Write the offsets
                writer.BaseStream.Position = pairUnitOffset + (j * RT04Page.EntrySize);
                writer.Write(pair.Value.ID);
                writer.Write(labelOffset);
                writer.Write(valueOffset);

                j++;
            }

            // Finish page toc entry
            writer.BaseStream.Position = baseOffset;
            writer.Write(baseNameOffset);
            writer.Write(PairUnits.Count);
            writer.Write(pairUnitOffset);
            writer.Write(0x5E5E5E5E); // Padding

            // Seek to the end of it
            writer.BaseStream.Position = writer.BaseStream.Length;
        }
Пример #2
0
        public override void Write(EndianBinWriter writer, int baseOffset, int baseDataOffset)
        {
            writer.BaseStream.Position = baseDataOffset;
            int baseNameOffset = (int)writer.BaseStream.Position;

            writer.WriteNullTerminatedString(Name, 0x04);
            int pairUnitOffset = (int)writer.BaseStream.Position;

            // Proceed to write the string tree, skip the entry map for now
            writer.BaseStream.Position += EntrySize * PairUnits.Count;
            int lastStringPos = (int)writer.BaseStream.Position;


            // Setup for binary searching - strings are sorted by length, then their encrypted values
            // Override the sorting logic - couldn't find a better way to structure this to make it work across all versions
            // Not the most efficient
            var orderedPairs = PairUnits.Values.OrderBy(
                e => Encrypt(Encoding.UTF8.GetBytes(e.Label), Constants.KEY.AlignString(0x20)),
                ByteBufferComparer.Default);

            // Write our strings
            int j = 0;

            foreach (var pair in orderedPairs)
            {
                writer.BaseStream.Position = lastStringPos;

                int labelOffset = (int)writer.BaseStream.Position;
                var encLabel    = Encrypt(Encoding.UTF8.GetBytes(pair.Label), Constants.KEY.AlignString(0x20));
                writer.WriteAligned(encLabel, 4, nullTerminate: true);

                int valueOffset = (int)writer.BaseStream.Position;
                var encValue    = Encrypt(Encoding.UTF8.GetBytes(pair.Value), Constants.KEY.AlignString(0x20));
                writer.WriteAligned(encValue, 4, nullTerminate: true);

                lastStringPos = (int)writer.BaseStream.Position;

                // Write the offsets
                writer.BaseStream.Position = pairUnitOffset + (j * EntrySize);
                writer.Write(pair.ID);
                writer.Write((ushort)(pair.Label.Length + 1));
                writer.Write((ushort)(pair.Value.Length + 1));
                writer.Write(labelOffset);
                writer.Write(valueOffset);

                j++;
            }

            // Finish page toc entry
            writer.BaseStream.Position = baseOffset;
            writer.Write(baseNameOffset);
            writer.Write(PairUnits.Count);
            writer.Write(0); // Unk
            writer.Write(pairUnitOffset);

            // Seek to the end of it
            writer.BaseStream.Position = writer.BaseStream.Length;
        }