Esempio n. 1
0
 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); }
 }
Esempio n. 2
0
 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); }
 }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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));
            });
        }