From 8a3ccaafe3a9737aeaa6b812b01eb6b3be759b72 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Sun, 27 Jul 2025 01:09:59 -0500 Subject: [PATCH 1/9] basic starscript support + a textbox that provides the starscript executed result & compiled script as well as suggestions --- Directory.Packages.props | 1 + src/Ryujinx/Ryujinx.csproj | 1 + .../Systems/Starscript/RyujinxStarscript.cs | 29 +++++ .../Systems/Starscript/StarscriptHelper.cs | 68 ++++++++++ .../Starscript/StarscriptTextBox.axaml | 21 +++ .../Starscript/StarscriptTextBox.axaml.cs | 95 ++++++++++++++ .../Starscript/StarscriptTextBoxViewModel.cs | 123 ++++++++++++++++++ .../UI/Views/Main/MainMenuBarView.axaml | 4 + .../UI/Views/Main/MainMenuBarView.axaml.cs | 3 + 9 files changed, 345 insertions(+) create mode 100644 src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs create mode 100644 src/Ryujinx/Systems/Starscript/StarscriptHelper.cs create mode 100644 src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml create mode 100644 src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs create mode 100644 src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 5eb7eda3a..1310a8ae4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -55,6 +55,7 @@ + diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 480d14781..881414fb6 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -73,6 +73,7 @@ + diff --git a/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs b/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs new file mode 100644 index 000000000..9efa16178 --- /dev/null +++ b/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs @@ -0,0 +1,29 @@ +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Common; +using Starscript; + +namespace Ryujinx.Ava.Systems.Starscript +{ + public static class RyujinxStarscript + { + public static readonly StarscriptHypervisor Hypervisor = StarscriptHypervisor.Create().WithStandardLibrary(true); + + static RyujinxStarscript() + { + Hypervisor.Set("ryujinx.releaseChannel", + ReleaseInformation.IsCanaryBuild + ? "Canary" + : ReleaseInformation.IsReleaseBuild + ? "Stable" + : "Custom"); + Hypervisor.Set("ryujinx.version", Program.Version); + Hypervisor.Set("appLibrary", StarscriptHelper.Wrap(RyujinxApp.MainWindow.ApplicationLibrary)); + Hypervisor.Set("currentApplication", () => + RyujinxApp.MainWindow.ApplicationLibrary.FindApplication( + RyujinxApp.MainWindow.ViewModel.AppHost?.ApplicationId ?? 0, + out ApplicationData appData) + ? StarscriptHelper.Wrap(appData) + : Value.Null); + } + } +} diff --git a/src/Ryujinx/Systems/Starscript/StarscriptHelper.cs b/src/Ryujinx/Systems/Starscript/StarscriptHelper.cs new file mode 100644 index 000000000..184b8486f --- /dev/null +++ b/src/Ryujinx/Systems/Starscript/StarscriptHelper.cs @@ -0,0 +1,68 @@ +using Gommon; +using Ryujinx.Ava.Systems.AppLibrary; +using Starscript; +using System; + +namespace Ryujinx.Ava.Systems.Starscript +{ + public static class StarscriptHelper + { + public static ValueMap Wrap(ApplicationLibrary appLib) + { + ValueMap lMap = new(); + lMap.Set("appCount", () => appLib.Applications.Count); + lMap.Set("dlcCount", () => appLib.DownloadableContents.Count); + lMap.Set("updateCount", () => appLib.TitleUpdates.Count); + lMap.Set("has", ctx => + { + ulong titleId; + + try + { + titleId = ctx.Constrain(Constraint.ExactlyOneArgument).NextString(1).ToULong(); + } + catch (FormatException) + { + throw ctx.Error( + $"Invalid input to {ctx.FormattedName}; input must be a hexadecimal number in a string."); + } + + return appLib.FindApplication(titleId, out _); + }); + lMap.Set("get", ctx => + { + ulong titleId; + + try + { + titleId = ctx.Constrain(Constraint.ExactlyOneArgument).NextString(1).ToULong(); + } + catch (FormatException) + { + throw ctx.Error( + $"Invalid input to {ctx.FormattedName}; input must be a hexadecimal number in a string."); + } + + return appLib.FindApplication(titleId, + out ApplicationData applicationData) + ? Wrap(applicationData) + : null; + }); + return lMap; + } + + public static ValueMap Wrap(ApplicationData appData) + { + ValueMap aMap = new(); + aMap.Set("name", appData.Name); + aMap.Set("version", appData.Version); + aMap.Set("developer", appData.Developer); + aMap.Set("fileExtension", appData.FileExtension); + aMap.Set("fileSize", appData.FileSizeString); + aMap.Set("hasLdnGames", appData.HasLdnGames); + aMap.Set("timePlayed", appData.TimePlayedString); + aMap.Set("isFavorite", appData.Favorite); + return aMap; + } + } +} diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml new file mode 100644 index 000000000..b30dc3eff --- /dev/null +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs new file mode 100644 index 000000000..8a772d134 --- /dev/null +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs @@ -0,0 +1,95 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Styling; +using FluentAvalonia.UI.Controls; +using Humanizer; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; +using Starscript; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.Systems.Starscript +{ + public partial class StarscriptTextBox : RyujinxControl + { + public IReadOnlyList CurrentSuggestions => ViewModel.CurrentSuggestions; + + public string CurrentScriptSource => ViewModel.CurrentScriptSource; + public Exception Exception => ViewModel.Exception; + public Script CurrentScript => ViewModel.CurrentScript; + public StringSegment CurrentScriptResult => ViewModel.CurrentScriptResult; + + public StarscriptTextBox() + { + InitializeComponent(); + + InputBox.TextInput += HandleTextChanged; + + InputBox.AsyncPopulator = GetSuggestionsAsync; + InputBox.MinimumPopulateDelay = 0.Seconds(); + InputBox.TextFilter = (_, _) => true; + InputBox.TextSelector = (text, suggestion) => + { + if (text is not null && suggestion is null) + return text; + if (text is null && suggestion is not null) + return suggestion; + // ReSharper disable once ConditionIsAlwaysTrueOrFalse + if (text is null && suggestion is null) + return string.Empty; + + var sb = new StringBuilder(text.Length + suggestion.Length + 1); + sb.Append(text); + + for (int i = 0; i < suggestion.Length - 1; i++) + { + if (text.EndsWith(suggestion[..(suggestion.Length - i - 1)])) + { + suggestion = suggestion[(suggestion.Length - i - 1)..]; + break; + } + } + + sb.Append(suggestion); + + return sb.ToString(); + }; + + Style textStyle = new(x => x.OfType().Descendant().OfType()); + textStyle.Setters.Add(new Setter(MarginProperty, new Thickness(0, 0))); + + Styles.Add(textStyle); + } + + private Task> GetSuggestionsAsync(string input, CancellationToken token) + => Task.FromResult(ViewModel.GetSuggestions(input, token)); + + private void HandleTextChanged(object sender, TextInputEventArgs eventArgs) + { + if (sender is AutoCompleteBox) + ViewModel.CurrentScriptSource = eventArgs.Text; + } + + public static StarscriptTextBox Create(StarscriptHypervisor hv) + => new() { ViewModel = new StarscriptTextBoxViewModel(hv) }; + + public static async Task Show() + { + ContentDialog contentDialog = new() + { + PrimaryButtonText = string.Empty, + SecondaryButtonText = string.Empty, + CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose], + Content = new StarscriptTextBox { ViewModel = new() } + }; + + await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles()); + } + } +} diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs new file mode 100644 index 000000000..3a2cd591c --- /dev/null +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs @@ -0,0 +1,123 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Ryujinx.Ava.UI.ViewModels; +using Starscript; +using Starscript.Internal; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Threading; + +namespace Ryujinx.Ava.Systems.Starscript +{ + public partial class StarscriptTextBoxViewModel : BaseModel + { + private readonly StarscriptHypervisor _hv; + + public StarscriptTextBoxViewModel(StarscriptHypervisor hv = null) + { + _hv = hv ?? RyujinxStarscript.Hypervisor; + } + + public ObservableCollection CurrentSuggestions { get; } = []; + + [ObservableProperty] private bool _hasError; + [ObservableProperty] private StringSegment _currentScriptResult; + [ObservableProperty] private string _errorMessage; + private Exception _exception; + private string _currentScriptSource; + private Script _currentScript; + + public Exception Exception + { + get => _exception; + set + { + ErrorMessage = (_exception = value) switch + { + ParseException pe => pe.Error.ToString(), + StarscriptException se => se.Message, + _ => string.Empty + }; + + OnPropertyChanged(); + } + } + + public string CurrentScriptSource + { + get => _currentScriptSource; + set + { + _currentScriptSource = value; + + if (value is null) + { + CurrentScript = null; + CurrentScriptResult = null; + Exception = null; + HasError = false; + return; + } + + try + { + CurrentScript = Compiler.DirectCompile(CurrentScriptSource); + Exception = null; + HasError = false; + } + catch (ParseException pe) + { + CurrentScript = null; + CurrentScriptResult = null; + Exception = pe; + HasError = true; + } + + OnPropertyChanged(); + } + } + + public Script CurrentScript + { + get => _currentScript; + private set + { + try + { + CurrentScriptResult = value?.Execute(_hv)!; + _currentScript = value; + Exception = null; + HasError = false; + } + catch (StarscriptException se) + { + _currentScript = null; + CurrentScriptResult = null; + Exception = se; + HasError = true; + } + + OnPropertyChanged(); + } + } + + public IEnumerable GetSuggestions(string input, CancellationToken token) + { + CurrentScriptSource = input; + + _hv.GetCompletions(CurrentScriptSource, CurrentScriptSource.Length, CreateCallback(), token); + + OnPropertyChanged(nameof(CurrentSuggestions)); + + return CurrentSuggestions; + } + + private CompletionCallback CreateCallback() + { + CurrentSuggestions.Clear(); + + return (result, isFunction) => + CurrentSuggestions.Add(isFunction ? $"{result}(" : result); + } + } +} diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 1bce31f6d..162997430 100755 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -253,6 +253,10 @@ Header="{ext:Locale MenuBarHelpAbout}" Icon="{ext:Icon fa-solid fa-circle-info}" ToolTip.Tip="{ext:Locale OpenAboutTooltip}" /> + CompatibilityListWindow.Show()); UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand; + + StarscriptDebugMenuItem.Command = Commands.Create(StarscriptTextBox.Show); FaqMenuItem.Command = SetupGuideMenuItem.Command = From 95157c0cfdad773df219a2b67a27c88ffcfd1621 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Sun, 27 Jul 2025 17:32:39 -0500 Subject: [PATCH 2/9] make ApplicationLibrary implement IStarscriptObject --- .../Systems/AppLibrary/ApplicationLibrary.cs | 13 ++++++++++++- src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs index 1db2332b8..1a0314bcf 100644 --- a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs @@ -14,6 +14,7 @@ using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Starscript; using Ryujinx.Ava.Utilities; using Ryujinx.Common; using Ryujinx.Common.Configuration; @@ -25,6 +26,7 @@ using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Npdm; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.HLE.Utilities; +using Starscript; using System; using System.Collections.Generic; using System.IO; @@ -41,7 +43,7 @@ using TimeSpan = System.TimeSpan; namespace Ryujinx.Ava.Systems.AppLibrary { - public class ApplicationLibrary + public class ApplicationLibrary : IStarscriptObject { public Language DesiredLanguage { get; set; } public event EventHandler ApplicationCountUpdated; @@ -1611,5 +1613,14 @@ namespace Ryujinx.Ava.Systems.AppLibrary ApplicationData newApplication = newApplications.First(it => it.IdBase == appIdBase); _applications.AddOrUpdate(newApplication); } + + private ValueMap _starscriptMap; + + public ValueMap ToStarscript() + { + _starscriptMap ??= StarscriptHelper.Wrap(this); + + return _starscriptMap; + } } } diff --git a/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs b/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs index 9efa16178..0f9a12436 100644 --- a/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs +++ b/src/Ryujinx/Systems/Starscript/RyujinxStarscript.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Ava.Systems.Starscript ? "Stable" : "Custom"); Hypervisor.Set("ryujinx.version", Program.Version); - Hypervisor.Set("appLibrary", StarscriptHelper.Wrap(RyujinxApp.MainWindow.ApplicationLibrary)); + Hypervisor.Set("appLibrary", RyujinxApp.MainWindow.ApplicationLibrary); Hypervisor.Set("currentApplication", () => RyujinxApp.MainWindow.ApplicationLibrary.FindApplication( RyujinxApp.MainWindow.ViewModel.AppHost?.ApplicationId ?? 0, From 217fd90568281c51fd8553bf5ab68138e37be50f Mon Sep 17 00:00:00 2001 From: GreemDev Date: Sun, 27 Jul 2025 17:35:06 -0500 Subject: [PATCH 3/9] Use a single parser execution per text box update Before it would: parse, compile, then execute for getting the formatted result, then run the suggestions function which did parsing on its own. It has now been moved to the new ParseAndGetCompletions function which returns the used ParserResult, saving some work. --- Directory.Packages.props | 2 +- .../Starscript/StarscriptTextBox.axaml.cs | 12 +---- .../Starscript/StarscriptTextBoxViewModel.cs | 51 +++++++++++-------- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1310a8ae4..3017e8569 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -55,7 +55,7 @@ - + diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs index 8a772d134..5797c3f4a 100644 --- a/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBox.axaml.cs @@ -1,6 +1,5 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Input; using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Humanizer; @@ -8,6 +7,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Starscript; +using Starscript.Internal; using System; using System.Collections.Generic; using System.Text; @@ -20,7 +20,7 @@ namespace Ryujinx.Ava.Systems.Starscript { public IReadOnlyList CurrentSuggestions => ViewModel.CurrentSuggestions; - public string CurrentScriptSource => ViewModel.CurrentScriptSource; + public ParserResult CurrentScriptSource => ViewModel.CurrentScriptSource; public Exception Exception => ViewModel.Exception; public Script CurrentScript => ViewModel.CurrentScript; public StringSegment CurrentScriptResult => ViewModel.CurrentScriptResult; @@ -28,8 +28,6 @@ namespace Ryujinx.Ava.Systems.Starscript public StarscriptTextBox() { InitializeComponent(); - - InputBox.TextInput += HandleTextChanged; InputBox.AsyncPopulator = GetSuggestionsAsync; InputBox.MinimumPopulateDelay = 0.Seconds(); @@ -70,12 +68,6 @@ namespace Ryujinx.Ava.Systems.Starscript private Task> GetSuggestionsAsync(string input, CancellationToken token) => Task.FromResult(ViewModel.GetSuggestions(input, token)); - private void HandleTextChanged(object sender, TextInputEventArgs eventArgs) - { - if (sender is AutoCompleteBox) - ViewModel.CurrentScriptSource = eventArgs.Text; - } - public static StarscriptTextBox Create(StarscriptHypervisor hv) => new() { ViewModel = new StarscriptTextBoxViewModel(hv) }; diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs index 3a2cd591c..5a4929dee 100644 --- a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs @@ -5,6 +5,7 @@ using Starscript.Internal; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Threading; namespace Ryujinx.Ava.Systems.Starscript @@ -24,7 +25,7 @@ namespace Ryujinx.Ava.Systems.Starscript [ObservableProperty] private StringSegment _currentScriptResult; [ObservableProperty] private string _errorMessage; private Exception _exception; - private string _currentScriptSource; + private ParserResult _currentScriptSource; private Script _currentScript; public Exception Exception @@ -38,12 +39,14 @@ namespace Ryujinx.Ava.Systems.Starscript StarscriptException se => se.Message, _ => string.Empty }; + + HasError = value is not null; OnPropertyChanged(); } } - public string CurrentScriptSource + public ParserResult CurrentScriptSource { get => _currentScriptSource; set @@ -55,23 +58,11 @@ namespace Ryujinx.Ava.Systems.Starscript CurrentScript = null; CurrentScriptResult = null; Exception = null; - HasError = false; return; } - - try - { - CurrentScript = Compiler.DirectCompile(CurrentScriptSource); - Exception = null; - HasError = false; - } - catch (ParseException pe) - { - CurrentScript = null; - CurrentScriptResult = null; - Exception = pe; - HasError = true; - } + + CurrentScript = Compiler.SingleCompile(value); + Exception = null; OnPropertyChanged(); } @@ -87,25 +78,41 @@ namespace Ryujinx.Ava.Systems.Starscript CurrentScriptResult = value?.Execute(_hv)!; _currentScript = value; Exception = null; - HasError = false; } catch (StarscriptException se) { _currentScript = null; CurrentScriptResult = null; Exception = se; - HasError = true; } OnPropertyChanged(); } } + public void ReExecuteScript() + { + if (_currentScript is null) return; + + try + { + CurrentScriptResult = _currentScript.Execute(_hv)!; + } + catch (StarscriptException se) + { + CurrentScriptResult = null; + Exception = se; + } + } + public IEnumerable GetSuggestions(string input, CancellationToken token) { - CurrentScriptSource = input; - - _hv.GetCompletions(CurrentScriptSource, CurrentScriptSource.Length, CreateCallback(), token); + CurrentScriptSource = _hv.ParseAndGetCompletions(input, input.Length, CreateCallback(), token); + + if (CurrentScriptSource.HasErrors) + { + Exception = new ParseException(CurrentScriptSource.Errors.First()); + } OnPropertyChanged(nameof(CurrentSuggestions)); From 6122fa204ff5fb8c471dbb3415d331b5104fb4bc Mon Sep 17 00:00:00 2001 From: GreemDev Date: Mon, 28 Jul 2025 17:58:54 -0500 Subject: [PATCH 4/9] simplify completion callback --- .../Systems/Starscript/StarscriptTextBoxViewModel.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs index 5a4929dee..38c5b3ca3 100644 --- a/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs +++ b/src/Ryujinx/Systems/Starscript/StarscriptTextBoxViewModel.cs @@ -107,7 +107,9 @@ namespace Ryujinx.Ava.Systems.Starscript public IEnumerable GetSuggestions(string input, CancellationToken token) { - CurrentScriptSource = _hv.ParseAndGetCompletions(input, input.Length, CreateCallback(), token); + CurrentSuggestions.Clear(); + + CurrentScriptSource = _hv.ParseAndGetCompletions(input, input.Length, CompletionCallback, token); if (CurrentScriptSource.HasErrors) { @@ -119,12 +121,6 @@ namespace Ryujinx.Ava.Systems.Starscript return CurrentSuggestions; } - private CompletionCallback CreateCallback() - { - CurrentSuggestions.Clear(); - - return (result, isFunction) => - CurrentSuggestions.Add(isFunction ? $"{result}(" : result); - } + private void CompletionCallback(string result, bool isFunction) => CurrentSuggestions.Add(isFunction ? $"{result}(" : result); } } From 7b1c8717ef11e987a6edae21e84e5d61dd40d08d Mon Sep 17 00:00:00 2001 From: Daenorth Date: Thu, 24 Jul 2025 13:48:56 +0200 Subject: [PATCH 5/9] Edit compatibility.csv (ryubing/ryujinx!80) See merge request ryubing/ryujinx!80 --- docs/compatibility.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/compatibility.csv b/docs/compatibility.csv index e368cd4f5..567dbe343 100644 --- a/docs/compatibility.csv +++ b/docs/compatibility.csv @@ -2257,6 +2257,7 @@ 010086F0064CE000,"Poi: Explorer Edition",nvdec,playable,2021-01-21 19:32:00 0100EB6012FD2000,"Poison Control",,playable,2021-05-16 14:01:54 010072400E04A000,"Pokémon Café ReMix",,playable,2021-08-17 20:00:04 +010008c01e742000,"Pokémon Friends",crash;services,menus,2025-07-24 13:32:00 01003D200BAA2000,"Pokémon Mystery Dungeon™: Rescue Team DX",mac-bug,playable,2024-01-21 00:16:32 01008DB008C2C000,"Pokémon Shield + Pokémon Shield Expansion Pass",deadlock;crash;online-broken;ldn-works;LAN,ingame,2024-08-12 07:20:22 0100ABF008968000,"Pokémon Sword + Pokémon Sword Expansion Pass",deadlock;crash;online-broken;ldn-works;LAN,ingame,2024-08-26 15:40:37 From b8f9f3e16a84b226e54be80f4dbc701c9b881264 Mon Sep 17 00:00:00 2001 From: Daenorth Date: Thu, 24 Jul 2025 20:04:22 +0200 Subject: [PATCH 6/9] Edit TileIDs.cs (ryubing/ryujinx!81) See merge request ryubing/ryujinx!81 --- src/Ryujinx.Common/TitleIDs.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index d753caa33..329078af9 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -93,6 +93,7 @@ namespace Ryujinx.Common //The Pokémon Franchise "0100f4300bf2c000", // New Pokémon Snap "0100000011d90000", // Pokémon Brilliant Diamond + "010008c01e742000", // Pokémon Friends "01001f5010dfa000", // Pokémon Legends: Arceus "01003d200baa2000", // Pokémon Mystery Dungeon - Rescue Team DX "0100a3d008c5c000", // Pokémon Scarlet From 8fe7d54f852da0f1a6dab20004714651b7126f83 Mon Sep 17 00:00:00 2001 From: Rondo Date: Mon, 28 Jul 2025 15:55:48 -0500 Subject: [PATCH 7/9] Changes to uk_UA (ryubing/ryujinx!84) See merge request ryubing/ryujinx!84 --- assets/locales.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/assets/locales.json b/assets/locales.json index dc760c4fa..af5e4556f 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -2092,7 +2092,7 @@ "sv_SE": "Total speltid: {0}", "th_TH": "", "tr_TR": "Toplam Oyun Süresi: {0}", - "uk_UA": "", + "uk_UA": "Всього зіграно: {0}", "zh_CN": "总游戏时间: {0}", "zh_TW": "總遊戲時間: {0}" } @@ -7217,7 +7217,7 @@ "sv_SE": "Konfiguration hittad:\n\nNamn:\t{0}\nGUID:\t{1}\n\n Väntar på anslutning till kontroller...", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Знайдено конфігурацій:\n\nНазва:\t{0}\nGUID:\t{1}\n\n Очікується з’єднання з контролером...", "zh_CN": "发现配置:\n\n名称:\t{0}\nGUID:\t{1}\n\n 正在等待控制器连接...", "zh_TW": "找到控制器的配置:\n\n名稱:\t{0}\nGUID:\t{1}\n\n 正在等待控制器連線..." } @@ -13142,7 +13142,7 @@ "sv_SE": "Det gick inte att konvertera Ryujinx-versionen som mottogs från uppdateringsservern.", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Не вдалося конвертувати версію Ryujinx, отриману з сервера оновлень.", "zh_CN": "无法转换从更新服务器接收的 Ryujinx 版本。", "zh_TW": "無法轉換從更新伺服器接收的 Ryujinx 版本。" } @@ -16567,7 +16567,7 @@ "sv_SE": "Om det här alternativet är aktiverat i anpassade inställningar kommer den globala inmatningskonfigurationen att användas.\n\nI de globala inställningarna: du kan aktivera eller inaktivera det efter behov; den här inställningen kommer att ärvas av alla nya anpassade konfigurationer som skapas.", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Якщо цей параметр увімкнено в користувацьких налаштуваннях, буде використовуватись глобальна конфігурація вводу.\n\nВ глобальних налаштуваннях: за потреби цю опцію можна вмикати або вимикати; це налаштування автоматично застосується до всіх нових конфігурацій, які ви створите.", "zh_CN": "如果在自定义设置中启用了此选项,则将使用全局输入配置。\n\n在全局设置中: 您可以根据需要启用或禁用它;之后创建的任何自定义配置都将继承此设置。", "zh_TW": "如果在自訂設定啟用了此選項,則將使用全域輸入配置。\n\n在全域設定中:你可以根據需要啟用或停用它;之後建立的任何自訂配置都將繼承此設定。" } @@ -18917,7 +18917,7 @@ "sv_SE": "Ryujinx kunde inte hitta några installerade firmwares", "th_TH": "Ryujinx ไม่พบ เฟิร์มแวร์ที่ติดตั้งไว้ในเครื่องของคุณ", "tr_TR": "Ryujinx yüklü herhangi firmware bulamadı", - "uk_UA": "Ryujinx не вдалося знайти встановлену прошивку", + "uk_UA": "Ryujinx не вдалося знайти жодної встановленої прошивки", "zh_CN": "Ryujinx 模拟器未安装 Switch 系统固件", "zh_TW": "Ryujinx 無法找到已安裝的任何韌體" } @@ -18942,7 +18942,7 @@ "sv_SE": "Ryujinx kunde inte tolka angiven firmware. Detta sker oftast med utdaterade nycklar.", "th_TH": "Ryujinx ไม่สามารถวิเคราะห์เฟิร์มแวร์ที่ให้มาได้ ซึ่งมักมีสาเหตุมาจากคีย์ที่เก่าจนเกินไป", "tr_TR": "Ryujinx temin edilen firmware'i çözümleyemedi. Bu durum genellikle güncel olmayan keys'den kaynaklanır.", - "uk_UA": "Ryujinx не вдалося проаналізувати прошивку. Зазвичай це спричинено застарілими ключами.", + "uk_UA": "Ryujinx не вдалося проаналізувати прошивку. Зазвичай це спричинено застарілими ключами.", "zh_CN": "Ryujinx 模拟器无法解密当前固件,一般是由于使用了旧版的密钥导致的。", "zh_TW": "Ryujinx 無法解析所提供的韌體。這通常是由於金鑰過時造成的。" } @@ -19017,7 +19017,7 @@ "sv_SE": "Ett odefinierat fel inträffade! Detta ska inte hända. Kontakta en utvecklare!", "th_TH": "เกิดข้อผิดพลาดที่ไม่สามารถระบุได้! สิ่งนี้ไม่ควรเกิดขึ้น โปรดติดต่อผู้พัฒนา!", "tr_TR": "Tanımlanmayan bir hata oluştu! Bu durum ile karşılaşılmamalıydı, lütfen bir geliştirici ile iletişime geçin!", - "uk_UA": "Виникла невизначена помилка! Це не повинно було статися. Будь ласка, зверніться до розробника!", + "uk_UA": "Виникла невизначена помилка! Це не повинно було статися. Будь ласка, зверніться до розробників!", "zh_CN": "出现未定义错误!此类错误不应出现,请联系开发者!", "zh_TW": "發生未定義錯誤! 這種情況不應該發生,請聯絡開發人員!" } @@ -19692,7 +19692,7 @@ "sv_SE": "Din aktuella konfiguration är ogiltig. Öppna inställningarna och konfigurera om din inmatning.", "th_TH": "การกำหนดค่าปัจจุบันของคุณไม่ถูกต้อง กรุณาเปิดการตั้งค่าและกำหนดค่าอินพุตของคุณใหม่", "tr_TR": "Halihazırdaki konfigürasyonunuz geçersiz. Ayarları açın ve girişlerinizi yeniden konfigüre edin.", - "uk_UA": "Поточна конфігурація невірна. Відкрийте налаштування та переналаштуйте Ваші дані.", + "uk_UA": "Поточна конфігурація невірна. Перейдіть до параметрів та переналаштуйте керування.", "zh_CN": "您当前的输入配置无效。打开设置并重新设置您的输入选项。", "zh_TW": "您目前的配置無效。開啟設定並重新配置輸入。" } @@ -19717,7 +19717,7 @@ "sv_SE": "Dockat läge angivet. Handhållna kontroller bör inaktiveras.", "th_TH": "ตั้งค่าด็อกโหมด ควรปิดใช้งานการควบคุมแบบแฮนด์เฮลด์", "tr_TR": "Docked mod ayarlandı. Portatif denetim devre dışı bırakılmalı.", - "uk_UA": "Встановлений режим в док-станції. Вимкніть портативні контролери.", + "uk_UA": "Встановлений режим в док-станції. Вимкніть портативний режим.", "zh_CN": "已经设置为主机模式,应禁用掌机手柄操控。", "zh_TW": "已設定底座模式。手提控制應該停用。" } @@ -23442,7 +23442,7 @@ "sv_SE": "Visa ändringslogg", "th_TH": "ด", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Показати список змін", "zh_CN": "查看更新日志", "zh_TW": "檢視更新日誌" } @@ -24817,7 +24817,7 @@ "sv_SE": "Startar och går in i spelet men lider av ett eller flera av följande: kraschar, deadlocks, GPU-buggar, distraherande dåligt ljud eller är helt enkelt för långsamt. Spelet kan fortfarande spelas hela vägen igenom, men inte så som spelet är avsett att spelas.", "th_TH": "", "tr_TR": "", - "uk_UA": "Запускається, але в грі на вас чекатимуть одна або декілька наступних проблем: збої, зависання, графічні баги, спотворений звук або ж гра загалом працюватиме надто повільно. Можливо, її все ще можна пройти, але досвід буде не найкращим.", + "uk_UA": "Запускається, але в грі на вас чекатимуть одна або декілька наступних проблем: збої, зависання, графічні баги, спотворений звук або ж гра загалом працюватиме надто повільно. Можливо, гру все ще можна буде пройти, але досвід буде не найкращим.", "zh_CN": "可以成功启动并进入游戏但可能会遇到以下一种或多种问题: 崩溃、卡死、GPU bug、令人无法接受的音频,或者只是太慢。仍然可以继续进行游戏,但是可能无法达到预期。", "zh_TW": "能啟動並進入遊戲,但可能會遇到下列狀況:崩潰、卡死、GPU bug、令人無法接受的聲音、或遊戲過慢。遊戲或可繼續進行,但是可能無法達到預期效果。" } @@ -24842,7 +24842,7 @@ "sv_SE": "Startar upp och går förbi titelskärmen men tar sig inte in i huvudspelet.", "th_TH": "", "tr_TR": "", - "uk_UA": "Запускається та проходить початковий екран, але пограти не вийде.", + "uk_UA": "Запускається та проходить початковий екран, проте зіграти у вас не вийде.", "zh_CN": "可以启动并通过标题画面但是无法进入到主要的游戏流程。", "zh_TW": "能啟動並通過標題畫面,但是無法進入主要的遊戲畫面。" } From d2037da65fa4baf7e9b99a6d5a4be000adcb0146 Mon Sep 17 00:00:00 2001 From: LotP <22-lotp@users.noreply.git.ryujinx.app> Date: Mon, 28 Jul 2025 18:24:35 -0500 Subject: [PATCH 8/9] Nullify Locales (ryubing/ryujinx!83) See merge request ryubing/ryujinx!83 --- assets/locales.json | 1200 +++++++++-------- .../LocalesValidationTask.cs | 5 +- .../Ryujinx.BuildValidationTasks.csproj | 16 +- 3 files changed, 626 insertions(+), 595 deletions(-) diff --git a/assets/locales.json b/assets/locales.json index af5e4556f..18e964d68 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -1,4 +1,24 @@ { + "Info": { + "Format1": "The Locale file uses a custom Unified format.", + "Format2": "The file starts with a list of all the supported languages.", + "Format3": "Each locale is made up an ID used for lookup and a list", + "Format4": "of the languages and their matching translations.", + "Format5": "When adding a new locale you just need to add the ID and", + "Format6": "the en_US language translation, then the validation system", + "Format7": "will add the rest of the languages automatically on rebuild.", + "Format8": "By default the languages will be added with an empty string.", + "Format9": "Any empty string or null value will automatically match the", + "Format10": "English translation.", + "Format11": "If you want to signal that a translation is supposed to", + "Format12": "match the English translation, you just have to replace the", + "Format13": "empty string with null.", + "Format14": "Translators who want to check what translations are missing", + "Format15": "for their language just need to search for:", + "Format16": "{'lang_code': ''} with double quotes instead of single", + "Format17": "e.g: {'en_US': ''} (but with any other language as English", + "Format18": "will never be missing translations)." + }, "Languages": [ "ar_SA", "de_DE", @@ -1100,101 +1120,101 @@ { "ID": "MenuBarViewWindow720", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "720p", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "MenuBarViewWindow1080", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "1080p", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "MenuBarViewWindow1440", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "1440p", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "MenuBarViewWindow2160", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "2160p", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -2650,26 +2670,26 @@ { "ID": "GameListContextMenuExtractDataExeFS", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "ExeFS", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -2700,26 +2720,26 @@ { "ID": "GameListContextMenuExtractDataRomFS", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "RomFS", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -5225,76 +5245,76 @@ { "ID": "SettingsTabSystemAudioBackendOpenAL", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "OpenAL", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "SettingsTabSystemAudioBackendSoundIO", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "SoundIO", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "Lyd Inn/Ut", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "SettingsTabSystemAudioBackendSDL2", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "SDL2", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -5950,126 +5970,126 @@ { "ID": "SettingsTabGraphicsAspectRatio4x3", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "4:3", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "SettingsTabGraphicsAspectRatio16x9", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "16:9", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "SettingsTabGraphicsAspectRatio16x10", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "16:10", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "SettingsTabGraphicsAspectRatio21x9", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "21:9", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "SettingsTabGraphicsAspectRatio32x9", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "32:9", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -6689,7 +6709,7 @@ "pl_PL": "Globalny Wpis", "pt_BR": "Entrada Global", "ru_RU": "Глобальный Ввод", - "sv_SE": "Global Input", + "sv_SE": null, "th_TH": "การป้อนข้อมูลแบบโกลบอล", "tr_TR": "Küresel Girdi", "uk_UA": "Глобальний Ввід", @@ -7650,151 +7670,151 @@ { "ID": "ControllerSettingsButtonA", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "Α", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "A", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsButtonB", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "B", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsButtonX", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "X", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsButtonY", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "Y", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsButtonPlus", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "+", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsButtonMinus", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "-", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -8325,201 +8345,201 @@ { "ID": "ControllerSettingsTriggerL", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "L", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsTriggerR", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "R", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsTriggerZL", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "ZL", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsTriggerZR", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "ZR", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsLeftSL", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "SL", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsLeftSR", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "SR", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsRightSL", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "SL", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "ControllerSettingsRightSR", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "SR", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -23075,26 +23095,26 @@ { "ID": "GraphicsScalingFilterFsr", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "FSR", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, "zh_CN": "FSR(超级分辨率锐画技术)", - "zh_TW": "" + "zh_TW": null } }, { @@ -23575,51 +23595,51 @@ { "ID": "MultiplayerModeLdnMitm", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "ldn_mitm", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { "ID": "MultiplayerModeLdnRyu", "Translations": { - "ar_SA": "", - "de_DE": "", - "el_GR": "", + "ar_SA": null, + "de_DE": null, + "el_GR": null, "en_US": "RyuLDN", - "es_ES": "", - "fr_FR": "", - "he_IL": "", - "it_IT": "", - "ja_JP": "", - "ko_KR": "", - "no_NO": "", - "pl_PL": "", - "pt_BR": "", - "ru_RU": "", - "sv_SE": "", - "th_TH": "", - "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "es_ES": null, + "fr_FR": null, + "he_IL": null, + "it_IT": null, + "ja_JP": null, + "ko_KR": null, + "no_NO": null, + "pl_PL": null, + "pt_BR": null, + "ru_RU": null, + "sv_SE": null, + "th_TH": null, + "tr_TR": null, + "uk_UA": null, + "zh_CN": null, + "zh_TW": null } }, { @@ -25023,4 +25043,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs b/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs index 17f9be5a0..a07f0c4ae 100644 --- a/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs +++ b/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs @@ -33,7 +33,7 @@ namespace Ryujinx.BuildValidationTasks LocalesJson json; if (isGitRunner && data.Contains("\r\n")) - throw new FormatException("locales.json is using CRLF line endings! It should be using LF line endings, build locally to fix..."); + throw new FormatException("locales.json is using CRLF line endings! It should be using LF line endings, rebuild locally to fix..."); try { @@ -86,7 +86,7 @@ namespace Ryujinx.BuildValidationTasks } if (isGitRunner && encounteredIssue) - throw new JsonException("1 or more locales are invalid!"); + throw new JsonException("1 or more locales are invalid! Rebuild locally to fix..."); string jsonString = JsonSerializer.Serialize(json, _jsonOptions); @@ -102,6 +102,7 @@ namespace Ryujinx.BuildValidationTasks struct LocalesJson { + public Dictionary Info { get; set; } public List Languages { get; set; } public List Locales { get; set; } } diff --git a/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj b/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj index c9fea9313..c89a044b2 100644 --- a/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj +++ b/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj @@ -10,8 +10,18 @@ + Condition="'$(RuntimeIdentifier)' == ''" + IgnoreExitCode="true"> + + + + + + $(OutputOfExec.Substring($(OutputOfExec.IndexOf("Unhandled exception")))) + $(ErrorOutput.Substring(0, $(ErrorOutput.IndexOf(';')))) + + + - \ No newline at end of file + From e9824c90536ea53c12df95a66445a10255d15304 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Mon, 28 Jul 2025 19:33:59 -0500 Subject: [PATCH 9/9] Comment AppImage builds It randomly started erroring in GitHub actions with exit code 8 but only sometimes, and I don't have the patience to debug it. I don't even use linux lol --- .github/workflows/canary.yml | 80 ++++++++++++++++++----------------- .github/workflows/release.yml | 80 ++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 78 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index cf250eb08..a24d8b83f 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -105,46 +105,48 @@ jobs: gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz" shell: bash + + # If anyone wants to look into why appimagetool randomly errors with exit code 8, that would be cool - - name: Build AppImage (Linux) - if: matrix.platform.os == 'ubuntu-latest' - run: | - BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" - PLATFORM_NAME="${{ matrix.platform.name }}" - - sudo apt install -y zsync desktop-file-utils appstream - - mkdir -p tools - export PATH="$PATH:$(readlink -f tools)" - - # Setup appimagetool - wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" - chmod +x tools/appimagetool - chmod +x distribution/linux/appimage/build-appimage.sh - - # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) - if [ "$PLATFORM_NAME" = "linux-x64" ]; then - ARCH_NAME=x64 - export ARCH=x86_64 - elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then - ARCH_NAME=arm64 - export ARCH=aarch64 - else - echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" - exit 1 - fi - - export UFLAG="gh-releases-zsync|${{ secrets.RC_OWNER }}${{ secrets.RC_CANARY_NAME }}|latest|*-$ARCH_NAME.AppImage.zsync" - BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh - - pushd publish_appimage - mv Ryujinx.AppImage ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage - mv Ryujinx.AppImage.zsync ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync - popd - - gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage" - gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" - shell: bash +# - name: Build AppImage (Linux) +# if: matrix.platform.os == 'ubuntu-latest' +# run: | +# BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" +# PLATFORM_NAME="${{ matrix.platform.name }}" +# +# sudo apt install -y zsync desktop-file-utils appstream +# +# mkdir -p tools +# export PATH="$PATH:$(readlink -f tools)" +# +# # Setup appimagetool +# wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" +# chmod +x tools/appimagetool +# chmod +x distribution/linux/appimage/build-appimage.sh +# +# # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) +# if [ "$PLATFORM_NAME" = "linux-x64" ]; then +# ARCH_NAME=x64 +# export ARCH=x86_64 +# elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then +# ARCH_NAME=arm64 +# export ARCH=aarch64 +# else +# echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" +# exit 1 +# fi +# +# export UFLAG="gh-releases-zsync|${{ secrets.RC_OWNER }}${{ secrets.RC_CANARY_NAME }}|latest|*-$ARCH_NAME.AppImage.zsync" +# BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh +# +# pushd publish_appimage +# mv Ryujinx.AppImage ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage +# mv Ryujinx.AppImage.zsync ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync +# popd +# +# gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage" +# gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" +# shell: bash macos_release: name: Release MacOS universal diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f2099719..e1d85f63e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -96,46 +96,48 @@ jobs: shell: bash env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Build AppImage (Linux) - if: matrix.platform.os == 'ubuntu-latest' - run: | - BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" - PLATFORM_NAME="${{ matrix.platform.name }}" - - sudo apt install -y zsync desktop-file-utils appstream - - mkdir -p tools - export PATH="$PATH:$(readlink -f tools)" - - # Setup appimagetool - wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" - chmod +x tools/appimagetool - chmod +x distribution/linux/appimage/build-appimage.sh - - # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) - if [ "$PLATFORM_NAME" = "linux-x64" ]; then - ARCH_NAME=x64 - export ARCH=x86_64 - elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then - ARCH_NAME=arm64 - export ARCH=aarch64 - else - echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" - exit 1 - fi - - export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync" - BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh - - pushd publish_appimage - mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage - mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync - popd - gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage" - gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" - shell: bash + # If anyone wants to look into why appimagetool randomly errors with exit code 8, that would be cool + +# - name: Build AppImage (Linux) +# if: matrix.platform.os == 'ubuntu-latest' +# run: | +# BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" +# PLATFORM_NAME="${{ matrix.platform.name }}" +# +# sudo apt install -y zsync desktop-file-utils appstream +# +# mkdir -p tools +# export PATH="$PATH:$(readlink -f tools)" +# +# # Setup appimagetool +# wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" +# chmod +x tools/appimagetool +# chmod +x distribution/linux/appimage/build-appimage.sh +# +# # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) +# if [ "$PLATFORM_NAME" = "linux-x64" ]; then +# ARCH_NAME=x64 +# export ARCH=x86_64 +# elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then +# ARCH_NAME=arm64 +# export ARCH=aarch64 +# else +# echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" +# exit 1 +# fi +# +# export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync" +# BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh +# +# pushd publish_appimage +# mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage +# mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync +# popd +# +# gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage" +# gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" +# shell: bash macos_release: name: Release MacOS universal