From 8df7ba2d561e1feb23236cb010759e03f2e5e364 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Mon, 20 Jan 2025 15:55:26 -0600 Subject: [PATCH 1/8] i18n: Norwegian DLC RomFS dumping translation --- src/Ryujinx/Assets/locales.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index d165bd742..30e0c0cf8 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -2335,7 +2335,7 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "", + "no_NO": "Pakk ut RomFS filene fra valgt DLC fil", "pl_PL": "", "pt_BR": "", "ru_RU": "", @@ -22960,7 +22960,7 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "", + "no_NO": "Velg en DLC og hente ut", "pl_PL": "", "pt_BR": "", "ru_RU": "", @@ -22973,4 +22973,4 @@ } } ] -} \ No newline at end of file +} -- 2.47.1 From ed64a63094ee020184ee308f6929ff41dd658ac0 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Mon, 20 Jan 2025 16:56:05 -0600 Subject: [PATCH 2/8] UI: Visually merge "Actions" and "Tools" menu bar items into Actions The contents of the menu item are dependent on whether you're in a game. No functionality has been removed. --- src/Ryujinx/Assets/locales.json | 47 +++++-------------- .../UI/Controls/DlcSelectView.axaml.cs | 8 +--- src/Ryujinx/UI/Helpers/Commands.cs | 16 +++---- .../UI/Views/Main/MainMenuBarView.axaml | 24 +++++----- .../UI/Views/Main/MainMenuBarView.axaml.cs | 36 ++++++-------- .../UI/Windows/XCITrimmerWindow.axaml.cs | 4 +- 6 files changed, 50 insertions(+), 85 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 30e0c0cf8..39897c240 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -748,32 +748,7 @@ } }, { - "ID": "MenuBarTools", - "Translations": { - "ar_SA": "_الأدوات", - "de_DE": "", - "el_GR": "_Εργαλεία", - "en_US": "_Tools", - "es_ES": "_Herramientas", - "fr_FR": "_Outils", - "he_IL": "_כלים", - "it_IT": "_Strumenti", - "ja_JP": "ツール(_T)", - "ko_KR": "도구(_T)", - "no_NO": "_Verktøy", - "pl_PL": "_Narzędzia", - "pt_BR": "_Ferramentas", - "ru_RU": "_Инструменты", - "sv_SE": "V_erktyg", - "th_TH": "_เครื่องมือ", - "tr_TR": "_Araçlar", - "uk_UA": "_Інструменти", - "zh_CN": "工具(_T)", - "zh_TW": "工具(_T)" - } - }, - { - "ID": "MenuBarToolsInstallFirmware", + "ID": "MenuBarActionsInstallFirmware", "Translations": { "ar_SA": "تثبيت البرنامج الثابت", "de_DE": "Firmware installieren", @@ -798,7 +773,7 @@ } }, { - "ID": "MenuBarFileToolsInstallFirmwareFromFile", + "ID": "MenuBarActionsInstallFirmwareFromFile", "Translations": { "ar_SA": "تثبيت برنامج ثابت من XCI أو ZIP", "de_DE": "Firmware von einer XCI- oder einer ZIP-Datei installieren", @@ -823,7 +798,7 @@ } }, { - "ID": "MenuBarFileToolsInstallFirmwareFromDirectory", + "ID": "MenuBarActionsInstallFirmwareFromDirectory", "Translations": { "ar_SA": "تثبيت برنامج ثابت من مجلد", "de_DE": "Firmware aus einem Verzeichnis installieren", @@ -848,7 +823,7 @@ } }, { - "ID": "MenuBarToolsInstallKeys", + "ID": "MenuBarActionsInstallKeys", "Translations": { "ar_SA": "", "de_DE": "", @@ -873,7 +848,7 @@ } }, { - "ID": "MenuBarFileToolsInstallKeysFromFile", + "ID": "MenuBarFileActionsInstallKeysFromFile", "Translations": { "ar_SA": "", "de_DE": "", @@ -898,7 +873,7 @@ } }, { - "ID": "MenuBarFileToolsInstallKeysFromFolder", + "ID": "MenuBarFileActionsInstallKeysFromFolder", "Translations": { "ar_SA": "", "de_DE": "", @@ -923,7 +898,7 @@ } }, { - "ID": "MenuBarToolsManageFileTypes", + "ID": "MenuBarActionsManageFileTypes", "Translations": { "ar_SA": "إدارة أنواع الملفات", "de_DE": "Dateitypen verwalten", @@ -948,7 +923,7 @@ } }, { - "ID": "MenuBarToolsInstallFileTypes", + "ID": "MenuBarActionsInstallFileTypes", "Translations": { "ar_SA": "تثبيت أنواع الملفات", "de_DE": "Dateitypen installieren", @@ -973,7 +948,7 @@ } }, { - "ID": "MenuBarToolsUninstallFileTypes", + "ID": "MenuBarActionsUninstallFileTypes", "Translations": { "ar_SA": "إزالة أنواع الملفات", "de_DE": "Dateitypen deinstallieren", @@ -998,7 +973,7 @@ } }, { - "ID": "MenuBarToolsXCITrimmer", + "ID": "MenuBarActionsXCITrimmer", "Translations": { "ar_SA": "", "de_DE": "", @@ -22973,4 +22948,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs b/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs index c2144da2d..c011ca110 100644 --- a/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs +++ b/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs @@ -3,14 +3,11 @@ using Avalonia.Controls; using Avalonia.Markup.Xaml; using Avalonia.Styling; using FluentAvalonia.UI.Controls; -using LibHac.Tools.FsSystem.NcaUtils; -using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Compat; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Controls @@ -22,9 +19,9 @@ namespace Ryujinx.Ava.UI.Controls InitializeComponent(); } - #nullable enable +#nullable enable public static async Task Show(ulong selectedTitleId, ApplicationLibrary appLibrary) - #nullable disable +#nullable disable { DlcSelectViewModel viewModel = new(selectedTitleId, appLibrary); @@ -52,4 +49,3 @@ namespace Ryujinx.Ava.UI.Controls } } } - diff --git a/src/Ryujinx/UI/Helpers/Commands.cs b/src/Ryujinx/UI/Helpers/Commands.cs index df24a7da1..868b49158 100644 --- a/src/Ryujinx/UI/Helpers/Commands.cs +++ b/src/Ryujinx/UI/Helpers/Commands.cs @@ -12,9 +12,9 @@ namespace Ryujinx.Ava.UI.Helpers public static RelayCommand CreateConditional(Action action, Func canExecute) => new(action, canExecute); - public static RelayCommand CreateWithArg(Action action) + public static RelayCommand Create(Action action) => new(action); - public static RelayCommand CreateConditionalWithArg(Action action, Predicate canExecute) + public static RelayCommand CreateConditional(Action action, Predicate canExecute) => new(action, canExecute); public static AsyncRelayCommand Create(Func action) @@ -24,11 +24,11 @@ namespace Ryujinx.Ava.UI.Helpers public static AsyncRelayCommand CreateSilentFail(Func action) => new(action, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); - public static AsyncRelayCommand CreateWithArg(Func action) + public static AsyncRelayCommand Create(Func action) => new(action, AsyncRelayCommandOptions.None); - public static AsyncRelayCommand CreateConcurrentWithArg(Func action) + public static AsyncRelayCommand CreateConcurrent(Func action) => new(action, AsyncRelayCommandOptions.AllowConcurrentExecutions); - public static AsyncRelayCommand CreateSilentFailWithArg(Func action) + public static AsyncRelayCommand CreateSilentFail(Func action) => new(action, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); public static AsyncRelayCommand CreateConditional(Func action, Func canExecute) @@ -38,11 +38,11 @@ namespace Ryujinx.Ava.UI.Helpers public static AsyncRelayCommand CreateSilentFailConditional(Func action, Func canExecute) => new(action, canExecute, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); - public static AsyncRelayCommand CreateConditionalWithArg(Func action, Predicate canExecute) + public static AsyncRelayCommand CreateConditional(Func action, Predicate canExecute) => new(action, canExecute, AsyncRelayCommandOptions.None); - public static AsyncRelayCommand CreateConcurrentConditionalWithArg(Func action, Predicate canExecute) + public static AsyncRelayCommand CreateConcurrentConditional(Func action, Predicate canExecute) => new(action, canExecute, AsyncRelayCommandOptions.AllowConcurrentExecutions); - public static AsyncRelayCommand CreateSilentFailConditionalWithArg(Func action, Predicate canExecute) + public static AsyncRelayCommand CreateSilentFailConditional(Func action, Predicate canExecute) => new(action, canExecute, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); } } diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 6bce21851..1cd06bb7b 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -208,7 +208,7 @@ Name="ActionsMenuItem" VerticalAlignment="Center" Header="{ext:Locale MenuBarActions}" - IsEnabled="{Binding IsGameRunning}"> + IsVisible="{Binding !EnableNonGameRunningControls}"> - - - - + + + + - - - + + + - - - + + + - + diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index 521460012..9a63c022d 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -37,26 +37,20 @@ namespace Ryujinx.Ava.UI.Views.Main ToggleFileTypesMenuItem.ItemsSource = GenerateToggleFileTypeItems(); ChangeLanguageMenuItem.ItemsSource = GenerateLanguageMenuItems(); - MiiAppletMenuItem.Command = new AsyncRelayCommand(OpenMiiApplet); - CloseRyujinxMenuItem.Command = new RelayCommand(CloseWindow); - OpenSettingsMenuItem.Command = new AsyncRelayCommand(OpenSettings); - PauseEmulationMenuItem.Command = new RelayCommand(() => ViewModel.AppHost?.Pause()); - ResumeEmulationMenuItem.Command = new RelayCommand(() => ViewModel.AppHost?.Resume()); - StopEmulationMenuItem.Command = new AsyncRelayCommand(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted()); - CheatManagerMenuItem.Command = new AsyncRelayCommand(async () => - { - try - { - await OpenCheatManagerForCurrentApp(); - } catch {} - }); - InstallFileTypesMenuItem.Command = new AsyncRelayCommand(InstallFileTypes); - UninstallFileTypesMenuItem.Command = new AsyncRelayCommand(UninstallFileTypes); - XciTrimmerMenuItem.Command = new AsyncRelayCommand(() => XCITrimmerWindow.Show(ViewModel)); - AboutWindowMenuItem.Command = new AsyncRelayCommand(AboutWindow.Show); - CompatibilityListMenuItem.Command = new AsyncRelayCommand(CompatibilityList.Show); + MiiAppletMenuItem.Command = Commands.Create(OpenMiiApplet); + CloseRyujinxMenuItem.Command = Commands.Create(CloseWindow); + OpenSettingsMenuItem.Command = Commands.Create(OpenSettings); + PauseEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Pause()); + ResumeEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Resume()); + StopEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted()); + CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp); + InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes); + UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes); + XciTrimmerMenuItem.Command = Commands.Create(XCITrimmerWindow.Show); + AboutWindowMenuItem.Command = Commands.Create(AboutWindow.Show); + CompatibilityListMenuItem.Command = Commands.Create(CompatibilityList.Show); - UpdateMenuItem.Command = new AsyncRelayCommand(async () => + UpdateMenuItem.Command = Commands.Create(async () => { if (Updater.CanUpdate(true)) await Updater.BeginUpdateAsync(true); @@ -64,12 +58,12 @@ namespace Ryujinx.Ava.UI.Views.Main FaqMenuItem.Command = SetupGuideMenuItem.Command = - LdnGuideMenuItem.Command = new RelayCommand(OpenHelper.OpenUrl); + LdnGuideMenuItem.Command = Commands.Create(OpenHelper.OpenUrl); WindowSize720PMenuItem.Command = WindowSize1080PMenuItem.Command = WindowSize1440PMenuItem.Command = - WindowSize2160PMenuItem.Command = new RelayCommand(ChangeWindowSize); + WindowSize2160PMenuItem.Command = Commands.Create(ChangeWindowSize); } private IEnumerable GenerateToggleFileTypeItems() => diff --git a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs b/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs index bc53ec245..31036f47c 100644 --- a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs @@ -28,14 +28,14 @@ namespace Ryujinx.Ava.UI.Windows InitializeComponent(); } - public static async Task Show(MainWindowViewModel mainWindowViewModel) + public static async Task Show() { ContentDialog contentDialog = new() { PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new XCITrimmerWindow(mainWindowViewModel), + Content = new XCITrimmerWindow(RyujinxApp.MainWindow.ViewModel), Title = string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]), }; -- 2.47.1 From fa6c882c26230a57e2f4c895849244e96b1388d5 Mon Sep 17 00:00:00 2001 From: Otozinclus <58051309+Otozinclus@users.noreply.github.com> Date: Tue, 21 Jan 2025 01:44:45 +0100 Subject: [PATCH 3/8] Add Lego Undercover, Bayonetta, Mario Wonders to metal list --- src/Ryujinx.Common/TitleIDs.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index dca634d9d..ffb3ae484 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -29,17 +29,21 @@ namespace Ryujinx.Common public static readonly string[] GreatMetalTitles = [ "01006f8002326000", // Animal Crossings: New Horizons + "010076f0049a2000", // Bayonetta "01009bf0072d4000", // Captain Toad: Treasure Tracker "0100a5c00d162000", // Cuphead "010023800d64a000", // Deltarune + "01003a30012c0000", // LEGO City Undercover "010028600EBDA000", // Mario 3D World "0100152000022000", // Mario Kart 8 Deluxe "01005CA01580E000", // Persona 5 - "0100187003A36000", // Pokémon: Let's Go, Evoli! + "0100187003A36000", // Pokémon: Let's Go, Eevee! "010003f003a34000", // Pokémon: Let's Go, Pikachu! "01008C0016544000", // Sea of Stars "01006A800016E000", // Smash Ultimate + "010015100b514000", // Super Mario Bros. Wonder "0100000000010000", // Super Mario Odyessy + "01006bb00c6f0000", // The Legend of Zelda: Link's Awakening ]; public static string GetDiscordGameAsset(string titleId) -- 2.47.1 From ad3e80b383f4afc1d89eeb6d2df43b1ad3423cef Mon Sep 17 00:00:00 2001 From: Matt Zinkevicius Date: Mon, 20 Jan 2025 18:19:19 -0700 Subject: [PATCH 4/8] Log .NET runtime version (#552) I was looking into a crash, and found out it was an issue that was fixed in .NET 9.0.1. Since Ryujinx embeds the runtime into the executable, it not obvious which runtime a build uses. This logs the .NET runtime version immediately after the build version. --- src/Ryujinx/Program.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index b9aa402c5..52b2d655d 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -230,6 +230,7 @@ namespace Ryujinx.Ava internal static void PrintSystemInfo() { Logger.Notice.Print(LogClass.Application, $"{RyujinxApp.FullAppName} Version: {Version}"); + Logger.Notice.Print(LogClass.Application, $".NET Runtime: {RuntimeInformation.FrameworkDescription}"); SystemInfo.Gather().Print(); var enabledLogLevels = Logger.GetEnabledLevels().ToArray(); -- 2.47.1 From 35898165ac1f123cbb64bb82254e6aa1136b9370 Mon Sep 17 00:00:00 2001 From: Otozinclus <58051309+Otozinclus@users.noreply.github.com> Date: Tue, 21 Jan 2025 05:19:50 +0100 Subject: [PATCH 5/8] Update TitleIDs.cs --- src/Ryujinx.Common/TitleIDs.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index ffb3ae484..1a3710501 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -28,22 +28,29 @@ namespace Ryujinx.Common public static readonly string[] GreatMetalTitles = [ - "01006f8002326000", // Animal Crossings: New Horizons - "010076f0049a2000", // Bayonetta - "01009bf0072d4000", // Captain Toad: Treasure Tracker "0100a5c00d162000", // Cuphead "010023800d64a000", // Deltarune - "01003a30012c0000", // LEGO City Undercover "010028600EBDA000", // Mario 3D World "0100152000022000", // Mario Kart 8 Deluxe - "01005CA01580E000", // Persona 5 "0100187003A36000", // Pokémon: Let's Go, Eevee! "010003f003a34000", // Pokémon: Let's Go, Pikachu! "01008C0016544000", // Sea of Stars "01006A800016E000", // Smash Ultimate - "010015100b514000", // Super Mario Bros. Wonder - "0100000000010000", // Super Mario Odyessy "01006bb00c6f0000", // The Legend of Zelda: Link's Awakening + + //These ones have small issues, but those happen on Vulkan as well: + "01006f8002326000", // Animal Crossings: New Horizons + "01009bf0072d4000", // Captain Toad: Treasure Tracker + "01005CA01580E000", // Persona 5 Royale + "0100000000010000", // Super Mario Odyssey + + //More testing needed: + "010076f0049a2000", // Bayonetta + "01009510001ca000", // Fast RMX + "01003a30012c0000", // LEGO City Undercover + "0100704000B3A000", // Snipperclips + "01008e20047dc000", // Snipperclips Plus + "010015100b514000", // Super Mario Bros. Wonder ]; public static string GetDiscordGameAsset(string titleId) -- 2.47.1 From 7ac174c438fc6d995fea996082d8449257c148d5 Mon Sep 17 00:00:00 2001 From: Otozinclus <58051309+Otozinclus@users.noreply.github.com> Date: Tue, 21 Jan 2025 16:44:32 +0100 Subject: [PATCH 6/8] Update TitleIDs.cs --- src/Ryujinx.Common/TitleIDs.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index 1a3710501..6d020b935 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -28,8 +28,10 @@ namespace Ryujinx.Common public static readonly string[] GreatMetalTitles = [ + "010076f0049a2000", // Bayonetta "0100a5c00d162000", // Cuphead "010023800d64a000", // Deltarune + "01003a30012c0000", // LEGO City Undercover "010028600EBDA000", // Mario 3D World "0100152000022000", // Mario Kart 8 Deluxe "0100187003A36000", // Pokémon: Let's Go, Eevee! @@ -41,15 +43,11 @@ namespace Ryujinx.Common //These ones have small issues, but those happen on Vulkan as well: "01006f8002326000", // Animal Crossings: New Horizons "01009bf0072d4000", // Captain Toad: Treasure Tracker + "01009510001ca000", // Fast RMX "01005CA01580E000", // Persona 5 Royale "0100000000010000", // Super Mario Odyssey - //More testing needed: - "010076f0049a2000", // Bayonetta - "01009510001ca000", // Fast RMX - "01003a30012c0000", // LEGO City Undercover - "0100704000B3A000", // Snipperclips - "01008e20047dc000", // Snipperclips Plus + //Isaac claims it has a issue in level 2, but I am not able to replicate it on my M3. More testing would be appreciated: "010015100b514000", // Super Mario Bros. Wonder ]; -- 2.47.1 From 471e7ed2e4eb7c1317b5e981a94f689bcbfeccbc Mon Sep 17 00:00:00 2001 From: Judas Drekonym <77771385+RAMDRAGONS@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:06:40 -0500 Subject: [PATCH 7/8] Add TitleID sort method (#553) Adds an additional application list sorting method for the TitleID. A bit of a niche choice for sorting but I think the TID is a relevant enough piece of metadata that it should be there. (And I personally would be using it) - Using existing TitleId constant in ApplicationSort, implying this was meant to be in the sorting options at some point? - Reuses the "DlcManagerTableHeadingTitleIdLabel" locale for fulfilling the need already, might be better to make a unique one for this in the long run but this codebase is new to me so I wanted to make the changes as unobtrusive as possible - Using app.Id for the comparer seems to work fine, not sure if using something else like IdString would be better? --- src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs | 3 +++ src/Ryujinx/UI/Views/Main/MainViewControls.axaml | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index f88ed65d0..8193c323b 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -624,6 +624,7 @@ namespace Ryujinx.Ava.UI.ViewModels ApplicationSort.FileSize => LocaleManager.Instance[LocaleKeys.GameListHeaderFileSize], ApplicationSort.Path => LocaleManager.Instance[LocaleKeys.GameListHeaderPath], ApplicationSort.Favorite => LocaleManager.Instance[LocaleKeys.CommonFavorite], + ApplicationSort.TitleId => LocaleManager.Instance[LocaleKeys.DlcManagerTableHeadingTitleIdLabel], _ => string.Empty, }; } @@ -694,6 +695,7 @@ namespace Ryujinx.Ava.UI.ViewModels public IHostUIHandler UiHandler { get; internal set; } public bool IsSortedByFavorite => SortMode == ApplicationSort.Favorite; public bool IsSortedByTitle => SortMode == ApplicationSort.Title; + public bool IsSortedByTitleId => SortMode == ApplicationSort.TitleId; public bool IsSortedByDeveloper => SortMode == ApplicationSort.Developer; public bool IsSortedByLastPlayed => SortMode == ApplicationSort.LastPlayed; public bool IsSortedByTimePlayed => SortMode == ApplicationSort.TotalTimePlayed; @@ -726,6 +728,7 @@ namespace Ryujinx.Ava.UI.ViewModels ApplicationSort.FileSize => CreateComparer(IsAscending, app => app.FileSize), ApplicationSort.Path => CreateComparer(IsAscending, app => app.Path), ApplicationSort.Favorite => CreateComparer(IsAscending, app => new AppListFavoriteComparable(app)), + ApplicationSort.TitleId => CreateComparer(IsAscending, app => app.Id), _ => null, #pragma warning restore IDE0055 }; diff --git a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml index 1c6895db1..cdc66a138 100644 --- a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml +++ b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml @@ -105,6 +105,12 @@ GroupName="Sort" IsChecked="{Binding IsSortedByTitle, Mode=OneTime}" Tag="Title" /> + Date: Tue, 21 Jan 2025 18:20:43 +0100 Subject: [PATCH 8/8] Cleanup in TitleIDs.cs (#546) Just a little cleanup in TitleID.cs, adding a franchise title to most franchises + sorting in alphabetical on all games. --- src/Ryujinx.Common/TitleIDs.cs | 111 ++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 44 deletions(-) diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index dca634d9d..6a86e4bd9 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -47,72 +47,87 @@ namespace Ryujinx.Common public static readonly string[] DiscordGameAssetKeys = [ + //All games are in Alphabetical order by Game name. + + //Dragon Quest Franchise "010008900705c000", // Dragon Quest Builders "010042000a986000", // Dragon Quest Builders 2 - "010055d009f78000", // Fire Emblem: Three Houses - "0100a12011cc8000", // Fire Emblem: Shadow Dragon + //Fire Emblem Franchise "0100a6301214e000", // Fire Emblem Engage + "0100a12011cc8000", // Fire Emblem: Shadow Dragon + "010055d009f78000", // Fire Emblem: Three Houses "0100f15003e64000", // Fire Emblem Warriors "010071f0143ea000", // Fire Emblem Warriors: Three Hopes - - "01007e3006dda000", // Kirby Star Allies + + //Kirby Franchise "01004d300c5ae000", // Kirby and the Forgotten Land - "01006b601380e000", // Kirby's Return to Dream Land Deluxe - "01003fb00c5a8000", // Super Kirby Clash - "0100227010460000", // Kirby Fighters 2 "0100a8e016236000", // Kirby's Dream Buffet - + "0100227010460000", // Kirby Fighters 2 + "01006b601380e000", // Kirby's Return to Dream Land Deluxe + "01007e3006dda000", // Kirby Star Allies + "01003fb00c5a8000", // Super Kirby Clash + + + //The Zelda Franchise + "01000b900d8b0000", // Cadence of Hyrule + "0100ae00096ea000", // Hyrule Warriors: Definitive Edition + "01002b00111a2000", // Hyrule Warriors: Age of Calamity "01007ef00011e000", // The Legend of Zelda: Breath of the Wild "01006bb00c6f0000", // The Legend of Zelda: Link's Awakening "01002da013484000", // The Legend of Zelda: Skyward Sword HD "0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom "01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom - "01000b900d8b0000", // Cadence of Hyrule - "0100ae00096ea000", // Hyrule Warriors: Definitive Edition - "01002b00111a2000", // Hyrule Warriors: Age of Calamity + + //Luigi Franchise "010048701995e000", // Luigi's Mansion 2 HD "0100dca0064a6000", // Luigi's Mansion 3 + //Metroid Franchise "010093801237c000", // Metroid Dread "010012101468c000", // Metroid Prime Remastered - "0100000000010000", // SUPER MARIO ODYSSEY - "0100ea80032ea000", // Super Mario Bros. U Deluxe - "01009b90006dc000", // Super Mario Maker 2 - "010049900f546000", // Super Mario 3D All-Stars - "010049900F546001", // ^ 64 - "010049900F546002", // ^ Sunshine - "010049900F546003", // ^ Galaxy - "010028600ebda000", // Super Mario 3D World + Bowser's Fury - "010015100b514000", // Super Mario Bros. Wonder - "0100152000022000", // Mario Kart 8 Deluxe - "010036b0034e4000", // Super Mario Party - "01006fe013472000", // Mario Party Superstars - "0100965017338000", // Super Mario Party Jamboree + //Monster Hunter Franchise + "0100770008dd8000", // Monster Hunter Generations Ultimate + "0100b04011742000", // Monster Hunter Rise + + //Mario Franchise "01006d0017f7a000", // Mario & Luigi: Brothership + "010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020 "010067300059a000", // Mario + Rabbids: Kingdom Battle "0100317013770000", // Mario + Rabbids: Sparks of Hope + "0100c9c00e25c000", // Mario Golf: Super Rush + "0100152000022000", // Mario Kart 8 Deluxe + "01006fe013472000", // Mario Party Superstars + "010019401051c000", // Mario Strikers: Battle League + "0100bde00862a000", // Mario Tennis Aces + "0100b99019412000", // Mario vs. Donkey Kong + "010049900f546000", // Super Mario 3D All-Stars + "010028600ebda000", // Super Mario 3D World + Bowser's Fury + "010049900F546001", // Super Mario 64 + "0100ea80032ea000", // Super Mario Bros. U Deluxe + "010015100b514000", // Super Mario Bros. Wonder + "010049900F546003", // Super Mario Galaxy + "01009b90006dc000", // Super Mario Maker 2 + "0100000000010000", // SUPER MARIO ODYSSEY + "010036b0034e4000", // Super Mario Party + "0100965017338000", // Super Mario Party Jamboree + "0100bc0018138000", // Super Mario RPG + "010049900F546002", // Super Mario Sunshine "0100a3900c3e2000", // Paper Mario: The Origami King "0100ecd018ebe000", // Paper Mario: The Thousand-Year Door - "0100bc0018138000", // Super Mario RPG - "0100bde00862a000", // Mario Tennis Aces - "0100c9c00e25c000", // Mario Golf: Super Rush - "010019401051c000", // Mario Strikers: Battle League - "010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020 - "0100b99019412000", // Mario vs. Donkey Kong + //Pikmin Franchise "0100aa80194b0000", // Pikmin 1 "0100d680194b2000", // Pikmin 2 "0100f4c009322000", // Pikmin 3 Deluxe "0100b7c00933a000", // Pikmin 4 + //The Pokémon Franchise "0100f4300bf2c000", // New Pokémon Snap "0100000011d90000", // Pokémon Brilliant Diamond "01001f5010dfa000", // Pokémon Legends: Arceus - "010003f003a34000", // Pokémon: Let's Go Pikachu! - "0100187003a36000", // Pokémon: Let's Go Eevee! "01003d200baa2000", // Pokémon Mystery Dungeon - Rescue Team DX "0100a3d008c5c000", // Pokémon Scarlet "01008db008c2c000", // Pokémon Shield @@ -120,24 +135,29 @@ namespace Ryujinx.Common "0100abf008968000", // Pokémon Sword "01008f6008c5e000", // Pokémon Violet "0100b3f000be2000", // Pokkén Tournament DX + "0100187003a36000", // Pokémon: Let's Go Eevee! + "010003f003a34000", // Pokémon: Let's Go Pikachu! - "01003bc0000a0000", // Splatoon 2 (US) + //Splatoon Franchise "0100f8f0000a2000", // Splatoon 2 (EU) "01003c700009c000", // Splatoon 2 (JP) + "01003bc0000a0000", // Splatoon 2 (US) "0100c2500fc20000", // Splatoon 3 "0100ba0018500000", // Splatoon 3: Splatfest World Premiere - "010040600c5ce000", // Tetris 99 - "0100277011f1a000", // Super Mario Bros. 35 - "0100ad9012510000", // PAC-MAN 99 + //NSO Membership games "0100ccf019c8c000", // F-ZERO 99 - "0100d870045b6000", // NES - Nintendo Switch Online - "01008d300c50c000", // SNES - Nintendo Switch Online - "0100c9a00ece6000", // N64 - Nintendo Switch Online - "0100e0601c632000", // N64 - Nintendo Switch Online 18+ "0100c62011050000", // GB - Nintendo Switch Online "010012f017576000", // GBA - Nintendo Switch Online + "0100c9a00ece6000", // N64 - Nintendo Switch Online + "0100e0601c632000", // N64 - Nintendo Switch Online 18+ + "0100d870045b6000", // NES - Nintendo Switch Online + "0100ad9012510000", // PAC-MAN 99 + "010040600c5ce000", // Tetris 99 + "01008d300c50c000", // SNES - Nintendo Switch Online + "0100277011f1a000", // Super Mario Bros. 35 + //Misc Nintendo 1st party games "01000320000cc000", // 1-2 Switch "0100300012f2a000", // Advance Wars 1+2: Re-Boot Camp "01006f8002326000", // Animal Crossing: New Horizons @@ -152,27 +172,32 @@ namespace Ryujinx.Common "01006a800016e000", // Super Smash Bros. Ultimate "0100a9400c9c2000", // Tokyo Mirage Sessions #FE Encore + //Bayonetta Franchise "010076f0049a2000", // Bayonetta "01007960049a0000", // Bayonetta 2 "01004a4010fea000", // Bayonetta 3 "0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon + //Persona Franchise "0100dcd01525a000", // Persona 3 Portable - "010062b01525c000", // Persona 4 Golden "010075a016a3a000", // Persona 4 Arena Ultimax + "010062b01525c000", // Persona 4 Golden "01005ca01580e000", // Persona 5 Royal "0100801011c3e000", // Persona 5 Strikers "010087701b092000", // Persona 5 Tactica - "01009aa000faa000", // Sonic Mania + //Sonic Franchise "01004ad014bf0000", // Sonic Frontiers + "01009aa000faa000", // Sonic Mania "01005ea01c0fc000", // SONIC X SHADOW GENERATIONS "01005ea01c0fc001", // ^ + //Xenoblade Franchise "0100ff500e34a000", // Xenoblade Chronicles - Definitive Edition "0100e95004038000", // Xenoblade Chronicles 2 "010074f013262000", // Xenoblade Chronicles 3 + //Misc Games "010056e00853a000", // A Hat in Time "0100fd1014726000", // Baldurs Gate: Dark Alliance "0100dbf01000a000", // Burnout Paradise Remastered @@ -185,8 +210,6 @@ namespace Ryujinx.Common "01003620068ea000", // Hand of Fate 2 "010085500130a000", // Lego City: Undercover "010073c01af34000", // LEGO Horizon Adventures - "0100770008dd8000", // Monster Hunter Generations Ultimate - "0100b04011742000", // Monster Hunter Rise "0100853015e86000", // No Man's Sky "01007bb017812000", // Portal "0100abd01785c000", // Portal 2 -- 2.47.1