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_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)); }); }