From e5b18c7b1ab152e33b1844ccac3aced3440b3b20 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 20 Apr 2015 18:04:06 -0700 Subject: [PATCH] Rectify encoding issues with wacky ingame language Thanks for reporting, Asia81. --- pk3DS/Subforms/xytext.cs | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/pk3DS/Subforms/xytext.cs b/pk3DS/Subforms/xytext.cs index 86da71c..0c96494 100644 --- a/pk3DS/Subforms/xytext.cs +++ b/pk3DS/Subforms/xytext.cs @@ -68,6 +68,8 @@ private void exportTextFile(string fileName, bool newline) .Replace("\\n", " ") .Replace("\\c", "") .Replace("\\r", "") + .Replace("\\\\", "\\") + .Replace("\\[", "[") : line); } } @@ -114,9 +116,11 @@ private bool importTextFile(string fileName) "When exporting text, do not remove newline formatting."); return false; } // All Text Lines received. Store all back. - for (int i = 0; i < files.Length; i++) - File.WriteAllBytes(files[i], getBytesForFile(textLines[i])); - + try { + for (int i = 0; i < files.Length; i++) + File.WriteAllBytes(files[i], getBytesForFile(textLines[i])); + } + catch { return false; } return true; } private void changeEntry(object sender, EventArgs e) @@ -270,6 +274,10 @@ internal static string[] getStringsFromFile(string path) { case '\n': s += "\\n"; break; + case '\\': s += "\\\\"; + break; + case '[': s += "\\["; + break; case 0x10: decryptVar(data, ref offset, ref s, ref c, ref k); break; case 0xE07F: s += (char)0x202F; // nbsp @@ -468,7 +476,28 @@ internal static void encryptVar(BinaryWriter bw, string line, ref int i, ref ush bw.Write(encryptU16(1, ref key)); bw.Write(encryptU16(0xBE01, ref key)); } - else { throw new Exception("Invalid terminated line"); } + else if (line[i + 1] == '\\') // Not Formatting + { + i++; + bw.Write(encryptU16('\\', ref key)); + } + else if (line[i + 1] == '[') // Not Variable + { + i++; + bw.Write(encryptU16('[', ref key)); + } + else + { + if (DialogResult.Yes != Util.Prompt( + MessageBoxButtons.YesNo, + "Encoding Error - Please Resolve:", + String.Format("File: {3}{0}Char: {1}{0}Line:{0}{2}", Environment.NewLine, line[i+1], line, i), + "Treat as literal '\\'?")) + throw new Exception("Invalid terminated line: " + line); + + i++; + bw.Write(encryptU16('\\', ref key)); + } else if (val == '[') // Special Variable { int bracket = line.Substring(i + 1).IndexOf(']');