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); }
public static Project GetProject(string projectPath) { if (projectPath.EndsWith("tf_yak0")) { return(Yakuza0Project.GetProject(projectPath)); } if (projectPath.EndsWith("tf_shm")) { return(ShenmueProject.GetProject(projectPath)); } if (projectPath.EndsWith("tf_sao_hf")) { return(SAOProject.GetProject(projectPath)); } if (projectPath.EndsWith("tf_srr")) { return(SRRProject.GetProject(projectPath)); } if (projectPath.EndsWith("tf_dsg")) { return(DisgaeaProject.GetProject(projectPath)); } if (projectPath.EndsWith("tf_btr")) { return(BattleRealmsProject.GetProject(projectPath)); } if (projectPath.EndsWith("tf_spf2")) { return(Spellforce2Project.GetProject(projectPath)); } if (projectPath.EndsWith("tf_jjm")) { return(JJMacfieldProject.GetProject(projectPath)); } if (projectPath.EndsWith("tf_nightcry")) { return(NightCryProject.GetProject(projectPath)); } throw new Exception(); }
public override void Save(string fileName, byte[] originalContent, IList <TFString> strings, ExportOptions options) { File.WriteAllBytes(fileName, originalContent); var writeOffset = _firstStringOffset + _strings[0].RelativeOffset; using (var fs = new FileStream(fileName, FileMode.Open)) { foreach (var item in _strings) { fs.Seek(item.RelativeOffsetPosition, SeekOrigin.Begin); fs.WriteValueS32(writeOffset - _firstStringOffset); fs.Seek(writeOffset, SeekOrigin.Begin); var str = item.Data.Translation; if (item.Data.Visible && !string.IsNullOrEmpty(str)) { if (options.CharReplacement != 0) { str = Utils.ReplaceChars(str, options.CharReplacementList); } str = SAOProject.WritingReplacements(str); fs.WriteStringZ(str, options.SelectedEncoding); writeOffset += str.GetLength(options.SelectedEncoding) + 1; } else { fs.WriteStringZ(item.Data.Original); writeOffset = item.Data.Original.GetLength(options.SelectedEncoding) + 1; } } var strSize = (uint)(fs.Position - _firstStringOffset); while (fs.Position % 4 != 0) { fs.WriteValueU8(0); } fs.Seek(0x0C, SeekOrigin.Begin); fs.WriteValueU32(strSize, Endianness); } }
private TFString ReadString(Stream s) { var stringOffset = (int)s.Position; var value = new TFString { FileId = Id, Offset = stringOffset, Visible = false }; 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); return(value); }
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); }