public async Task TestEachLine() { var garcGameText = await ORASConfig.GameConfig.GetGarc(GarcNames.GameText); byte[] tf0Data = await garcGameText.GetFile(0); TextFile tf0 = await ORASConfig.GameConfig.GetTextFile(0); byte[] textData = tf0Data.Skip(0x10 /* SectionDataOffset */).ToArray(); ushort key = TextFileHelper.KeyBase; for (int i = 0; i < tf0.Lines.Count; i++) { TestContext.Progress.WriteLine($"Testing line {i}..."); TextFile.LineInfo lineInfo = tf0.LineInfos[i]; byte[] lineData = textData.Skip((int)lineInfo.Offset).Take(lineInfo.Length * 2).ToArray(); if (i < tf0.Lines.Count - 1) { TextFile.LineInfo next = tf0.LineInfos[i + 1]; long padding = next.Offset - (lineInfo.Offset + lineInfo.Length * 2); TestContext.Progress.WriteLine($" Length: {lineInfo.Length * 2}"); TestContext.Progress.WriteLine($" Padding: {padding}"); TestContext.Progress.WriteLine($" Flag: {lineInfo.Flag}"); TestContext.Progress.WriteLine($" Length w/ padding: {lineInfo.Length * 2 + padding}"); TestContext.Progress.WriteLine($" Char Len % 2: {lineInfo.Length % 2}"); TestContext.Progress.WriteLine($" Len w/ pad % 2: {( lineInfo.Length + ( padding / 2 ) ) % 2}"); } string tfhString = TextFileHelper.GetLineString(tf0, TextFileHelper.CryptLineData(lineData, key)); Assert.AreEqual(tf0.Lines[i], tfhString, "Directly decoded string not equal"); var newData = TextFileHelper.GetLineData(tf0, tf0.Lines[i]); byte[] tfhData = TextFileHelper.CryptLineData(newData, key); if (lineData.Length == tfhData.Length + 2 && lineData[lineData.Length - 1] == 0 && lineData[lineData.Length - 2] == 0) { tfhData = tfhData.Concat(new byte[] { 0, 0 }).ToArray(); // add padding } Assert.AreEqual(lineData, tfhData, "Directly encoded string not equal"); key += TextFileHelper.KeyAdvance; } }