/// <summary> /// Finds a compatible save file that was most recently saved (by file write time). /// </summary> /// <param name="path">If this function returns true, full path of a save file or null if no path could be found. If this function returns false, this parameter will be set to the error message.</param> /// <param name="extra">Paths to check in addition to the default paths</param> /// <returns>A boolean indicating whether or not a file was detected</returns> public static bool DetectSaveFile(out string path, params string[] extra) { var foldersToCheck = extra.Where(f => f?.Length > 0); string path3DS = Path.GetPathRoot(Get3DSLocation()); if (path3DS != null) // check for Homebrew/CFW backups { foldersToCheck = foldersToCheck.Concat(Get3DSBackupPaths(path3DS)); } string pathNX = Path.GetPathRoot(GetSwitchLocation()); if (pathNX != null) // check for Homebrew/CFW backups { foldersToCheck = foldersToCheck.Concat(GetSwitchBackupPaths(pathNX)); } path = null; List <string> possiblePaths = new List <string>(); foreach (var folder in foldersToCheck) { if (!SaveUtil.GetSavesFromFolder(folder, true, out IEnumerable <string> files)) { if (files != null) // can be null if folder doesn't exist { path = string.Join(Environment.NewLine, files); // `files` contains the error message return(false); } } if (files != null) { possiblePaths.AddRange(files); } } // return newest save file path that is valid foreach (var file in possiblePaths.OrderByDescending(f => new FileInfo(f).LastWriteTime)) { try { var data = File.ReadAllBytes(file); var sav = SaveUtil.GetVariantSAV(data); if (sav?.ChecksumsValid != true) { continue; } path = file; return(true); } catch (Exception e) { path = e.Message + Environment.NewLine + file; return(false); } } return(true); }
private static List <PKM> LoadPKMSaves(string pkmdb, string savdb, string EXTERNAL_SAV, SaveFile SAV) { var dbTemp = new ConcurrentBag <PKM>(); var extensions = new HashSet <string>(PKM.Extensions.Select(z => $".{z}")); var files = Directory.EnumerateFiles(pkmdb, "*", SearchOption.AllDirectories); Parallel.ForEach(files, file => TryAddPKMsFromFolder(dbTemp, file, SAV, extensions)); if (SaveUtil.GetSavesFromFolder(savdb, false, out IEnumerable <string> result)) { Parallel.ForEach(result, file => TryAddPKMsFromSaveFilePath(dbTemp, file, EXTERNAL_SAV)); } // Fetch from save file var savpkm = SAV.BoxData.Where(pk => pk.Species != 0); var bakpkm = dbTemp.Where(pk => pk.Species != 0).OrderBy(pk => pk.Identifier); var db = bakpkm.Concat(savpkm).Where(pk => pk.ChecksumValid && pk.Sanity == 0); // when PK7->PK8 conversion is possible (and sprites in new size are available, remove this filter) db = SAV is SAV8SWSH?db.Where(z => z is PK8 || ((PersonalInfoSWSH)PersonalTable.SWSH.GetFormeEntry(z.Species, z.AltForm)).IsPresentInGame) : db.Where(z => !(z is PK8)); // Finalize the Database return(new List <PKM>(db)); }
private static List <PKM> LoadPKMSaves(string pkmdb, string savdb, string EXTERNAL_SAV, SaveFile SAV) { var dbTemp = new ConcurrentBag <PKM>(); var files = Directory.EnumerateFiles(pkmdb, "*", SearchOption.AllDirectories); var extensions = new HashSet <string>(PKM.Extensions.Select(z => $".{z}")); Parallel.ForEach(files, file => { var fi = new FileInfo(file); if (!extensions.Contains(fi.Extension) || !PKX.IsPKM(fi.Length)) { return; } var data = File.ReadAllBytes(file); var prefer = PKX.GetPKMFormatFromExtension(fi.Extension, SAV.Generation); var pk = PKMConverter.GetPKMfromBytes(data, prefer); if (!(pk?.Species > 0)) { return; } pk.Identifier = file; dbTemp.Add(pk); }); #if LOADALL if (SaveUtil.GetSavesFromFolder(savdb, false, out IEnumerable <string> result)) { Parallel.ForEach(result, file => { var sav = SaveUtil.GetVariantSAV(file); var path = EXTERNAL_SAV + new FileInfo(file).Name; if (sav.HasBox) { foreach (var pk in sav.BoxData) { addPKM(pk); } } void addPKM(PKM pk) { pk.Identifier = Path.Combine(path, pk.Identifier); dbTemp.Add(pk); } }); } #endif // Fetch from save file var savpkm = SAV.BoxData.Where(pk => pk.Species != 0); var bakpkm = dbTemp.Where(pk => pk.Species != 0).OrderBy(pk => pk.Identifier); var db = bakpkm.Concat(savpkm).Where(pk => pk.ChecksumValid && pk.Sanity == 0); // Prepare Database return(new List <PKM>(db)); }
private void LoadDatabase() { var dbTemp = new ConcurrentBag <PKM>(); var files = Directory.EnumerateFiles(DatabasePath, "*", SearchOption.AllDirectories); Parallel.ForEach(files, file => { FileInfo fi = new FileInfo(file); if (!fi.Extension.Contains(".pk") || !PKX.IsPKM(fi.Length)) { return; } var pk = PKMConverter.GetPKMfromBytes(File.ReadAllBytes(file), file, prefer: (fi.Extension.Last() - '0') & 0xF); if (pk != null) { dbTemp.Add(pk); } }); #if LOADALL if (SaveUtil.GetSavesFromFolder(Main.BackupPath, false, out IEnumerable <string> result)) { Parallel.ForEach(result, file => { var sav = SaveUtil.GetVariantSAV(File.ReadAllBytes(file)); var path = EXTERNAL_SAV + new FileInfo(file).Name; if (sav.HasBox) { foreach (var pk in sav.BoxData) { addPKM(pk); } } void addPKM(PKM pk) { pk.Identifier = Path.Combine(path, pk.Identifier); dbTemp.Add(pk); } }); } #endif // Prepare Database RawDB = new List <PKM>(dbTemp.OrderBy(pk => pk.Identifier) .Concat(SAV.BoxData.Where(pk => pk.Species != 0)) // Fetch from save file .Where(pk => pk.ChecksumValid && pk.Species != 0 && pk.Sanity == 0) .Distinct()); try { BeginInvoke(new MethodInvoker(() => SetResults(RawDB))); } catch { /* Window Closed? */ } }
private static List <PKM> LoadPKMSaves(string pkmdb, string savdb, string EXTERNAL_SAV, SaveFile SAV) { var dbTemp = new ConcurrentBag <PKM>(); var extensions = new HashSet <string>(PKM.Extensions.Select(z => $".{z}")); var files = Directory.EnumerateFiles(pkmdb, "*", SearchOption.AllDirectories); Parallel.ForEach(files, file => TryAddPKMsFromFolder(dbTemp, file, SAV, extensions)); if (SaveUtil.GetSavesFromFolder(savdb, false, out IEnumerable <string> result)) { Parallel.ForEach(result, file => TryAddPKMsFromSaveFilePath(dbTemp, file, EXTERNAL_SAV)); } // Fetch from save file var savpkm = SAV.BoxData.Where(pk => pk.Species != 0); var bakpkm = dbTemp.Where(pk => pk.Species != 0).OrderBy(pk => pk.Identifier); var db = bakpkm.Concat(savpkm).Where(pk => pk.ChecksumValid && pk.Sanity == 0); // Finalize the Database return(new List <PKM>(db)); }
public SAV_Database(PKMEditor f1, SAVEditor saveditor) { SAV = saveditor.SAV; BoxView = saveditor; PKME_Tabs = f1; InitializeComponent(); // Preset Filters to only show PKM available for loaded save CB_FormatComparator.SelectedIndex = 3; // <= PKXBOXES = new[] { bpkx1, bpkx2, bpkx3, bpkx4, bpkx5, bpkx6, bpkx7, bpkx8, bpkx9, bpkx10, bpkx11, bpkx12, bpkx13, bpkx14, bpkx15, bpkx16, bpkx17, bpkx18, bpkx19, bpkx20, bpkx21, bpkx22, bpkx23, bpkx24, bpkx25, bpkx26, bpkx27, bpkx28, bpkx29, bpkx30, bpkx31, bpkx32, bpkx33, bpkx34, bpkx35, bpkx36, bpkx37, bpkx38, bpkx39, bpkx40, bpkx41, bpkx42, bpkx43, bpkx44, bpkx45, bpkx46, bpkx47, bpkx48, bpkx49, bpkx50, bpkx51, bpkx52, bpkx53, bpkx54, bpkx55, bpkx56, bpkx57, bpkx58, bpkx59, bpkx60, bpkx61, bpkx62, bpkx63, bpkx64, bpkx65, bpkx66, }; // Enable Scrolling when hovered over PAN_Box.MouseWheel += (sender, e) => { if (ActiveForm == this) { SCR_Box.Focus(); } }; foreach (var slot in PKXBOXES) { slot.MouseWheel += (sender, e) => { if (ActiveForm == this) { SCR_Box.Focus(); } }; // Enable Click slot.MouseClick += (sender, e) => { if (ModifierKeys == Keys.Control) { ClickView(sender, e); } else if (ModifierKeys == Keys.Alt) { ClickDelete(sender, e); } else if (ModifierKeys == Keys.Shift) { ClickSet(sender, e); } }; } Counter = L_Count.Text; Viewed = L_Viewed.Text; L_Viewed.Text = ""; // invis for now var hover = new ToolTip(); L_Viewed.MouseEnter += (sender, e) => hover.SetToolTip(L_Viewed, L_Viewed.Text); PopulateComboBoxes(); ContextMenuStrip mnu = new ContextMenuStrip(); ToolStripMenuItem mnuView = new ToolStripMenuItem("View"); ToolStripMenuItem mnuDelete = new ToolStripMenuItem("Delete"); // Assign event handlers mnuView.Click += ClickView; mnuDelete.Click += ClickDelete; // Add to main context menu mnu.Items.AddRange(new ToolStripItem[] { mnuView, mnuDelete }); // Assign to datagridview foreach (PictureBox p in PKXBOXES) { p.ContextMenuStrip = mnu; } // Load Data var dbTemp = new ConcurrentBag <PKM>(); var files = Directory.GetFiles(DatabasePath, "*", SearchOption.AllDirectories); Parallel.ForEach(files, file => { FileInfo fi = new FileInfo(file); if (!fi.Extension.Contains(".pk") || !PKX.IsPKM(fi.Length)) { return; } var pk = PKMConverter.GetPKMfromBytes(File.ReadAllBytes(file), file, prefer: (fi.Extension.Last() - 0x30) & 7); if (pk != null) { dbTemp.Add(pk); } }); #if DEBUG if (SaveUtil.GetSavesFromFolder(Main.BackupPath, false, out IEnumerable <string> result)) { Parallel.ForEach(result, file => { var sav = SaveUtil.GetVariantSAV(File.ReadAllBytes(file)); var path = EXTERNAL_SAV + new FileInfo(file).Name; if (sav.HasBox) { foreach (var pk in sav.BoxData) { addPKM(pk); } } void addPKM(PKM pk) { pk.Identifier = Path.Combine(path, pk.Identifier); dbTemp.Add(pk); } }); } #endif // Prepare Database RawDB = new List <PKM>(dbTemp.OrderBy(pk => pk.Identifier) .Concat(SAV.BoxData.Where(pk => pk.Species != 0)) // Fetch from save file .Where(pk => pk.ChecksumValid && pk.Species != 0 && pk.Sanity == 0) .Distinct()); SetResults(RawDB); Menu_SearchSettings.DropDown.Closing += (sender, e) => { if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) { e.Cancel = true; } }; CenterToParent(); }