private void Preload_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker a = sender as BackgroundWorker; string inputPath = InputPath; //string tempPath = ModLoaderGlobals.BaseDirectory + ModLoaderGlobals.TempName + @"\"; //string outputPath = OutputPath; bool inputDirectoryMode = IO_Common.PathIsFolder(inputPath); //bool outputDirectoryMode = IO_Common.PathIsFolder(outputPath); a.ReportProgress(0); DeleteTempFiles(TempPath); //Pipeline.PreStart(inputDirectoryMode, outputDirectoryMode); a.ReportProgress(33); ExtractGame(inputPath, TempPath); while (Pipeline.IsBusy) { Thread.Sleep(100); } a.ReportProgress(66); PreloadGame(); a.ReportProgress(90); if (!KeepTempFiles) { DeleteTempFiles(TempPath); } }
/// <summary> /// Builds game ROM or copies game files to output path. /// </summary> /// <param name="inputPath">Input path of the game files</param> /// <param name="outputPath">Output path to folder or file</param> void BuildGame(string inputPath, string outputPath) { if (Pipeline == null) { Console.WriteLine("Error: Pipeline not ready!"); return; } bool directoryMode = IO_Common.PathIsFolder(outputPath); if (directoryMode) { //Directory Mode - just copy files to output DirectoryInfo di = new DirectoryInfo(inputPath); if (Pipeline.Metadata.Console == ConsoleMode.PS2) { foreach (DirectoryInfo dir in di.EnumerateDirectories()) { foreach (FileInfo file in dir.EnumerateFiles()) { file.MoveTo(file.FullName); } IO_Common.Recursive_RenameFiles(dir); } foreach (FileInfo file in di.EnumerateFiles()) { file.MoveTo(file.FullName); } } if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } string pathparent = outputPath + @"\"; foreach (DirectoryInfo dir in di.EnumerateDirectories()) { Directory.CreateDirectory(pathparent + dir.Name); foreach (FileInfo file in dir.EnumerateFiles()) { file.CopyTo(pathparent + dir.Name + @"\" + file.Name); } IO_Common.Recursive_CopyFiles(dir, pathparent + dir.Name + @"\"); } foreach (FileInfo file in di.EnumerateFiles()) { file.CopyTo(pathparent + file.Name); } } else { Pipeline.Build(inputPath, outputPath); } }
/// <summary> /// Detects console and game from the given full path using cached ModPipeline and Game lists. /// </summary> public void DetectGame(string inputPath) { bool directoryMode = IO_Common.PathIsFolder(inputPath); Modder = null; Pipeline = null; GamePreloaded = false; SupportedMods = new List <ModCrate>(); bool ConsoleDetected = false; string regionID; uint regionNumber; DeleteTempFiles(TempPath); try { foreach (KeyValuePair <ModPipelineInfo, Type> pair in SupportedConsoles) { Pipeline = (ModPipeline)Activator.CreateInstance(pair.Value); bool DetectResult = Pipeline.Detect(directoryMode, inputPath, out regionID, out regionNumber); if (DetectResult) { ConsoleDetected = true; SetGameType(regionID, pair.Key.Console, regionNumber); break; } DeleteTempFiles(TempPath); } } catch (Exception ex) { Console.WriteLine("Detect Error: " + ex.Message); UpdateProcessMessage(ModLoaderText.Error_UnableToOpenGame); ResetGameSpecific(false); return; } DeleteTempFiles(TempPath); SetProcessStartAllow.Invoke(this, new EventValueArgs <bool>(ConsoleDetected)); if (!ConsoleDetected) { ResetGameSpecific(false); UpdateProcessMessage(ModLoaderText.Error_UnknownGameROM); } }
/// <summary> /// Extracts or copies game files using the set ModPipeline from given input path to given output path. /// </summary> /// <param name="inputPath">Input path to Game folder or file</param> /// <param name="outputPath">Output path of game files</param> void ExtractGame(string inputPath, string outputPath) { if (Pipeline == null) { Console.WriteLine("Error: Pipeline not ready!"); return; } bool directoryMode = IO_Common.PathIsFolder(inputPath); if (directoryMode) { DirectoryInfo di = new DirectoryInfo(inputPath); if (!di.Exists) { throw new IOException(ModLoaderText.Error_FolderNotAccessible); } Directory.CreateDirectory(outputPath); string pathparent = outputPath + @"\"; foreach (DirectoryInfo dir in di.EnumerateDirectories()) { Directory.CreateDirectory(pathparent + dir.Name); foreach (FileInfo file in dir.EnumerateFiles()) { file.CopyTo(pathparent + dir.Name + @"\" + file.Name); } IO_Common.Recursive_CopyFiles(dir, pathparent + dir.Name + @"\"); } foreach (FileInfo file in di.EnumerateFiles()) { file.CopyTo(pathparent + file.Name); } } else { Pipeline.Extract(inputPath, outputPath); } }