diff --git a/MENU.md b/MENU.md index 9ae725f8..a75a7d25 100644 --- a/MENU.md +++ b/MENU.md @@ -4,10 +4,13 @@ 4. Download Assets 5. Backup Saves & Memories 6. Pocket Setup - 1. Add Display Modes + 1. Manage Display Modes 1. Enable Recommended Display Modes 2. Enable Selected Display Modes for All Cores 3. Enable Selected Display Modes for Select Cores + 4. Reset All Customized Display Modes + 5. Reset Selected Customized Display Modes + 6. Change Display Modes Option Setting 2. Download Images and Palettes 1. Download Platform Image Packs 2. Download Pocket Library Images diff --git a/README.md b/README.md index 0dbf537f..8bdb5348 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ For a full view of the interactive console menu, see [here](MENU.md). [GameBoy Palettes](#pocket-setup---download-gameboy-palettes) | [PC Engine CD](#pocket-setup---generating-instance-json-files-pc-engine-cd) | [Game & Watch](#pocket-setup---generate-game--watch-roms) | -[Display Modes](#pocket-setup---enable-all-display-modes) | +[Display Modes](#pocket-setup---display-modes) | [Super GameBoy Aspect Ratio](#pocket-setup---super-gameboy-aspect-ratio) | [Pocket Maintenance](#pocket-maintenance---reinstall-or-uninstall-cores) | [Pocket Extras](#pocket-extras) | @@ -93,6 +93,24 @@ This presents you with a list of all of the supported display modes and lets you This presents you with a list of all of the supported display modes and lets you select which ones you want to apply. Next, you'll be asked to select which of your installed cores you want to apply the display modes to. Then it applies those display modes to the cores you have selected. +- Reset All Customized Display Modes + +This will reset all of the cores with customized display modes back to the original list that was specified by the core. + +- Reset Selected Customized Display Modes + +This will reset the selected cores with customized display modes back to the original list that was specified by the core. + +- Change Display Modes Option Setting + +This will prompt you to ask how you want to apply the display modes to the cores, with 3 options: +- Merge + - Selecting this will merge the selected or recommended display modes with the ones specified by the core. +- Overwrite + - Selecting this will overwrite the display modes specified by the core with the selected or recommended ones. +- Ask + - Selecting this will ask you if you want to merge or overwrite the core specified display modes with the selected or recommended ones each time you run it. + ### Pocket Setup - Download Platform Image Packs This will present you with a list of available image packs and automatically download and extract it to the Platforms/_images directory for you @@ -153,10 +171,6 @@ Should look like this: Now just run the menu option in the updater and it will build your games -### Pocket Setup - Enable All Display Modes - -This will enable all of the Pocket Display Modes for the openFPGA cores. - ### Pocket Setup - Super GameBoy Aspect Ratio This allows you to apply the 8:7 aspect ratio to any of the Super GameBoy cores you may have installed. When selected you will be asked which cores you want to do this for. @@ -225,6 +239,7 @@ This contains a list of alternate core setups. These take existing cores and mak | config.archive_name | The account on archive.org that the app will use to check for Assets | | config.github_token | The app will use this when making API calls to GitHub | | config.download_new_cores | This will be set automatically by the `Select Cores` menu item. It can be set to "yes", "no", or "ask" | +| config.display_modes_option | This will be set automatically by any of the `Display Modes` menu items. It can be set to "merge", "overwrite", or "ask" | | config.custom_archive | You can set a custom URL here, if you don't want to use the default. `index` is a relative path to the index of your custom site's files. This is not required, but it's needed for CRC checking. If you have CRC checking enabled, the setting will be ignored unless this provides the necessary format. It must match the output of archive.org's json endpoint. https://archive.org/developers/md-read.html | | config.backup_saves | Set this to `true` if you want your Saves directory to be backed up automatically during `Update All` | | config.backup_saves_location | Put the absolute path to the backup location here to backup your `Saves` directory to. This defaults to `Backups` in the current directory when not set. | diff --git a/display_modes.json b/display_modes.json index c4b17264..273cca30 100644 --- a/display_modes.json +++ b/display_modes.json @@ -1,44 +1,135 @@ { "display_modes": { "all": [ - { "value": "0x10", "description": "CRT Trinitron" }, - { "value": "0x20", "description": "Greyscale LCD" }, - { "value": "0x30", "description": "Reflective Color LCD" }, - { "value": "0x40", "description": "Backlit Color LCD" }, - { "value": "0xE0", "description": "Pinball Neon Matrix" }, - { "value": "0xE1", "description": "Vacuum Fluorescent" } + { + "value": "0x10", + "order": 17, + "description": "CRT Trinitron" + }, + { + "value": "0x20", + "order": 18, + "description": "Greyscale LCD" + }, + { + "value": "0x30", + "order": 19, + "description": "Reflective Color LCD" + }, + { + "value": "0x40", + "order": 20, + "description": "Backlit Color LCD" + }, + { + "value": "0xE0", + "order": 21, + "description": "Pinball Neon Matrix" + }, + { + "value": "0xE1", + "order": 22, + "description": "Vacuum Fluorescent" + } ], "gb": [ - { "value": "0x21", "description": "Original GB DMG" }, - { "value": "0x22", "description": "Original GBP" }, - { "value": "0x23", "description": "Original GBP Light" } + { + "value": "0x21", + "order": 1, + "description": "Original GB DMG (Requires Core Response)", + "exclude_cores": [ "Spiritualized.GB" ] + }, + { + "value": "0x22", + "order": 2, + "description": "Original GBP (Requires Core Response)", + "exclude_cores": [ "Spiritualized.GB" ] + }, + { + "value": "0x23", + "order": 3, + "description": "Original GBP Light (Requires Core Response)", + "exclude_cores": [ "Spiritualized.GB" ] + } ], "gbc": [ - { "value": "0x31", "description": "Original GBC LCD" }, - { "value": "0x32", "description": "Original GBC LCD+" } + { + "value": "0x31", + "order": 4, + "description": "Original GBC LCD" + }, + { + "value": "0x32", + "order": 5, + "description": "Original GBC LCD+" + } ], "gba": [ - { "value": "0x41", "description": "Original GBA LCD" }, - { "value": "0x42", "description": "Original GBA SP 101" } + { + "value": "0x41", + "order": 6, + "description": "Original GBA LCD" + }, + { + "value": "0x42", + "order": 7, + "description": "Original GBA SP 101" + } ], "gg": [ - { "value": "0x51", "description": "Original GG" }, - { "value": "0x52", "description": "Original GG+" } + { + "value": "0x51", + "order": 8, + "description": "Original GG" + }, + { + "value": "0x52", + "order": 9, + "description": "Original GG+" + } ], "jtngp": [ - { "value": "0x61", "description": "Original NGP" } + { + "value": "0x61", + "order": 10, + "description": "Original NGP" + } ], "jtngpc": [ - { "value": "0x62", "description": "Original NGPC" }, - { "value": "0x63", "description": "Original NGPC+" } + { + "value": "0x62", + "order": 11, + "description": "Original NGPC" + }, + { + "value": "0x63", + "order": 12, + "description": "Original NGPC+" + } ], "pce": [ - { "value": "0x71", "description": "TurboExpress" }, - { "value": "0x72", "description": "PC Engine LT" } + { + "value": "0x71", + "order": 13, + "description": "TurboExpress" + }, + { + "value": "0x72", + "order": 14, + "description": "PC Engine LT" + } ], "lynx": [ - { "value": "0x81", "description": "Original Lynx" }, - { "value": "0x82", "description": "Original Lynx+" } + { + "value": "0x81", + "order": 15, + "description": "Original Lynx" + }, + { + "value": "0x82", + "order": 16, + "description": "Original Lynx+" + } ] } } diff --git a/pupdate.csproj b/pupdate.csproj index 9c5494c7..ae1ca661 100644 --- a/pupdate.csproj +++ b/pupdate.csproj @@ -49,6 +49,7 @@ + diff --git a/src/Program.cs b/src/Program.cs index 192a3e0a..3711a086 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -68,7 +68,7 @@ private static void Main(string[] args) { case MenuOptions options: if (!options.SkipUpdate) - CheckForUpdates(ServiceHelper.UpdateDirectory, false, args, ServiceHelper.SettingsService.GetConfig().auto_install_updates); + CheckForUpdates(ServiceHelper.UpdateDirectory, false, args, ServiceHelper.SettingsService.Config.auto_install_updates); else enableMissingCores = true; break; @@ -149,7 +149,7 @@ private static void Main(string[] args) if (options.Save) { - var config = ServiceHelper.SettingsService.GetConfig(); + var config = ServiceHelper.SettingsService.Config; config.backup_saves = true; config.backup_saves_location = options.BackupPath; diff --git a/src/helpers/ServiceHelper.cs b/src/helpers/ServiceHelper.cs index 0d866c14..1c8defad 100644 --- a/src/helpers/ServiceHelper.cs +++ b/src/helpers/ServiceHelper.cs @@ -28,15 +28,15 @@ public static void Initialize(string path, string settingsPath, EventHandler scaler_modes { get; set; } + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] public List display_modes { get; set; } } diff --git a/src/models/DisplayModes/DisplayMode.cs b/src/models/DisplayModes/DisplayMode.cs index e07fcd8f..66e7f00a 100644 --- a/src/models/DisplayModes/DisplayMode.cs +++ b/src/models/DisplayModes/DisplayMode.cs @@ -4,9 +4,12 @@ public class DisplayMode { public string value { get; set; } public string description { get; set; } + public int order { get; set; } + + public List exclude_cores { get; set; } = new(); public override string ToString() { - return value; + return $"{this.value} - {this.order} - {this.description}"; } } diff --git a/src/models/Settings/Config.cs b/src/models/Settings/Config.cs index d7d67214..c045aa98 100644 --- a/src/models/Settings/Config.cs +++ b/src/models/Settings/Config.cs @@ -23,6 +23,8 @@ public class Config public string download_new_cores { get; set; } + public string display_modes_option { get; set; } + [Description("Build game JSON files for supported cores during 'Update All'")] public bool build_instance_jsons { get; set; } = true; @@ -56,6 +58,9 @@ public class Config public string patreon_email_address { get; set; } = null; + [Description("Adds a description element to the video.json display modes (non-breaking)")] + public bool add_display_mode_description_to_video_json { get; set; } = false; + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] //[Description("Use a local cores.json file for the inventory")] public bool use_local_cores_inventory { get; set; } = false; diff --git a/src/partials/Program.DisplayModes.cs b/src/partials/Program.DisplayModes.cs index 3668fc5a..c29176ec 100644 --- a/src/partials/Program.DisplayModes.cs +++ b/src/partials/Program.DisplayModes.cs @@ -1,30 +1,79 @@ using Pannella.Helpers; +using Pannella.Models.DisplayModes; namespace Pannella; internal partial class Program { - private static void EnableDisplayModes(List coreIdentifiers = null, string[] displayModes = null, bool isCurated = false) + private static void EnableDisplayModes(List coreIdentifiers = null, List displayModes = null, + bool isCurated = false) { + AskAboutDisplayModesSetting(); + + string answer = null; + + if (ServiceHelper.SettingsService.Config.display_modes_option == "ask") + { + answer = AskAboutDisplayModes(); + } + coreIdentifiers ??= ServiceHelper.CoresService.Cores .Where(core => !ServiceHelper.SettingsService.GetCoreSettings(core.identifier).skip) .Select(core => core.identifier) .ToList(); - foreach (var core in coreIdentifiers) + foreach (var coreIdentifier in coreIdentifiers) { try { - // not sure if this check is still needed - if (core == null) + Console.WriteLine($"Updating display modes for {coreIdentifier}"); + ServiceHelper.CoresService.AddDisplayModes(coreIdentifier, displayModes, isCurated, + merge: answer == "merge"); + } + catch (Exception e) + { + Console.WriteLine("Uh oh something went wrong."); +#if DEBUG + Console.WriteLine(e.ToString()); +#else + Console.WriteLine(e.Message); +#endif + } + } + + ServiceHelper.SettingsService.Save(); + + Console.WriteLine("Finished."); + } + + private static void ResetDisplayModes(List coreIdentifiers = null) + { + coreIdentifiers ??= ServiceHelper.CoresService.InstalledCoresWithCustomDisplayModes.Select(c => c.identifier) + .ToList(); + + foreach (var coreIdentifier in coreIdentifiers) + { + try + { + var coreSettings = ServiceHelper.SettingsService.GetCoreSettings(coreIdentifier); + + Console.WriteLine($"Resetting display modes for {coreIdentifier}"); + + if (string.IsNullOrWhiteSpace(coreSettings.original_display_modes)) { - Console.WriteLine("Core Name is required. Skipping."); - continue; + ServiceHelper.CoresService.ClearDisplayModes(coreIdentifier); + } + else + { + var originalDisplayModes = coreSettings.original_display_modes.Split(','); + var displayModes = ServiceHelper.CoresService.ConvertDisplayModes(originalDisplayModes); + + ServiceHelper.CoresService.AddDisplayModes(coreIdentifier, displayModes); } - Console.WriteLine("Updating " + core); - ServiceHelper.CoresService.AddDisplayModes(core, displayModes, isCurated); - ServiceHelper.SettingsService.Save(); + coreSettings.display_modes = false; + coreSettings.original_display_modes = null; + coreSettings.selected_display_modes = null; } catch (Exception e) { @@ -37,6 +86,8 @@ private static void EnableDisplayModes(List coreIdentifiers = null, stri } } + ServiceHelper.SettingsService.Save(); + Console.WriteLine("Finished."); } } diff --git a/src/partials/Program.GameAndWatch.cs b/src/partials/Program.GameAndWatch.cs index ae1e2d1e..948f51fb 100644 --- a/src/partials/Program.GameAndWatch.cs +++ b/src/partials/Program.GameAndWatch.cs @@ -12,7 +12,7 @@ internal partial class Program private static void BuildGameAndWatchRoms() { Release release = GithubApiService.GetLatestRelease("agg23", "fpga-gameandwatch", - ServiceHelper.SettingsService.GetConfig().github_token); + ServiceHelper.SettingsService.Config.github_token); foreach (GithubAsset asset in release.assets) { diff --git a/src/partials/Program.GameBoyPalettes.cs b/src/partials/Program.GameBoyPalettes.cs index fe6f4321..b94e6054 100644 --- a/src/partials/Program.GameBoyPalettes.cs +++ b/src/partials/Program.GameBoyPalettes.cs @@ -11,7 +11,7 @@ internal partial class Program private static void DownloadGameBoyPalettes() { Release release = GithubApiService.GetLatestRelease("davewongillies", "openfpga-palettes", - ServiceHelper.SettingsService.GetConfig().github_token); + ServiceHelper.SettingsService.Config.github_token); Asset asset = release.assets.FirstOrDefault(a => a.name.EndsWith(".zip")); if (asset != null) diff --git a/src/partials/Program.Helpers.cs b/src/partials/Program.Helpers.cs index 2755ed42..f5d9d10f 100644 --- a/src/partials/Program.Helpers.cs +++ b/src/partials/Program.Helpers.cs @@ -14,7 +14,7 @@ private static bool CheckVersion(string path) try { List releases = GithubApiService.GetReleases(USER, REPOSITORY, - ServiceHelper.SettingsService.GetConfig().github_token); + ServiceHelper.SettingsService.Config.github_token); string tagName = releases[0].tag_name; string v = SemverUtil.FindSemver(tagName); diff --git a/src/partials/Program.Menus.Cores.cs b/src/partials/Program.Menus.Cores.cs index 346feb4d..c86b3bb9 100644 --- a/src/partials/Program.Menus.Cores.cs +++ b/src/partials/Program.Menus.Cores.cs @@ -127,7 +127,7 @@ private static Dictionary RunCoreSelector(List cores, string { Dictionary results = null; - if (ServiceHelper.SettingsService.GetConfig().download_new_cores?.ToLowerInvariant() == "yes") + if (ServiceHelper.SettingsService.Config.download_new_cores?.ToLowerInvariant() == "yes") { foreach (Core core in cores) { diff --git a/src/partials/Program.Menus.DisplayModes.cs b/src/partials/Program.Menus.DisplayModes.cs index 1396c2c8..845dd6ce 100644 --- a/src/partials/Program.Menus.DisplayModes.cs +++ b/src/partials/Program.Menus.DisplayModes.cs @@ -1,6 +1,7 @@ using ConsoleTools; using Pannella.Helpers; using Pannella.Models.DisplayModes; +using Pannella.Services; namespace Pannella; @@ -15,7 +16,6 @@ private static void DisplayModeSelector(bool showCoreSelector = false) var more = true; var count = 0; var results = new List(); - var allDisplayModes = ServiceHelper.CoresService.GetAllDisplayModes(); while (more) { @@ -27,7 +27,7 @@ private static void DisplayModeSelector(bool showCoreSelector = false) config.WriteHeaderAction = () => { Console.WriteLine("Which display modes would you like to enable?"); - Console.WriteLine($"Note: There is a maximum of 16. You have {16 - count} remaining."); + Console.WriteLine($"Note: There is a maximum of 16. You have {CoresService.DISPLAY_MODES_MAX - count} remaining."); }; config.SelectedItemBackgroundColor = Console.ForegroundColor; config.SelectedItemForegroundColor = Console.BackgroundColor; @@ -35,7 +35,7 @@ private static void DisplayModeSelector(bool showCoreSelector = false) }); var current = -1; - if ((offset + pageSize) <= allDisplayModes.Count) + if ((offset + pageSize) <= ServiceHelper.CoresService.AllDisplayModes.Count) { menu.Add("Next Page", thisMenu => { @@ -44,7 +44,7 @@ private static void DisplayModeSelector(bool showCoreSelector = false) }); } - foreach (DisplayMode displayMode in allDisplayModes) + foreach (DisplayMode displayMode in ServiceHelper.CoresService.AllDisplayModes) { current++; @@ -76,7 +76,7 @@ private static void DisplayModeSelector(bool showCoreSelector = false) } } - if ((offset + pageSize) <= allDisplayModes.Count) + if ((offset + pageSize) <= ServiceHelper.CoresService.AllDisplayModes.Count) { menu.Add("Next Page", thisMenu => { @@ -94,11 +94,13 @@ private static void DisplayModeSelector(bool showCoreSelector = false) }); } + List convertedDisplayModes = ServiceHelper.CoresService.ConvertDisplayModes(results); + if (!showCoreSelector) { menu.Add("Apply Choices", thisMenu => { - EnableDisplayModes(displayModes: results.ToArray()); + EnableDisplayModes(displayModes: convertedDisplayModes); thisMenu.CloseMenu(); more = false; }); @@ -114,10 +116,9 @@ private static void DisplayModeSelector(bool showCoreSelector = false) ServiceHelper.CoresService.InstalledCores, "Which cores would you like to apply the selected display modes to?", false); + var coreIdentifiers = coreResults.Where(kvp => kvp.Value).Select(kvp => kvp.Key).ToList(); - EnableDisplayModes( - coreResults.Where(kvp => kvp.Value).Select(kvp => kvp.Key).ToList(), - results.ToArray()); + EnableDisplayModes(coreIdentifiers, convertedDisplayModes); }); } diff --git a/src/partials/Program.Menus.Questions.cs b/src/partials/Program.Menus.Questions.cs index abaf914e..4729b384 100644 --- a/src/partials/Program.Menus.Questions.cs +++ b/src/partials/Program.Menus.Questions.cs @@ -6,7 +6,7 @@ internal partial class Program { private static void AskAboutNewCores(bool force = false) { - while (ServiceHelper.SettingsService.GetConfig().download_new_cores == null || force) + while (ServiceHelper.SettingsService.Config.download_new_cores == null || force) { force = false; @@ -14,7 +14,7 @@ private static void AskAboutNewCores(bool force = false) ConsoleKey response = Console.ReadKey(true).Key; - ServiceHelper.SettingsService.GetConfig().download_new_cores = response switch + ServiceHelper.SettingsService.Config.download_new_cores = response switch { ConsoleKey.Y => "yes", ConsoleKey.N => "no", @@ -24,6 +24,49 @@ private static void AskAboutNewCores(bool force = false) } } + private static void AskAboutDisplayModesSetting(bool force = false) + { + while (ServiceHelper.SettingsService.Config.display_modes_option == null || force) + { + force = false; + + Console.WriteLine("Would you like to, by default, merge or overwrite the display modes? [M]erge, [O]verwrite, [A]sk each time:"); + + ConsoleKey response = Console.ReadKey(true).Key; + + ServiceHelper.SettingsService.Config.display_modes_option = response switch + { + ConsoleKey.M => "merge", + ConsoleKey.O => "overwrite", + ConsoleKey.A => "ask", + _ => null + }; + } + + ServiceHelper.SettingsService.Save(); + } + + private static string AskAboutDisplayModes() + { + string result = null; + + while (result == null) + { + Console.WriteLine("Would you like to merge or overwrite the display modes? [M]erge, [O]verwrite:"); + + ConsoleKey response = Console.ReadKey(true).Key; + + result = response switch + { + ConsoleKey.M => "merge", + ConsoleKey.O => "overwrite", + _ => null + }; + } + + return result; + } + private static bool AskYesNoQuestion(string question) { Console.WriteLine($"{question} [Y]es, [N]o"); diff --git a/src/partials/Program.Menus.Settings.cs b/src/partials/Program.Menus.Settings.cs index 14490c4b..4b9e55a3 100644 --- a/src/partials/Program.Menus.Settings.cs +++ b/src/partials/Program.Menus.Settings.cs @@ -31,13 +31,13 @@ from property in type.GetProperties() foreach (var (name, text) in menuItems) { var property = type.GetProperty(name); - var value = (bool)property!.GetValue(ServiceHelper.SettingsService.GetConfig())!; + var value = (bool)property!.GetValue(ServiceHelper.SettingsService.Config)!; var title = MenuItemName(text, value); menu.Add(title, thisMenu => { value = !value; - property.SetValue(ServiceHelper.SettingsService.GetConfig(), value); + property.SetValue(ServiceHelper.SettingsService.Config, value); thisMenu.CurrentItem.Name = MenuItemName(text, value); }); } diff --git a/src/partials/Program.Menus.cs b/src/partials/Program.Menus.cs index 3c3b8e0d..a075f549 100644 --- a/src/partials/Program.Menus.cs +++ b/src/partials/Program.Menus.cs @@ -58,6 +58,27 @@ private static void DisplayMenu(CoreUpdaterService coreUpdaterService) DisplayModeSelector(true); Pause(); }) + .Add("Reset All Customized Display Modes", () => + { + ResetDisplayModes(); + Pause(); + }) + .Add("Reset Selected Customized Display Modes", () => + { + var coreResults = ShowCoresMenu( + ServiceHelper.CoresService.InstalledCores, + "Which cores would you like to reset the display modes for?", + false); + var coreIdentifiers = coreResults.Where(kvp => kvp.Value).Select(kvp => kvp.Key).ToList(); + + ResetDisplayModes(coreIdentifiers); + Pause(); + }) + .Add("Change Display Modes Option Setting", () => + { + AskAboutDisplayModesSetting(true); + Pause(); + }) .Add("Go Back", ConsoleMenu.Close); #endregion @@ -155,7 +176,7 @@ private static void DisplayMenu(CoreUpdaterService coreUpdaterService) var pocketSetupMenu = new ConsoleMenu() .Configure(menuConfig) - .Add("Apply Display Modes >", displayModesMenu.Show) + .Add("Manage Display Modes >", displayModesMenu.Show) .Add("Download Images and Palettes >", downloadFilesMenu.Show) .Add("Generate ROMs & JSON Files >", generateFilesMenu.Show) .Add("Super GameBoy Aspect Ratio >", sgbAspectRatioMenu.Show) @@ -169,14 +190,14 @@ private static void DisplayMenu(CoreUpdaterService coreUpdaterService) }) .Add("Set Patreon Email Address", () => { - Console.WriteLine($"Current email address: {ServiceHelper.SettingsService.GetConfig().patreon_email_address}"); + Console.WriteLine($"Current email address: {ServiceHelper.SettingsService.Config.patreon_email_address}"); var result = AskYesNoQuestion("Would you like to change your address?"); if (!result) return; string input = PromptForInput(); - ServiceHelper.SettingsService.GetConfig().patreon_email_address = input; + ServiceHelper.SettingsService.Config.patreon_email_address = input; ServiceHelper.SettingsService.Save(); Pause(); @@ -304,7 +325,7 @@ private static void DisplayMenu(CoreUpdaterService coreUpdaterService) { bool result = true; - if (ServiceHelper.SettingsService.GetConfig().show_menu_descriptions && + if (ServiceHelper.SettingsService.Config.show_menu_descriptions && !string.IsNullOrEmpty(pocketExtra.description)) { Console.WriteLine(Util.WordWrap(pocketExtra.description, 80)); @@ -371,9 +392,9 @@ private static void DisplayMenu(CoreUpdaterService coreUpdaterService) .Add("Backup Saves & Memories", () => { AssetsService.BackupSaves(ServiceHelper.UpdateDirectory, - ServiceHelper.SettingsService.GetConfig().backup_saves_location); + ServiceHelper.SettingsService.Config.backup_saves_location); AssetsService.BackupMemories(ServiceHelper.UpdateDirectory, - ServiceHelper.SettingsService.GetConfig().backup_saves_location); + ServiceHelper.SettingsService.Config.backup_saves_location); Pause(); }) .Add("Pocket Setup >", pocketSetupMenu.Show) diff --git a/src/partials/Program.MissingCores.cs b/src/partials/Program.MissingCores.cs index 609e24da..65990bf4 100644 --- a/src/partials/Program.MissingCores.cs +++ b/src/partials/Program.MissingCores.cs @@ -12,7 +12,7 @@ private static void CheckForMissingCores(bool enableMissingCores) Console.WriteLine("\nNew cores found since the last run."); AskAboutNewCores(); - string downloadNewCores = ServiceHelper.SettingsService.GetConfig().download_new_cores?.ToLowerInvariant(); + string downloadNewCores = ServiceHelper.SettingsService.Config.download_new_cores?.ToLowerInvariant(); switch (downloadNewCores) { diff --git a/src/services/AssetsService.cs b/src/services/AssetsService.cs index 2b36b5c3..9f1de5ab 100644 --- a/src/services/AssetsService.cs +++ b/src/services/AssetsService.cs @@ -165,7 +165,7 @@ private static string ComputeDirectoryHash(string directoryPath) public static void PruneSaveStates(string rootDirectory, string coreName = null) { - BackupMemories(ServiceHelper.UpdateDirectory, ServiceHelper.SettingsService.GetConfig().backup_saves_location); + BackupMemories(ServiceHelper.UpdateDirectory, ServiceHelper.SettingsService.Config.backup_saves_location); string savesPath = Path.Combine(rootDirectory, "Memories", "Save States"); //YYYYMMDD_HHMMSS_SOMETHING_SOMETHING_GAMETITLE.STA diff --git a/src/services/CoreUpdaterService.cs b/src/services/CoreUpdaterService.cs index 3efa6917..e90741af 100644 --- a/src/services/CoreUpdaterService.cs +++ b/src/services/CoreUpdaterService.cs @@ -57,13 +57,13 @@ public void RunUpdates(string[] ids = null, bool clean = false) List missingLicenses = new List(); string firmwareDownloaded = null; - if (this.settingsService.GetConfig().backup_saves) + if (this.settingsService.Config.backup_saves) { - AssetsService.BackupSaves(this.installPath, this.settingsService.GetConfig().backup_saves_location); - AssetsService.BackupMemories(this.installPath, this.settingsService.GetConfig().backup_saves_location); + AssetsService.BackupSaves(this.installPath, this.settingsService.Config.backup_saves_location); + AssetsService.BackupMemories(this.installPath, this.settingsService.Config.backup_saves_location); } - if (this.settingsService.GetConfig().download_firmware && ids == null) + if (this.settingsService.Config.download_firmware && ids == null) { if (this.firmwareService != null) { @@ -321,7 +321,7 @@ public void RunUpdates(string[] ids = null, bool clean = false) private void JotegoRename(Core core) { - if (this.settingsService.GetConfig().fix_jt_names && + if (this.settingsService.Config.fix_jt_names && this.settingsService.GetCoreSettings(core.identifier).platform_rename && core.identifier.Contains("jotego")) { @@ -355,7 +355,7 @@ public void DeleteCore(Core core, bool force = false, bool nuke = false) // If the platform id is still missing, it's a pocket extra that was already deleted, so skip it. if (!string.IsNullOrEmpty(core.platform_id) && - (this.settingsService.GetConfig().delete_skipped_cores || force)) + (this.settingsService.Config.delete_skipped_cores || force)) { this.coresService.Uninstall(core.identifier, core.platform_id, nuke); } diff --git a/src/services/CoresService.DisplayModes.cs b/src/services/CoresService.DisplayModes.cs index 2f47632a..6dab24ba 100644 --- a/src/services/CoresService.DisplayModes.cs +++ b/src/services/CoresService.DisplayModes.cs @@ -8,16 +8,35 @@ public partial class CoresService private const string DISPLAY_MODES_END_POINT = "https://raw.githubusercontent.com/mattpannella/pupdate/main/display_modes.json"; private const string DISPLAY_MODES_FILE = "display_modes.json"; + private List allDisplayModesList; private Dictionary> displayModesList; - private Dictionary> DisplayModes + public List AllDisplayModes { get { - if (displayModesList == null) + if (this.allDisplayModesList == null) + { + this.allDisplayModesList = new List(); + + foreach (string key in this.DisplayModes.Keys) + { + this.allDisplayModesList.AddRange(this.DisplayModes[key]); + } + } + + return this.allDisplayModesList; + } + } + + public Dictionary> DisplayModes + { + get + { + if (this.displayModesList == null) { string json = this.GetServerJsonFile( - this.settingsService.GetConfig().use_local_display_modes, + this.settingsService.Config.use_local_display_modes, DISPLAY_MODES_FILE, DISPLAY_MODES_END_POINT); @@ -27,7 +46,7 @@ private Dictionary> DisplayModes { var localDisplayModes = JsonConvert.DeserializeObject(json); - return localDisplayModes.display_modes; + displayModesList = localDisplayModes.display_modes; } catch (Exception ex) { @@ -41,23 +60,11 @@ private Dictionary> DisplayModes } else { - displayModesList = new Dictionary>(); + this.displayModesList = new Dictionary>(); } } - return displayModesList; + return this.displayModesList; } } - - public List GetAllDisplayModes() - { - List displayModes = new List(); - - foreach (string key in this.DisplayModes.Keys) - { - displayModes.AddRange(this.DisplayModes[key]); - } - - return displayModes; - } } diff --git a/src/services/CoresService.Download.cs b/src/services/CoresService.Download.cs index 5ca8a42e..d85b4582 100644 --- a/src/services/CoresService.Download.cs +++ b/src/services/CoresService.Download.cs @@ -110,7 +110,7 @@ public Dictionary DownloadAssets(Core core, bool ignoreGlobalSet // or // global override is off, global setting is on, and core specific is on bool run = (ignoreGlobalSetting && this.settingsService.GetCoreSettings(core.identifier).download_assets) || - (!ignoreGlobalSetting && this.settingsService.GetConfig().download_assets && + (!ignoreGlobalSetting && this.settingsService.Config.download_assets && this.settingsService.GetCoreSettings(core.identifier).download_assets); if (!run) @@ -167,7 +167,7 @@ public Dictionary DownloadAssets(Core core, bool ignoreGlobalSet if (File.Exists(filePath) && CheckCrc(filePath, archiveFile)) { - if (!this.settingsService.GetConfig().suppress_already_installed) + if (!this.settingsService.Config.suppress_already_installed) WriteMessage($"Already installed: {file}"); } else @@ -205,7 +205,7 @@ public Dictionary DownloadAssets(Core core, bool ignoreGlobalSet if (File.Exists(filePath) && CheckCrc(filePath, file)) { - if (!this.settingsService.GetConfig().suppress_already_installed) + if (!this.settingsService.Config.suppress_already_installed) WriteMessage($"Already installed: {file.name}"); } else @@ -267,7 +267,7 @@ public Dictionary DownloadAssets(Core core, bool ignoreGlobalSet continue; } - if (this.settingsService.GetConfig().skip_alternative_assets && + if (this.settingsService.Config.skip_alternative_assets && file.Contains(Path.Combine(instancesDirectory, "_alternatives"))) { continue; @@ -303,7 +303,7 @@ public Dictionary DownloadAssets(Core core, bool ignoreGlobalSet if (File.Exists(slotPath) && CheckCrc(slotPath, archiveFile)) { - if (!this.settingsService.GetConfig().suppress_already_installed) + if (!this.settingsService.Config.suppress_already_installed) WriteMessage($"Already installed: {slot.filename}"); } else @@ -350,7 +350,7 @@ public Dictionary DownloadAssets(Core core, bool ignoreGlobalSet public void BuildInstanceJson(string identifier, bool overwrite = true) { - if (!this.settingsService.GetConfig().build_instance_jsons) + if (!this.settingsService.Config.build_instance_jsons) { return; } diff --git a/src/services/CoresService.Extras.cs b/src/services/CoresService.Extras.cs index f13a9a7c..4ebff7b2 100644 --- a/src/services/CoresService.Extras.cs +++ b/src/services/CoresService.Extras.cs @@ -22,7 +22,7 @@ public List PocketExtrasList if (pocketExtrasList == null) { string json = this.GetServerJsonFile( - this.settingsService.GetConfig().use_local_pocket_extras, + this.settingsService.Config.use_local_pocket_extras, POCKET_EXTRAS_FILE, POCKET_EXTRAS_END_POINT); @@ -87,7 +87,7 @@ public void GetPocketExtra(PocketExtra pocketExtra, string path, bool downloadAs private void DownloadPocketExtrasPlatform(PocketExtra pocketExtra, string path, bool downloadAssets) { Release release = GithubApiService.GetLatestRelease(pocketExtra.github_user, pocketExtra.github_repository, - this.settingsService.GetConfig().github_token); + this.settingsService.Config.github_token); Asset asset = release.assets.FirstOrDefault(x => x.name.StartsWith(pocketExtra.github_asset_prefix)); if (asset == null) @@ -269,7 +269,7 @@ private void DownloadPocketExtras(PocketExtra pocketExtra, string path, bool dow } Release release = GithubApiService.GetLatestRelease(pocketExtra.github_user, pocketExtra.github_repository, - this.settingsService.GetConfig().github_token); + this.settingsService.Config.github_token); Asset asset = release.assets.FirstOrDefault(x => x.name.StartsWith(pocketExtra.github_asset_prefix)); if (asset == null) @@ -361,7 +361,7 @@ private void DownloadPocketExtras(PocketExtra pocketExtra, string path, bool dow public string GetMostRecentRelease(PocketExtra pocketExtra) { Release release = GithubApiService.GetLatestRelease(pocketExtra.github_user, pocketExtra.github_repository, - this.settingsService.GetConfig().github_token); + this.settingsService.Config.github_token); return release.tag_name; } diff --git a/src/services/CoresService.Helpers.cs b/src/services/CoresService.Helpers.cs index 73079f1b..a36b881c 100644 --- a/src/services/CoresService.Helpers.cs +++ b/src/services/CoresService.Helpers.cs @@ -1,8 +1,10 @@ using Pannella.Helpers; using Pannella.Models.Analogue.Shared; +using Pannella.Models.DisplayModes; using Pannella.Models.Extras; using Pannella.Models.OpenFPGA_Cores_Inventory; using ArchiveFile = Pannella.Models.Archive.File; +using AnalogueDisplayMode = Pannella.Models.Analogue.Video.DisplayMode; using File = System.IO.File; namespace Pannella.Services; @@ -63,7 +65,7 @@ private bool InstallGithubAsset(string identifier, string platformId, string dow ZipHelper.ExtractToDirectory(zipPath, tempDir, true); // Clean problematic directories and files. - Util.CleanDir(tempDir, this.installPath, this.settingsService.GetConfig().preserve_platforms_folder, platformId); + Util.CleanDir(tempDir, this.installPath, this.settingsService.Config.preserve_platforms_folder, platformId); // Move the files into place and delete our core's temp directory. WriteMessage("Installing..."); @@ -104,16 +106,39 @@ private void CheckForDisplayModes(string identifier) if (coreSettings.display_modes) { - var displayModes = coreSettings.selected_display_modes.Split(','); + string[] selectedDisplayModes = coreSettings.selected_display_modes.Split(','); + List displayModes = this.ConvertDisplayModes(selectedDisplayModes); WriteMessage("Reapplying Display Modes..."); this.AddDisplayModes(identifier, displayModes, forceOriginal: true); } } + public List ConvertDisplayModes(IEnumerable displayModes) + { + List convertedDisplayModes = + (from analogueDisplayMode in displayModes + from displayMode in this.AllDisplayModes + where analogueDisplayMode == displayMode.value + select displayMode).ToList(); + + return convertedDisplayModes; + } + + private List ConvertDisplayModes(List analogueDisplayModes) + { + List convertedDisplayModes = + (from analogueDisplayMode in analogueDisplayModes + from displayMode in this.AllDisplayModes + where analogueDisplayMode.id == displayMode.value + select displayMode).ToList(); + + return convertedDisplayModes; + } + private bool CheckCrc(string filePath, ArchiveFile archiveFile) { - if (!this.settingsService.GetConfig().crc_check) + if (!this.settingsService.Config.crc_check) { return true; } diff --git a/src/services/CoresService.IgnoreInstanceJson.cs b/src/services/CoresService.IgnoreInstanceJson.cs index 49829c69..d0155bff 100644 --- a/src/services/CoresService.IgnoreInstanceJson.cs +++ b/src/services/CoresService.IgnoreInstanceJson.cs @@ -17,7 +17,7 @@ private List IgnoreInstanceJson if (ignoreInstanceJson == null) { string json = this.GetServerJsonFile( - this.settingsService.GetConfig().use_local_ignore_instance_json, + this.settingsService.Config.use_local_ignore_instance_json, IGNORE_INSTANCE_JSON_FILE, IGNORE_INSTANCE_JSON_END_POINT); diff --git a/src/services/CoresService.Jotego.cs b/src/services/CoresService.Jotego.cs index d6634f58..7cf0950c 100644 --- a/src/services/CoresService.Jotego.cs +++ b/src/services/CoresService.Jotego.cs @@ -22,10 +22,10 @@ private Dictionary LoadRenamedPlatformFiles() try { List files = GithubApiService.GetFiles("dyreschlock", "pocket-platform-images", - "arcade/Platforms", this.settingsService.GetConfig().github_token); + "arcade/Platforms", this.settingsService.Config.github_token); //grab the home platforms, too, to make sure neogeo pocket gets updated files.AddRange(GithubApiService.GetFiles("dyreschlock", "pocket-platform-images", - "home/Platforms", this.settingsService.GetConfig().github_token)); + "home/Platforms", this.settingsService.Config.github_token)); foreach (var file in files) { diff --git a/src/services/CoresService.License.cs b/src/services/CoresService.License.cs index 3481ab4e..30e91572 100644 --- a/src/services/CoresService.License.cs +++ b/src/services/CoresService.License.cs @@ -54,16 +54,16 @@ public bool RetrieveKeys() string keyPath = Path.Combine(this.installPath, LICENSE_EXTRACT_LOCATION); this.ExtractJTBetaKey(); - string email = ServiceHelper.SettingsService.GetConfig().patreon_email_address; - if (email == null && ServiceHelper.SettingsService.GetConfig().coin_op_beta) + string email = ServiceHelper.SettingsService.Config.patreon_email_address; + if (email == null && ServiceHelper.SettingsService.Config.coin_op_beta) { Console.WriteLine("Unable to retrieve Coin-Op Collection Beta license. Please set your patreon email address."); Console.Write("Enter value: "); email = Console.ReadLine(); - ServiceHelper.SettingsService.GetConfig().patreon_email_address = email; + ServiceHelper.SettingsService.Config.patreon_email_address = email; ServiceHelper.SettingsService.Save(); } - if (email != null && ServiceHelper.SettingsService.GetConfig().coin_op_beta) + if (email != null && ServiceHelper.SettingsService.Config.coin_op_beta) { if (!Directory.Exists(keyPath)) { diff --git a/src/services/CoresService.Video.cs b/src/services/CoresService.Video.cs index d8dcdc1c..ceed708b 100644 --- a/src/services/CoresService.Video.cs +++ b/src/services/CoresService.Video.cs @@ -1,10 +1,14 @@ using Newtonsoft.Json; using Pannella.Models.Analogue.Video; +using AnalogueDisplayMode = Pannella.Models.Analogue.Video.DisplayMode; +using DisplayMode = Pannella.Models.DisplayModes.DisplayMode; namespace Pannella.Services; public partial class CoresService { + public const int DISPLAY_MODES_MAX = 16; + public void ChangeAspectRatio(string identifier, int fromWidth, int fromHeight, int toWidth, int toHeight) { var video = this.ReadVideoJson(identifier); @@ -24,72 +28,141 @@ public void ChangeAspectRatio(string identifier, int fromWidth, int fromHeight, File.WriteAllText(Path.Combine(this.installPath, "Cores", identifier, "video.json"), json); } - public void AddDisplayModes(string identifier, string[] displayModes = null, bool isCurated = false, bool forceOriginal = false) + public void AddDisplayModes(string identifier, List displayModes = null, bool isCurated = false, + bool forceOriginal = false, bool merge = false) { var info = this.ReadCoreJson(identifier); var video = this.ReadVideoJson(identifier); - List toAdd = new List(); + Dictionary toAdd = new Dictionary(); if (isCurated) { if (info.metadata.platform_ids.Contains("gb") && this.DisplayModes.TryGetValue("gb", out var gb)) { - toAdd.AddRange(gb.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in gb.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } else if (info.metadata.platform_ids.Contains("gbc") && this.DisplayModes.TryGetValue("gbc", out var gbc)) { - toAdd.AddRange(gbc.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in gbc.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } else if (info.metadata.platform_ids.Contains("gba") && this.DisplayModes.TryGetValue("gba", out var gba)) { - toAdd.AddRange(gba.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in gba.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } else if (info.metadata.platform_ids.Contains("gg") && this.DisplayModes.TryGetValue("gg", out var gg)) { - toAdd.AddRange(gg.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in gg.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } + } else if (info.metadata.platform_ids.Contains("lynx") && this.DisplayModes.TryGetValue("lynx", out var lynx)) { - toAdd.AddRange(lynx.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in lynx.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } else if (info.metadata.platform_ids.Contains("jtngpc") && this.DisplayModes.TryGetValue("jtngpc", out var ngpc)) { - toAdd.AddRange(ngpc.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in ngpc.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } else if (info.metadata.platform_ids.Contains("jtngp") && this.DisplayModes.TryGetValue("jtngp", out var ngp)) { - toAdd.AddRange(ngp.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in ngp.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } else if (info.metadata.platform_ids.Contains("pce") && this.DisplayModes.TryGetValue("pce", out var pce)) { - toAdd.AddRange(pce.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in pce.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } if (this.DisplayModes.TryGetValue("all", out var all)) { - toAdd.AddRange(all.Select(displayMode => new DisplayMode { id = displayMode.value })); + foreach (var displayMode in all.Where(dm => !dm.exclude_cores.Contains(identifier))) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } } else { - displayModes ??= this.GetAllDisplayModes().Select(m => m.value).ToArray(); - toAdd = displayModes.Select(id => new DisplayMode { id = id }).ToList(); + displayModes ??= this.AllDisplayModes.Where(dm => dm.exclude_cores.Contains(identifier)).ToList(); + + foreach (var displayMode in displayModes) + { + toAdd.TryAdd(displayMode.value, displayMode); + } } var settings = this.settingsService.GetCoreSettings(identifier); if (!settings.display_modes || forceOriginal) { - // if this is the first time custom display modes are being applied, save the original ones settings.original_display_modes = video.display_modes is { Count: > 0 } ? string.Join(',', video.display_modes.Select(d => d.id)) : string.Empty; } + if (merge && video.display_modes is { Count: > 0 }) + { + var convertedVideoDisplayModes = this.ConvertDisplayModes(video.display_modes); + + foreach (var displayMode in convertedVideoDisplayModes) + { + toAdd.TryAdd(displayMode.value, displayMode); + } + + if (toAdd.Count > DISPLAY_MODES_MAX) + { + WriteMessage($"Unable to merge display modes. Total count is {toAdd.Count} greater than {DISPLAY_MODES_MAX}."); + return; + } + } + settings.display_modes = true; - settings.selected_display_modes = string.Join(',', toAdd.Select(d => d.id)); + settings.selected_display_modes = string.Join(',', toAdd.Keys); + video.display_modes = this.settingsService.Config.add_display_mode_description_to_video_json + ? toAdd.OrderBy(kvp => kvp.Value.order) + .Select(kvp => new AnalogueDisplayMode + { + id = kvp.Value.value, + description = kvp.Value.description + }) + .ToList() + : toAdd.OrderBy(kvp => kvp.Value.order) + .Select(kvp => new AnalogueDisplayMode { id = kvp.Value.value }) + .ToList(); + + Dictionary output = new Dictionary { { "video", video } }; + string json = JsonConvert.SerializeObject(output, Formatting.Indented); + + File.WriteAllText(Path.Combine(this.installPath, "Cores", identifier, "video.json"), json); + } + + public void ClearDisplayModes(string identifier) + { + var video = this.ReadVideoJson(identifier); - video.display_modes = toAdd; + video.display_modes = null; Dictionary output = new Dictionary { { "video", video } }; string json = JsonConvert.SerializeObject(output, Formatting.Indented); diff --git a/src/services/CoresService.cs b/src/services/CoresService.cs index ab50ca1a..2e412337 100644 --- a/src/services/CoresService.cs +++ b/src/services/CoresService.cs @@ -25,7 +25,7 @@ public List Cores { string json = null; - if (this.settingsService.GetConfig().use_local_cores_inventory) + if (this.settingsService.Config.use_local_cores_inventory) { if (File.Exists(CORES_FILE)) { @@ -91,7 +91,7 @@ public List InstalledCores { if (installedCores == null) { - RefreshInstalledCores(); + this.RefreshInstalledCores(); } return installedCores; @@ -106,13 +106,28 @@ public Dictionary> InstalledCoresWithSponsors { if (installedCoresWithSponsors == null) { - RefreshInstalledCores(); + this.RefreshInstalledCores(); } return installedCoresWithSponsors; } } + private static List installedCoresWithCustomDisplayModes; + + public List InstalledCoresWithCustomDisplayModes + { + get + { + if (installedCoresWithCustomDisplayModes == null) + { + this.RefreshInstalledCores(); + } + + return installedCoresWithCustomDisplayModes; + } + } + private static List coresNotInstalled; public List CoresNotInstalled @@ -160,6 +175,7 @@ public void RefreshInstalledCores() installedCores = new List(); coresNotInstalled = new List(); installedCoresWithSponsors = new Dictionary>(); + installedCoresWithCustomDisplayModes = new List(); foreach (var core in cores) { @@ -181,6 +197,11 @@ public void RefreshInstalledCores() installedCoresWithSponsors.Add(author, new List { core }); } } + + if (this.settingsService.GetCoreSettings(core.identifier).display_modes) + { + installedCoresWithCustomDisplayModes.Add(core); + } } else { diff --git a/src/services/SettingsService.cs b/src/services/SettingsService.cs index fc3798f7..417bf76b 100644 --- a/src/services/SettingsService.cs +++ b/src/services/SettingsService.cs @@ -14,6 +14,8 @@ public class SettingsService private readonly string settingsFile; private readonly List missingCores; + public Config Config => this.settings.config; + public SettingsService(string settingsPath, List cores = null) { this.settings = new Settings(); @@ -154,11 +156,6 @@ public void DisableMissingCores() } } - public Config GetConfig() - { - return settings.config; - } - // This is used by the RetroDriven Pocket Updater Windows Application // ReSharper disable once UnusedMember.Global public void UpdateConfig(Config config)