public void Write(string path, LocalisationEntity locale) { CalculateEntryOffsets(locale); using (NfsFileWriter writer = new NfsFileWriter(path, FileMode.OpenOrCreate)) { writer.WriteBytes(locale.Unknown1); for (int i = 0; i < locale.Entries.Count; i++) { LocalisationEntryEntity entry = locale.Entries[i]; writer.WriteInt32(entry.Offset); writer.WriteBytes(entry.UnknownBytes); } writer.WriteBytes(locale.Unknown2); for (int i = 0; i < locale.Entries.Count; i++) { string str = locale.Entries[i].Value; writer.WriteString(str); } writer.WriteBytes(locale.Unknown3); } }
void CalculateEntryOffsets(LocalisationEntity locale) { int currentOffset = locale.Entries.Count * 12 + 12; for (int i = 0; i < locale.Entries.Count; i++) { locale.Entries[i].Offset = currentOffset; currentOffset += locale.Entries[i].Value.Length + 1; } }
/// <summary> /// Converts the domain model into an entity. /// </summary> /// <returns>The entity.</returns> /// <param name="model">Localisation.</param> internal static LocalisationEntity ToEntity(this Localisation model) { LocalisationEntity entity = new LocalisationEntity { Unknown1 = model.Unknown1, Unknown2 = model.Unknown2, Unknown3 = model.Unknown3, Entries = model.Entries.ToEntities().ToList() }; return(entity); }
/// <summary> /// Converts the entity into a domain model. /// </summary> /// <returns>The domain model.</returns> /// <param name="entity">Localisation entity.</param> internal static Localisation ToDomainModel(this LocalisationEntity entity) { Localisation model = new Localisation { Unknown1 = entity.Unknown1, Unknown2 = entity.Unknown2, Unknown3 = entity.Unknown3, Entries = entity.Entries.ToDomainModels().ToList() }; return(model); }
/// <summary> /// Reads the localisation file. /// </summary> /// <returns>The localisation data.</returns> /// <param name="path">Path.</param> public LocalisationEntity Read(string path) { LocalisationEntity locale = new LocalisationEntity(); using (NfsFileReader reader = new NfsFileReader(path, FileMode.Open)) { locale.Entries = new List <LocalisationEntryEntity>(); locale.Unknown1 = reader.ReadBytes(8); firstValueOffset = int.MaxValue; while (reader.BaseStream.Position < firstValueOffset - 12) { LocalisationEntryEntity entry = new LocalisationEntryEntity(); entry.Offset = reader.ReadInt32(); entry.UnknownBytes = reader.ReadBytes(8); locale.Entries.Add(entry); if (entry.Offset < firstValueOffset) { firstValueOffset = entry.Offset; } } locale.Unknown2 = reader.ReadBytes((int)(firstValueOffset - reader.BaseStream.Position)); for (int i = 0; i < locale.Entries.Count; i++) { if (i < locale.Entries.Count - 1) { int length = locale.Entries[i + 1].Offset - locale.Entries[i].Offset - 1; locale.Entries[i].Value = reader.ReadString(length + 1); } else { locale.Entries[i].Value = reader.ReadString(); } } locale.Unknown3 = reader.ReadBytes((int)(reader.BaseStream.Length - reader.BaseStream.Position)); } return(locale); }
/// <summary> /// Converts an XML into a localisation file. /// </summary> /// <param name="inputPath">XML path.</param> /// <param name="outputPath">Localisation file path.</param> public void ConvertToLocalisationFile(string inputPath, string outputPath) { LocalisationEntity locale = xmlManager.Read(inputPath).ToEntity(); localisationFile.Write(outputPath, locale); }