private static void RepackRaw(string path, sceModule sceModule) { byte[] dump = File.ReadAllBytes(path); string hexStringDump = BitConverter.ToString(dump).Replace("-", string.Empty); string[] hexDump = hexStringDump.Split(new[] { AnsiToHex("\r\n[ENDBLOCK]\r\n") }, StringSplitOptions.None); if (hexDump[hexDump.Length - 1].Equals(string.Empty)) { Array.Resize(ref hexDump, hexDump.Length - 1); } for (int index = 0; index < hexDump.Length; ++index) { sceModule.SetBlock(index, HexToArrayByte(hexDump[index])); } sceModule.Save(); sceModule.Dispose(); return; }
private static void Repack(string fileName) { sceModule sceModule = new sceModule(fileName); //check if rsce has text beforehand if (!sceModule.isHaveText()) { return; } string path; if (useAltPath) { path = altPath; } else { if (Path.GetDirectoryName(fileName) == "") { path = Environment.CurrentDirectory + "\\" + Path.GetFileNameWithoutExtension(fileName) + ".txt"; } else { path = Path.GetDirectoryName(fileName) + "\\" + Path.GetFileNameWithoutExtension(fileName) + ".txt"; } } if (!File.Exists(path)) { MiscUtils.Die("The file \"" + Path.GetFileName(path) + "\" does not exist!"); } //Echo! Console.WriteLine(string.Format("Repacking {0}...", Path.GetFileName(fileName))); if (jpcodes == null || dumpRaw) { RepackRaw(path, sceModule); return; } //Convert UTF-8 to SJIS, as it's easier to detect kanjis in SJIS byte[] temp; if (!useSJIS) { temp = Encoding.Convert(Encoding.UTF8, SJIS, File.ReadAllBytes(path)); } else { temp = File.ReadAllBytes(path); } string[] stringSeparators = new string[] { "\r\n" }; string[] strArray = SJIS.GetString(temp).Split(stringSeparators, StringSplitOptions.None); //Can't ignore empty lines with the split (some lines might be blank in the source file) //but the last line can't be blank, so handle that here if (strArray[strArray.Length - 1].Equals(string.Empty)) { Array.Resize(ref strArray, strArray.Length - 1); } List <string> stringList = new List <string>(); List <string> plainStringList = new List <string>(); List <int> lineNumberList = new List <int>(); int lineNumber = 0; int blockLine = 0; string str = ""; for (int index = 0; index < strArray.Length; ++index) { if (strArray[index].StartsWith("//")) { continue; } if (strArray[index].StartsWith("[ENDBLOCK]")) { lineNumberList.Add(lineNumber - blockLine); blockLine = 0; stringList.Add(str); plainStringList.Add(str.Replace("\r\n", "\\r\\n")); str = ""; } else { if (strArray[index + 1].StartsWith("[ENDBLOCK]")) { str = str + strArray[index]; } else { str = str + strArray[index] + "\r\n"; blockLine++; } } lineNumber++; } //check if same ammount of lines are present if (sceModule.Header.fileStrings.Count != stringList.Count) { MiscUtils.Warn("Different amount of strings in the file!"); MiscUtils.Warn("expected " + sceModule.Header.fileStrings.Count + " but got " + stringList.Count); MiscUtils.Warn("Packing anyway, but expect errors!"); Console.WriteLine(); } for (int index = 0; index < stringList.Count; ++index) { stringList[index] = AnsiToHex(stringList[index]); } if (jpcodes != null) { for (int index = 0; index < stringList.Count; ++index) { stringList[index] = jpcodes.ConvertBtoA(stringList[index]); } } if (codes != null) { for (int index = 0; index < stringList.Count; ++index) { stringList[index] = codes.ConvertTagsToNative(stringList[index]); } } else { MiscUtils.Warn("No CODES.txt file! If the file has replaced tags they will be inserted verbatim!"); } int realLine = 0; int skippedLine = 0; for (int index = 0; index < stringList.Count; ++index) { realLine++; while (stringList[index].StartsWith(AnsiToHex("<IGNORE>"))) { if (verbose) { MiscUtils.Info("Ignoring block " + realLine + " (around line " + lineNumberList[index] + ")..."); } lineNumberList.RemoveAt(index); plainStringList.RemoveAt(index); sceModule.Header.fileStrings.RemoveAt(index); stringList.RemoveAt(index); realLine++; skippedLine++; } sceModule.SetBlock(index, HexToArrayByte(stringList[index]), plainStringList, lineNumberList); } MiscUtils.Info("Ignored " + skippedLine + " blocks"); Console.WriteLine(); sceModule.Save(doDeduplication); sceModule.Dispose(); }
private static void Repack(string fileName) { sceModule sceModule = new sceModule(fileName); //check if rsce has text beforehand if (!sceModule.isHaveText()) { return; } string path = !(Path.GetDirectoryName(fileName) != "") ? Environment.CurrentDirectory + "\\" + Path.GetFileNameWithoutExtension(fileName) + ".txt" : Path.GetDirectoryName(fileName) + "\\" + Path.GetFileNameWithoutExtension(fileName) + ".txt"; if (!File.Exists(path)) { return; } //Echo! Console.WriteLine(string.Format("Repacking {0}...", Path.GetFileName(fileName))); if (jpcodes == null) { Console.WriteLine("No JPCODES.txt file! Assuming dump is raw..."); } if (jpcodes == null || dumpRaw) { byte[] dump = File.ReadAllBytes(path); string hexStringDump = System.BitConverter.ToString(dump).Replace("-", string.Empty); string[] hexDump = hexStringDump.Split(new[] { "0D0A5B454E44424C4F434B5D0D0A" /*"\r\n[ENDBLOCK]\r\n"*/ }, StringSplitOptions.None); if (hexDump[hexDump.Length - 1].Equals(String.Empty)) { Array.Resize(ref hexDump, hexDump.Length - 1); } for (int index = 0; index < hexDump.Length; ++index) { sceModule.SetBlock(index, HexToArrayByte(hexDump[index])); } sceModule.Save(); sceModule.Dispose(); return; } //Convert UTF-8 to SJIS, as it's easier to detect kanjis in SJIS byte[] temp; if (!useSJIS) { temp = Encoding.Convert(Encoding.UTF8, SJIS, File.ReadAllBytes(path)); } else { temp = File.ReadAllBytes(path); } string[] stringSeparators = new string[] { "\r\n" }; string[] strArray = SJIS.GetString(temp).Split(stringSeparators, StringSplitOptions.None); //Can't ignore empty lines with the split (some lines might be blank in the source file) //but the last line can't be blank, so handle that here if (strArray[strArray.Length - 1].Equals(String.Empty)) { Array.Resize(ref strArray, strArray.Length - 1); } List <string> stringList = new List <string>(); string str = ""; for (int index = 0; index < strArray.Length; ++index) { if (strArray[index] == "[ENDBLOCK]") { stringList.Add(str); str = ""; } else { str = !(strArray[index + 1] != "[ENDBLOCK]") ? str + strArray[index] : str + strArray[index] + "\r\n"; } } for (int index = 0; index < stringList.Count; ++index) { stringList[index] = AnsiToHex(stringList[index]); } if (jpcodes != null) { for (int index = 0; index < stringList.Count; ++index) { stringList[index] = jpcodes.ConvertBtoA(stringList[index]); } } if (codes != null) { for (int index = 0; index < stringList.Count; ++index) { stringList[index] = codes.ConvertTagsToNative(stringList[index]); } } else { Console.WriteLine("No CODES.txt file! If the file has replaced tags they will be inserted verbatim!"); } for (int index = 0; index < stringList.Count; ++index) { sceModule.SetBlock(index, HexToArrayByte(stringList[index])); } sceModule.Save(); sceModule.Dispose(); }