public static void Merge(List <string> ModList, string modDir) { foreach (var mod in ModList) { if (!Directory.Exists(mod)) { Console.WriteLine($"[ERROR] Cannot find {mod}"); continue; } // Run prebuild.bat if (FileIOWrapper.Exists($@"{mod}\prebuild.bat") && new FileInfo($@"{mod}\prebuild.bat").Length > 0) { Console.WriteLine($@"[INFO] Running {mod}\prebuild.bat..."); ProcessStartInfo ProcessInfo; ProcessInfo = new ProcessStartInfo(); ProcessInfo.FileName = Path.GetFullPath($@"{mod}\prebuild.bat"); ProcessInfo.CreateNoWindow = true; ProcessInfo.UseShellExecute = false; ProcessInfo.WorkingDirectory = Path.GetFullPath(mod); using (Process process = new Process()) { process.StartInfo = ProcessInfo; process.Start(); process.WaitForExit(); } Console.WriteLine($@"[INFO] Finished running {mod}\prebuild.bat!"); } if (!Directory.Exists($@"{mod}\data")) { Console.WriteLine($"[WARNING] No data folder found in {mod}, skipping..."); continue; } // Copy over .files, hashing them when neccessary foreach (var file in Directory.GetFiles($@"{mod}\data", "*", SearchOption.AllDirectories)) { string fileName = Path.GetFileName(file); if (Path.GetExtension(file).ToLower() != ".file") { fileName = Hash(Path.GetFileName(file)); } Console.WriteLine($@"[INFO] Copying over {file} to {modDir}\data\{fileName}"); try { FileIOWrapper.Copy(file, $@"{modDir}\data\{fileName.ToLower()}", true); } catch (Exception e) { Console.WriteLine($"[ERROR] Couldn't copy over {file} ({e.Message})"); } } } }
public static void Backup(string modPath) { Directory.CreateDirectory($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data"); foreach (var file in original_data) { Console.WriteLine($@"[INFO] Backing up {modPath}\data\{file}"); if (FileIOWrapper.Exists($@"{modPath}\data\{file}")) { FileIOWrapper.Copy($@"{modPath}\data\{file}", $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{file}", true); } else { Console.WriteLine($@"[ERROR] Couldn't find {modPath}\data\{file}"); } } foreach (var rdb in Directory.GetFiles(modPath, "*.rdb")) { Console.WriteLine($"[INFO] Backing up {rdb}"); FileIOWrapper.Copy(rdb, $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\{Path.GetFileName(rdb)}", true); } }
// P4G public static void Unpack(string directory, string cpk) { Directory.CreateDirectory($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden"); if (!Directory.Exists(directory)) { Console.WriteLine($"[ERROR] Couldn't find {directory}. Please correct the file path in config."); return; } List <string> pacs = new List <string>(); List <string> globs = new List <string> { "*[!0-9].bin", "*2[0-1][0-9].bin", "*.arc", "*.pac", "*.pack" }; switch (cpk) { case "data_e.cpk": pacs.Add("data00004.pac"); pacs.Add("data_e.cpk"); break; case "data.cpk": pacs.Add("data00000.pac"); pacs.Add("data00001.pac"); pacs.Add("data00003.pac"); pacs.Add("data.cpk"); break; case "data_k.cpk": pacs.Add("data00005.pac"); pacs.Add("data_k.cpk"); break; case "data_c.cpk": pacs.Add("data00006.pac"); pacs.Add("data_c.cpk"); break; } ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true; startInfo.FileName = $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Dependencies\Preappfile\preappfile.exe"; if (!FileIOWrapper.Exists(startInfo.FileName)) { Console.WriteLine($"[ERROR] Couldn't find {startInfo.FileName}. Please check if it was blocked by your anti-virus."); return; } Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = Cursors.Wait; }); startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.RedirectStandardOutput = true; startInfo.UseShellExecute = false; foreach (var pac in pacs) { Console.WriteLine($"[INFO] Unpacking files for {pac}..."); foreach (var glob in globs) { startInfo.Arguments = $@"-i ""{directory}\{pac}"" -o ""{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\{Path.GetFileNameWithoutExtension(pac)}"" --unpack-filter {glob}"; using (Process process = new Process()) { process.StartInfo = startInfo; process.Start(); while (!process.HasExited) { string text = process.StandardOutput.ReadLine(); if (text != "" && text != null) { Console.WriteLine($"[INFO] {text}"); } } } } } if (FileIOWrapper.Exists($@"{directory}\{cpk}") && !FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\{cpk}")) { Console.WriteLine($@"[INFO] Backing up {cpk}"); FileIOWrapper.Copy($@"{directory}\{cpk}", $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\{cpk}", true); } if (FileIOWrapper.Exists($@"{directory}\movie.cpk") && !FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\movie.cpk")) { Console.WriteLine($@"[INFO] Backing up movie.cpk"); FileIOWrapper.Copy($@"{directory}\movie.cpk", $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\movie.cpk", true); } Console.WriteLine("[INFO] Finished unpacking base files!"); Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = null; }); }
public static void Append(string path, string cpkLang) { // Check if required files are there if (!FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Dependencies\preappfile\preappfile.exe")) { Console.WriteLine($@"[ERROR] Couldn't find Dependencies\preappfile\preappfile.exe. Please check if it was blocked by your anti-virus."); return; } if (!FileIOWrapper.Exists($@"{path}\{cpkLang}")) { Console.WriteLine($@"[ERROR] Couldn't find {path}\{cpkLang} for appending."); return; } // Backup cpk if not backed up already if (!FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\{cpkLang}")) { Console.WriteLine($@"[INFO] Backing up {cpkLang}.cpk"); FileIOWrapper.Copy($@"{path}\{cpkLang}", $@"Original\Persona 4 Golden\{cpkLang}"); } // Copy original cpk back if different if (GetChecksumString($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\{cpkLang}") != GetChecksumString($@"{path}\{cpkLang}")) { Console.WriteLine($@"[INFO] Reverting {cpkLang} back to original"); FileIOWrapper.Copy($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\{cpkLang}", $@"{path}\{cpkLang}", true); } if (!FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\movie.cpk")) { Console.WriteLine($@"[INFO] Backing up movie.cpk"); FileIOWrapper.Copy($@"{path}\movie.cpk", $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\movie.cpk"); } // Copy original cpk back if different if (GetChecksumString($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\movie.cpk") != GetChecksumString($@"{path}\movie.cpk")) { Console.WriteLine($@"[INFO] Reverting movie.cpk back to original"); FileIOWrapper.Copy($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 4 Golden\movie.cpk", $@"{path}\movie.cpk", true); } // Delete modified pacs if (FileIOWrapper.Exists($@"{path}\data00007.pac")) { Console.WriteLine($"[INFO] Deleting data00007.pac"); FileIOWrapper.Delete($@"{path}\data00007.pac"); } if (FileIOWrapper.Exists($@"{path}\movie00003.pac")) { Console.WriteLine($"[INFO] Deleting movie00003.pac"); FileIOWrapper.Delete($@"{path}\movie00003.pac"); } ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true; startInfo.FileName = $@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Dependencies\Preappfile\preappfile.exe"; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.UseShellExecute = false; if (Directory.Exists($@"{path}\mods\preappfile\{Path.GetFileNameWithoutExtension(cpkLang)}")) { Console.WriteLine($@"[INFO] Appending to {cpkLang}"); startInfo.Arguments = $@"-i ""{path}\mods\preappfile\{Path.GetFileNameWithoutExtension(cpkLang)}"" -a ""{path}\{cpkLang}"" -o ""{path}\{cpkLang}"" --pac-index 7"; using (Process process = new Process()) { process.StartInfo = startInfo; process.Start(); process.WaitForExit(); } } if (Directory.Exists($@"{path}\mods\preappfile\movie")) { Console.WriteLine($@"[INFO] Appending to movie"); startInfo.Arguments = $@"-i ""{path}\mods\preappfile\movie"" -a ""{path}\movie.cpk"" -o ""{path}\movie.cpk"" --pac-index 3"; using (Process process = new Process()) { process.StartInfo = startInfo; process.Start(); process.WaitForExit(); } } }
public static void Restart(string modPath) { Console.WriteLine($"[INFO] Restoring directory to original state..."); // Just in case its missing for some reason Directory.CreateDirectory($@"{modPath}\data"); // Clear data directory Parallel.ForEach(Directory.GetFiles($@"{modPath}\data"), file => { // Delete if not found in Original if (!FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{Path.GetFileName(file)}")) { Console.WriteLine($@"[INFO] Deleting {file}..."); try { FileIOWrapper.Delete(file); } catch (Exception e) { Console.WriteLine($"[ERROR] Couldn't delete {file} ({e.Message})"); } } // Overwrite if file size/date modified are different else if (new FileInfo(file).Length != new FileInfo($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{Path.GetFileName(file)}").Length || FileIOWrapper.GetLastWriteTime(file) != FileIOWrapper.GetLastWriteTime($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{Path.GetFileName(file)}")) { Console.WriteLine($@"[INFO] Reverting {file} to original..."); try { FileIOWrapper.Copy($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{Path.GetFileName(file)}", file, true); } catch (Exception e) { Console.WriteLine($"[ERROR] Couldn't overwrite {file} ({e.Message})"); } } }); // Copy over original files that may have accidentally been deleted foreach (var file in original_data) { if (!FileIOWrapper.Exists($@"{modPath}\data\{file}") && FileIOWrapper.Exists($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{file}")) { Console.WriteLine($"[INFO] Restoring {file}..."); try { FileIOWrapper.Copy($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\data\{file}", $@"{modPath}\data\{file}", true); } catch (Exception e) { Console.WriteLine($"[ERROR] Couldn't copy over {file} ({e.Message})"); } } } // Copy over backed up original rdbs foreach (var file in Directory.GetFiles(modPath, "*.rdb")) { Console.WriteLine($@"[INFO] Reverting {file} to original..."); try { FileIOWrapper.Copy($@"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\Original\Persona 5 Strikers\motor_rsc\{Path.GetFileName(file)}", file, true); } catch (Exception e) { Console.WriteLine($"[ERROR] Couldn't overwrite {file} ({e.Message})"); } } }