diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index aeac1c4a7..2478b88f4 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -37,6 +37,19 @@ jobs: echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT shell: bash + + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create GitLab tag + run: gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=CreateTag "Canary-${{ steps.version_info.outputs.build_version }}|master" - name: Create release uses: ncipollo/release-action@v1 @@ -51,10 +64,12 @@ jobs: | Platform | Artifact | |--|--| | Windows 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | - | Windows ARM 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) | + | Windows ARM 64-bit | [Canary Windows ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) | | Linux 64-bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | | Linux ARM 64-bit | [Canary Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | | macOS | [Canary macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + + **[Full Changelog](https://git.ryujinx.app/ryubing/ryujinx/-/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }})** omitBodyDuringUpdate: true owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} @@ -177,9 +192,12 @@ jobs: | Platform | Artifact | |--|--| | Windows 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | + | Windows ARM 64-bit | [Canary Windows ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) | | Linux 64-bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | | Linux ARM 64-bit | [Canary Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | | macOS | [Canary macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + + **[Full Changelog](https://git.ryujinx.app/ryubing/ryujinx/-/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }})** omitBodyDuringUpdate: true allowUpdates: true replacesArtifacts: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bb2a44131..a0901cfa9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,6 +27,19 @@ jobs: echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT shell: bash + + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create GitLab tag + run: gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=CreateTag "${{ steps.version_info.outputs.build_version }}|master" - name: Create release uses: ncipollo/release-action@v1 @@ -38,9 +51,12 @@ jobs: | Platform | Artifact | |--|--| | Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | + | Windows ARM 64-bit | [Stable Windows ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) | | Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | | Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | | macOS | [Stable macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + + **[Full Changelog](https://git.ryujinx.app/ryubing/ryujinx/-/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }})** omitBodyDuringUpdate: true owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} @@ -159,9 +175,12 @@ jobs: | Platform | Artifact | |--|--| | Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | + | Windows ARM 64-bit | [Stable Windows ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) | | Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | | Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | | macOS | [Stable macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + + **[Full Changelog](https://git.ryujinx.app/ryubing/ryujinx/-/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }})** omitBodyDuringUpdate: true allowUpdates: true replacesArtifacts: true diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..dd0f2ccfa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,255 @@ +# Ryujinx Changelog + +All updates to this Ryujinx branch will be documented in this file. + + +## [1.2.86]() - 2025-03-13 +A list of notable changes can be found on the release linked in the version number above. + +## [1.2.82]() - 2025-02-16 +A list of notable changes can be found on the release linked in the version number above. + +## [1.2.80-81]() - 2025-01-22 +A list of notable changes can be found on the release linked in the version number above. + +## [1.2.78]() - 2024-12-19 +A list of notable changes can be found on the release linked in the version number above. + +## [1.2.73-1.2.76]() - 2024-11-19 +A list of notable changes can be found on the release linked in the version number above. + +Additionally, 1.2.74 & 75 were fixes for uploading Windows build artifacts. + +1.2.76 fixes a rare crash on startup. + +## [1.2.72]() - 2024-11-03 +PRs [#163](), [#164](), [#139]() +### HLE: + - Add DebugMouse HID device. + - Fixes "Clock Tower Rewind" crashing while loading. +### Audio: + - Fix index bounds check in GetCoefficientAtIndex. + - Fixes crashing in Super Mario Party Jamboree. +### misc: + - Update macOS distribution .icns. + +## [1.2.69]() - 2024-11-01 +### Infra: + - Compile the native libraries into the Ryujinx executable. + - Remove `libarmeilleure-jitsupport.dylib` from Windows & Linux releases (dylibs are macOS-only) +### Misc: + - Remove custom themes in config. + - This is a leftover from the GTK UI, as Avalonia does not have custom themes. + - Replace "" with `string.Empty`. + - Code cleanups & simplifications. + +## [1.2.67]() - 2024-11-01 +PRs [#36](), [#135]() + +### GUI: + - Set UseFloatingWatermark to false when watermark is empty + - Should prevent the text prompt box from having weird jumpy behavior. +### GPU: + - Increase the amount of VRAM cache available for textures based on selected DRAM amount. +### Misc: + - Fix homebrew loading. + + +## [1.2.64](https://github.com/GreemDev/Ryujinx/releases/tag/1.2.64) - 2024-10-30 +PRs [#92](https://github.com/GreemDev/Ryujinx/pull/92), [#96](https://github.com/GreemDev/Ryujinx/pull/96), [#97](https://github.com/GreemDev/Ryujinx/pull/97), [#101](https://github.com/GreemDev/Ryujinx/pull/101), [#103](https://github.com/GreemDev/Ryujinx/pull/103) +### GUI: +- Option to show classic-style title bar. Requires restart of emulator to take effect. + - This is only relevant on Windows. Other Operating Systems default to this being on and not being changeable, because the custom (current) title bar only works on Windows in the first place. +### i18n: +- it_IT: + - Add missing Italian strings. +- pt_BR: + - Add missing Brazilian Portuguese strings. +- fr_FR: + - Fix some French strings. +### MISC: +- Higher-res logo. + +## 1.2.59 - 2024-10-27 + +PRs [#88](https://github.com/GreemDev/Ryujinx/pull/88), [#87](https://github.com/GreemDev/Ryujinx/pull/87) +### i18n: +- fr_FR: + - Add missing translations for new features & fix a couple wrong ones. + - Fix Ignore Missing Services / Ignore Applet tooltip. + +## 1.2.57 - 2024-10-27 +PRs [#60](https://github.com/GreemDev/Ryujinx/pull/60), [#42](https://github.com/GreemDev/Ryujinx/pull/42) +### GUI: +- Automatically remove invalid DLC & updates as part of autoload. +- Added Thai translation for Ignore Applet hover tooltip. +### INPUT: +- When using multiple gamepads, when reconnecting they will no longer be mixed up between players. + +## 1.2.50 - 2024-10-25 +### GUI: +- Fix crash when using "delete all" button in mod manager. +### Updater: +- Remove Avalonia migration code. +### MISC: +- Replace references to IntPtr/UIntPtr to nint/nuint. + +## 1.2.45 - 2024-10-25 +### GUI: +- Added program icon to windows other than the main. +- Reference translations added in the last version. +- Shader compile counter is now translated. +### RPC: +- Added SONIC X SHADOW GENERATIONS asset image. +### MISC: +- Code cleanup. + +## 1.2.44 - 2024-10-25 +PR [#59](https://github.com/GreemDev/Ryujinx/pull/59) +### GUI: +- Add descriptions for "ignoring applet" translated into other languages. + +NOTE: The translation isn't referenced in the code yet, it will be in the next update. These are just the translations. + +## Hotfix: 1.2.43 - 2024-10-24 +### GUI: +- Do not enable Ignore Applet by default when upgrading config version. + +## 1.2.42 - 2024-10-24 +Sources: + +Init function: https://github.com/MutantAura/Ryujinx/commit/9cef4ceba40d66492ff775af793ff70e6e7551a9 + +Shader counter: https://github.com/MutantAura/Ryujinx/commit/67b873645fd593e83d042a77bf7ab12e5ec97357 + +Thanks MutantAura :D +### GUI: +- Implement shader compile counter (currently not translated, will change, need to pull changes.) +- Remove graphics backend / GPU name event logic in favor of a single init function. + +## 1.2.41 - 2024-10-24 +PR [#54](https://github.com/GreemDev/Ryujinx/pull/54) + +Thanks Whitescatz! +### i18n: +- th_TH (Thai): Added missing translations, reduce transliterated words, fix grammar. + +## 1.2.40 - 2024-10-23 +PR [#40](https://github.com/GreemDev/Ryujinx/pull/40) + +Thanks Вова С! +### GUI: +- Add option to ignore controller applet upon start. + +*This option is under the hacks section for a reason; it ignores intended behavior. Use with caution. + +## 1.2.39 - 2024-10-23 +### MISC: +- Null-coalesce autoloaddirs on config load. + - Should prevent crashing on config loads in some circumstances. + +## 1.2.38 - 2024-10-23 +PR [#51](https://github.com/GreemDev/Ryujinx/pull/51) +### i18n: +- zh_CH (Simplified Chinese): Add some missing translations. + +## 1.2.37 - 2024-10-23 +PR [#37](https://github.com/GreemDev/Ryujinx/pull/37) + +Thanks Last Breath! +### GUI: +- Set the default controller to the Pro Controller. + +## 1.2.36 - 2024-10-21 +PR [#30](https://github.com/GreemDev/Ryujinx/pull/30) +### GUI: +- Fix repeated dialog popup notifying you of new updates when there aren't any, while having a bundled update inside an XCI and an external update file. + +## 1.2.35 - 2024-10-21 +PR [#32](https://github.com/GreemDev/Ryujinx/pull/32) +### GUI: +- Replace "expand DRAM" option with a DRAM size dropdown. + - Allows for using mods which require a ridiculous amount of memory to allocate from. + +## 1.2.34 - 2024-10-21 +PR [#29](https://github.com/GreemDev/Ryujinx/pull/29) +### GUI: +- Fix duplicate controller names when 2 controllers of the same type are connected. +### INPUT: +- Fix invert x, y, and rotate when mapping physical left stick to logical right stick and vice versa. + +## 1.2.32-1.2.33 - 2024-10-21 +### i18n: +- fr_FR: Added missing strings and general improvements. + - Improve French translation clarity & add missing translations by Nebroc351, helped by Fredy27 in the Discord. + +## 1.2.31 - 2024-10-21 +### GUI: +- Revert maximized = fullscreen change. + - Fixes fullscreen not hiding the Windows taskbar. + +## 1.2.30 - 2024-10-19 +### GUI: +- Reload game list on locale change. +- Add keybinds to useful things (namely opening Amiibo scan window (Ctrl + A) and the scan button (Enter)). +- Reset RPC state when AppHost stops. + +### MISC: +- XML & code cleanups. + +## 1.2.29 - 2024-10-19 +### GUI: +- Remove references to ryujinx.org in the localization files. +- Switch from downloading amiibo.ryujinx.org to just referencing a file in the repo & images in the repo, under assets/amiibo. + +This fork is now entirely independent of the existing Ryujinx infrastructure, and as such the Amiibo features will continue to work in my version when they break in the mainline version. + +## 1.2.28 - 2024-10-17 +### GUI: +- Fix dialog popups doubling the window controls and laying text over the menu bar. + +## 1.2.26 - 2024-10-17 +### I18n: +Added Low-power PPTC mode strings to the translation files. +### GUI: +- Remove OS-provided title bar and put the Ryujinx logo next to "File" in the menu bar. + - What was in the title bar, Ryujinx version & current game information, is still visible by hovering the Ryujinx icon. +- Added icons to many actions in dropdown menus. +### RPC: +- Added Kirby and the Forgotten Land, Elder Scrolls V Skyrim, and Hyrule Warriors: Age of Calamity to the RPC assets. + +## 1.2.25 - 2024-10-14 +### CPU: +- Add low-power PPTC mode. + - Specifically, this setting causes the core count to get reduced by two-thirds, for lower-power but still fast loading if desired, and for unstable CPUs. + +## 1.2.24 - 2024-10-14 +### SDL: +- Move Mouse & MouseDriver to Input project, instead of Headless. + +## 1.2.22 - 2024-10-12 +### GUI/RPC: +- Added RDR, Luigi's Mansion 2 HD & 3 asset images. +### MISC: +- Minor code cleanups & improvements. +- Removed duplicate executable in the release bundle (leftovers from GTK & Avalonia dual releases). +- Removed Avalonia test release bundle, which was kept in Ryujinx for the OG Avalonia testers. That doesn't apply to this fork, so it's removed. + +## 1.2.21 - 2024-10-11 +### GUI/RPC: +- Add game version string when hovering large image asset. +- Add version information about this fork to the Ryujinx logo (big when in main menu, small when in game) when hovering. + +## 1.2.20 - 2024-10-11 +### MISC: +- Code cleanups & remove references to Ryujinx Patreon & Twitter. +### GUI: +- Add more Discord presence assets. + +## 1.2.1-1.2.19 - 2024-10-08 - 2024-10-11 +### GUI/INFRA/MISC: +- Remove GTK UI. +- Autoload DLC/Updates from dir ([#12](https://github.com/GreemDev/Ryujinx/pull/12)). +- Changed executable icon to rainbow logo. +- Extract Data > Logo now also extracts the square thumbnail you see for the game in the UI. +- The "use random UUID hack" checkbox in the Amiibo screen now remembers its last state when you reopen the window in a given session. \ No newline at end of file diff --git a/docs/compatibility.csv b/docs/compatibility.csv index 7b3f814c5..c46a0d1e9 100644 --- a/docs/compatibility.csv +++ b/docs/compatibility.csv @@ -3375,10 +3375,12 @@ 0100E95004038000,"Xenoblade Chronicles™ 2",deadlock;amd-vendor-bug,ingame,2024-03-28 14:31:41 010074F013262000,"Xenoblade Chronicles™ 3",gpu;crash;nvdec;vulkan-backend-bug;amd-vendor-bug,ingame,2024-08-06 19:56:44 0100FF500E34A000,"Xenoblade Chronicles™ Definitive Edition",nvdec,playable,2024-05-04 20:12:41 +0100453019aa8000,"Xenoblade Chronicles: X Definitive Edition",,ingame,2025-03-20 06:51:00 010028600BA16000,"Xenon Racer",nvdec;UE4,playable,2022-08-31 22:05:30 010064200C324000,"Xenon Valkyrie+",,playable,2021-06-07 20:25:53 0100928005BD2000,"Xenoraid",,playable,2022-09-03 13:01:10 01005B5009364000,"Xeodrifter",,playable,2022-09-03 13:18:39 +010048501F73E000,"X-Out: Resurfaced",,playable,2025-03-15 18:25:20 01006FB00DB02000,"Yaga",nvdec,playable,2022-09-16 23:17:17 010076B0101A0000,"YesterMorrow",crash,ingame,2020-12-17 17:15:25 010085500B29A000,"Yet Another Zombie Defense HD",,playable,2021-01-06 00:18:39 diff --git a/docs/shell.png b/docs/shell.png index f1eda13e8..9f2d4c257 100644 Binary files a/docs/shell.png and b/docs/shell.png differ diff --git a/src/Ryujinx.Common/ReleaseInformation.cs b/src/Ryujinx.Common/ReleaseInformation.cs index 68db97465..b539caa6e 100644 --- a/src/Ryujinx.Common/ReleaseInformation.cs +++ b/src/Ryujinx.Common/ReleaseInformation.cs @@ -1,5 +1,9 @@ +using Ryujinx.Common.Utilities; using System; +using System.Net.Http; using System.Reflection; +using System.Text.Json.Serialization; +using System.Threading.Tasks; namespace Ryujinx.Common { @@ -34,12 +38,59 @@ namespace Ryujinx.Common public static string Version => IsValid ? BuildVersion : Assembly.GetEntryAssembly()!.GetCustomAttribute()?.InformationalVersion; - public static string GetChangelogUrl(Version currentVersion, Version newVersion) => + public static string GetChangelogUrl(Version currentVersion, Version newVersion, ReleaseChannels.Channel releaseChannel) => IsCanaryBuild - ? $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/compare/Canary-{currentVersion}...Canary-{newVersion}" - : GetChangelogForVersion(newVersion); + ? $"https://git.ryujinx.app/ryubing/ryujinx/-/compare/Canary-{currentVersion}...Canary-{newVersion}" + : GetChangelogForVersion(newVersion, releaseChannel); - public static string GetChangelogForVersion(Version version) => - $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelRepo}/releases/{version}"; + public static string GetChangelogForVersion(Version version, ReleaseChannels.Channel releaseChannel) => + $"https://github.com/{releaseChannel}/releases/{version}"; + + public static async Task GetReleaseChannelsAsync(HttpClient httpClient) + { + ReleaseChannelPair releaseChannelPair = JsonHelper.Deserialize(await httpClient.GetStringAsync("https://ryujinx.app/api/release-channels"), ReleaseChannelPairContext.Default.ReleaseChannelPair); + return new ReleaseChannels(releaseChannelPair); + } + } + + public readonly struct ReleaseChannels + { + internal ReleaseChannels(ReleaseChannelPair channelPair) + { + Stable = new Channel(channelPair.Stable); + Canary = new Channel(channelPair.Canary); + } + + public readonly Channel Stable; + public readonly Channel Canary; + + public readonly struct Channel + { + public Channel(string raw) + { + string[] parts = raw.Split('/'); + Owner = parts[0]; + Repo = parts[1]; + } + + public readonly string Owner; + public readonly string Repo; + + public override string ToString() => $"{Owner}/{Repo}"; + + public string GetLatestReleaseApiUrl() => + $"https://api.github.com/repos/{ToString()}/releases/latest"; + } + } + + [JsonSerializable(typeof(ReleaseChannelPair))] + partial class ReleaseChannelPairContext : JsonSerializerContext; + + class ReleaseChannelPair + { + [JsonPropertyName("stable")] + public string Stable { get; set; } + [JsonPropertyName("canary")] + public string Canary { get; set; } } } diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index 76a8a7126..3201a5c6b 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -163,6 +163,7 @@ namespace Ryujinx.Common "0100ff500e34a000", // Xenoblade Chronicles - Definitive Edition "0100e95004038000", // Xenoblade Chronicles 2 "010074f013262000", // Xenoblade Chronicles 3 + "0100453019aa8000", // Xenoblade Chronicles: X Definitive Edition //Misc Games "010056e00853a000", // A Hat in Time diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 4fc66c4c0..2ab413848 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -117,7 +117,7 @@ namespace Ryujinx.Graphics.Gpu.Shader private static string GetDiskCachePath() { return GraphicsConfig.EnableShaderCache && GraphicsConfig.TitleId != null - ? Path.Combine(AppDataManager.GamesDirPath, GraphicsConfig.TitleId, "cache", "shader") + ? Path.Combine(AppDataManager.GamesDirPath, GraphicsConfig.TitleId.ToLower(), "cache", "shader") : null; } diff --git a/src/Ryujinx.HLE/HOS/Services/IpcService.cs b/src/Ryujinx.HLE/HOS/Services/IpcService.cs index f1ac7c5ac..de58bb178 100644 --- a/src/Ryujinx.HLE/HOS/Services/IpcService.cs +++ b/src/Ryujinx.HLE/HOS/Services/IpcService.cs @@ -1,8 +1,10 @@ +using Gommon; using Ryujinx.Common.Logging; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; @@ -21,22 +23,43 @@ namespace Ryujinx.HLE.HOS.Services private int _selfId; private bool _isDomain; - public IpcService(ServerBase server = null) + public IpcService(ServerBase server = null, bool registerTipc = false) { - CmifCommands = GetType().Assembly.GetTypes() - .Where(type => type == GetType()) - .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)) + Stopwatch sw = Stopwatch.StartNew(); + + CmifCommands = GetType() + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) .SelectMany(methodInfo => methodInfo.GetCustomAttributes() .Select(command => (command.Id, methodInfo))) .ToDictionary(command => command.Id, command => command.methodInfo); + + sw.Stop(); + + Logger.Debug?.Print( + LogClass.Emulation, + $"{CmifCommands.Count} Cmif commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).", + GetType().AsPrettyString() + ); - TipcCommands = GetType().Assembly.GetTypes() - .Where(type => type == GetType()) - .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)) - .SelectMany(methodInfo => methodInfo.GetCustomAttributes() - .Select(command => (command.Id, methodInfo))) - .ToDictionary(command => command.Id, command => command.methodInfo); + if (registerTipc) + { + sw.Start(); + TipcCommands = GetType() + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) + .SelectMany(methodInfo => methodInfo.GetCustomAttributes() + .Select(command => (command.Id, methodInfo))) + .ToDictionary(command => command.Id, command => command.methodInfo); + + sw.Stop(); + + Logger.Debug?.Print( + LogClass.Emulation, + $"{TipcCommands.Count} Tipc commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).", + GetType().AsPrettyString() + ); + } + Server = server; _parent = this; diff --git a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs index 6d03d8d05..af511af29 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs @@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm private bool _isInitialized; - public IUserInterface(KernelContext context, SmRegistry registry) + public IUserInterface(KernelContext context, SmRegistry registry) : base(registerTipc: true) { _commonServer = new ServerBase(context, "CommonServer"); _registry = registry; diff --git a/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs b/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs index 5e4a0c53b..17fde279c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs @@ -9,6 +9,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Ssl { [Service("ssl")] + [Service("ssl:s")] class ISslService : IpcService { // NOTE: The SSL service is used by games to connect it to various official online services, which we do not intend to support. @@ -123,5 +124,48 @@ namespace Ryujinx.HLE.HOS.Services.Ssl return ResultCode.Success; } + + [CommandCmif(100)] + // CreateContextForSystem(u64 pid, nn::ssl::sf::SslVersion, u64) + public ResultCode CreateContextForSystem(ServiceCtx context) + { + ulong pid = context.RequestData.ReadUInt64(); + SslVersion sslVersion = (SslVersion)context.RequestData.ReadUInt32(); + ulong pidPlaceholder = context.RequestData.ReadUInt64(); + + Logger.Stub?.PrintStub(LogClass.ServiceSsl, new { pid, sslVersion, pidPlaceholder }); + + return ResultCode.Success; + } + + [CommandCmif(101)] + // SetThreadCoreMask(u64 mask) + public ResultCode SetThreadCoreMask(ServiceCtx context) + { + ulong mask = context.RequestData.ReadUInt64(); + + Logger.Stub?.PrintStub(LogClass.ServiceSsl, new { mask }); + + return ResultCode.Success; + } + + [CommandCmif(102)] + // GetThreadCoreMask() -> u64 + public ResultCode GetThreadCoreMask(ServiceCtx context) + { + Logger.Stub?.PrintStub(LogClass.ServiceSsl); + + return ResultCode.Success; + } + + [CommandCmif(103)] + // VerifySignature(buffer<0x5> unknownInput1, buffer<0x5> unknownInput2, buffer<0x5> unknownInput3, buffer unknown1) + public ResultCode VerifySignature(ServiceCtx context) + { + // I would log these values like a proper stub, but I genuinely don't know how. + Logger.Stub?.PrintStub(LogClass.ServiceSsl); + + return ResultCode.Success; + } } } diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 7ff896802..df963f50f 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -2764,7 +2764,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Задать индивидуальные параметры", - "sv_SE": "", + "sv_SE": "Skapa anpassad konfiguration", "th_TH": "", "tr_TR": "", "uk_UA": "Створити користувацьку конфігурацію", @@ -2789,7 +2789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Изменить индивидуальные параметры", - "sv_SE": "", + "sv_SE": "Redigera anpassad konfiguration", "th_TH": "", "tr_TR": "", "uk_UA": "Редагувати користувацьку конфігурацію", @@ -2864,7 +2864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.", - "sv_SE": "", + "sv_SE": "Redigera din befintliga oberoende konfiguration för det valda spelet", "th_TH": "", "tr_TR": "", "uk_UA": "Відредагувати наявну індивідуальну конфігурацію для цієї гри.", @@ -3839,7 +3839,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)", - "sv_SE": "", + "sv_SE": "Visa ursprunglig gränssnittsstil (kräver omstart)", "th_TH": "", "tr_TR": "", "uk_UA": "Показати оригінальний UI (Потрібен перезапуск)", @@ -3864,7 +3864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.", - "sv_SE": "", + "sv_SE": "Visa det gamla Ryuijinx-gränssnittet baserat på Avalonia som påminner om version 1.1.1403. Detta är aktiverat som standard på plattformat som inte är Windows.\nDen klassiska titelfältet är tillbaka och de stora omarbetningarna av fönsterlayouten är omvända, till exempel placeringen av inställningsnavigeringen ovanför detta verktygstips.", "th_TH": "", "tr_TR": "", "uk_UA": "Показати старий інтерфейс Avalonia Ryujinx, який був у Ryujinx 1.1.1403. Ця опція активна за замовчуванням на всіх інших, окрім Windows платформах.\nПовернеться класична панель заголовка, а всі суттєві зміни інтерфейсу будуть скасовані, зокрема горизонтальне розміщення навігації в налаштуваннях.", @@ -24064,7 +24064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Список совместимости — записей: {0}", - "sv_SE": "", + "sv_SE": "Kompatibilitetslista - {0} poster", "th_TH": "", "tr_TR": "", "uk_UA": "Список сумісності — {0} ігор", @@ -24139,7 +24139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Поиск среди {0} записей о совместимости...", - "sv_SE": "", + "sv_SE": "Sök i {0} kompatibilitetsposter...", "th_TH": "", "tr_TR": "", "uk_UA": "Шукати серед {0} перевірених ігор...", @@ -24464,7 +24464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Индивидуальные параметры", - "sv_SE": "", + "sv_SE": "Anpassad konfiguration", "th_TH": "", "tr_TR": "", "uk_UA": "Власна конфігурація", diff --git a/src/Ryujinx/Systems/Updater.cs b/src/Ryujinx/Systems/Updater.cs index a601123a7..ee57906a7 100644 --- a/src/Ryujinx/Systems/Updater.cs +++ b/src/Ryujinx/Systems/Updater.cs @@ -31,9 +31,9 @@ namespace Ryujinx.Ava.Systems { internal static class Updater { + private static ReleaseChannels.Channel? _currentReleaseChannel; + private const string GitHubApiUrl = "https://api.github.com"; - private const string LatestReleaseUrl = - $"{GitHubApiUrl}/repos/{ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}/releases/latest"; private static readonly GithubReleasesJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); @@ -70,13 +70,22 @@ namespace Ryujinx.Ava.Systems } Logger.Info?.Print(LogClass.Application, "Checking for updates."); - + // Get latest version number from GitHub API try { using HttpClient jsonClient = ConstructHttpClient(); - string fetchedJson = await jsonClient.GetStringAsync(LatestReleaseUrl); + if (_currentReleaseChannel == null) + { + ReleaseChannels releaseChannels = await ReleaseInformation.GetReleaseChannelsAsync(jsonClient); + + _currentReleaseChannel = ReleaseInformation.IsCanaryBuild + ? releaseChannels.Canary + : releaseChannels.Stable; + } + + string fetchedJson = await jsonClient.GetStringAsync(_currentReleaseChannel.Value.GetLatestReleaseApiUrl()); GithubReleasesJsonResponse fetched = JsonHelper.Deserialize(fetchedJson, _serializerContext.GithubReleasesJsonResponse); _buildVer = fetched.TagName; @@ -94,10 +103,10 @@ namespace Ryujinx.Ava.Systems LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], string.Empty); - /*if (userResult is UserResult.Ok) + if (userResult is UserResult.Ok) { - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion)); - }*/ + OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion, _currentReleaseChannel.Value)); + } } Logger.Info?.Print(LogClass.Application, "Up to date."); @@ -122,7 +131,7 @@ namespace Ryujinx.Ava.Systems if (userResult is UserResult.Ok) { - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion)); + OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion, _currentReleaseChannel.Value)); } } @@ -184,10 +193,10 @@ namespace Ryujinx.Ava.Systems LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], string.Empty); - /*if (userResult is UserResult.Ok) + if (userResult is UserResult.Ok) { - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion)); - }*/ + OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion, _currentReleaseChannel.Value)); + } } Logger.Info?.Print(LogClass.Application, "Up to date."); @@ -223,7 +232,7 @@ namespace Ryujinx.Ava.Systems Logger.Info?.Print(LogClass.Application, $"Version found: {newVersionString}"); - //RequestUserToUpdate: + RequestUserToUpdate: // Show a message asking the user if they want to update UserResult shouldUpdate = await ContentDialogHelper.CreateUpdaterChoiceDialog( LocaleManager.Instance[LocaleKeys.RyujinxUpdater], @@ -236,9 +245,9 @@ namespace Ryujinx.Ava.Systems await UpdateRyujinx(_buildUrl); break; // Secondary button maps to no, which in this case is the show changelog button. - /*case UserResult.No: - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogUrl(currentVersion, newVersion)); - goto RequestUserToUpdate;*/ + case UserResult.No: + OpenHelper.OpenUrl(ReleaseInformation.GetChangelogUrl(currentVersion, newVersion, _currentReleaseChannel.Value)); + goto RequestUserToUpdate; default: _running = false; break; diff --git a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs index 50347f48b..a93b2894e 100644 --- a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs +++ b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs @@ -354,7 +354,7 @@ namespace Ryujinx.Ava.UI.Helpers primary, secondaryText, LocaleManager.Instance[LocaleKeys.InputDialogYes], - string.Empty, // LocaleManager.Instance[LocaleKeys.DialogUpdaterShowChangelogMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterShowChangelogMessage], LocaleManager.Instance[LocaleKeys.InputDialogNo], (int)Symbol.Help, UserResult.Yes);