Пример #1
0
        private void ReadStrings(Stream s, Ofs3Data file)
        {
            file.StartOffset = s.Position;
            file.Padding     = 0x04;

            var stringOffset = (int)s.Position;

            var value = new TFString {
                FileId = Id, Offset = stringOffset, Visible = false
            };

            if (stringOffset != 0)
            {
                var str = s.ReadStringZ(Encoding);

                if (!string.IsNullOrEmpty(str.TrimEnd('\0')))
                {
                    str = SAOProject.ReadingReplacements(str);
                }

                value.Original    = str;
                value.Translation = str;
                value.Visible     = !string.IsNullOrWhiteSpace(str);
            }

            _strings.Add(value);
        }
Пример #2
0
        private void ReadOfs3(Stream s, Ofs3Data file)
        {
            file.StartOffset = s.Position;

            file.Signature  = s.ReadValueU32(Endianness);
            file.HeaderSize = s.ReadValueU32(Endianness);
            file.Type       = s.ReadValueU16(Endianness);
            file.Padding    = s.ReadValueU8();
            file.SubType    = s.ReadValueU8();
            file.Size       = s.ReadValueU32(Endianness);
            file.FileCount  = s.ReadValueU32(Endianness);

            file.FilesInfo = new FileInfo[file.FileCount];

            for (var i = 0; i < file.FileCount; i++)
            {
                var offset = s.ReadValueU32(Endianness) + file.HeaderSize;
                var size   = s.ReadValueU32(Endianness);

                var t = new FileInfo {
                    Offset = offset, Size = size
                };

                file.FilesInfo[i] = t;
            }

            file.Files = new Ofs3Data[file.FileCount];
            for (var i = 0; i < file.FileCount; i++)
            {
                file.Files[i] = new Ofs3Data();
                var offset = file.FilesInfo[i].Offset;
                s.Seek(offset + file.StartOffset, SeekOrigin.Begin);
                ReadFile(s, file.Files[i]);
            }
        }
Пример #3
0
        private void ReadFile(Stream s, Ofs3Data file)
        {
            var signature = s.ReadValueU32(Endianness);

            s.Seek(-4, SeekOrigin.Current);
            if (signature == 0x3353464F)
            {
                ReadOfs3(s, file);
            }
            else
            {
                ReadStrings(s, file);
            }
        }
Пример #4
0
 public override void Read(Stream s)
 {
     _root = new Ofs3Data();
     ReadFile(s, _root);
 }
Пример #5
0
        private int WriteStrings(Stream s, IList <TFString> strings, ExportOptions options, Ofs3Data file)
        {
            int result   = 0;
            var tfString = strings.FirstOrDefault(x => x.Offset == file.StartOffset);

            if (tfString != null)
            {
                var str = tfString.Translation;

                if (tfString.Visible && !string.IsNullOrEmpty(str))
                {
                    if (options.CharReplacement != 0)
                    {
                        str = Utils.ReplaceChars(str, options.CharReplacementList);
                    }

                    str = SAOProject.WritingReplacements(str);

                    s.WriteStringZ(str, options.SelectedEncoding);

                    result = str.GetLength(options.SelectedEncoding) + 1;
                }
                else
                {
                    s.WriteStringZ(tfString.Original, options.SelectedEncoding);

                    result = tfString.Original.GetLength(options.SelectedEncoding) + 1;
                }

                while (s.Position % file.Padding != 0)
                {
                    s.WriteValueU8(0);

                    result++;
                }
            }

            return(result);
        }
Пример #6
0
        private int WriteOfs3(Stream s, IList <TFString> strings, ExportOptions options, Ofs3Data file)
        {
            var fileStart = s.Position;

            s.WriteValueU32(file.Signature, Endianness);
            s.WriteValueU32(file.HeaderSize, Endianness);
            s.WriteValueU16(file.Type, Endianness);
            s.WriteValueU8(file.Padding);
            s.WriteValueU8(file.SubType);

            var sizeOffset = s.Position;

            s.WriteValueU32(0, Endianness); // Tamaño total, todavía desconocido

            s.WriteValueU32(file.FileCount);

            var result = 4; //El filecount entra dentro del tamaño del fichero.

            var tableOffset = s.Position;

            for (var i = 0; i < file.FileCount; i++)
            {
                s.WriteValueU32(0, Endianness);

                if (file.SubType == 1)
                {
                    s.WriteValueU32(file.FilesInfo[i].Size);
                }
                else
                {
                    s.WriteValueU32(0, Endianness);
                }

                result += 8;
            }

            while (s.Position % file.Padding != 0)
            {
                s.WriteValueU8(0);
                result++;
            }

            // Estoy en la posición para escribir el primer fichero hijo
            for (var i = 0; i < file.FileCount; i++)
            {
                var offset = (int)(s.Position - fileStart - file.HeaderSize);
                var size   = WriteFile(s, strings, options, file.Files[i]);
                result += size;

                var aux = s.Position;

                s.Seek(tableOffset, SeekOrigin.Begin);
                s.WriteValueS32(offset, Endianness);

                if (file.SubType != 1)
                {
                    s.WriteValueS32(size, Endianness);
                }
                else
                {
                    s.Seek(4, SeekOrigin.Current);
                }

                tableOffset = s.Position;

                s.Seek(aux, SeekOrigin.Begin);
            }

            var pos = s.Position;

            s.Seek(sizeOffset, SeekOrigin.Begin);
            s.WriteValueS32(result, Endianness);
            s.Seek(pos, SeekOrigin.Begin);

            return((int)(result + file.HeaderSize));
        }
Пример #7
0
 private int WriteFile(Stream s, IList <TFString> strings, ExportOptions options, Ofs3Data file)
 {
     if (file.Signature == 0x3353464F)
     {
         return(WriteOfs3(s, strings, options, file));
     }
     else
     {
         return(WriteStrings(s, strings, options, file));
     }
 }