public RtlvTextFile ReadFile() { var file = new RtlvTextFile(); var cypherStrategy = new CypherStrategyTEA(); BaseStream.Seek(24, SeekOrigin.Begin); var staticContext1Size = 0; var check = ReadInt32(); if (check == 136) { staticContext1Size = 168; } else if (check == 120) { staticContext1Size = 140; } else { throw new Exception(); } BaseStream.Seek(88, SeekOrigin.Begin); var startOfLanguageSections = ReadInt32() + 12; BaseStream.Seek(0, SeekOrigin.Begin); file.Header = ReadBytes(8); file.FileSize = this.ReadUInt32BE(); file.StaticContext = ReadBytes(staticContext1Size); file.Identifier = ReadUInt32(); file.StaticContext2 = ReadBytes(startOfLanguageSections - (int)BaseStream.Position); var numberOfLanguages = ReadUInt32(); for (var i = 0; i < numberOfLanguages; i++) { var section = new RtvlLanguageSection(); section.SectionLength = ReadInt16(); section.Unknown = ReadInt16(); section.Zeros = ReadInt32(); section.StartingOffset = ReadInt32(); section.Zeros2 = ReadInt32(); file.Sections.Add(section); } for (var i = 0; i < numberOfLanguages; i++) { var length = ReadInt32(); byte[] bytes = ReadBytes(length); if (length == 0) { ReadInt32(); } file.Sections[i].Lines.Add(cypherStrategy.Decypher(bytes)); } return(file); }
public DlgeTextFile LoadDlgeFile(string path, string category) { var dlgeFile = new DlgeTextFile { Name = Path.GetFileName(path), Category = category }; DlgeStructure structure; using (var file = File.Open(path, FileMode.Open)) using (var reader = new GlacierDlgeBinaryReader(file, _version)) { int numberOfLanguages = 12; ICypherStrategy cypherStrategy = new CypherStrategyTEA(); reader.ReadHeader(); int iteration = 0; var hasAnyStrings = false; while (reader.HasText()) { structure = reader.ReadStructure(iteration); int nonEmptyStrings = 0; for (int i = 0; i < numberOfLanguages; i++) { structure.Dialogues[i] = reader.ReadString(cypherStrategy); if (!string.IsNullOrEmpty(structure.Dialogues[i])) { nonEmptyStrings++; } if (i != numberOfLanguages - 1) { if (reader.ReadLanguageMetadataAndDetermineIfEmpty(i, iteration, structure)) { i++; } } } if (nonEmptyStrings != 0) { hasAnyStrings = true; } dlgeFile.Structures.Add(structure); iteration++; } if (!hasAnyStrings) { throw new InvalidDataException("No text inside dialogue file."); } reader.BaseStream.Seek(-1, SeekOrigin.Current); dlgeFile.Extra = reader.ReadBytes((int)(reader.BaseStream.Length - reader.BaseStream.Position)); } return(dlgeFile); }