private void button_mpk_pack_Click(object sender, EventArgs e) { try { var mpk = new MPK(); foreach (var file in Directory.GetFiles(textBox_mpk_pack_input.Text).OrderBy(f => f)) { if (checkBox_mpk_pack_ignore_bak.Checked && file.EndsWith(".bak")) { continue; } mpk.Entries.Add(new MPKEntry(Path.GetFileName(file), File.ReadAllBytes(file))); } Log("[MPK Pack] Created " + mpk.Entries.Count + " entries."); var target = textBox_mpk_pack_output.Text; if (Directory.Exists(target)) { target = Path.Combine(target, Path.GetFileName(textBox_mpk_pack_input.Text) + ".mpk"); } using (var writer = new BinaryWriter(File.Open(target, FileMode.Create))) { mpk.Write(writer); Log("[MPK Pack] Write success, size: " + writer.BaseStream.Position + ", target: " + target); } } catch (Exception ex) { Oops(ex); } }
private void button_mpk_unpack_Click(object sender, EventArgs e) { try { var files = new List <string>(); if (Directory.Exists(textBox_mpk_unpack_input.Text)) { files.AddRange(Directory.GetFiles(textBox_mpk_unpack_input.Text) .Where(f => f.EndsWith(".mpk", StringComparison.CurrentCultureIgnoreCase))); } else { files.Add(textBox_mpk_unpack_input.Text); } foreach (var file in files) { Log("[MPK Unpack] Unpacking " + Path.GetFileName(file) + " ..."); var output = Path.Combine(textBox_mpk_unpack_output.Text, Path.GetFileNameWithoutExtension(file)); Directory.CreateDirectory(output); using (var reader = new BinaryReader(File.OpenRead(file))) { var mpk = MPK.ReadFile(reader); Log("[MPK Unpack] Found " + mpk.Entries.Count + " entries."); foreach (var entry in mpk.Entries) { Log("[MPK Unpack] Unpacking " + entry.Name + "(" + entry.Size + ") ..."); File.WriteAllBytes(Path.Combine(output, entry.Name), entry.Data); } } } } catch (Exception ex) { Oops(ex); } }
static void Main(string[] args) { Console.WriteLine( @" ################################### # SG Archives Decompiler # ################################### # Made by Daviex # ################################### # Version 2.0 # ################################### # Codename: # ################################### # El Psy Congroo # ################################### Press any key to start... "); Console.ReadLine(); if (args.Length == 0) { Console.WriteLine("You should move the file .npa or .mpk on me to make it works!"); Console.WriteLine("Press a button to close the program."); Console.ReadLine(); Environment.Exit(0); } string originalFile = args[0].Substring(args[0].LastIndexOf('\\') + 1); using (BinaryReader br = new BinaryReader(File.OpenRead(args[0]))) { Console.WriteLine($"Trying to read from file {originalFile}"); //NPA File if (originalFile.ToLower().EndsWith(".npa")) { Console.WriteLine("Your file is a NPA format / JAST USA EDITION"); byte[] header; uint headerLen; headerLen = br.ReadUInt32(); header = br.ReadBytes((int)headerLen); Console.WriteLine("I'm decrypting the header..."); NPA.ScrambleKey(NPA.keyLen); NPA.DecryptBuffer(NPA.keyLen, ref header, (int)headerLen); Console.WriteLine("Gnam Gnam, now i want more data!");; NPA.ParseHeader(br, header, originalFile); } //MPK File else if (originalFile.ToLower().EndsWith(".mpk")) { Console.WriteLine("Your file is a MPK format / STEAM EDITION"); //MPK\0 string magic = Encoding.ASCII.GetString(br.ReadBytes(4)); br.ReadBytes(0x2); ushort headerVersion = br.ReadUInt16(); MPK.fileCount = br.ReadInt32(); //Removing the already readed magic and header length byte[] header = br.ReadBytes(0x38 + (MPK.fileCount * 0x100)); Console.WriteLine("Gnam Gnam, now i want more data!");; MPK.ParseHeader(br, header, originalFile); } else { Console.WriteLine("Unknown file format u passed me"); } } Console.WriteLine(); Console.WriteLine("I ended, but, remember, the Agency still watches you!"); Console.WriteLine("Press a button to close the program."); Console.ReadLine(); }
static void Main(string[] args) { Console.WriteLine( @" ################################### # SG Archives Compiler # ################################### # Made by Daviex # ################################### # Version 2.0 # ################################### # Codename: # ################################### # El Psy Congroo # ################################### Press any key to start... "); Console.ReadLine(); if (args.Length == 0) { Console.WriteLine("You should move the folder on me to works!"); Console.WriteLine("Press a button to close the program."); Console.ReadLine(); Environment.Exit(0); } int choice = 0; do { Console.WriteLine("In what format you want to compile the archive?"); Console.WriteLine("[1] NPA"); Console.WriteLine("[2] MPK"); }while(!int.TryParse(Console.ReadLine(), out choice) || (choice != (int)Choice.NPA && choice != (int)Choice.MPK)); string originalFolder = args[0]; Console.WriteLine("I'm reading your folder..."); Console.WriteLine(); if (choice == (int)Choice.NPA) { Console.WriteLine("I'm encrypting the header..."); Console.WriteLine(); NPA.ScrambleKey(NPA.keyLen); NPA.ReadDirectory(originalFolder); BinaryWriter bw = new BinaryWriter(File.Create(originalFolder.Substring(originalFolder.LastIndexOf('\\') + 1) + ".npa.new")); NPA.WriteHeader(ref bw); NPA.WriteData(ref bw); bw.Flush(); bw.Close(); } if (choice == (int)Choice.MPK) { MPK.ReadDirectory(originalFolder); BinaryWriter bw = new BinaryWriter(File.Create(originalFolder.Substring(originalFolder.LastIndexOf('\\') + 1).Replace("dir_", "") + ".new")); MPK.WriteHeader(ref bw); MPK.WriteData(ref bw); } Console.WriteLine(); Console.WriteLine("I ended, but remember, the Agency still watches you!"); Console.WriteLine("Press a button to close the program."); Console.ReadLine(); }
private void button_patch_Click(object sender, EventArgs e) { textBox_log.Clear(); button_patch.Enabled = false; ThreadPool.QueueUserWorkItem(s => { try { var usrdir = Path.Combine(textBox_path.Text, "USRDIR"); Log("[BERD] 正在寻找 USRDIR..."); if (!Directory.Exists(usrdir)) { Oops("[BERD] USRDIR 不存在, 请检查你的目录设置."); Invoke(new Action(() => button_patch.Enabled = true)); return; } var bakdir = usrdir + ".bak"; if (!Directory.Exists(bakdir)) { Log("[BERD] 备份文件夹不存在, 创建中..."); Directory.CreateDirectory(bakdir); } foreach (var patch in Directory.GetFiles(PATCH_DIR, "*.json").Select(p => JSON.ToObject <Dictionary <string, dynamic> >(File.ReadAllText(p)))) { if (!patch.ContainsKey("file")) { continue; } string file = patch["file"]; if (!File.Exists(Path.Combine(bakdir, file))) { Log("[BERD] 正在备份 " + file + "..."); File.Copy(Path.Combine(usrdir, file), Path.Combine(bakdir, file)); } MPK mpk = null; Log("[MPK] 正在加载 " + file + "..."); using (var reader = new BinaryReader(File.OpenRead(Path.Combine(bakdir, file)))) { mpk = MPK.ReadFile(reader); } var entries = mpk.Entries.ToDictionary(k => k.Name, v => v); switch (patch["type"]) { case "scx": if (!patchSCX(entries, patch["charset_preset"] + patch["charset"], patch["data"])) { return; } break; case "file": if (!patchFile(entries, patch["data"])) { return; } break; default: Oops("未知补丁类型"); Invoke(new Action(() => button_patch.Enabled = true)); return; } Log("[MPK] 正在打包 " + file + "..."); using (var writer = new BinaryWriter(File.Open(Path.Combine(usrdir, file), FileMode.Create))) { mpk.Write(writer); Log("[MPK] 打包成功: " + writer.BaseStream.Position); } } MessageBox.Show("补丁应用完成, 请检查游戏是否能正常运行", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); Log("[FENGberd] 操作完成, 请检查游戏是否能正常运行"); } catch (Exception ex) { Oops(ex.ToString()); Log("[FENGberd] 发生致命错误"); } Invoke(new Action(() => button_patch.Enabled = true)); }); }