Prechádzať zdrojové kódy

UI: Store config migrations in a dictionary and loop through it to do migrations.

Evan Husted 1 rok pred
rodič
commit
19d2883a35

+ 371 - 364
src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs

@@ -9,379 +9,146 @@ using Ryujinx.Common.Configuration.Multiplayer;
 using Ryujinx.Common.Logging;
 using Ryujinx.HLE;
 using System;
+using System.Collections.Generic;
 using System.Linq;
+using RyuLogger = Ryujinx.Common.Logging.Logger;
 
 namespace Ryujinx.Ava.Utilities.Configuration
 {
     public partial class ConfigurationState
     {
-        public void Load(ConfigurationFileFormat configurationFileFormat, string configurationFilePath)
+        public void Load(ConfigurationFileFormat cff, string configurationFilePath)
         {
-            // referenced by Migrate
             bool configurationFileUpdated = false;
 
-            if (configurationFileFormat.Version is < 0 or > ConfigurationFileFormat.CurrentVersion)
+            if (cff.Version is < 0 or > ConfigurationFileFormat.CurrentVersion)
             {
-                Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Unsupported configuration version {configurationFileFormat.Version}, loading default.");
+                RyuLogger.Warning?.Print(LogClass.Application, $"Unsupported configuration version {cff.Version}, loading default.");
 
                 LoadDefault();
             }
-            
-            Migrate(2, static cff => cff.SystemRegion = Region.USA);
-            Migrate(3, static cff => cff.SystemTimeZone = "UTC");
-            Migrate(4, static cff => cff.MaxAnisotropy = -1);
-            Migrate(5, static cff => cff.SystemTimeOffset = 0);
-            Migrate(8, static cff => cff.EnablePtc = true);
-            Migrate(9, static cff =>
-            {
-                cff.ColumnSort = new ColumnSort
-                {
-                    SortColumnId = 0,
-                    SortAscending = false
-                };
 
-                cff.Hotkeys = new KeyboardHotkeys { ToggleVSyncMode = Key.F1 };
-            });
-            Migrate(10, static cff => cff.AudioBackend = AudioBackend.OpenAl);
-            Migrate(11, static cff =>
-            {
-                cff.ResScale = 1;
-                cff.ResScaleCustom = 1.0f;
-            });
-            Migrate(12, static cff => cff.LoggingGraphicsDebugLevel = GraphicsDebugLevel.None);
-            // 13 -> LDN1
-            Migrate(14, static cff => cff.CheckUpdatesOnStart = true);
-            Migrate(16, static cff => cff.EnableShaderCache = true);
-            Migrate(17, static cff => cff.StartFullscreen = false);
-            Migrate(18, static cff => cff.AspectRatio = AspectRatio.Fixed16x9);
-            // 19 -> LDN2
-            Migrate(20, static cff => cff.ShowConfirmExit = true);
-            Migrate(21, static cff =>
-            {
-                // Initialize network config.
-                
-                cff.MultiplayerMode = MultiplayerMode.Disabled;
-                cff.MultiplayerLanInterfaceId = "0";
-            });
-            Migrate(22, static cff => cff.HideCursor = HideCursorMode.Never);
-            Migrate(24, static cff =>
+            foreach ((int newVersion, Action<ConfigurationFileFormat> migratorFunction)
+                     in _migrations.OrderBy(x => x.Key))
             {
-                cff.InputConfig =
-                [
-                    new StandardKeyboardInputConfig
-                    {
-                        Version = InputConfig.CurrentVersion,
-                        Backend = InputBackendType.WindowKeyboard,
-                        Id = "0",
-                        PlayerIndex = PlayerIndex.Player1,
-                        ControllerType = ControllerType.ProController,
-                        LeftJoycon = new LeftJoyconCommonConfig<Key>
-                        {
-                            DpadUp = Key.Up,
-                            DpadDown = Key.Down,
-                            DpadLeft = Key.Left,
-                            DpadRight = Key.Right,
-                            ButtonMinus = Key.Minus,
-                            ButtonL = Key.E,
-                            ButtonZl = Key.Q,
-                            ButtonSl = Key.Unbound,
-                            ButtonSr = Key.Unbound,
-                        },
-                        LeftJoyconStick = new JoyconConfigKeyboardStick<Key>
-                        {
-                            StickUp = Key.W,
-                            StickDown = Key.S,
-                            StickLeft = Key.A,
-                            StickRight = Key.D,
-                            StickButton = Key.F,
-                        },
-                        RightJoycon = new RightJoyconCommonConfig<Key>
-                        {
-                            ButtonA = Key.Z,
-                            ButtonB = Key.X,
-                            ButtonX = Key.C,
-                            ButtonY = Key.V,
-                            ButtonPlus = Key.Plus,
-                            ButtonR = Key.U,
-                            ButtonZr = Key.O,
-                            ButtonSl = Key.Unbound,
-                            ButtonSr = Key.Unbound,
-                        },
-                        RightJoyconStick = new JoyconConfigKeyboardStick<Key>
-                        {
-                            StickUp = Key.I,
-                            StickDown = Key.K,
-                            StickLeft = Key.J,
-                            StickRight = Key.L,
-                            StickButton = Key.H,
-                        },
-                    }
+                if (cff.Version >= newVersion) 
+                    continue;
 
-                ];
-            });
-            Migrate(26, static cff => cff.MemoryManagerMode = MemoryManagerMode.HostMappedUnsafe);
-            Migrate(27, static cff => cff.EnableMouse = false);
-            Migrate(29, static cff => cff.Hotkeys = new KeyboardHotkeys
-            {
-                ToggleVSyncMode = Key.F1,
-                Screenshot = Key.F8,
-                ShowUI = Key.F4
-            });
-            Migrate(30, static cff => 
-            {
-                foreach (InputConfig config in cff.InputConfig)
-                {
-                    if (config is StandardControllerInputConfig controllerConfig)
-                    {
-                        controllerConfig.Rumble = new RumbleConfigController
-                        {
-                            EnableRumble = false,
-                            StrongRumble = 1f,
-                            WeakRumble = 1f,
-                        };
-                    }
-                }
-            });
-            Migrate(31, static cff => cff.BackendThreading = BackendThreading.Auto);
-            Migrate(32, static cff => cff.Hotkeys = new KeyboardHotkeys
-            {
-                ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
-                Screenshot = cff.Hotkeys.Screenshot,
-                ShowUI = cff.Hotkeys.ShowUI,
-                Pause = Key.F5,
-            });
-            Migrate(33, static cff =>
-            {
-                cff.Hotkeys = new KeyboardHotkeys
-                {
-                    ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
-                    Screenshot = cff.Hotkeys.Screenshot,
-                    ShowUI = cff.Hotkeys.ShowUI,
-                    Pause = cff.Hotkeys.Pause,
-                    ToggleMute = Key.F2,
-                };
+                RyuLogger.Warning?.Print(LogClass.Application, 
+                    $"Outdated configuration version {cff.Version}, migrating to version {newVersion}.");
+                
+                migratorFunction(cff);
 
-                cff.AudioVolume = 1;
-            });
-            Migrate(34, static cff => cff.EnableInternetAccess = false);
-            Migrate(35, static cff =>
-            {
-                foreach (StandardControllerInputConfig config in cff.InputConfig.OfType<StandardControllerInputConfig>())
-                {
-                    config.RangeLeft = 1.0f;
-                    config.RangeRight = 1.0f;
-                }
-            });
+                configurationFileUpdated = true;
+            }
             
-            Migrate(36, static cff => cff.LoggingEnableTrace = false);
-            Migrate(37, static cff => cff.ShowConsole = true);
-            Migrate(38, static cff =>
-            {
-                cff.BaseStyle = "Dark";
-                cff.GameListViewMode = 0;
-                cff.ShowNames = true;
-                cff.GridSize = 2;
-                cff.LanguageCode = "en_US";
-            });
-            Migrate(39, static cff => cff.Hotkeys = new KeyboardHotkeys
-            {
-                ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
-                Screenshot = cff.Hotkeys.Screenshot,
-                ShowUI = cff.Hotkeys.ShowUI,
-                Pause = cff.Hotkeys.Pause,
-                ToggleMute = cff.Hotkeys.ToggleMute,
-                ResScaleUp = Key.Unbound,
-                ResScaleDown = Key.Unbound
-            });
-            Migrate(40, static cff => cff.GraphicsBackend = GraphicsBackend.OpenGl);
-            Migrate(41, static cff => cff.Hotkeys = new KeyboardHotkeys
-            {
-                ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
-                Screenshot = cff.Hotkeys.Screenshot,
-                ShowUI = cff.Hotkeys.ShowUI,
-                Pause = cff.Hotkeys.Pause,
-                ToggleMute = cff.Hotkeys.ToggleMute,
-                ResScaleUp = cff.Hotkeys.ResScaleUp,
-                ResScaleDown = cff.Hotkeys.ResScaleDown,
-                VolumeUp = Key.Unbound,
-                VolumeDown = Key.Unbound
-            });
-            Migrate(42, static cff => cff.EnableMacroHLE = true);
-            Migrate(43, static cff => cff.UseHypervisor = true);
-            Migrate(44, static cff =>
-            {
-                cff.AntiAliasing = AntiAliasing.None;
-                cff.ScalingFilter = ScalingFilter.Bilinear;
-                cff.ScalingFilterLevel = 80;
-            });
-            Migrate(45, static cff => cff.ShownFileTypes = new ShownFileTypes
-            {
-                NSP = true,
-                PFS0 = true,
-                XCI = true,
-                NCA = true,
-                NRO = true,
-                NSO = true
-            });
-            Migrate(46, static cff => cff.UseHypervisor = OperatingSystem.IsMacOS());
-            Migrate(47, static cff => cff.WindowStartup = new WindowStartup
-            {
-                WindowPositionX = 0,
-                WindowPositionY = 0,
-                WindowSizeHeight = 760,
-                WindowSizeWidth = 1280,
-                WindowMaximized = false
-            });
-            Migrate(48, static cff => cff.EnableColorSpacePassthrough = false);
-            Migrate(49, static _ =>
-            {
-                if (OperatingSystem.IsMacOS())
-                {
-                    AppDataManager.FixMacOSConfigurationFolders();
-                }
-            });
-            Migrate(50, static cff => cff.EnableHardwareAcceleration = true);
-            Migrate(51, static cff => cff.RememberWindowState = true);
-            Migrate(52, static cff => cff.AutoloadDirs = []);
-            Migrate(53, static cff => cff.EnableLowPowerPtc = false);
-            Migrate(54, static cff => cff.DramSize = MemoryConfiguration.MemoryConfiguration4GiB);
-            Migrate(55, static cff => cff.IgnoreApplet = false);
-            Migrate(56, static cff => cff.ShowTitleBar = !OperatingSystem.IsWindows());
-            Migrate(57, static cff =>
-            {
-                cff.VSyncMode = VSyncMode.Switch;
-                cff.EnableCustomVSyncInterval = false;
-
-                cff.Hotkeys = new KeyboardHotkeys
-                {
-                    ToggleVSyncMode = Key.F1,
-                    Screenshot = cff.Hotkeys.Screenshot,
-                    ShowUI = cff.Hotkeys.ShowUI,
-                    Pause = cff.Hotkeys.Pause,
-                    ToggleMute = cff.Hotkeys.ToggleMute,
-                    ResScaleUp = cff.Hotkeys.ResScaleUp,
-                    ResScaleDown = cff.Hotkeys.ResScaleDown,
-                    VolumeUp = cff.Hotkeys.VolumeUp,
-                    VolumeDown = cff.Hotkeys.VolumeDown,
-                    CustomVSyncIntervalIncrement = Key.Unbound,
-                    CustomVSyncIntervalDecrement = Key.Unbound,
-                };
-
-                cff.CustomVSyncInterval = 120;
-            });
-            // 58 migration accidentally got skipped but it worked with no issues somehow lol
-            Migrate(59, static cff =>
-            {
-                cff.ShowDirtyHacks = false;
-                cff.DirtyHacks = [];
-
-                // This was accidentally enabled by default when it was PRed. That is not what we want,
-                // so as a compromise users who want to use it will simply need to re-enable it once after updating.
-                cff.IgnoreApplet = false;
-            });
-
-            Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
-            Graphics.ResScale.Value = configurationFileFormat.ResScale;
-            Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
-            Graphics.MaxAnisotropy.Value = configurationFileFormat.MaxAnisotropy;
-            Graphics.AspectRatio.Value = configurationFileFormat.AspectRatio;
-            Graphics.ShadersDumpPath.Value = configurationFileFormat.GraphicsShadersDumpPath;
-            Graphics.BackendThreading.Value = configurationFileFormat.BackendThreading;
-            Graphics.GraphicsBackend.Value = configurationFileFormat.GraphicsBackend;
-            Graphics.PreferredGpu.Value = configurationFileFormat.PreferredGpu;
-            Graphics.AntiAliasing.Value = configurationFileFormat.AntiAliasing;
-            Graphics.ScalingFilter.Value = configurationFileFormat.ScalingFilter;
-            Graphics.ScalingFilterLevel.Value = configurationFileFormat.ScalingFilterLevel;
-            Logger.EnableDebug.Value = configurationFileFormat.LoggingEnableDebug;
-            Logger.EnableStub.Value = configurationFileFormat.LoggingEnableStub;
-            Logger.EnableInfo.Value = configurationFileFormat.LoggingEnableInfo;
-            Logger.EnableWarn.Value = configurationFileFormat.LoggingEnableWarn;
-            Logger.EnableError.Value = configurationFileFormat.LoggingEnableError;
-            Logger.EnableTrace.Value = configurationFileFormat.LoggingEnableTrace;
-            Logger.EnableGuest.Value = configurationFileFormat.LoggingEnableGuest;
-            Logger.EnableFsAccessLog.Value = configurationFileFormat.LoggingEnableFsAccessLog;
-            Logger.FilteredClasses.Value = configurationFileFormat.LoggingFilteredClasses;
-            Logger.GraphicsDebugLevel.Value = configurationFileFormat.LoggingGraphicsDebugLevel;
-            System.Language.Value = configurationFileFormat.SystemLanguage;
-            System.Region.Value = configurationFileFormat.SystemRegion;
-            System.TimeZone.Value = configurationFileFormat.SystemTimeZone;
-            System.SystemTimeOffset.Value = configurationFileFormat.SystemTimeOffset;
-            System.EnableDockedMode.Value = configurationFileFormat.DockedMode;
-            EnableDiscordIntegration.Value = configurationFileFormat.EnableDiscordIntegration;
-            CheckUpdatesOnStart.Value = configurationFileFormat.CheckUpdatesOnStart;
-            ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit;
-            IgnoreApplet.Value = configurationFileFormat.IgnoreApplet;
-            RememberWindowState.Value = configurationFileFormat.RememberWindowState;
-            ShowTitleBar.Value = configurationFileFormat.ShowTitleBar;
-            EnableHardwareAcceleration.Value = configurationFileFormat.EnableHardwareAcceleration;
-            HideCursor.Value = configurationFileFormat.HideCursor;
-            Graphics.VSyncMode.Value = configurationFileFormat.VSyncMode;
-            Graphics.EnableCustomVSyncInterval.Value = configurationFileFormat.EnableCustomVSyncInterval;
-            Graphics.CustomVSyncInterval.Value = configurationFileFormat.CustomVSyncInterval;
-            Graphics.EnableShaderCache.Value = configurationFileFormat.EnableShaderCache;
-            Graphics.EnableTextureRecompression.Value = configurationFileFormat.EnableTextureRecompression;
-            Graphics.EnableMacroHLE.Value = configurationFileFormat.EnableMacroHLE;
-            Graphics.EnableColorSpacePassthrough.Value = configurationFileFormat.EnableColorSpacePassthrough;
-            System.EnablePtc.Value = configurationFileFormat.EnablePtc;
-            System.EnableLowPowerPtc.Value = configurationFileFormat.EnableLowPowerPtc;
-            System.EnableInternetAccess.Value = configurationFileFormat.EnableInternetAccess;
-            System.EnableFsIntegrityChecks.Value = configurationFileFormat.EnableFsIntegrityChecks;
-            System.FsGlobalAccessLogMode.Value = configurationFileFormat.FsGlobalAccessLogMode;
-            System.AudioBackend.Value = configurationFileFormat.AudioBackend;
-            System.AudioVolume.Value = configurationFileFormat.AudioVolume;
-            System.MemoryManagerMode.Value = configurationFileFormat.MemoryManagerMode;
-            System.DramSize.Value = configurationFileFormat.DramSize;
-            System.IgnoreMissingServices.Value = configurationFileFormat.IgnoreMissingServices;
-            System.UseHypervisor.Value = configurationFileFormat.UseHypervisor;
-            UI.GuiColumns.FavColumn.Value = configurationFileFormat.GuiColumns.FavColumn;
-            UI.GuiColumns.IconColumn.Value = configurationFileFormat.GuiColumns.IconColumn;
-            UI.GuiColumns.AppColumn.Value = configurationFileFormat.GuiColumns.AppColumn;
-            UI.GuiColumns.DevColumn.Value = configurationFileFormat.GuiColumns.DevColumn;
-            UI.GuiColumns.VersionColumn.Value = configurationFileFormat.GuiColumns.VersionColumn;
-            UI.GuiColumns.TimePlayedColumn.Value = configurationFileFormat.GuiColumns.TimePlayedColumn;
-            UI.GuiColumns.LastPlayedColumn.Value = configurationFileFormat.GuiColumns.LastPlayedColumn;
-            UI.GuiColumns.FileExtColumn.Value = configurationFileFormat.GuiColumns.FileExtColumn;
-            UI.GuiColumns.FileSizeColumn.Value = configurationFileFormat.GuiColumns.FileSizeColumn;
-            UI.GuiColumns.PathColumn.Value = configurationFileFormat.GuiColumns.PathColumn;
-            UI.ColumnSort.SortColumnId.Value = configurationFileFormat.ColumnSort.SortColumnId;
-            UI.ColumnSort.SortAscending.Value = configurationFileFormat.ColumnSort.SortAscending;
-            UI.GameDirs.Value = configurationFileFormat.GameDirs;
-            UI.AutoloadDirs.Value = configurationFileFormat.AutoloadDirs ?? [];
-            UI.ShownFileTypes.NSP.Value = configurationFileFormat.ShownFileTypes.NSP;
-            UI.ShownFileTypes.PFS0.Value = configurationFileFormat.ShownFileTypes.PFS0;
-            UI.ShownFileTypes.XCI.Value = configurationFileFormat.ShownFileTypes.XCI;
-            UI.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA;
-            UI.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO;
-            UI.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO;
-            UI.LanguageCode.Value = configurationFileFormat.LanguageCode;
-            UI.BaseStyle.Value = configurationFileFormat.BaseStyle;
-            UI.GameListViewMode.Value = configurationFileFormat.GameListViewMode;
-            UI.ShowNames.Value = configurationFileFormat.ShowNames;
-            UI.IsAscendingOrder.Value = configurationFileFormat.IsAscendingOrder;
-            UI.GridSize.Value = configurationFileFormat.GridSize;
-            UI.ApplicationSort.Value = configurationFileFormat.ApplicationSort;
-            UI.StartFullscreen.Value = configurationFileFormat.StartFullscreen;
-            UI.ShowConsole.Value = configurationFileFormat.ShowConsole;
-            UI.WindowStartup.WindowSizeWidth.Value = configurationFileFormat.WindowStartup.WindowSizeWidth;
-            UI.WindowStartup.WindowSizeHeight.Value = configurationFileFormat.WindowStartup.WindowSizeHeight;
-            UI.WindowStartup.WindowPositionX.Value = configurationFileFormat.WindowStartup.WindowPositionX;
-            UI.WindowStartup.WindowPositionY.Value = configurationFileFormat.WindowStartup.WindowPositionY;
-            UI.WindowStartup.WindowMaximized.Value = configurationFileFormat.WindowStartup.WindowMaximized;
-            Hid.EnableKeyboard.Value = configurationFileFormat.EnableKeyboard;
-            Hid.EnableMouse.Value = configurationFileFormat.EnableMouse;
-            Hid.Hotkeys.Value = configurationFileFormat.Hotkeys;
-            Hid.InputConfig.Value = configurationFileFormat.InputConfig ?? [];
-
-            Multiplayer.LanInterfaceId.Value = configurationFileFormat.MultiplayerLanInterfaceId;
-            Multiplayer.Mode.Value = configurationFileFormat.MultiplayerMode;
-            Multiplayer.DisableP2p.Value = configurationFileFormat.MultiplayerDisableP2p;
-            Multiplayer.LdnPassphrase.Value = configurationFileFormat.MultiplayerLdnPassphrase;
-            Multiplayer.LdnServer.Value = configurationFileFormat.LdnServer;
+            EnableDiscordIntegration.Value = cff.EnableDiscordIntegration;
+            CheckUpdatesOnStart.Value = cff.CheckUpdatesOnStart;
+            ShowConfirmExit.Value = cff.ShowConfirmExit;
+            IgnoreApplet.Value = cff.IgnoreApplet;
+            RememberWindowState.Value = cff.RememberWindowState;
+            ShowTitleBar.Value = cff.ShowTitleBar;
+            EnableHardwareAcceleration.Value = cff.EnableHardwareAcceleration;
+            HideCursor.Value = cff.HideCursor;
             
-            Hacks.ShowDirtyHacks.Value = configurationFileFormat.ShowDirtyHacks;
+            Logger.EnableFileLog.Value = cff.EnableFileLog;
+            Logger.EnableDebug.Value = cff.LoggingEnableDebug;
+            Logger.EnableStub.Value = cff.LoggingEnableStub;
+            Logger.EnableInfo.Value = cff.LoggingEnableInfo;
+            Logger.EnableWarn.Value = cff.LoggingEnableWarn;
+            Logger.EnableError.Value = cff.LoggingEnableError;
+            Logger.EnableTrace.Value = cff.LoggingEnableTrace;
+            Logger.EnableGuest.Value = cff.LoggingEnableGuest;
+            Logger.EnableFsAccessLog.Value = cff.LoggingEnableFsAccessLog;
+            Logger.FilteredClasses.Value = cff.LoggingFilteredClasses;
+            Logger.GraphicsDebugLevel.Value = cff.LoggingGraphicsDebugLevel;
+            
+            Graphics.ResScale.Value = cff.ResScale;
+            Graphics.ResScaleCustom.Value = cff.ResScaleCustom;
+            Graphics.MaxAnisotropy.Value = cff.MaxAnisotropy;
+            Graphics.AspectRatio.Value = cff.AspectRatio;
+            Graphics.ShadersDumpPath.Value = cff.GraphicsShadersDumpPath;
+            Graphics.BackendThreading.Value = cff.BackendThreading;
+            Graphics.GraphicsBackend.Value = cff.GraphicsBackend;
+            Graphics.PreferredGpu.Value = cff.PreferredGpu;
+            Graphics.AntiAliasing.Value = cff.AntiAliasing;
+            Graphics.ScalingFilter.Value = cff.ScalingFilter;
+            Graphics.ScalingFilterLevel.Value = cff.ScalingFilterLevel;
+            Graphics.VSyncMode.Value = cff.VSyncMode;
+            Graphics.EnableCustomVSyncInterval.Value = cff.EnableCustomVSyncInterval;
+            Graphics.CustomVSyncInterval.Value = cff.CustomVSyncInterval;
+            Graphics.EnableShaderCache.Value = cff.EnableShaderCache;
+            Graphics.EnableTextureRecompression.Value = cff.EnableTextureRecompression;
+            Graphics.EnableMacroHLE.Value = cff.EnableMacroHLE;
+            Graphics.EnableColorSpacePassthrough.Value = cff.EnableColorSpacePassthrough;
+            
+            System.Language.Value = cff.SystemLanguage;
+            System.Region.Value = cff.SystemRegion;
+            System.TimeZone.Value = cff.SystemTimeZone;
+            System.SystemTimeOffset.Value = cff.SystemTimeOffset;
+            System.EnableDockedMode.Value = cff.DockedMode;
+            System.EnablePtc.Value = cff.EnablePtc;
+            System.EnableLowPowerPtc.Value = cff.EnableLowPowerPtc;
+            System.EnableInternetAccess.Value = cff.EnableInternetAccess;
+            System.EnableFsIntegrityChecks.Value = cff.EnableFsIntegrityChecks;
+            System.FsGlobalAccessLogMode.Value = cff.FsGlobalAccessLogMode;
+            System.AudioBackend.Value = cff.AudioBackend;
+            System.AudioVolume.Value = cff.AudioVolume;
+            System.MemoryManagerMode.Value = cff.MemoryManagerMode;
+            System.DramSize.Value = cff.DramSize;
+            System.IgnoreMissingServices.Value = cff.IgnoreMissingServices;
+            System.UseHypervisor.Value = cff.UseHypervisor;
+            
+            UI.GuiColumns.FavColumn.Value = cff.GuiColumns.FavColumn;
+            UI.GuiColumns.IconColumn.Value = cff.GuiColumns.IconColumn;
+            UI.GuiColumns.AppColumn.Value = cff.GuiColumns.AppColumn;
+            UI.GuiColumns.DevColumn.Value = cff.GuiColumns.DevColumn;
+            UI.GuiColumns.VersionColumn.Value = cff.GuiColumns.VersionColumn;
+            UI.GuiColumns.TimePlayedColumn.Value = cff.GuiColumns.TimePlayedColumn;
+            UI.GuiColumns.LastPlayedColumn.Value = cff.GuiColumns.LastPlayedColumn;
+            UI.GuiColumns.FileExtColumn.Value = cff.GuiColumns.FileExtColumn;
+            UI.GuiColumns.FileSizeColumn.Value = cff.GuiColumns.FileSizeColumn;
+            UI.GuiColumns.PathColumn.Value = cff.GuiColumns.PathColumn;
+            UI.ColumnSort.SortColumnId.Value = cff.ColumnSort.SortColumnId;
+            UI.ColumnSort.SortAscending.Value = cff.ColumnSort.SortAscending;
+            UI.GameDirs.Value = cff.GameDirs;
+            UI.AutoloadDirs.Value = cff.AutoloadDirs ?? [];
+            UI.ShownFileTypes.NSP.Value = cff.ShownFileTypes.NSP;
+            UI.ShownFileTypes.PFS0.Value = cff.ShownFileTypes.PFS0;
+            UI.ShownFileTypes.XCI.Value = cff.ShownFileTypes.XCI;
+            UI.ShownFileTypes.NCA.Value = cff.ShownFileTypes.NCA;
+            UI.ShownFileTypes.NRO.Value = cff.ShownFileTypes.NRO;
+            UI.ShownFileTypes.NSO.Value = cff.ShownFileTypes.NSO;
+            UI.LanguageCode.Value = cff.LanguageCode;
+            UI.BaseStyle.Value = cff.BaseStyle;
+            UI.GameListViewMode.Value = cff.GameListViewMode;
+            UI.ShowNames.Value = cff.ShowNames;
+            UI.IsAscendingOrder.Value = cff.IsAscendingOrder;
+            UI.GridSize.Value = cff.GridSize;
+            UI.ApplicationSort.Value = cff.ApplicationSort;
+            UI.StartFullscreen.Value = cff.StartFullscreen;
+            UI.ShowConsole.Value = cff.ShowConsole;
+            UI.WindowStartup.WindowSizeWidth.Value = cff.WindowStartup.WindowSizeWidth;
+            UI.WindowStartup.WindowSizeHeight.Value = cff.WindowStartup.WindowSizeHeight;
+            UI.WindowStartup.WindowPositionX.Value = cff.WindowStartup.WindowPositionX;
+            UI.WindowStartup.WindowPositionY.Value = cff.WindowStartup.WindowPositionY;
+            UI.WindowStartup.WindowMaximized.Value = cff.WindowStartup.WindowMaximized;
+            
+            Hid.EnableKeyboard.Value = cff.EnableKeyboard;
+            Hid.EnableMouse.Value = cff.EnableMouse;
+            Hid.Hotkeys.Value = cff.Hotkeys;
+            Hid.InputConfig.Value = cff.InputConfig ?? [];
 
+            Multiplayer.LanInterfaceId.Value = cff.MultiplayerLanInterfaceId;
+            Multiplayer.Mode.Value = cff.MultiplayerMode;
+            Multiplayer.DisableP2p.Value = cff.MultiplayerDisableP2p;
+            Multiplayer.LdnPassphrase.Value = cff.MultiplayerLdnPassphrase;
+            Multiplayer.LdnServer.Value = cff.LdnServer;
+            
             {
-                DirtyHacks hacks = new (configurationFileFormat.DirtyHacks ?? []);
+                Hacks.ShowDirtyHacks.Value = cff.ShowDirtyHacks;
+                
+                DirtyHacks hacks = new (cff.DirtyHacks ?? []);
 
                 Hacks.Xc2MenuSoftlockFix.Value = hacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix);
 
@@ -393,21 +160,261 @@ namespace Ryujinx.Ava.Utilities.Configuration
             {
                 ToFileFormat().SaveConfig(configurationFilePath);
 
-                Ryujinx.Common.Logging.Logger.Notice.Print(LogClass.Application, $"Configuration file updated to version {ConfigurationFileFormat.CurrentVersion}");
+                RyuLogger.Notice.Print(LogClass.Application, $"Configuration file updated to version {ConfigurationFileFormat.CurrentVersion}");
             }
+        }
+        
+        private static readonly Dictionary<int, Action<ConfigurationFileFormat>> _migrations =
+            Collections.NewDictionary<int, Action<ConfigurationFileFormat>>(
+                (2, static cff => cff.SystemRegion = Region.USA),
+                (3, static cff => cff.SystemTimeZone = "UTC"),
+                (4, static cff => cff.MaxAnisotropy = -1),
+                (5, static cff => cff.SystemTimeOffset = 0),
+                (8, static cff => cff.EnablePtc = true),
+                (9, static cff =>
+                {
+                    cff.ColumnSort = new ColumnSort { SortColumnId = 0, SortAscending = false };
+                    cff.Hotkeys = new KeyboardHotkeys { ToggleVSyncMode = Key.F1 };
+                }),
+                (10, static cff => cff.AudioBackend = AudioBackend.OpenAl),
+                (11, static cff =>
+                {
+                    cff.ResScale = 1;
+                    cff.ResScaleCustom = 1.0f;
+                }),
+                (12, static cff => cff.LoggingGraphicsDebugLevel = GraphicsDebugLevel.None),
+                // 13 -> LDN1
+                (14, static cff => cff.CheckUpdatesOnStart = true),
+                (16, static cff => cff.EnableShaderCache = true),
+                (17, static cff => cff.StartFullscreen = false),
+                (18, static cff => cff.AspectRatio = AspectRatio.Fixed16x9),
+                // 19 -> LDN2
+                (20, static cff => cff.ShowConfirmExit = true),
+                (21, static cff =>
+                {
+                    // Initialize network config.
 
-            return;
-            
-            void Migrate(int newVer, Action<ConfigurationFileFormat> migrator)
-            {
-                if (configurationFileFormat.Version >= newVer) return;
+                    cff.MultiplayerMode = MultiplayerMode.Disabled;
+                    cff.MultiplayerLanInterfaceId = "0";
+                }),
+                (22, static cff => cff.HideCursor = HideCursorMode.Never),
+                (24, static cff =>
+                {
+                    cff.InputConfig =
+                    [
+                        new StandardKeyboardInputConfig
+                        {
+                            Version = InputConfig.CurrentVersion,
+                            Backend = InputBackendType.WindowKeyboard,
+                            Id = "0",
+                            PlayerIndex = PlayerIndex.Player1,
+                            ControllerType = ControllerType.ProController,
+                            LeftJoycon = new LeftJoyconCommonConfig<Key>
+                            {
+                                DpadUp = Key.Up,
+                                DpadDown = Key.Down,
+                                DpadLeft = Key.Left,
+                                DpadRight = Key.Right,
+                                ButtonMinus = Key.Minus,
+                                ButtonL = Key.E,
+                                ButtonZl = Key.Q,
+                                ButtonSl = Key.Unbound,
+                                ButtonSr = Key.Unbound,
+                            },
+                            LeftJoyconStick = new JoyconConfigKeyboardStick<Key>
+                            {
+                                StickUp = Key.W,
+                                StickDown = Key.S,
+                                StickLeft = Key.A,
+                                StickRight = Key.D,
+                                StickButton = Key.F,
+                            },
+                            RightJoycon = new RightJoyconCommonConfig<Key>
+                            {
+                                ButtonA = Key.Z,
+                                ButtonB = Key.X,
+                                ButtonX = Key.C,
+                                ButtonY = Key.V,
+                                ButtonPlus = Key.Plus,
+                                ButtonR = Key.U,
+                                ButtonZr = Key.O,
+                                ButtonSl = Key.Unbound,
+                                ButtonSr = Key.Unbound,
+                            },
+                            RightJoyconStick = new JoyconConfigKeyboardStick<Key>
+                            {
+                                StickUp = Key.I,
+                                StickDown = Key.K,
+                                StickLeft = Key.J,
+                                StickRight = Key.L,
+                                StickButton = Key.H,
+                            },
+                        }
+                    ];
+                }),
+                (26, static cff => cff.MemoryManagerMode = MemoryManagerMode.HostMappedUnsafe),
+                (27, static cff => cff.EnableMouse = false),
+                (29,
+                    static cff =>
+                        cff.Hotkeys = new KeyboardHotkeys
+                        {
+                            ToggleVSyncMode = Key.F1, Screenshot = Key.F8, ShowUI = Key.F4
+                        }),
+                (30, static cff =>
+                {
+                    foreach (InputConfig config in cff.InputConfig)
+                    {
+                        if (config is StandardControllerInputConfig controllerConfig)
+                        {
+                            controllerConfig.Rumble = new RumbleConfigController
+                            {
+                                EnableRumble = false, StrongRumble = 1f, WeakRumble = 1f,
+                            };
+                        }
+                    }
+                }),
+                (31, static cff => cff.BackendThreading = BackendThreading.Auto),
+                (32, static cff => cff.Hotkeys = new KeyboardHotkeys
+                {
+                    ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
+                    Screenshot = cff.Hotkeys.Screenshot,
+                    ShowUI = cff.Hotkeys.ShowUI,
+                    Pause = Key.F5,
+                }),
+                (33, static cff =>
+                {
+                    cff.Hotkeys = new KeyboardHotkeys
+                    {
+                        ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
+                        Screenshot = cff.Hotkeys.Screenshot,
+                        ShowUI = cff.Hotkeys.ShowUI,
+                        Pause = cff.Hotkeys.Pause,
+                        ToggleMute = Key.F2,
+                    };
 
-                Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version {newVer}.");
-                
-                migrator(configurationFileFormat);
+                    cff.AudioVolume = 1;
+                }),
+                (34, static cff => cff.EnableInternetAccess = false),
+                (35, static cff =>
+                {
+                    foreach (StandardControllerInputConfig config in cff.InputConfig
+                                 .OfType<StandardControllerInputConfig>())
+                    {
+                        config.RangeLeft = 1.0f;
+                        config.RangeRight = 1.0f;
+                    }
+                }),
 
-                configurationFileUpdated = true;
-            }
-        }
+                (36, static cff => cff.LoggingEnableTrace = false),
+                (37, static cff => cff.ShowConsole = true),
+                (38, static cff =>
+                {
+                    cff.BaseStyle = "Dark";
+                    cff.GameListViewMode = 0;
+                    cff.ShowNames = true;
+                    cff.GridSize = 2;
+                    cff.LanguageCode = "en_US";
+                }),
+                (39,
+                    static cff => cff.Hotkeys = new KeyboardHotkeys
+                    {
+                        ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
+                        Screenshot = cff.Hotkeys.Screenshot,
+                        ShowUI = cff.Hotkeys.ShowUI,
+                        Pause = cff.Hotkeys.Pause,
+                        ToggleMute = cff.Hotkeys.ToggleMute,
+                        ResScaleUp = Key.Unbound,
+                        ResScaleDown = Key.Unbound
+                    }),
+                (40, static cff => cff.GraphicsBackend = GraphicsBackend.OpenGl),
+                (41,
+                    static cff => cff.Hotkeys = new KeyboardHotkeys
+                    {
+                        ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode,
+                        Screenshot = cff.Hotkeys.Screenshot,
+                        ShowUI = cff.Hotkeys.ShowUI,
+                        Pause = cff.Hotkeys.Pause,
+                        ToggleMute = cff.Hotkeys.ToggleMute,
+                        ResScaleUp = cff.Hotkeys.ResScaleUp,
+                        ResScaleDown = cff.Hotkeys.ResScaleDown,
+                        VolumeUp = Key.Unbound,
+                        VolumeDown = Key.Unbound
+                    }),
+                (42, static cff => cff.EnableMacroHLE = true),
+                (43, static cff => cff.UseHypervisor = true),
+                (44, static cff =>
+                {
+                    cff.AntiAliasing = AntiAliasing.None;
+                    cff.ScalingFilter = ScalingFilter.Bilinear;
+                    cff.ScalingFilterLevel = 80;
+                }),
+                (45,
+                    static cff => cff.ShownFileTypes = new ShownFileTypes
+                    {
+                        NSP = true,
+                        PFS0 = true,
+                        XCI = true,
+                        NCA = true,
+                        NRO = true,
+                        NSO = true
+                    }),
+                (46, static cff => cff.UseHypervisor = OperatingSystem.IsMacOS()),
+                (47,
+                    static cff => cff.WindowStartup = new WindowStartup
+                    {
+                        WindowPositionX = 0,
+                        WindowPositionY = 0,
+                        WindowSizeHeight = 760,
+                        WindowSizeWidth = 1280,
+                        WindowMaximized = false
+                    }),
+                (48, static cff => cff.EnableColorSpacePassthrough = false),
+                (49, static _ =>
+                {
+                    if (OperatingSystem.IsMacOS())
+                    {
+                        AppDataManager.FixMacOSConfigurationFolders();
+                    }
+                }),
+                (50, static cff => cff.EnableHardwareAcceleration = true),
+                (51, static cff => cff.RememberWindowState = true),
+                (52, static cff => cff.AutoloadDirs = []),
+                (53, static cff => cff.EnableLowPowerPtc = false),
+                (54, static cff => cff.DramSize = MemoryConfiguration.MemoryConfiguration4GiB),
+                (55, static cff => cff.IgnoreApplet = false),
+                (56, static cff => cff.ShowTitleBar = !OperatingSystem.IsWindows()),
+                (57, static cff =>
+                {
+                    cff.VSyncMode = VSyncMode.Switch;
+                    cff.EnableCustomVSyncInterval = false;
+
+                    cff.Hotkeys = new KeyboardHotkeys
+                    {
+                        ToggleVSyncMode = Key.F1,
+                        Screenshot = cff.Hotkeys.Screenshot,
+                        ShowUI = cff.Hotkeys.ShowUI,
+                        Pause = cff.Hotkeys.Pause,
+                        ToggleMute = cff.Hotkeys.ToggleMute,
+                        ResScaleUp = cff.Hotkeys.ResScaleUp,
+                        ResScaleDown = cff.Hotkeys.ResScaleDown,
+                        VolumeUp = cff.Hotkeys.VolumeUp,
+                        VolumeDown = cff.Hotkeys.VolumeDown,
+                        CustomVSyncIntervalIncrement = Key.Unbound,
+                        CustomVSyncIntervalDecrement = Key.Unbound,
+                    };
+
+                    cff.CustomVSyncInterval = 120;
+                }),
+                // 58 migration accidentally got skipped, but it worked with no issues somehow lol
+                (59, static cff =>
+                {
+                    cff.ShowDirtyHacks = false;
+                    cff.DirtyHacks = [];
+
+                    // This was accidentally enabled by default when it was PRed. That is not what we want,
+                    // so as a compromise users who want to use it will simply need to re-enable it once after updating.
+                    cff.IgnoreApplet = false;
+                })
+            );
     }
 }