using System; using System.IO; using System.Linq; using System.Threading.Tasks; namespace PKHeX.Core; /// /// Logic for startup initialization and argument parsing. /// public static class StartupUtil { public static void ReloadSettings(IProgramSettings settings) { var backup = settings.Backup; SaveFinder.CustomBackupPaths.Clear(); SaveFinder.CustomBackupPaths.AddRange(backup.OtherBackupPaths.Where(Directory.Exists)); settings.SaveLanguage.Apply(); var write = settings.SlotWrite; SaveFile.SetUpdateDex = write.SetUpdateDex ? EntityImportOption.Enable : EntityImportOption.Disable; SaveFile.SetUpdatePKM = write.SetUpdatePKM ? EntityImportOption.Enable : EntityImportOption.Disable; SaveFile.SetUpdateRecords = write.SetUpdateRecords ? EntityImportOption.Enable : EntityImportOption.Disable; CommonEdits.ShowdownSetIVMarkings = settings.Import.ApplyMarkings; CommonEdits.ShowdownSetBehaviorNature = settings.Import.ApplyNature; ParseSettings.Initialize(settings.Legality); var converter = settings.Converter; EntityConverter.AllowIncompatibleConversion = converter.AllowIncompatibleConversion; EntityConverter.RejuvenateHOME = converter.AllowGuessRejuvenateHOME; EntityConverter.VirtualConsoleSourceGen1 = converter.VirtualConsoleSourceGen1; EntityConverter.VirtualConsoleSourceGen2 = converter.VirtualConsoleSourceGen2; EntityConverter.RetainMetDateTransfer45 = converter.RetainMetDateTransfer45; var mgdb = settings.LocalResources.GetMGDatabasePath(); if (!Directory.Exists(mgdb)) return; new Task(() => EncounterEvent.RefreshMGDB(mgdb)).Start(); } public static ProgramInit FormLoadInitialActions(ReadOnlySpan args, IProgramSettings settings, Version currentVersion) { // Check if there is an update available var startup = settings.Startup; var showChangelog = GetShowChangelog(currentVersion, startup); // Remember the current version for next run // HaX behavior requested var hax = startup.ForceHaXOnLaunch || GetIsHaX(args); // Prompt to create a backup folder var backup = settings.Backup; var showAskBackupFolderCreate = !backup.BAKPrompt; if (showAskBackupFolderCreate) backup.BAKPrompt = true; // Never prompt after this run, unless changed in settings startup.Version = currentVersion.ToString(); return new ProgramInit(showChangelog, showAskBackupFolderCreate, hax); } private static bool GetShowChangelog(Version currentVersion, IStartupSettings startup) { if (!startup.ShowChangelogOnUpdate) return false; if (!Version.TryParse(startup.Version, out var lastRun)) return false; return lastRun < currentVersion; } public static StartupArguments GetStartup(ReadOnlySpan args, IProgramSettings settings) { var result = new StartupArguments(); try { result.ReadArguments(args); result.ReadSettings(settings.Startup); result.ReadTemplateIfNoEntity(settings.LocalResources.GetTemplatePath()); } catch (Exception ex) { // If an error occurs, store it in the result for later handling result.Error = ex; } return result; } private static bool GetIsHaX(ReadOnlySpan args) { foreach (var x in args) { var arg = x.AsSpan().Trim('-'); if (arg.Equals("HaX", StringComparison.CurrentCultureIgnoreCase)) return true; } ReadOnlySpan path = Environment.ProcessPath!; return Path.GetFileNameWithoutExtension(path).EndsWith("HaX"); } } public readonly record struct ProgramInit(bool ShowChangelog, bool BackupPrompt, bool HaX);