예제 #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 int WriteString(Stream s, TFString str, ExportOptions options)
        {
            var result   = 0;
            var writeStr = str.Translation;

            if (str.Original.Equals(str.Translation))
            {
                writeStr = JJMacfieldProject.WritingReplacements(writeStr);
                s.WriteStringZ(writeStr, Encoding);
                result = writeStr.GetLength(Encoding);
            }
            else
            {
                if (options.CharReplacement != 0)
                {
                    writeStr = Utils.ReplaceChars(writeStr, options.CharReplacementList);
                }

                writeStr = JJMacfieldProject.WritingReplacements(writeStr);
                s.WriteStringZ(writeStr, options.SelectedEncoding);

                result = writeStr.GetLength(options.SelectedEncoding);
            }

            return(result);
        }
예제 #3
0
        /// <summary>
        /// Creates a single-dimension tensor from a byte buffer.  This is different than creating a tensor from a byte array that produces a tensor with as many elements as the byte array.
        /// </summary>
        public unsafe static TFTensor CreateString(byte [] buffer)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException(nameof(buffer));
            }
            //
            // TF_STRING tensors are encoded with a table of 8-byte offsets followed by
            // TF_StringEncode-encoded bytes.
            //
            var    size   = TFString.TF_StringEncodedSize((UIntPtr)buffer.Length);
            IntPtr handle = TF_AllocateTensor(TFDataType.String, IntPtr.Zero, 0, (UIntPtr)((ulong)size + 8));

            // Clear offset table
            IntPtr dst = TF_TensorData(handle);

            Marshal.WriteInt64(dst, 0);
            var status = TFStatus.TF_NewStatus();

            fixed(byte *src = &buffer[0])
            {
                TFString.TF_StringEncode(src, (UIntPtr)buffer.Length, (sbyte *)(dst + 8), size, status);
                var ok = TFStatus.TF_GetCode(status) == TFCode.Ok;

                TFStatus.TF_DeleteStatus(status);
                if (!ok)
                {
                    return(null);
                }
            }

            return(new TFTensor(handle));
        }
예제 #4
0
        public override void Read(Stream s)
        {
            _dataList = new List <TFString>();

            s.Seek(0x24, SeekOrigin.Begin);

            var pointer1 = s.ReadValueS32(Endianness);

            if (pointer1 != -1)
            {
                s.Seek(pointer1, SeekOrigin.Begin);

                var pointer2 = s.ReadValueS32(Endianness);

                s.Seek(pointer2, SeekOrigin.Begin);

                var str = s.ReadStringZ(Encoding);
                if (!string.IsNullOrEmpty(str.TrimEnd('\0')))
                {
                    str = Yakuza0Project.ReadingReplacements(str);
                }

                var item = new TFString
                {
                    FileId      = Id,
                    Offset      = pointer2,
                    Section     = pointer1.ToString("X8"),
                    Original    = str,
                    Translation = str,
                    Visible     = !string.IsNullOrEmpty(str.TrimEnd('\0'))
                };

                _dataList.Add(item);
            }
        }
예제 #5
0
        private TFString ReadString(Stream s)
        {
            var stringOffset = (int)s.Position;

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

            if (stringOffset != 0)
            {
                s.Seek(stringOffset, SeekOrigin.Begin);

                var str = s.ReadStringZ(Encoding);

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

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

            return(value);
        }
예제 #6
0
        private TFString ReadString(Stream s)
        {
            var stringOffset = s.ReadValueS32(Endianness);
            var pos          = s.Position;

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

            if (stringOffset != 0)
            {
                s.Seek(stringOffset, SeekOrigin.Begin);

                var str = s.ReadStringZ(Encoding);

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

                    value.Original    = str;
                    value.Translation = str;
                    value.Visible     = true;
                }
            }

            s.Seek(pos, SeekOrigin.Begin);

            return(value);
        }
예제 #7
0
        private TFString ReadString(ItemData item, int index)
        {
            var stringOffset = item.Offset + index;

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

            var array = new byte[item.Size - index];

            Array.Copy(item.BinaryContent, index, array, 0, array.Length);
            using (var ms = new MemoryStream(array))
            {
                var str = ms.ReadStringZ(Encoding);

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

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

            return(value);
        }
예제 #8
0
        private void InsertPauses(TFString str, IList <short> pauses)
        {
            var strClean  = RemoveTags(str.Original);
            var strPauses = AddPauses(strClean, pauses);
            var strResult = AddTags(strPauses, str.Original);

            str.Original    = strResult;
            str.Translation = strResult;
        }
예제 #9
0
        private int GetLength(TFString tfStr, ExportOptions options)
        {
            if (tfStr.Original == tfStr.Translation)
            {
                var temp = tfStr.Original.Replace("\\r\\n", "\r\n");

                return(temp.GetLength(Encoding));
            }
            else
            {
                var temp = tfStr.Translation.Replace("\\r\\n", "\r\n");

                return(temp.GetLength(options.SelectedEncoding));
            }
        }
예제 #10
0
        private TFString ReadString(Stream s, uint length, string section)
        {
            var value = new TFString {
                FileId = Id, Offset = (int)s.Position, Visible = true, Section = section
            };

            var str = s.ReadString(length, false, Encoding);

            str = Spellforce2Project.ReadingReplacements(str);

            value.Original    = str;
            value.Translation = str;

            return(value);
        }
예제 #11
0
        private int WriteItem(Stream s, int offset, TFString item, IList <TFString> strings, ExportOptions options)
        {
            var result = offset;

            if (item.Offset != 0)
            {
                s.WriteValueS32(result, Endianness);
                result = WriteString(s, result, item, strings, options);
            }
            else
            {
                s.WriteValueS32(0);
            }

            return(result);
        }
예제 #12
0
        private void WriteProperties(Stream s, Item item, TFString tfStr)
        {
            if (tfStr.Original == tfStr.Translation)
            {
                foreach (var p in item.StringProperties)
                {
                    s.WriteValueU16(p.Type, Endianness);
                    s.WriteBytes(p.Unknown1);
                    s.WriteBytes(p.Unknown2);
                    s.WriteValueU16(p.Position, Endianness);
                    s.WriteBytes(p.Unknown3);
                }
            }
            else
            {
                // Como la línea ha cambiado, las propiedades también
                var newProperties = new List <Property>();
                if (item.HasPauses())
                {
                    var newPauses = ParsePauses(tfStr.Translation);
                    foreach (var property in item.StringProperties)
                    {
                        if (!property.IsPause())
                        {
                            newProperties.Add(property);
                        }
                    }
                    newProperties.InsertRange(newProperties.Count - 1, newPauses);
                }
                else
                {
                    foreach (var property in item.StringProperties)
                    {
                        newProperties.Add(property);
                    }
                }

                foreach (var p in newProperties)
                {
                    s.WriteValueU16(p.Type, Endianness);
                    s.WriteBytes(p.Unknown1);
                    s.WriteBytes(p.Unknown2);
                    s.WriteValueU16(p.Position, Endianness);
                    s.WriteBytes(p.Unknown3);
                }
            }
        }
예제 #13
0
        private int WriteString(Stream s, int offset, TFString item, IList <TFString> strings, ExportOptions options)
        {
            var pos = s.Position;

            var result = offset;

            var tfString = strings.FirstOrDefault(x => x.Offset == item.Offset);

            s.Seek(offset, SeekOrigin.Begin);

            var str = tfString.Translation;

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

                    str = Yakuza0Project.WritingReplacements(str);

                    s.WriteStringZ(str, options.SelectedEncoding);

                    result += str.GetLength(options.SelectedEncoding) + 1;
                }
                else
                {
                    str = Yakuza0Project.WritingReplacements(str);

                    s.WriteStringZ(str, Encoding);

                    result += str.GetLength(Encoding) + 1;
                }
            }
            else
            {
                // Hay que escribir solo el 0 del final
                s.WriteString("\0");
                result++;
            }

            s.Seek(pos, SeekOrigin.Begin);
            return(result);
        }
예제 #14
0
        private TFString ReadString(string str)
        {
            var value = new TFString {
                FileId = Id, Offset = 0, Visible = false
            };

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

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

            return(value);
        }
예제 #15
0
        private int WriteString(Stream s, int offset, TFString tfString, ExportOptions options, bool writeZero)
        {
            var result = offset;

            s.Seek(offset, SeekOrigin.Begin);

            string   str;
            Encoding enc;
            bool     replaceChars;

            if (tfString.Original == tfString.Translation)
            {
                str          = tfString.Original;
                enc          = Encoding;
                replaceChars = false;
            }
            else
            {
                str          = tfString.Translation;
                enc          = options.SelectedEncoding;
                replaceChars = options.CharReplacement != 0;
            }

            if (!string.IsNullOrEmpty(str))
            {
                if (replaceChars)
                {
                    str = Utils.ReplaceChars(str, options.CharReplacementList);
                }

                str = Yakuza0Project.WritingReplacements(str);

                s.WriteStringZ(str, enc);
                result += str.GetLength(enc) + 1;

                if (writeZero)
                {
                    s.WriteByte(0);
                    result++;
                }
            }

            return(result);
        }
예제 #16
0
        private TFString ReadString(Stream s)
        {
            var value = new TFString {
                FileId = Id, Offset = (int)s.Position, Visible = false
            };

            var str = s.ReadStringZ(Encoding);

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

                value.Original    = str;
                value.Translation = str;
                value.Visible     = true;
            }

            return(value);
        }
예제 #17
0
        private TFString GetString(Stream s, string section)
        {
            var pos = s.Position;
            var str = s.ReadStringZ(Encoding);

            str = Yakuza0Project.ReadingReplacements(str);

            var tfString = new TFString
            {
                FileId      = Id,
                Original    = str,
                Translation = str,
                Offset      = (int)pos,
                Section     = section,
                Visible     = !string.IsNullOrWhiteSpace(str),
            };

            return(tfString);
        }
예제 #18
0
        private void WriteString(Stream s, TFString str, ExportOptions options)
        {
            var writeStr = str.Translation;

            if (str.Original.Equals(str.Translation))
            {
                writeStr = Yakuza0Project.WritingReplacements(writeStr);
                s.WriteStringZ(writeStr, Encoding);
            }
            else
            {
                if (options.CharReplacement != 0)
                {
                    writeStr = Utils.ReplaceChars(writeStr, options.CharReplacementList);
                }

                writeStr = Yakuza0Project.WritingReplacements(writeStr);
                s.WriteStringZ(writeStr, options.SelectedEncoding);
            }
        }
예제 #19
0
        private void ReadDataItems(Stream s)
        {
            _dataList = new List <TFString>();

            var readStrings = new List <long>();

            foreach (var offset in _offsets)
            {
                s.Seek(offset, SeekOrigin.Begin);

                var stringOffset    = s.ReadValueS64(Endianness);
                var correctedOffset = stringOffset - ((stringOffset >= 0x014E042000)?OUTPUT_BASE:FILE_BASE);

                TFString tfString;

                if (readStrings.Contains(stringOffset))
                {
                    tfString = new TFString
                    {
                        FileId      = Id,
                        Offset      = (int)correctedOffset,
                        Section     = offset.ToString("X8"),
                        Original    = string.Empty,
                        Translation = string.Empty,
                        Visible     = false
                    };
                }
                else
                {
                    var pos = s.Position;
                    s.Seek(correctedOffset, SeekOrigin.Begin);

                    tfString         = ReadString(s, (int)correctedOffset);
                    tfString.Section = offset.ToString("X8");
                    readStrings.Add(stringOffset);
                    s.Seek(pos, SeekOrigin.Begin);
                }

                _dataList.Add(tfString);
            }
        }
예제 #20
0
        private void WriteString(Stream s, TFString tfString, ExportOptions options)
        {
            var pos   = s.Position;
            var zeros = new byte[64];

            s.WriteBytes(zeros);
            s.Seek(pos, SeekOrigin.Begin);

            string   str;
            Encoding enc;
            bool     replace;

            if (tfString.Original == tfString.Translation)
            {
                str     = tfString.Original;
                enc     = Encoding;
                replace = false;
            }
            else
            {
                str     = tfString.Translation;
                enc     = options.SelectedEncoding;
                replace = options.CharReplacement != 0;
            }
            if (replace)
            {
                str = Utils.ReplaceChars(str, options.CharReplacementList);
            }
            str = Yakuza0Project.WritingReplacements(str);

            if (str.GetLength(options.SelectedEncoding) >= 64)
            {
                str = str.Substring(0, 63);
            }

            s.WriteStringZ(str, enc);

            s.Seek(pos + 64, SeekOrigin.Begin);
        }
예제 #21
0
        private void WriteString(Stream s, TFString str, ExportOptions options)
        {
            if (str.Original == str.Translation)
            {
                var aux = str.Original;

                aux = Yakuza0Project.WritingReplacements(aux);

                s.WriteStringZ(aux, Encoding);
            }
            else
            {
                var aux = str.Translation;
                if (options.CharReplacement != 0)
                {
                    aux = Utils.ReplaceChars(aux, options.CharReplacementList);
                }

                aux = Yakuza0Project.WritingReplacements(aux);

                s.WriteStringZ(aux, options.SelectedEncoding);
            }
        }
예제 #22
0
        public override void Read(Stream s)
        {
            _unknown1     = s.ReadValueS32(Endianness);
            _unknown2     = s.ReadValueS16(Endianness);
            _num          = s.ReadValueS16(Endianness);
            _unknown3     = s.ReadValueS32(Endianness);
            _table2Offset = s.ReadValueS32(Endianness);

            _dataList1 = new List <TFString>();
            _dataList2 = new List <ItemData>();

            var firstString = -1;

            for (var i = 0; i < 43; i++)
            {
                var str = ReadString(s);
                _dataList1.Add(str);

                if (firstString == -1)
                {
                    firstString = str.Offset;
                }
            }

            _remainder1 = s.ReadBytes(0x54);

            s.Seek(-8, SeekOrigin.Current);
            _barkeeper = ReadString(s);
            s.Seek(4, SeekOrigin.Current);

            for (var i = 0; i < _num; i++)
            {
                var item = new ItemData();
                for (var j = 0; j < 22; j++)
                {
                    item.Unknown[j] = s.ReadValueS32(Endianness);
                }

                if (firstString == -1)
                {
                    firstString = item.Unknown[8];
                }

                item.Data.Add(ReadString(s, item.Unknown[8]));
                item.Data.Add(ReadString(s, item.Unknown[14]));
                item.Data.Add(ReadString(s, item.Unknown[15]));
                item.Data.Add(ReadString(s, item.Unknown[16]));
                item.Data.Add(ReadString(s, item.Unknown[17]));
                item.Data.Add(ReadString(s, item.Unknown[18]));
                item.Data.Add(ReadString(s, item.Unknown[19]));
                item.Data.Add(ReadString(s, item.Unknown[20]));
                item.Data.Add(ReadString(s, item.Unknown[21]));

                _dataList2.Add(item);
            }

            var remainderSize = (int)(firstString - s.Position);

            if (remainderSize > 0)
            {
                _remainder2 = ReadRemainder(s, remainderSize);
            }
        }
예제 #23
0
 public DataItem()
 {
     Index = new DataIndex();
     Data  = new TFString();
 }
예제 #24
0
 private static TFString FindString(TFString original, IList <TFString> strings)
 {
     return(strings.FirstOrDefault(s => s.Offset == original.Offset));
 }
예제 #25
0
        public override void Read(Stream s)
        {
            s.Seek(0x20, SeekOrigin.Begin);

            var titlePointer       = s.ReadValueS32(Endianness);
            var descriptionPointer = s.ReadValueS32(Endianness);

            s.Seek(0x40, SeekOrigin.Begin);

            var ddsPointer = s.ReadValueS32(Endianness);

            if (titlePointer != 0)
            {
                s.Seek(titlePointer, SeekOrigin.Begin);

                var str = s.ReadStringZ(Encoding);
                if (!string.IsNullOrEmpty(str.TrimEnd('\0')))
                {
                    str = Yakuza0Project.ReadingReplacements(str);
                }

                var item = new TFString
                {
                    FileId      = Id,
                    Offset      = titlePointer,
                    Section     = "32",
                    Original    = str,
                    Translation = str,
                    Visible     = !string.IsNullOrEmpty(str.TrimEnd('\0'))
                };

                _title = item;
            }

            if (descriptionPointer != 0)
            {
                s.Seek(descriptionPointer, SeekOrigin.Begin);

                var str = s.ReadStringZ(Encoding);
                if (!string.IsNullOrEmpty(str.TrimEnd('\0')))
                {
                    str = Yakuza0Project.ReadingReplacements(str);
                }

                var item = new TFString
                {
                    FileId      = Id,
                    Offset      = descriptionPointer,
                    Section     = "36",
                    Original    = str,
                    Translation = str,
                    Visible     = !string.IsNullOrEmpty(str.TrimEnd('\0'))
                };

                _description = item;
            }

            if (ddsPointer != 0)
            {
                s.Seek(ddsPointer, SeekOrigin.Begin);

                var str = s.ReadStringZ(Encoding);
                if (!string.IsNullOrEmpty(str.TrimEnd('\0')))
                {
                    str = Yakuza0Project.ReadingReplacements(str);
                }

                var item = new TFString
                {
                    FileId      = Id,
                    Offset      = ddsPointer,
                    Section     = "64",
                    Original    = str,
                    Translation = str,
                    Visible     = false
                };

                _dds = item;
            }
        }