diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ffb5d5f8b..45f233dff 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -22,7 +22,7 @@ body: id: log attributes: label: Log file - description: A log file will help our developers to better diagnose and fix the issue. + description: "A log file will help our developers to better diagnose and fix the issue. UPLOAD THE FILE. DO NOT COPY AND PASTE THE FILE'S CONTENT." placeholder: Logs files can be found under "Logs" folder in Ryujinx program folder. They can also be accessed by opening Ryujinx, then going to File > Open Logs Folder. You can drag and drop the log on to the text area (do not copy paste). validations: required: true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aeb12a575..0472fd5f7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -129,11 +129,11 @@ jobs: with: global-json-file: global.json - - name: Setup LLVM 14 + - name: Setup LLVM 17 run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 14 + sudo ./llvm.sh 17 - name: Install rcodesign run: | diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index a0653f540..433e65cb2 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -108,6 +108,7 @@ jobs: sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place '/^Name=Ryujinx$/s/Name=Ryujinx/Name=Ryujinx-Canary/' distribution/linux/Ryujinx.desktop shell: bash - name: Create output dir @@ -115,71 +116,69 @@ jobs: - name: Publish run: | - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained + dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' run: | - pushd publish_ava - rm publish/libarmeilleure-jitsupport.dylib - 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish + pushd publish + rm libarmeilleure-jitsupport.dylib + 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd shell: bash - name: Packing Linux builds if: matrix.platform.os == 'ubuntu-latest' run: | - pushd publish_ava - rm publish/libarmeilleure-jitsupport.dylib - chmod +x publish/Ryujinx.sh publish/Ryujinx - tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish + pushd publish + rm libarmeilleure-jitsupport.dylib + chmod +x Ryujinx.sh Ryujinx + tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish popd 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 }}" + - 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 + sudo apt install -y zsync desktop-file-utils appstream - # mkdir -p tools - # export PATH="$PATH:$(readlink -f tools)" + 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 + 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 + 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_ava OUTDIR=publish_ava_appimage distribution/linux/appimage/build-appimage.sh + export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|Canary-Releases|latest|*-$ARCH_NAME.AppImage.zsync" + BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh - # Add to release output - # pushd publish_ava_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 - # shell: bash + 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 + shell: bash - name: Pushing new release uses: ncipollo/release-action@v1 with: name: ${{ steps.version_info.outputs.build_version }} - artifacts: "release_output/*.tar.gz,release_output/*.zip" - #artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*" + artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*" tag: ${{ steps.version_info.outputs.build_version }} body: | # Canary builds: @@ -211,11 +210,11 @@ jobs: with: global-json-file: global.json - - name: Setup LLVM 15 + - name: Setup LLVM 17 run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 15 + sudo ./llvm.sh 17 - name: Install rcodesign run: | diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml index fb7cdb359..24d23d98b 100644 --- a/.github/workflows/nightly_pr_comment.yml +++ b/.github/workflows/nightly_pr_comment.yml @@ -37,11 +37,11 @@ jobs: if (!artifacts.length) { return core.error(`No artifacts found`); } - let body = `*You need to be logged into GitHub to download these files.*\n\nDownload the artifacts for this pull request:\n`; + let body = `Download the artifacts for this pull request:\n`; let hidden_debug_artifacts = `\n\n
Only for Developers\n`; for (const art of artifacts) { - const url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run_id}/artifacts/${art.id}`; - if(art.name.includes('Debug')) { + const url = `https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip`; + if (art.name.includes('Debug')) { hidden_debug_artifacts += `\n* [${art.name}](${url})`; } else { body += `\n* [${art.name}](${url})`; diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 584507d75..7e11f6edf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,16 +3,6 @@ name: Release job on: workflow_dispatch: inputs: {} - push: - branches: [ release ] - paths-ignore: - - '.github/**' - - 'docs/**' - - 'assets/**' - - '*.yml' - - '*.json' - - '*.config' - - '*.md' concurrency: release @@ -121,6 +111,15 @@ jobs: 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd shell: bash + + - name: Packing Linux builds + if: matrix.platform.os == 'ubuntu-latest' + run: | + pushd publish + chmod +x Ryujinx.sh Ryujinx + tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish + popd + shell: bash - name: Build AppImage (Linux) if: matrix.platform.os == 'ubuntu-latest' @@ -157,15 +156,6 @@ jobs: 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 - shell: bash - - - name: Packing Linux builds - if: matrix.platform.os == 'ubuntu-latest' - run: | - pushd publish - chmod +x Ryujinx.sh Ryujinx - tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish - popd shell: bash - name: Pushing new release @@ -201,11 +191,11 @@ jobs: with: global-json-file: global.json - - name: Setup LLVM 15 + - name: Setup LLVM 17 run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 15 + sudo ./llvm.sh 17 - name: Install rcodesign run: | diff --git a/Directory.Packages.props b/Directory.Packages.props index ab3bc39b8..c2ac358ed 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,13 +3,13 @@ true - - - - - - - + + + + + + + @@ -18,7 +18,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -42,16 +42,17 @@ - + + - - - - - + + + + + diff --git a/distribution/linux/appimage/build-appimage.sh b/distribution/linux/appimage/build-appimage.sh index 9b52928f8..a9de4866b 100755 --- a/distribution/linux/appimage/build-appimage.sh +++ b/distribution/linux/appimage/build-appimage.sh @@ -6,7 +6,7 @@ cd "$ROOTDIR" BUILDDIR=${BUILDDIR:-publish} OUTDIR=${OUTDIR:-publish_appimage} -UFLAG=${UFLAG:-"gh-releases-zsync|GreemDev|ryujinx|latest|*-x64.AppImage.zsync"} +UFLAG=${UFLAG:-"gh-releases-zsync|Ryubing|ryujinx|latest|*-x64.AppImage.zsync"} rm -rf AppDir mkdir -p AppDir/usr/bin diff --git a/distribution/macos/bundle_fix_up.py b/distribution/macos/bundle_fix_up.py index a8e3ac760..273d7455d 100644 --- a/distribution/macos/bundle_fix_up.py +++ b/distribution/macos/bundle_fix_up.py @@ -19,7 +19,7 @@ if platform.system() == "Darwin": else: OTOOL = shutil.which("llvm-otool") if OTOOL is None: - for llvm_ver in [15, 14, 13]: + for llvm_ver in [17, 16, 15, 14, 13]: otool_path = shutil.which(f"llvm-otool-{llvm_ver}") if otool_path is not None: OTOOL = otool_path diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py index b6c3770c6..5d9321860 100644 --- a/distribution/macos/construct_universal_dylib.py +++ b/distribution/macos/construct_universal_dylib.py @@ -26,7 +26,7 @@ else: LIPO = shutil.which("llvm-lipo") if LIPO is None: - for llvm_ver in [15, 14, 13]: + for llvm_ver in [17, 16, 15, 14, 13]: lipo_path = shutil.which(f"llvm-lipo-{llvm_ver}") if lipo_path is not None: LIPO = lipo_path diff --git a/distribution/macos/create_macos_build_ava.sh b/distribution/macos/create_macos_build_ava.sh index b19fa4863..de6fab358 100755 --- a/distribution/macos/create_macos_build_ava.sh +++ b/distribution/macos/create_macos_build_ava.sh @@ -67,11 +67,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_APP_ if ! [ -x "$(command -v lipo)" ]; then - if ! [ -x "$(command -v llvm-lipo-14)" ]; + if ! [ -x "$(command -v llvm-lipo-17)" ]; then LIPO=llvm-lipo else - LIPO=llvm-lipo-14 + LIPO=llvm-lipo-17 fi else LIPO=lipo diff --git a/distribution/macos/create_macos_build_headless.sh b/distribution/macos/create_macos_build_headless.sh index 01951d878..5de862a2f 100755 --- a/distribution/macos/create_macos_build_headless.sh +++ b/distribution/macos/create_macos_build_headless.sh @@ -62,11 +62,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_OUTP if ! [ -x "$(command -v lipo)" ]; then - if ! [ -x "$(command -v llvm-lipo-14)" ]; + if ! [ -x "$(command -v llvm-lipo-17)" ]; then LIPO=llvm-lipo else - LIPO=llvm-lipo-14 + LIPO=llvm-lipo-17 fi else LIPO=lipo diff --git a/distribution/macos/shortcut-template.plist b/distribution/macos/shortcut-template.plist index 27a9e46a9..c6368a08f 100644 --- a/distribution/macos/shortcut-template.plist +++ b/distribution/macos/shortcut-template.plist @@ -19,7 +19,7 @@ CSResourcesFileMapped NSHumanReadableCopyright - Copyright © 2018 - 2023 Ryujinx Team and Contributors. + Copyright © 2018 - 2025 Ryujinx Team and Contributors. LSApplicationCategoryType public.app-category.games LSMinimumSystemVersion diff --git a/docs/compatibility.csv b/docs/compatibility.csv new file mode 100644 index 000000000..3528652c8 --- /dev/null +++ b/docs/compatibility.csv @@ -0,0 +1,3424 @@ +"title_id","game_name","labels","status","last_updated" +010099F00EF3E000,"-KLAUS-",nvdec,playable,2020-06-27 13:27:30 +0100BA9014A02000,".hack//G.U. Last Recode",deadlock,boots,2022-03-12 19:15:47 +010098800C4B0000,"'n Verlore Verstand",slow,ingame,2020-12-10 18:00:28 +01009A500E3DA000,"'n Verlore Verstand - Demo",,playable,2021-02-09 00:13:32 +0100A5D01174C000,"/Connection Haunted ",slow,playable,2020-12-10 18:57:14 +01001E500F7FC000,"#Funtime",,playable,2020-12-10 16:54:35 +01000E50134A4000,"#Halloween, Super Puzzles Dream",nvdec,playable,2020-12-10 20:43:58 +01004D100C510000,"#KILLALLZOMBIES",slow,playable,2020-12-16 01:50:25 +0100325012C12000,"#NoLimitFantasy, Super Puzzles Dream",nvdec,playable,2020-12-12 17:21:32 +01005D400E5C8000,"#RaceDieRun",,playable,2020-07-04 20:23:16 +01003DB011AE8000,"#womenUp, Super Puzzles Dream",,playable,2020-12-12 16:57:25 +0100D87012A14000,"#womenUp, Super Puzzles Dream Demo",nvdec,playable,2021-02-09 00:03:31 +01000320000CC000,"1-2-Switch™",services,playable,2022-02-18 14:44:03 +01004D1007926000,"10 Second Run RETURNS",gpu,ingame,2022-07-17 13:06:18 +0100DC000A472000,"10 Second Run RETURNS Demo",gpu,ingame,2021-02-09 00:17:18 +0100D82015774000,"112 Operator",nvdec,playable,2022-11-13 22:42:50 +010051E012302000,"112th Seed",,playable,2020-10-03 10:32:38 +01007F600D1B8000,"12 is Better Than 6",,playable,2021-02-22 16:10:12 +0100B1A010014000,"12 Labours of Hercules II: The Cretan Bull",cpu;32-bit;crash,nothing,2022-12-07 13:43:10 +0100A840047C2000,"12 orbits",,playable,2020-05-28 16:13:26 +01003FC01670C000,"13 Sentinels: Aegis Rim",slow,ingame,2024-06-10 20:33:38 +0100C54015002000,"13 Sentinels: Aegis Rim Demo",demo,playable,2022-04-13 14:15:48 +01007E600EEE6000,"140",,playable,2020-08-05 20:01:33 +0100B94013D28000,"16-Bit Soccer Demo",,playable,2021-02-09 00:23:07 +01005CA0099AA000,"1917 - The Alien Invasion DX",,playable,2021-01-08 22:11:16 +0100829010F4A000,"1971 Project Helios",,playable,2021-04-14 13:50:19 +0100D1000B18C000,"1979 Revolution: Black Friday",nvdec,playable,2021-02-21 21:03:43 +01007BB00FC8A000,"198X",,playable,2020-08-07 13:24:38 +010075601150A000,"1993 Shenandoah",,playable,2020-10-24 13:55:42 +0100148012550000,"1993 Shenandoah Demo",,playable,2021-02-09 00:43:43 +010096500EA94000,"2048 Battles",,playable,2020-12-12 14:21:25 +010024C0067C4000,"2064: Read Only Memories INTEGRAL",deadlock,menus,2020-05-28 16:53:58 +0100749009844000,"20XX",gpu,ingame,2023-08-14 09:41:44 +01007550131EE000,"2URVIVE",,playable,2022-11-17 13:49:37 +0100E20012886000,"2weistein – The Curse of the Red Dragon",nvdec;UE4,playable,2022-11-18 14:47:07 +0100DAC013D0A000,"30 in 1 game collection vol. 2",online-broken,playable,2022-10-15 17:22:27 +010056D00E234000,"30-in-1 Game Collection",online-broken,playable,2022-10-15 17:47:09 +0100FB5010D2E000,"3000th Duel",,playable,2022-09-21 17:12:08 +01003670066DE000,"36 Fragments of Midnight",,playable,2020-05-28 15:12:59 +0100AF400C4CE000,"39 Days to Mars",,playable,2021-02-21 22:12:46 +010010C013F2A000,"3D Arcade Fishing",,playable,2022-10-25 21:50:51 +01006DA00707C000,"3D MiniGolf",,playable,2021-01-06 09:22:11 +01006890126E4000,"4x4 Dirt Track",,playable,2020-12-12 21:41:42 +010010100FF14000,"60 Parsecs!",,playable,2022-09-17 11:01:17 +0100969005E98000,"60 Seconds!",services,ingame,2021-11-30 01:04:14 +0100ECF008474000,"6180 the moon",,playable,2020-05-28 15:39:24 +0100EFE00E964000,"64.0",,playable,2020-12-12 21:31:58 +0100DA900B67A000,"7 Billion Humans",32-bit,playable,2020-12-17 21:04:58 +01004B200DF76000,"7th Sector",nvdec,playable,2020-08-10 14:22:14 +0100E9F00B882000,"8-BIT ADV STEINS;GATE",audio,ingame,2020-01-12 15:05:06 +0100B0700E944000,"80 DAYS",,playable,2020-06-22 21:43:01 +01006B1011B9E000,"80's OVERDRIVE",,playable,2020-10-16 14:33:32 +010006A0042F0000,"88 Heroes - 98 Heroes Edition",,playable,2020-05-28 14:13:02 +010005E00E2BC000,"9 Monkeys of Shaolin",UE4;gpu;slow,ingame,2020-11-17 11:58:43 +0100C5F012E3E000,"9 Monkeys of Shaolin Demo",UE4;gpu;nvdec,ingame,2021-02-09 01:03:30 +01000360107BC000,"911 Operator Deluxe Edition",,playable,2020-07-14 13:57:44 +0100B2C00682E000,"99Vidas - Definitive Edition",online,playable,2020-10-29 13:00:40 +010023500C2F0000,"99Vidas Demo",,playable,2021-02-09 12:51:31 +0100DB00117BA000,"9th Dawn III",,playable,2020-12-12 22:27:27 +010096A00CC80000,"A Ch'ti Bundle",nvdec,playable,2022-10-04 12:48:44 +010021D00D53E000,"A Dark Room",gpu,ingame,2020-12-14 16:14:28 +010026B006802000,"A Duel Hand Disaster: Trackher",nvdec;online-working,playable,2022-09-04 14:24:55 +0100582012B90000,"A Duel Hand Disaster: Trackher DEMO",crash;demo;nvdec,ingame,2021-03-24 18:45:27 +01006CE0134E6000,"A Frog Game",,playable,2020-12-14 16:09:53 +010056E00853A000,"A Hat in Time",,playable,2024-06-25 19:52:44 +01009E1011EC4000,"A HERO AND A GARDEN",,playable,2022-12-05 16:37:47 +01005EF00CFDA000,"A Knight's Quest",UE4,playable,2022-09-12 20:44:20 +01008DD006C52000,"A Magical High School Girl",,playable,2022-07-19 14:40:50 +01004890117B2000,"A Short Hike",,playable,2020-10-15 00:19:58 +0100F0901006C000,"A Sound Plan",crash,boots,2020-12-14 16:46:21 +01007DD011C4A000,"A Summer with the Shiba Inu",,playable,2021-06-10 20:51:16 +0100A3E010E56000,"A-Train: All Aboard! Tourism",nvdec,playable,2021-04-06 17:48:19 +010097A00CC0A000,"Aaero: Complete Edition",nvdec,playable,2022-07-19 14:49:55 +0100EFC010398000,"Aborigenus",,playable,2020-08-05 19:47:24 +0100A5B010A66000,"Absolute Drift",,playable,2020-12-10 14:02:44 +0100C1300BBC6000,"ABZÛ",UE4,playable,2022-07-19 15:02:52 +01003C400871E000,"ACA NEOGEO 2020 SUPER BASEBALL",online,playable,2021-04-12 13:23:51 +0100FC000AFC6000,"ACA NEOGEO 3 COUNT BOUT",online,playable,2021-04-12 13:16:42 +0100AC40038F4000,"ACA NEOGEO AERO FIGHTERS 2",online,playable,2021-04-08 15:44:09 +0100B91008780000,"ACA NEOGEO AERO FIGHTERS 3",online,playable,2021-04-12 13:11:17 +0100B4800AFBA000,"ACA NEOGEO AGGRESSORS OF DARK KOMBAT",online,playable,2021-04-01 22:48:01 +01003FE00A2F6000,"ACA NEOGEO BASEBALL STARS PROFESSIONAL",online,playable,2021-04-01 21:23:05 +0100DFC003398000,"ACA NEOGEO BLAZING STAR",crash;services,menus,2020-05-26 17:29:02 +0100D2400AFB0000,"ACA NEOGEO CROSSED SWORDS",online,playable,2021-04-01 20:42:59 +0100EE6002B48000,"ACA NEOGEO FATAL FURY",online,playable,2021-04-01 20:36:23 +0100EEA00AFB2000,"ACA NEOGEO FOOTBALL FRENZY",,playable,2021-03-29 20:12:12 +0100CB2001DB8000,"ACA NEOGEO GAROU: MARK OF THE WOLVES",online,playable,2021-04-01 20:31:10 +01005D700A2F8000,"ACA NEOGEO GHOST PILOTS",online,playable,2021-04-01 20:26:45 +01000D10038E6000,"ACA NEOGEO LAST RESORT",online,playable,2021-04-01 19:51:22 +0100A2900AFA4000,"ACA NEOGEO LEAGUE BOWLING",crash;services,menus,2020-05-26 17:11:04 +0100A050038F2000,"ACA NEOGEO MAGICAL DROP II",crash;services,menus,2020-05-26 16:48:24 +01007920038F6000,"ACA NEOGEO MAGICIAN LORD",online,playable,2021-04-01 19:33:26 +0100EBE002B3E000,"ACA NEOGEO METAL SLUG",,playable,2021-02-21 13:56:48 +010086300486E000,"ACA NEOGEO METAL SLUG 2",online,playable,2021-04-01 19:25:52 +0100BA8001DC6000,"ACA NEOGEO METAL SLUG 3",crash;services,menus,2020-05-26 16:32:45 +01009CE00AFAE000,"ACA NEOGEO METAL SLUG 4",online,playable,2021-04-01 18:12:18 +01008FD004DB6000,"ACA NEOGEO METAL SLUG X",crash;services,menus,2020-05-26 14:07:20 +010038F00AFA0000,"ACA NEOGEO Money Puzzle Exchanger",online,playable,2021-04-01 17:59:56 +01002E70032E8000,"ACA NEOGEO NEO TURF MASTERS",,playable,2021-02-21 15:12:01 +010052A00A306000,"ACA NEOGEO NINJA COMBAT",,playable,2021-03-29 21:17:28 +01007E800AFB6000,"ACA NEOGEO NINJA COMMANDO",online,playable,2021-04-01 17:28:18 +01003A5001DBA000,"ACA NEOGEO OVER TOP",,playable,2021-02-21 13:16:25 +010088500878C000,"ACA NEOGEO REAL BOUT FATAL FURY SPECIAL",online,playable,2021-04-01 17:18:27 +01005C9002B42000,"ACA NEOGEO SAMURAI SHODOWN",online,playable,2021-04-01 17:11:35 +010047F001DBC000,"ACA NEOGEO SAMURAI SHODOWN IV",online,playable,2021-04-12 12:58:54 +010049F00AFE8000,"ACA NEOGEO SAMURAI SHODOWN V SPECIAL",online,playable,2021-04-10 18:07:13 +01009B300872A000,"ACA NEOGEO SENGOKU 2",online,playable,2021-04-10 17:36:44 +01008D000877C000,"ACA NEOGEO SENGOKU 3",online,playable,2021-04-10 16:11:53 +01008A9001DC2000,"ACA NEOGEO SHOCK TROOPERS",crash;services,menus,2020-05-26 15:29:34 +01007D1004DBA000,"ACA NEOGEO SPIN MASTER",online,playable,2021-04-10 15:50:19 +010055A00A300000,"ACA NEOGEO SUPER SIDEKICKS 2",online,playable,2021-04-10 16:05:58 +0100A4D00A308000,"ACA NEOGEO SUPER SIDEKICKS 3 : THE NEXT GLORY",online,playable,2021-04-10 15:39:22 +0100EB2001DCC000,"ACA NEOGEO THE KING OF FIGHTERS '94",crash;services,menus,2020-05-26 15:03:44 +01009DC001DB6000,"ACA NEOGEO THE KING OF FIGHTERS '95",,playable,2021-03-29 20:27:35 +01006F0004FB4000,"ACA NEOGEO THE KING OF FIGHTERS '96",online,playable,2021-04-10 14:49:10 +0100170008728000,"ACA NEOGEO THE KING OF FIGHTERS '97",online,playable,2021-04-10 14:43:27 +0100B42001DB4000,"ACA NEOGEO THE KING OF FIGHTERS '98",crash;services,menus,2020-05-26 14:54:20 +0100583001DCA000,"ACA NEOGEO THE KING OF FIGHTERS '99",online,playable,2021-04-10 14:36:56 +0100B97002B44000,"ACA NEOGEO THE KING OF FIGHTERS 2000",online,playable,2021-04-10 15:24:35 +010048200AFC2000,"ACA NEOGEO THE KING OF FIGHTERS 2001",online,playable,2021-04-10 15:16:23 +0100CFD00AFDE000,"ACA NEOGEO THE KING OF FIGHTERS 2002",online,playable,2021-04-10 15:01:55 +0100EF100AFE6000,"ACA NEOGEO THE KING OF FIGHTERS 2003",online,playable,2021-04-10 14:54:31 +0100699008792000,"ACA NEOGEO THE LAST BLADE 2",online,playable,2021-04-10 14:31:54 +0100F7F00AFA2000,"ACA NEOGEO THE SUPER SPY",online,playable,2021-04-10 14:26:33 +0100CEF001DC0000,"ACA NEOGEO WAKU WAKU 7",online,playable,2021-04-10 14:20:52 +01009D4001DC4000,"ACA NEOGEO WORLD HEROES PERFECT",crash;services,menus,2020-05-26 14:14:36 +01002E700AFC4000,"ACA NEOGEO ZUPAPA!",online,playable,2021-03-25 20:07:33 +0100A9900CB5C000,"Access Denied",,playable,2022-07-19 15:25:10 +01007C50132C8000,"Ace Angler: Fishing Spirits",crash,menus,2023-03-03 03:21:39 +010005501E68C000,"Ace Attorney Investigations Collection",,playable,2024-09-19 16:38:05 +010033401E68E000,"Ace Attorney Investigations Collection DEMO",,playable,2024-09-07 06:16:42 +010039301B7E0000,"Ace Combat 7 - Skies Unknown Deluxe Edition",gpu;UE4,ingame,2024-09-27 14:31:43 +0100FF1004D56000,"Ace of Seafood",,playable,2022-07-19 15:32:25 +0100B28003440000,"Aces of the Luftwaffe - Squadron",nvdec;slow,playable,2020-05-27 12:29:42 +010054300D822000,"Aces of the Luftwaffe - Squadron Demo",nvdec,playable,2021-02-09 13:12:28 +010079B00B3F4000,"Achtung! Cthulhu Tactics",,playable,2020-12-14 18:40:27 +0100DBC0081A4000,"ACORN Tactics",,playable,2021-02-22 12:57:40 +010043C010AEA000,"Across the Grooves",,playable,2020-06-27 12:29:51 +010039A010DA0000,"Active Neurons - Puzzle game",,playable,2021-01-27 21:31:21 +01000D1011EF0000,"Active Neurons 2",,playable,2022-10-07 16:21:42 +010031C0122B0000,"Active Neurons 2 Demo",,playable,2021-02-09 13:40:21 +0100EE1013E12000,"Active Neurons 3 - Wonders Of The World",,playable,2021-03-24 12:20:20 +0100CD40104DE000,"Actual Sunlight",gpu,ingame,2020-12-14 17:18:41 +0100C0C0040E4000,"Adam's Venture™: Origins",,playable,2021-03-04 18:43:57 +010029700EB76000,"Adrenaline Rush - Miami Drive",,playable,2020-12-12 22:49:50 +0100300012F2A000,"Advance Wars™ 1+2: Re-Boot Camp",,playable,2024-01-30 18:19:44 +010014B0130F2000,"Adventure Llama",,playable,2020-12-14 19:32:24 +0100C990102A0000,"Adventure Pinball Bundle",slow,playable,2020-12-14 20:31:53 +0100C4E004406000,"Adventure Time: Pirates of the Enchiridion",nvdec,playable,2022-07-21 21:49:01 +010021F00C1C0000,"Adventures of Bertram Fiddle Episode 2: A Bleaker Predicklement",nvdec,playable,2021-02-22 14:56:37 +010072601233C000,"Adventures of Chris",,playable,2020-12-12 23:00:02 +0100A0A0136E8000,"Adventures of Chris Demo",,playable,2021-02-09 13:49:21 +01002B5012004000,"Adventures of Pip",nvdec,playable,2020-12-12 22:11:55 +01008C901266E000,"ADVERSE",UE4,playable,2021-04-26 14:32:51 +01008E6006502000,"Aegis Defenders",,playable,2021-02-22 13:29:33 +010064500AF72000,"Aegis Defenders demo",,playable,2021-02-09 14:04:17 +010001C011354000,"Aeolis Tournament",online,playable,2020-12-12 22:02:14 +01006710122CE000,"Aeolis Tournament Demo",nvdec,playable,2021-02-09 14:22:30 +0100A0400DDE0000,"AER Memories of Old",nvdec,playable,2021-03-05 18:43:43 +0100E9B013D4A000,"Aerial_Knight's Never Yield",,playable,2022-10-25 22:05:00 +0100087012810000,"Aery - Broken Memories",,playable,2022-10-04 13:11:52 +01000A8015390000,"Aery - Calm Mind",,playable,2022-11-14 14:26:58 +0100875011D0C000,"Aery - Little Bird Adventure",,playable,2021-03-07 15:25:51 +010018E012914000,"Aery - Sky Castle",,playable,2022-10-21 17:58:49 +0100DF8014056000,"Aery – A Journey Beyond Time",,playable,2021-04-05 15:52:25 +01006C40086EA000,"AeternoBlade",nvdec,playable,2020-12-14 20:06:48 +0100B1C00949A000,"AeternoBlade Demo",nvdec,playable,2021-02-09 14:39:26 +01009D100EA28000,"AeternoBlade II",online-broken;UE4;vulkan-backend-bug,playable,2022-09-12 21:11:18 +0100B1C00949A000,"AeternoBlade II Demo Version",gpu;nvdec,ingame,2021-02-09 15:10:19 +01001B400D334000,"AFL Evolution 2",slow;online-broken;UE4,playable,2022-12-07 12:45:56 +0100DB100BBCE000,"Afterparty",,playable,2022-09-22 12:23:19 +010087C011C4E000,"Agatha Christie - The ABC Murders",,playable,2020-10-27 17:08:23 +010093600A60C000,"Agatha Knife",,playable,2020-05-28 12:37:58 +010005400A45E000,"Agent A: A puzzle in disguise",,playable,2020-11-16 22:53:27 +01008E8012C02000,"Agent A: A puzzle in disguise (Demo)",,playable,2021-02-09 18:30:41 +0100E4700E040000,"Ages of Mages: The last keeper",vulkan-backend-bug,playable,2022-10-04 11:44:05 +010004D00A9C0000,"Aggelos",gpu,ingame,2023-02-19 13:24:23 +010072600D21C000,"Agony",UE4;crash,boots,2020-07-10 16:21:18 +010089B00D09C000,"AI: THE SOMNIUM FILES",nvdec,playable,2022-09-04 14:45:06 +0100C1700FB34000,"AI: THE SOMNIUM FILES Demo",nvdec,playable,2021-02-10 12:52:33 +01006E8011C1E000,"Ailment",,playable,2020-12-12 22:30:41 +0100C7600C7D6000,"Air Conflicts: Pacific Carriers",,playable,2021-01-04 10:52:50 +010005A00A4F4000,"Air Hockey",,playable,2020-05-28 16:44:37 +0100C9E00F54C000,"Air Missions: HIND",,playable,2020-12-13 10:16:45 +0100E95011FDC000,"Aircraft Evolution",nvdec,playable,2021-06-14 13:30:18 +010010A00DB72000,"Airfield Mania Demo",services;demo,boots,2022-04-10 03:43:02 +01003DD00BFEE000,"Airheart - Tales of broken Wings",,playable,2021-02-26 15:20:27 +01007F100DE52000,"Akane",nvdec,playable,2022-07-21 00:12:18 +01009A800F0C8000,"Akash: Path of the Five",gpu;nvdec,ingame,2020-12-14 22:33:12 +010053100B0EA000,"Akihabara - Feel the Rhythm Remixed",,playable,2021-02-22 14:39:35 +0100D4C00EE0C000,"Akuarium",slow,playable,2020-12-12 23:43:36 +010026E00FEBE000,"Akuto: Showdown",,playable,2020-08-04 19:43:27 +0100F5400AB6C000,"Alchemic Jousts",gpu,ingame,2022-12-08 15:06:28 +010001E00F75A000,"Alchemist's Castle",,playable,2020-12-12 23:54:08 +01004510110C4000,"Alder's Blood Prologue",crash,ingame,2021-02-09 19:03:03 +0100D740110C0000,"Alder's Blood: Definitive Edition",,playable,2020-08-28 15:15:23 +01000E000EEF8000,"Aldred Knight",services,playable,2021-11-30 01:49:17 +010025D01221A000,"Alex Kidd in Miracle World DX",,playable,2022-11-14 15:01:34 +0100A2E00D0E0000,"Alien Cruise",,playable,2020-08-12 13:56:05 +0100C1500DBDE000,"Alien Escape",,playable,2020-06-03 23:43:18 +010075D00E8BA000,"Alien: Isolation",nvdec;vulkan-backend-bug,playable,2022-09-17 11:48:41 +0100CBD012FB6000,"All Walls Must Fall",UE4,playable,2022-10-15 19:16:30 +0100C1F00A9B8000,"All-Star Fruit Racing",nvdec;UE4,playable,2022-07-21 00:35:37 +0100AC501122A000,"Alluris",gpu;UE4,ingame,2023-08-02 23:13:50 +010063000C3CE000,"Almightree: The Last Dreamer",slow,playable,2020-12-15 13:59:03 +010083E010AE8000,"Along the Edge",,playable,2020-11-18 15:00:07 +010083E013188000,"Alpaca Ball: Allstars",nvdec,playable,2020-12-11 12:26:29 +01000A800B998000,"ALPHA",,playable,2020-12-13 12:17:45 +010053B0123DC000,"Alphaset by POWGI",,playable,2020-12-15 15:15:15 +01003E700FD66000,"Alt-Frequencies",,playable,2020-12-15 19:01:33 +01004DB00935A000,"Alteric",,playable,2020-11-08 13:53:22 +0100C3D00D1D4000,"Alternate Jake Hunter: DAEDALUS The Awakening of Golden Jazz",,playable,2020-08-31 14:17:42 +0100A8A00D27E000,"Alternate Jake Hunter: DAEDALUS The Awakening of Golden Jazz Trial version",,playable,2021-02-10 13:33:59 +010045201487C000,"Aluna: Sentinel of the Shards",nvdec,playable,2022-10-25 22:17:03 +01004C200B0B4000,"Alwa's Awakening",,playable,2020-10-13 11:52:01 +01001B7012214000,"Alwa's Legacy",,playable,2020-12-13 13:00:57 +010002B00C534000,"American Fugitive",nvdec,playable,2021-01-04 20:45:11 +010089D00A3FA000,"American Ninja Warrior: Challenge",nvdec,playable,2021-06-09 13:11:17 +01003CC00D0BE000,"Amnesia: Collection",,playable,2022-10-04 13:36:15 +010041D00DEB2000,"Amoeba Battle - Microscopic RTS Action",,playable,2021-05-06 13:33:41 +010046500C8D2000,"Among the Sleep - Enhanced Edition",nvdec,playable,2021-06-03 15:06:25 +0100B0C013912000,"Among Us",online;ldn-broken,menus,2021-09-22 15:20:17 +010050900E1C6000,"Anarcute",,playable,2021-02-22 13:17:59 +01009EE0111CC000,"Ancestors Legacy",nvdec;UE4,playable,2022-10-01 12:25:36 +010021700BC56000,"Ancient Rush 2",UE4;crash,menus,2020-07-14 14:58:47 +0100AE000AEBC000,"Angels of Death",nvdec,playable,2021-02-22 14:17:15 +010001E00A5F6000,"AngerForce: Reloaded for Nintendo Switch",,playable,2022-07-21 10:37:17 +0100F3500D05E000,"Angry Bunnies: Colossal Carrot Crusade",online-broken,playable,2022-09-04 14:53:26 +010084500C7DC000,"Angry Video Game Nerd I & II Deluxe",crash,ingame,2020-12-12 23:59:54 +0100706005B6A000,"Anima: Gate of Memories",nvdec,playable,2021-06-16 18:13:18 +010033F00B3FA000,"Anima: Gate of Memories - Arcane Edition",nvdec,playable,2021-01-26 16:55:51 +01007A400B3F8000,"Anima: Gate of Memories - The Nameless Chronicles",,playable,2021-06-14 14:33:06 +0100F38011CFE000,"Animal Crossing: New Horizons Island Transfer Tool",services;Needs Update;Incomplete,ingame,2022-12-07 13:51:19 +01006F8002326000,"Animal Crossing™: New Horizons",gpu;crash;nvdec;online-broken;ldn-works;mac-bug,ingame,2024-09-23 13:31:49 +010019500E642000,"Animal Fight Club",gpu,ingame,2020-12-13 13:13:33 +01002F4011A8E000,"Animal Fun for Toddlers and Kids",services,boots,2020-12-15 16:45:29 +010035500CA0E000,"Animal Hunter Z",,playable,2020-12-13 12:50:35 +010033C0121DC000,"Animal Pairs - Matching & Concentration Game for Toddlers & Kids",services,boots,2021-11-29 23:43:14 +010065B009B3A000,"Animal Rivals: Nintendo Switch Edition",,playable,2021-02-22 14:02:42 +0100EFE009424000,"Animal Super Squad",UE4,playable,2021-04-23 20:50:50 +0100A16010966000,"Animal Up!",,playable,2020-12-13 15:39:02 +010020D01AD24000,"ANIMAL WELL",,playable,2024-05-22 18:01:49 +0100451012492000,"Animals for Toddlers",services,boots,2020-12-15 17:27:27 +010098600CF06000,"Animated Jigsaws Collection",nvdec,playable,2020-12-15 15:58:34 +0100A1900B5B8000,"Animated Jigsaws: Beautiful Japanese Scenery Demo",nvdec,playable,2021-02-10 13:49:56 +010062500EB84000,"Anime Studio Story",,playable,2020-12-15 18:14:05 +01002B300EB86000,"Anime Studio Story Demo",,playable,2021-02-10 14:50:39 +010097600C322000,"ANIMUS",,playable,2020-12-13 15:11:47 +0100E5A00FD38000,"ANIMUS: Harbinger",,playable,2022-09-13 22:09:20 +010055500CCD2000,"Ankh Guardian - Treasure of the Demon's Temple",,playable,2020-12-13 15:55:49 +01009E600D78C000,"Anode",,playable,2020-12-15 17:18:58 +0100CB9018F5A000,"Another Code™: Recollection",gpu;crash,ingame,2024-09-06 05:58:52 +01001A900D312000,"Another Sight",UE4;gpu;nvdec,ingame,2020-12-03 16:49:59 +01003C300AAAE000,"Another World",slow,playable,2022-07-21 10:42:38 +01000FD00DF78000,"AnShi",nvdec;UE4,playable,2022-10-21 19:37:01 +010054C00D842000,"Anthill",services;nvdec,menus,2021-11-18 09:25:25 +0100596011E20000,"Anti Hero Bundle",nvdec,playable,2022-10-21 20:10:30 +0100016007154000,"Antiquia Lost",,playable,2020-05-28 11:57:32 +0100FE1011400000,"AntVentor",nvdec,playable,2020-12-15 20:09:27 +0100FA100620C000,"Ao no Kanata no Four Rhythm",,playable,2022-07-21 10:50:42 +010047000E9AA000,"AO Tennis 2",online-broken,playable,2022-09-17 12:05:07 +0100990011866000,"Aokana - Four Rhythms Across the Blue",,playable,2022-10-04 13:50:26 +01005B100C268000,"Ape Out",,playable,2022-09-26 19:04:47 +010054500E6D4000,"Ape Out DEMO",,playable,2021-02-10 14:33:06 +010051C003A08000,"Aperion Cyberstorm",,playable,2020-12-14 00:40:16 +01008CA00D71C000,"Aperion Cyberstorm [DEMO]",,playable,2021-02-10 15:53:21 +01008FC00C5BC000,"Apocalipsis Wormwood Edition",deadlock,menus,2020-05-27 12:56:37 +010045D009EFC000,"Apocryph: an old-school shooter",gpu,ingame,2020-12-13 23:24:10 +010020D01B890000,"Apollo Justice: Ace Attorney Trilogy",,playable,2024-06-21 21:54:27 +01005F20116A0000,"Apparition",nvdec;slow,ingame,2020-12-13 23:57:04 +0100AC10085CE000,"AQUA KITTY UDX",online,playable,2021-04-12 15:34:11 +0100FE0010886000,"Aqua Lungers",crash,ingame,2020-12-14 11:25:57 +0100D0D00516A000,"Aqua Moto Racing Utopia",,playable,2021-02-21 21:21:00 +010071800BA74000,"Aragami: Shadow Edition",nvdec,playable,2021-02-21 20:33:23 +0100C7D00E6A0000,"Arc of Alchemist",nvdec,playable,2022-10-07 19:15:54 +0100BE80097FA000,"Arcade Archives 10-Yard Fight",online,playable,2021-03-25 21:26:41 +01005DD00BE08000,"Arcade Archives ALPHA MISSION",online,playable,2021-04-15 09:20:43 +010083800DC70000,"Arcade Archives ALPINE SKI",online,playable,2021-04-15 09:28:46 +0100A5700AF32000,"Arcade Archives ARGUS",online,playable,2021-04-16 06:51:25 +010014F001DE2000,"Arcade Archives Armed F",online,playable,2021-04-16 07:00:17 +0100BEC00C7A2000,"Arcade Archives ATHENA",online,playable,2021-04-16 07:10:12 +0100426001DE4000,"Arcade Archives Atomic Robo-Kid",online,playable,2021-04-16 07:20:29 +0100192009824000,"Arcade Archives BOMB JACK",online,playable,2021-04-16 09:48:26 +010007A00980C000,"Arcade Archives City CONNECTION",online,playable,2021-03-25 22:16:15 +0100EDC00E35A000,"Arcade Archives CLU CLU LAND",online,playable,2021-04-16 10:00:42 +0100BB1001DD6000,"Arcade Archives CRAZY CLIMBER",online,playable,2021-03-25 22:24:15 +0100E9E00B052000,"Arcade Archives DONKEY KONG",Needs Update;crash;services,menus,2021-03-24 18:18:43 +0100F25001DD0000,"Arcade Archives DOUBLE DRAGON",online,playable,2021-03-25 22:44:34 +01009E3001DDE000,"Arcade Archives DOUBLE DRAGON II The Revenge",online,playable,2021-04-12 16:05:29 +0100496006EC8000,"Arcade Archives FRONT LINE",online,playable,2021-05-05 14:10:49 +01009A4008A30000,"Arcade Archives HEROIC EPISODE",online,playable,2021-03-25 23:01:26 +01007D200D3FC000,"Arcade Archives ICE CLIMBER",online,playable,2021-05-05 14:18:34 +010049400C7A8000,"Arcade Archives IKARI WARRIORS",online,playable,2021-05-05 14:24:46 +01000DB00980A000,"Arcade Archives Ikki",online,playable,2021-03-25 23:11:28 +010008300C978000,"Arcade Archives IMAGE FIGHT",online,playable,2021-05-05 14:31:21 +010010B008A36000,"Arcade Archives Kid Niki Radical Ninja",audio;online,ingame,2022-07-21 11:02:04 +0100E7C001DE0000,"Arcade Archives Kid's Horehore Daisakusen",online,playable,2021-04-12 16:21:29 +0100F380105A4000,"Arcade Archives LIFE FORCE",,playable,2020-09-04 13:26:25 +0100755004608000,"Arcade Archives Mario Bros.",online,playable,2021-03-26 11:31:32 +01000BE001DD8000,"Arcade Archives MOON CRESTA",online,playable,2021-05-05 14:39:29 +01003000097FE000,"Arcade Archives MOON PATROL",online,playable,2021-03-26 11:42:04 +01003EF00D3B4000,"Arcade Archives NINJA GAIDEN",audio;online,ingame,2021-04-12 16:27:53 +01002F300D2C6000,"Arcade Archives Ninja Spirit",online,playable,2021-05-05 14:45:31 +0100369001DDC000,"Arcade Archives Ninja-Kid",online,playable,2021-03-26 20:55:07 +01004A200BB48000,"Arcade Archives OMEGA FIGHTER",crash;services,menus,2020-08-18 20:50:54 +01007F8010C66000,"Arcade Archives PLUS ALPHA",audio,ingame,2020-07-04 20:47:55 +0100A6E00D3F8000,"Arcade Archives POOYAN",online,playable,2021-05-05 17:58:19 +01000D200C7A4000,"Arcade Archives PSYCHO SOLDIER",online,playable,2021-05-05 18:02:19 +01001530097F8000,"Arcade Archives PUNCH-OUT!!",online,playable,2021-03-25 22:10:55 +010081E001DD2000,"Arcade Archives Renegade",online,playable,2022-07-21 11:45:40 +0100FBA00E35C000,"Arcade Archives ROAD FIGHTER",online,playable,2021-05-05 18:09:17 +010060000BF7C000,"Arcade Archives ROUTE 16",online,playable,2021-05-05 18:40:41 +0100C2D00981E000,"Arcade Archives RYGAR",online,playable,2021-04-15 08:48:30 +01007A4009834000,"Arcade Archives Shusse Ozumo",online,playable,2021-05-05 17:52:25 +010008F00B054000,"Arcade Archives Sky Skipper",online,playable,2021-04-15 08:58:09 +01008C900982E000,"Arcade Archives Solomon's Key",online,playable,2021-04-19 16:27:18 +010069F008A38000,"Arcade Archives STAR FORCE",online,playable,2021-04-15 08:39:09 +0100422001DDA000,"Arcade Archives TERRA CRESTA",crash;services,menus,2020-08-18 20:20:55 +0100348001DE6000,"Arcade Archives TERRA FORCE",online,playable,2021-04-16 20:03:27 +0100DFD016B7A000,"Arcade Archives TETRIS® THE GRAND MASTER",,playable,2024-06-23 01:50:29 +0100DC000983A000,"Arcade Archives THE NINJA WARRIORS",online;slow,ingame,2021-04-16 19:54:56 +0100AF300D2E8000,"Arcade Archives TIME PILOT",online,playable,2021-04-16 19:22:31 +010029D006ED8000,"Arcade Archives Traverse USA",online,playable,2021-04-15 08:11:06 +010042200BE0C000,"Arcade Archives URBAN CHAMPION",online,playable,2021-04-16 10:20:03 +01004EC00E634000,"Arcade Archives VS. GRADIUS",online,playable,2021-04-12 14:53:58 +010021D00812A000,"Arcade Archives VS. SUPER MARIO BROS.",online,playable,2021-04-08 14:48:11 +01001B000D8B6000,"Arcade Archives WILD WESTERN",online,playable,2021-04-16 10:11:36 +010050000D6C4000,"Arcade Classics Anniversary Collection",,playable,2021-06-03 13:55:10 +01005A8010C7E000,"ARCADE FUZZ",,playable,2020-08-15 12:37:36 +010077000F620000,"Arcade Spirits",,playable,2020-06-21 11:45:03 +0100E680149DC000,"Arcaea",,playable,2023-03-16 19:31:21 +01003C2010C78000,"Archaica: The Path Of Light",crash,nothing,2020-10-16 13:22:26 +01004DA012976000,"Area 86",,playable,2020-12-16 16:45:52 +0100691013C46000,"ARIA CHRONICLE",,playable,2022-11-16 13:50:55 +0100D4A00B284000,"ARK: Survival Evolved",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2024-04-16 00:53:56 +0100C56012C96000,"Arkanoid vs. Space Invaders",services,ingame,2021-01-21 12:50:30 +010069A010606000,"Arkham Horror: Mother's Embrace",nvdec,playable,2021-04-19 15:40:55 +0100C5B0113A0000,"Armed 7 DX",,playable,2020-12-14 11:49:56 +010070A00A5F4000,"Armello",nvdec,playable,2021-01-07 11:43:26 +0100A5400AC86000,"ARMS Demo",,playable,2021-02-10 16:30:13 +01009B500007C000,"ARMS™",ldn-works;LAN,playable,2024-08-28 07:49:24 +0100184011B32000,"Arrest of a stone Buddha",crash,nothing,2022-12-07 16:55:00 +01007AB012102000,"Arrog",,playable,2020-12-16 17:20:50 +01008EC006BE2000,"Art of Balance",gpu;ldn-works,ingame,2022-07-21 17:13:57 +010062F00CAE2000,"Art of Balance DEMO",gpu;slow,ingame,2021-02-10 17:17:12 +01006AA013086000,"Art Sqool",nvdec,playable,2022-10-16 20:42:37 +0100CDD00DA70000,"Artifact Adventure Gaiden DX",,playable,2020-12-16 17:49:25 +0100C2500CAB6000,"Ary and the Secret of Seasons",,playable,2022-10-07 20:45:09 +0100C9F00AAEE000,"ASCENDANCE",,playable,2021-01-05 10:54:40 +0100D5800DECA000,"Asemblance",UE4;gpu,ingame,2020-12-16 18:01:23 +0100E4C00DE30000,"Ash of Gods: Redemption",deadlock,nothing,2020-08-10 18:08:32 +010027B00E40E000,"Ashen",nvdec;online-broken;UE4,playable,2022-09-17 12:19:14 +01007B000C834000,"Asphalt Legends Unite",services;crash;online-broken,menus,2022-12-07 13:28:29 +01007F600B134000,"Assassin's Creed® III: Remastered",nvdec,boots,2024-06-25 20:12:11 +010044700DEB0000,"Assassin’s Creed®: The Rebel Collection",gpu,ingame,2024-05-19 07:58:56 +0100DF200B24C000,"Assault Android Cactus+",,playable,2021-06-03 13:23:55 +0100BF8012A30000,"Assault ChaingunS KM",crash;gpu,ingame,2020-12-14 12:48:34 +0100C5E00E540000,"Assault on Metaltron Demo",,playable,2021-02-10 19:48:06 +010057A00C1F6000,"Astebreed",,playable,2022-07-21 17:33:54 +010081500EA1E000,"Asterix & Obelix XXL 3 - The Crystal Menhir",gpu;nvdec;regression,ingame,2022-11-28 14:19:23 +0100F46011B50000,"Asterix & Obelix XXL: Romastered",gpu;nvdec;opengl,ingame,2023-08-16 21:22:06 +01007300020FA000,"ASTRAL CHAIN",,playable,2024-07-17 18:02:19 +0100E5F00643C000,"Astro Bears Party",,playable,2020-05-28 11:21:58 +0100F0400351C000,"Astro Duel Deluxe",32-bit,playable,2021-06-03 11:21:48 +0100B80010C48000,"Astrologaster",cpu;32-bit;crash,nothing,2023-06-28 15:39:31 +0100DF401249C000,"AstroWings: Space War",,playable,2020-12-14 13:10:44 +010099801870E000,"Atari 50: The Anniversary Celebration",slow,playable,2022-11-14 19:42:10 +010088600C66E000,"Atelier Arland series Deluxe Pack",nvdec,playable,2021-04-08 15:33:15 +0100D9D00EE8C000,"Atelier Ayesha: The Alchemist of Dusk DX",crash;nvdec;Needs Update,menus,2021-11-24 07:29:54 +0100E5600EE8E000,"Atelier Escha & Logy: Alchemists of the Dusk Sky DX",nvdec,playable,2022-11-20 16:01:41 +010023201421E000,"Atelier Firis: The Alchemist and the Mysterious Journey DX",gpu;nvdec,ingame,2022-10-25 22:46:19 +0100B1400CD50000,"Atelier Lulua ~The Scion of Arland~",nvdec,playable,2020-12-16 14:29:19 +010009900947A000,"Atelier Lydie & Suelle ~The Alchemists and the Mysterious Paintings~",nvdec,playable,2021-06-03 18:37:01 +01001A5014220000,"Atelier Lydie & Suelle: The Alchemists and the Mysterious Paintings DX",,playable,2022-10-25 23:06:20 +0100ADD00C6FA000,"Atelier Meruru ~The Apprentice of Arland~ DX",nvdec,playable,2020-06-12 00:50:48 +01002D700B906000,"Atelier Rorona Arland no Renkinjutsushi DX (JP)",nvdec,playable,2022-12-02 17:26:54 +01009A9012022000,"Atelier Ryza 2: Lost Legends & the Secret Fairy",,playable,2022-10-16 21:06:06 +0100D1900EC80000,"Atelier Ryza: Ever Darkness & the Secret Hideout",,playable,2023-10-15 16:36:50 +010005C00EE90000,"Atelier Shallie: Alchemists of the Dusk Sea DX",nvdec,playable,2020-11-25 20:54:12 +010082A01538E000,"Atelier Sophie 2: The Alchemist of the Mysterious Dream",crash,ingame,2022-12-01 04:34:03 +01009BC00C6F6000,"Atelier Totori ~The Adventurer of Arland~ DX",nvdec,playable,2020-06-12 01:04:56 +0100B9400FA38000,"ATOM RPG",nvdec,playable,2022-10-22 10:11:48 +01005FE00EC4E000,"Atomic Heist",,playable,2022-10-16 21:24:32 +0100AD30095A4000,"Atomicrops",,playable,2022-08-06 10:05:07 +01000D1006CEC000,"ATOMIK: RunGunJumpGun",,playable,2020-12-14 13:19:24 +0100FB500631E000,"ATOMINE",gpu;nvdec;slow,playable,2020-12-14 18:56:50 +010039600E7AC000,"Attack of the Toy Tanks",slow,ingame,2020-12-14 12:59:12 +010034500641A000,"Attack on Titan 2",,playable,2021-01-04 11:40:01 +01000F600B01E000,"ATV Drift & Tricks",UE4;online,playable,2021-04-08 17:29:17 +0100AA800DA42000,"Automachef",,playable,2020-12-16 19:51:25 +01006B700EA6A000,"Automachef Demo",,playable,2021-02-10 20:35:37 +0100B280106A0000,"Aviary Attorney: Definitive Edition",,playable,2020-08-09 20:32:12 +010064600F982000,"AVICII Invector",,playable,2020-10-25 12:12:56 +0100E100128BA000,"AVICII Invector Demo",,playable,2021-02-10 21:04:58 +01008FB011248000,"AvoCuddle",,playable,2020-09-02 14:50:13 +0100085012D64000,"Awakening of Cthulhu",UE4,playable,2021-04-26 13:03:07 +01002F1005F3C000,"Away: Journey To The Unexpected",nvdec;vulkan-backend-bug,playable,2022-11-06 15:31:04 +0100B8C00CFCE000,"Awesome Pea",,playable,2020-10-11 12:39:23 +010023800D3F2000,"Awesome Pea (Demo)",,playable,2021-02-10 21:48:21 +0100B7D01147E000,"Awesome Pea 2",,playable,2022-10-01 12:34:19 +0100D2011E28000,"Awesome Pea 2 (Demo)",crash,nothing,2021-02-10 22:08:27 +0100DA3011174000,"AXES",,playable,2021-04-08 13:01:58 +0100052004384000,"Axiom Verge",,playable,2020-10-20 01:07:18 +010075400DEC6000,"Ayakashi Koi Gikyoku《Trial version》",,playable,2021-02-10 22:22:11 +01006AF012FC8000,"Azur Lane: Crosswave",UE4;nvdec,playable,2021-04-05 15:15:25 +0100C7D00DE24000,"Azuran Tales: TRIALS",,playable,2020-08-12 15:23:07 +01006FB00990E000,"Azure Reflections",nvdec;online,playable,2021-04-08 13:18:25 +01004E90149AA000,"Azure Striker GUNVOLT 3",,playable,2022-08-10 13:46:49 +0100192003FA4000,"Azure Striker GUNVOLT: STRIKER PACK",32-bit,playable,2024-02-10 23:51:21 +010031D012BA4000,"Azurebreak Heroes",,playable,2020-12-16 21:26:17 +01009B901145C000,"B.ARK",nvdec,playable,2022-11-17 13:35:02 +01002CD00A51C000,"Baba Is You",,playable,2022-07-17 05:36:54 +0100F4100AF16000,"Back to Bed",nvdec,playable,2020-12-16 20:52:04 +0100FEA014316000,"Backworlds",,playable,2022-10-25 23:20:34 +0100EAF00E32E000,"Bacon Man: An Adventure",crash;nvdec,menus,2021-11-20 02:36:21 +01000CB00D094000,"Bad Dream: Coma",deadlock,boots,2023-08-03 00:54:18 +0100B3B00D81C000,"Bad Dream: Fever",,playable,2021-06-04 18:33:12 +0100E98006F22000,"Bad North",,playable,2022-07-17 13:44:25 +010075000D092000,"Bad North Demo",,playable,2021-02-10 22:48:38 +01004C70086EC000,"BAFL - Brakes Are For Losers",,playable,2021-01-13 08:32:51 +010076B011EC8000,"Baila Latino",,playable,2021-04-14 16:40:24 +0100730011BDC000,"Bakugan: Champions of Vestroia",,playable,2020-11-06 19:07:39 +01008260138C4000,"Bakumatsu Renka SHINSENGUMI",,playable,2022-10-25 23:37:31 +0100438012EC8000,"BALAN WONDERWORLD",nvdec;UE4,playable,2022-10-22 13:08:43 +0100E48013A34000,"Balan Wonderworld Demo",gpu;services;UE4;demo,ingame,2023-02-16 20:05:07 +0100CD801CE5E000,"Balatro",,ingame,2024-04-21 02:01:53 +010010A00DA48000,"Baldur's Gate and Baldur's Gate II: Enhanced Editions",32-bit,playable,2022-09-12 23:52:15 +0100BC400FB64000,"Balthazar's Dream",,playable,2022-09-13 00:13:22 +01008D30128E0000,"Bamerang",,playable,2022-10-26 00:29:39 +010013C010C5C000,"Banner of the Maid",,playable,2021-06-14 15:23:37 +0100388008758000,"Banner Saga 2",crash,boots,2021-01-13 08:56:09 +010071E00875A000,"Banner Saga 3",slow,boots,2021-01-11 16:53:57 +0100CE800B94A000,"Banner Saga Trilogy",slow,playable,2024-03-06 11:25:20 +0100425009FB2000,"Baobabs Mausoleum Ep.1: Ovnifagos Don't Eat Flamingos",,playable,2020-07-15 05:06:29 +010079300E976000,"Baobabs Mausoleum Ep.2: 1313 Barnabas Dead End Drive",,playable,2020-12-17 11:22:50 +01006D300FFA6000,"Baobabs Mausoleum Ep.3: Un Pato en Muertoburgo",nvdec,playable,2020-12-17 11:43:10 +0100D3000AEC2000,"Baobabs Mausoleum: DEMO",,playable,2021-02-10 22:59:25 +01003350102E2000,"Barbarous: Tavern of Emyr",,playable,2022-10-16 21:50:24 +0100F7E01308C000,"Barbearian",Needs Update;gpu,ingame,2021-06-28 16:27:50 +010039C0106C6000,"Baron: Fur Is Gonna Fly",crash,boots,2022-02-06 02:05:43 +0100FB000EB96000,"Barry Bradford's Putt Panic Party",nvdec,playable,2020-06-17 01:08:34 +01004860080A0000,"Baseball Riot",,playable,2021-06-04 18:07:27 +010038600B27E000,"Bastion",,playable,2022-02-15 14:15:24 +01005F3012748000,"Batbarian: Testament of the Primordials",,playable,2020-12-17 12:00:59 +0100C07018CA6000,"Baten Kaitos I & II HD Remaster (Europe/USA)",services;Needs Update,boots,2023-10-01 00:44:32 +0100F28018CA4000,"Baten Kaitos I & II HD Remaster (Japan)",services;Needs Update,boots,2023-10-24 23:11:54 +0100011005D92000,"Batman - The Telltale Series",nvdec;slow,playable,2021-01-11 18:19:35 +01003F00163CE000,"Batman: Arkham City",,playable,2024-09-11 00:30:19 +0100ACD0163D0000,"Batman: Arkham Knight",gpu;mac-bug,ingame,2024-06-25 20:24:42 +0100E6300AA3A000,"Batman: The Enemy Within",crash,nothing,2020-10-16 05:49:27 +0100747011890000,"Battle Axe",,playable,2022-10-26 00:38:01 +0100551001D88000,"Battle Chasers: Nightwar",nvdec;slow,playable,2021-01-12 12:27:34 +0100CC2001C6C000,"Battle Chef Brigade Deluxe",,playable,2021-01-11 14:16:28 +0100DBB00CAEE000,"Battle Chef Brigade Demo",,playable,2021-02-10 23:15:07 +0100A3B011EDE000,"Battle Hunters",gpu,ingame,2022-11-12 09:19:17 +010035E00C1AE000,"Battle of Kings",slow,playable,2020-12-17 12:45:23 +0100D2800EB40000,"Battle Planet - Judgement Day",,playable,2020-12-17 14:06:20 +0100C4D0093EA000,"Battle Princess Madelyn",,playable,2021-01-11 13:47:23 +0100A7500DF64000,"Battle Princess Madelyn Royal Edition",,playable,2022-09-26 19:14:49 +010099B00E898000,"Battle Supremacy - Evolution",gpu;nvdec,boots,2022-02-17 09:02:50 +0100DEB00D5A8000,"Battle Worlds: Kronos",nvdec,playable,2021-06-04 17:48:02 +0100650010DD4000,"Battleground",crash,ingame,2021-09-06 11:53:23 +010044E00D97C000,"BATTLESLOTHS",,playable,2020-10-03 08:32:22 +010059C00E39C000,"Battlestar Galactica Deadlock",nvdec,playable,2020-06-27 17:35:44 +01006D800A988000,"Battlezone Gold Edition",gpu;ldn-untested;online,boots,2021-06-04 18:36:05 +010048300D5C2000,"BATTLLOON",,playable,2020-12-17 15:48:23 +0100194010422000,"bayala - the game",,playable,2022-10-04 14:09:25 +0100CF5010FEC000,"Bayonetta Origins: Cereza and the Lost Demon™",gpu,ingame,2024-02-27 01:39:49 +010002801A3FA000,"Bayonetta Origins: Cereza and the Lost Demon™ Demo",gpu;demo,ingame,2024-02-17 06:06:28 +010076F0049A2000,"Bayonetta™",audout,playable,2022-11-20 15:51:59 +01007960049A0000,"Bayonetta™ 2",nvdec;ldn-works;LAN,playable,2022-11-26 03:46:09 +01004A4010FEA000,"Bayonetta™ 3",gpu;crash;nvdec;vulkan-backend-bug;opengl-backend-bug;amd-vendor-bug;ASTC,ingame,2024-09-28 14:34:33 +01002FA00DE72000,"BDSM: Big Drunk Satanic Massacre",,playable,2021-03-04 21:28:22 +01003A1010E3C000,"BE-A Walker",slow,ingame,2020-09-02 15:00:31 +010095C00406C000,"Beach Buggy Racing",online,playable,2021-04-13 23:16:50 +010020700DE04000,"Bear With Me: The Lost Robots",nvdec,playable,2021-02-27 14:20:10 +010024200E97E800,"Bear With Me: The Lost Robots Demo",nvdec,playable,2021-02-12 22:38:12 +0100C0E014A4E000,"Bear's Restaurant",,playable,2024-08-11 21:26:59 +010045F00BF64000,"BEAST Darling! ~Kemomimi Danshi to Himitsu no Ryou~",crash,menus,2020-10-04 06:12:08 +01009C300BB4C000,"Beat Cop",,playable,2021-01-06 19:26:48 +01002D20129FC000,"Beat Me!",online-broken,playable,2022-10-16 21:59:26 +01006B0014590000,"BEAUTIFUL DESOLATION",gpu;nvdec,ingame,2022-10-26 10:34:38 +01009E700DB2E000,"Bee Simulator",UE4;crash,boots,2020-07-15 12:13:13 +010018F007786000,"BeeFense BeeMastered",,playable,2022-11-17 15:38:12 +0100558010B26000,"Behold the Kickmen",,playable,2020-06-27 12:49:45 +0100D1300C1EA000,"Beholder: Complete Edition",,playable,2020-10-16 12:48:58 +01006E1004404000,"Ben 10",nvdec,playable,2021-02-26 14:08:35 +01009CD00E3AA000,"Ben 10: Power Trip!",nvdec,playable,2022-10-09 10:52:12 +010074500BBC4000,"Bendy and the Ink Machine",,playable,2023-05-06 20:35:39 +010068600AD16000,"Beyblade Burst Battle Zero",services;crash;Needs Update,menus,2022-11-20 15:48:32 +010056500CAD8000,"Beyond Enemy Lines: Covert Operations",UE4,playable,2022-10-01 13:11:50 +0100B8F00DACA000,"Beyond Enemy Lines: Essentials",nvdec;UE4,playable,2022-09-26 19:48:16 +0100BF400AF38000,"Bibi & Tina – Adventures with Horses",nvdec;slow,playable,2021-01-13 08:58:09 +010062400E69C000,"Bibi & Tina at the horse farm",,playable,2021-04-06 16:31:39 +01005FF00AF36000,"Bibi Blocksberg – Big Broom Race 3",,playable,2021-01-11 19:07:16 +010062B00A874000,"Big Buck Hunter Arcade",nvdec,playable,2021-01-12 20:31:39 +010088100C35E000,"Big Crown: Showdown",nvdec;online;ldn-untested,menus,2022-07-17 18:25:32 +0100A42011B28000,"Big Dipper",,playable,2021-06-14 15:08:19 +010077E00F30E000,"Big Pharma",,playable,2020-07-14 15:27:30 +010007401287E000,"BIG-Bobby-Car - The Big Race",slow,playable,2020-12-10 14:25:06 +010057700FF7C000,"Billion Road",,playable,2022-11-19 15:57:43 +010087D008D64000,"BINGO for Nintendo Switch",,playable,2020-07-23 16:17:36 +01004BA017CD6000,"Biomutant",crash,ingame,2024-05-16 15:46:36 +01002620102C6000,"BioShock 2 Remastered",services,nothing,2022-10-29 14:39:22 +0100D560102C8000,"BioShock Infinite: The Complete Edition",services-horizon;crash,nothing,2024-08-11 21:35:01 +0100AD10102B2000,"BioShock Remastered",services-horizon;crash;Needs Update,boots,2024-06-06 01:08:52 +010053B0117F8000,"Biped",nvdec,playable,2022-10-01 13:32:58 +01001B700B278000,"Bird Game +",online,playable,2022-07-17 18:41:57 +0100B6B012FF4000,"Birds and Blocks Demo",services;demo,boots,2022-04-10 04:53:03 +0100E62012D3C000,"BIT.TRIP RUNNER",,playable,2022-10-17 14:23:24 +01000AD012D3A000,"BIT.TRIP VOID",,playable,2022-10-17 14:31:23 +0100A0800EA9C000,"Bite the Bullet",,playable,2020-10-14 23:10:11 +010026E0141C8000,"Bitmaster",,playable,2022-12-13 14:05:51 +010061D00FD26000,"Biz Builder Delux",slow,playable,2020-12-15 21:36:25 +0100DD1014AB8000,"Black Book",nvdec,playable,2022-12-13 16:38:53 +010049000B69E000,"Black Future '88",nvdec,playable,2022-09-13 11:24:37 +01004BE00A682000,"Black Hole Demo",,playable,2021-02-12 23:02:17 +0100C3200E7E6000,"Black Legend",gpu;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-10-22 12:54:48 +010043A012A32000,"Blackjack Hands",,playable,2020-11-30 14:04:51 +0100A0A00E660000,"Blackmoor 2",online-broken,playable,2022-09-26 20:26:34 +010032000EA2C000,"Blacksad: Under the Skin",,playable,2022-09-13 11:38:04 +01006B400C178000,"Blacksea Odyssey",nvdec,playable,2022-10-16 22:14:34 +010068E013450000,"Blacksmith of the Sand Kingdom",,playable,2022-10-16 22:37:44 +0100C4400CB7C000,"BLADE ARCUS Rebellion From Shining",,playable,2022-07-17 18:52:28 +0100EA1018A2E000,"Blade Assault",audio,nothing,2024-04-29 14:32:50 +01009CC00E224000,"Blade II - The Return Of Evil",audio;crash;UE4,ingame,2021-11-14 02:49:59 +01005950022EC000,"Blade Strangers",nvdec,playable,2022-07-17 19:02:43 +0100DF0011A6A000,"Bladed Fury",,playable,2022-10-26 11:36:26 +0100CFA00CC74000,"Blades of Time",deadlock;online,boots,2022-07-17 19:19:58 +01006CC01182C000,"Blair Witch",nvdec;UE4,playable,2022-10-01 14:06:16 +010039501405E000,"Blanc",gpu;slow,ingame,2023-02-22 14:00:13 +0100698009C6E000,"Blasphemous",nvdec,playable,2021-03-01 12:15:31 +0100302010338000,"Blasphemous Demo",,playable,2021-02-12 23:49:56 +0100225000FEE000,"Blaster Master Zero",32-bit,playable,2021-03-05 13:22:33 +01005AA00D676000,"Blaster Master Zero 2",,playable,2021-04-08 15:22:59 +010025B002E92000,"Blaster Master Zero Demo",,playable,2021-02-12 23:59:06 +0100E53013E1C000,"Blastoid Breakout",,playable,2021-01-25 23:28:02 +0100EE800C93E000,"BLAZBLUE CENTRALFICTION Special Edition",nvdec,playable,2020-12-15 23:50:04 +0100B61008208000,"BLAZBLUE CROSS TAG BATTLE",nvdec;online,playable,2021-01-05 20:29:37 +010021A00DE54000,"Blazing Beaks",,playable,2020-06-04 20:37:06 +0100C2700C252000,"Blazing Chrome",,playable,2020-11-16 04:56:54 +010091700EA2A000,"Bleep Bloop DEMO",nvdec,playable,2021-02-13 00:20:53 +010089D011310000,"Blind Men",audout,playable,2021-02-20 14:15:38 +0100743013D56000,"Blizzard® Arcade Collection",nvdec,playable,2022-08-03 19:37:26 +0100F3500A20C000,"BlobCat",,playable,2021-04-23 17:09:30 +0100E1C00DB6C000,"Block-a-Pix Deluxe Demo",,playable,2021-02-13 00:37:39 +0100C6A01AD56000,"Bloo Kid",,playable,2024-05-01 17:18:04 +010055900FADA000,"Bloo Kid 2",,playable,2024-05-01 17:16:57 +0100EE5011DB6000,"Blood and Guts Bundle",,playable,2020-06-27 12:57:35 +01007E700D17E000,"Blood Waves",gpu,ingame,2022-07-18 13:04:46 +0100E060102AA000,"Blood will be Spilled",nvdec,playable,2020-12-17 03:02:03 +01004B800AF5A000,"Bloodstained: Curse of the Moon",,playable,2020-09-04 10:42:17 +01004680124E6000,"Bloodstained: Curse of the Moon 2",,playable,2020-09-04 10:56:27 +010025A00DF2A000,"Bloodstained: Ritual of the Night",nvdec;UE4,playable,2022-07-18 14:27:35 +0100E510143EC000,"Bloody Bunny, The Game",nvdec;UE4,playable,2022-10-22 13:18:55 +0100B8400A1C6000,"Bloons TD 5",Needs Update;audio;gpu;services,boots,2021-04-18 23:02:46 +01000EB01023E000,"Blossom Tales Demo",,playable,2021-02-13 14:22:53 +0100C1000706C000,"Blossom Tales: The Sleeping King",,playable,2022-07-18 16:43:07 +010073B010F6E000,"Blue Fire",UE4,playable,2022-10-22 14:46:11 +0100721013510000,"Body of Evidence",,playable,2021-04-25 22:22:11 +0100AD1010CCE000,"Bohemian Killing",vulkan-backend-bug,playable,2022-09-26 22:41:37 +010093700ECEC000,"Boku to Nurse no Kenshuu Nisshi",,playable,2022-11-21 20:38:34 +01001D900D9AC000,"Bokujou Monogatari Saikai no Mineraru Taun (Story of Seasons: Friends of Mineral Town)",slow;crash;Needs Update,ingame,2022-04-24 22:46:04 +0100317014B7C000,"Bomb Rush Cyberfunk",,playable,2023-09-28 19:51:57 +01007900080B6000,"Bomber Crew",,playable,2021-06-03 14:21:28 +0100A1F012948000,"Bomber Fox",nvdec,playable,2021-04-19 17:58:13 +010087300445A000,"Bombslinger",services,menus,2022-07-19 12:53:15 +01007A200F452000,"Book of Demons",,playable,2022-09-29 12:03:43 +010054500F564000,"Bookbound Brigade",,playable,2020-10-09 14:30:29 +01002E6013ED8000,"Boom Blaster",,playable,2021-03-24 10:55:56 +010081A00EE62000,"Boomerang Fu",,playable,2024-07-28 01:12:41 +010069F0135C4000,"Boomerang Fu Demo Version",demo,playable,2021-02-13 14:38:13 +01009970122E4000,"Borderlands 3 Ultimate Edition",gpu,ingame,2024-07-15 04:38:14 +010064800F66A000,"Borderlands: Game of the Year Edition",slow;online-broken;ldn-untested,ingame,2023-07-23 21:10:36 +010096F00FF22000,"Borderlands: The Handsome Collection",,playable,2022-04-22 18:35:07 +010007400FF24000,"Borderlands: The Pre-Sequel",nvdec,playable,2021-06-09 20:17:10 +01008E500AFF6000,"Boreal Blade",gpu;ldn-untested;online,ingame,2021-06-11 15:37:14 +010092C013FB8000,"BORIS THE ROCKET",,playable,2022-10-26 13:23:09 +010076F00EBE4000,"BOSSGARD",online-broken,playable,2022-10-04 14:21:13 +010069B00EAC8000,"Bot Vice Demo",crash;demo,ingame,2021-02-13 14:52:42 +010081100FE08000,"Bouncy Bob 2",,playable,2020-07-14 16:51:53 +0100E1200DC1A000,"Bounty Battle",nvdec,playable,2022-10-04 14:40:51 +0100B4700C57E000,"Bow to Blood: Last Captain Standing",slow,playable,2020-10-23 10:51:21 +010040800BA8A000,"Box Align",crash;services,nothing,2020-04-03 17:26:56 +010018300D006000,"BOXBOY! + BOXGIRL!™",,playable,2020-11-08 01:11:54 +0100B7200E02E000,"BOXBOY! + BOXGIRL!™ Demo",demo,playable,2021-02-13 14:59:08 +0100CA400B6D0000,"BQM -BlockQuest Maker-",online,playable,2020-07-31 20:56:50 +0100E87017D0E000,"Bramble: The Mountain King",services-horizon,playable,2024-03-06 09:32:17 +01000F5003068000,"Brave Dungeon + Dark Witch Story:COMBAT",,playable,2021-01-12 21:06:34 +01006DC010326000,"BRAVELY DEFAULT™ II",gpu;crash;Needs Update;UE4,ingame,2024-04-26 06:11:26 +0100B6801137E000,"Bravely Default™ II Demo",gpu;crash;UE4;demo,ingame,2022-09-27 05:39:47 +010081501371E000,"BraveMatch",UE4,playable,2022-10-26 13:32:15 +0100F60017D4E000,"Bravery and Greed",gpu;deadlock,boots,2022-12-04 02:23:47 +0100A42004718000,"BRAWL",nvdec;slow,playable,2020-06-04 14:23:18 +010068F00F444000,"Brawl Chess",nvdec,playable,2022-10-26 13:59:17 +0100C6800B934000,"Brawlhalla",online;opengl,playable,2021-06-03 18:26:09 +010060200A4BE000,"Brawlout",ldn-untested;online,playable,2021-06-04 17:35:35 +0100C1B00E1CA000,"Brawlout Demo",demo,playable,2021-02-13 22:46:53 +010022C016DC8000,"Breakout: Recharged",slow,ingame,2022-11-06 15:32:57 +01000AA013A5E000,"Breathedge",UE4;nvdec,playable,2021-05-06 15:44:28 +01003D50100F4000,"Breathing Fear",,playable,2020-07-14 15:12:29 +010026800BB06000,"Brick Breaker",nvdec;online,playable,2020-12-15 18:26:23 +01002AD0126AE000,"Bridge Constructor: The Walking Dead",gpu;slow,ingame,2020-12-11 17:31:32 +01000B1010D8E000,"Bridge! 3",,playable,2020-10-08 20:47:24 +010011000EA7A000,"BRIGANDINE The Legend of Runersia",,playable,2021-06-20 06:52:25 +0100703011258000,"BRIGANDINE The Legend of Runersia Demo",,playable,2021-02-14 14:44:10 +01000BF00BE40000,"Bring Them Home",UE4,playable,2021-04-12 14:14:43 +010060A00B53C000,"Broforce",ldn-untested;online,playable,2021-05-28 12:23:38 +0100EDD0068A6000,"Broken Age",,playable,2021-06-04 17:40:32 +0100A5800F6AC000,"Broken Lines",,playable,2020-10-16 00:01:37 +01001E60085E6000,"Broken Sword 5 - the Serpent's Curse",,playable,2021-06-04 17:28:59 +0100F19011226000,"Brotherhood United Demo",demo,playable,2021-02-14 21:10:57 +01000D500D08A000,"Brothers: A Tale of Two Sons",nvdec;UE4,playable,2022-07-19 14:02:22 +0100B2700E90E000,"Brunch Club",,playable,2020-06-24 13:54:07 +010010900F7B4000,"Bubble Bobble 4 Friends: The Baron is Back!",nvdec,playable,2021-06-04 15:27:55 +0100DBE00C554000,"Bubsy: Paws on Fire!",slow,ingame,2023-08-24 02:44:51 +0100089010A92000,"Bucket Knight",crash,ingame,2020-09-04 13:11:24 +0100F1B010A90000,"Bucket Knight demo",demo,playable,2021-02-14 21:23:09 +01000D200AC0C000,"Bud Spencer & Terence Hill - Slaps And Beans",,playable,2022-07-17 12:37:00 +010051A00E99E000,"Bug Fables: The Everlasting Sapling",,playable,2020-06-09 11:27:00 +01003DD00D658000,"Bulletstorm: Duke of Switch Edition",nvdec,playable,2022-03-03 08:30:24 +01006BB00E8FA000,"BurgerTime Party!",slow,playable,2020-11-21 14:11:53 +01005780106E8000,"BurgerTime Party! Demo",demo,playable,2021-02-14 21:34:16 +010078C00DB40000,"Buried Stars",,playable,2020-09-07 14:11:58 +0100DBF01000A000,"Burnout™ Paradise Remastered",nvdec;online,playable,2021-06-13 02:54:46 +010066F00C76A000,"Bury me, my Love",,playable,2020-11-07 12:47:37 +010030D012FF6000,"Bus Driver Simulator",,playable,2022-10-17 13:55:27 +0100A9101418C000,"BUSTAFELLOWS",nvdec,playable,2020-10-17 20:04:41 +0100177005C8A000,"BUTCHER",,playable,2021-01-11 18:50:17 +01000B900D8B0000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda",slow;nvdec,playable,2024-04-01 22:43:40 +010065700EE06000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda Demo",demo;gpu;nvdec,ingame,2021-02-14 21:48:15 +01005C00117A8000,"Café Enchanté",,playable,2020-11-13 14:54:25 +010060400D21C000,"Cafeteria Nipponica Demo",demo,playable,2021-02-14 22:11:35 +0100699012F82000,"Cake Bash Demo",crash;demo,ingame,2021-02-14 22:21:15 +01004FD00D66A000,"Caladrius Blaze",deadlock;nvdec,nothing,2022-12-07 16:44:37 +01004B500AB88000,"Calculation Castle : Greco's Ghostly Challenge Addition",32-bit,playable,2020-11-01 23:40:11 +010045500B212000,"Calculation Castle : Greco's Ghostly Challenge Division",32-bit,playable,2020-11-01 23:54:55 +0100ECE00B210000,"Calculation Castle : Greco's Ghostly Challenge Multiplication",32-bit,playable,2020-11-02 00:04:33 +0100A6500B176000,"Calculation Castle : Greco's Ghostly Challenge Subtraction",32-bit,playable,2020-11-01 23:47:42 +010004701504A000,"Calculator",,playable,2021-06-11 13:27:20 +010013A00E750000,"Calico",,playable,2022-10-17 14:44:28 +010046000EE40000,"Call of Cthulhu",nvdec;UE4,playable,2022-12-18 03:08:30 +0100B4700BFC6000,"Call of Juarez: Gunslinger",gpu;nvdec,ingame,2022-09-17 16:49:46 +0100593008BDC000,"Can't Drive This",,playable,2022-10-22 14:55:17 +0100E4600B166000,"Candle: The Power of the Flame",nvdec,playable,2020-05-26 12:10:20 +01001E0013208000,"Capcom Arcade Stadium",,playable,2021-03-17 05:45:14 +010094E00B52E000,"Capcom Beat 'Em Up Bundle",,playable,2020-03-23 18:31:24 +0100F6400A77E000,"CAPCOM BELT ACTION COLLECTION",online;ldn-untested,playable,2022-07-21 20:51:23 +01009BF0072D4000,"Captain Toad™: Treasure Tracker",32-bit,playable,2024-04-25 00:50:16 +01002C400B6B6000,"Captain Toad™: Treasure Tracker Demo",32-bit;demo,playable,2021-02-14 22:36:09 +0100EAE010560000,"Captain Tsubasa: Rise of New Champions",online-broken;vulkan-backend-bug,playable,2022-10-09 11:20:50 +01002320137CC000,"CAPTAIN TSUBASA: RISE OF NEW CHAMPIONS DEMO VERSION",slow,playable,2021-02-14 22:45:35 +010048800D95C000,"Car Mechanic Manager",,playable,2020-07-23 18:50:17 +01007BD00AE70000,"Car Quest",deadlock,menus,2021-11-18 08:59:18 +0100DA70115E6000,"Caretaker",,playable,2022-10-04 14:52:24 +0100DD6014870000,"Cargo Crew Driver",,playable,2021-04-19 12:54:22 +010088C0092FE000,"Carnival Games®",nvdec,playable,2022-07-21 21:01:22 +01005F5011AC4000,"Carnivores: Dinosaur Hunt",,playable,2022-12-14 18:46:06 +0100B1600E9AE000,"CARRION",crash,nothing,2020-08-13 17:15:12 +01008D1001512000,"Cars 3: Driven to Win",gpu,ingame,2022-07-21 21:21:05 +0100810012A1A000,"Carto",,playable,2022-09-04 15:37:06 +0100085003A2A000,"Cartoon Network Battle Crashers",,playable,2022-07-21 21:55:40 +0100C4C0132F8000,"CASE 2: Animatronics Survival",nvdec;UE4;vulkan-backend-bug,playable,2022-10-09 11:45:03 +010066F01A0E0000,"Cassette Beasts",,playable,2024-07-22 20:38:43 +010001300D14A000,"Castle Crashers Remastered",gpu,boots,2024-08-10 09:21:20 +0100F6D01060E000,"Castle Crashers Remastered Demo",gpu;demo,boots,2022-04-10 10:57:10 +01003C100445C000,"Castle of Heart",nvdec,playable,2022-07-21 23:10:45 +0100F5500FA0E000,"Castle of no Escape 2",,playable,2022-09-13 13:51:42 +0100DA2011F18000,"Castle Pals",,playable,2021-03-04 21:00:33 +010097C00AB66000,"CastleStorm",nvdec,playable,2022-07-21 22:49:14 +010007400EB64000,"CastleStorm II",UE4;crash;nvdec,boots,2020-10-25 11:22:44 +01001A800D6BC000,"Castlevania Anniversary Collection",audio,playable,2020-05-23 11:40:29 +010076000C86E000,"Cat Girl Without Salad: Amuse-Bouche",,playable,2022-09-03 13:01:47 +0100A2F006FBE000,"Cat Quest",,playable,2020-04-02 23:09:32 +01008BE00E968000,"Cat Quest II",,playable,2020-07-06 23:52:09 +0100E86010220000,"Cat Quest II Demo",demo,playable,2021-02-15 14:11:57 +0100BAE0077E4000,"Catherine Full Body for Nintendo Switch (JP)",Needs Update;gpu,ingame,2021-02-21 18:06:11 +0100BF00112C0000,"Catherine: Full Body",nvdec,playable,2023-04-02 11:00:37 +010004400B28A000,"Cattails",,playable,2021-06-03 14:36:57 +0100B7D0022EE000,"Cave Story+",,playable,2020-05-22 09:57:25 +01001A100C0E8000,"Caveblazers",slow,ingame,2021-06-09 17:57:28 +01006DB004566000,"Caveman Warriors",,playable,2020-05-22 11:44:20 +010078700B2CC000,"Caveman Warriors Demo",demo,playable,2021-02-15 14:44:08 +01002B30028F6000,"Celeste",,playable,2020-06-17 10:14:40 +01006B000A666000,"Cendrillon palikA",gpu;nvdec,ingame,2022-07-21 22:52:24 +01007600115CE000,"CHAOS CODE -NEW SIGN OF CATASTROPHE-",crash;nvdec,boots,2022-04-04 12:24:21 +0100957016B90000,"CHAOS;HEAD NOAH",,playable,2022-06-02 22:57:19 +0100F52013A66000,"Charge Kid",gpu;audout,boots,2024-02-11 01:17:47 +0100DE200C350000,"Chasm",,playable,2020-10-23 11:03:43 +010034301A556000,"Chasm: The Rift",gpu,ingame,2024-04-29 19:02:48 +0100A5900472E000,"Chess Ultra",UE4,playable,2023-08-30 23:06:31 +0100E3C00A118000,"Chicken Assassin: Reloaded",,playable,2021-02-20 13:29:01 +0100713010E7A000,"Chicken Police – Paint it RED!",nvdec,playable,2020-12-10 15:10:11 +0100F6C00A016000,"Chicken Range",,playable,2021-04-23 12:14:23 +01002E500E3EE000,"Chicken Rider",,playable,2020-05-22 11:31:17 +0100CAC011C3A000,"Chickens Madness DEMO",UE4;demo;gpu;nvdec,ingame,2021-02-15 15:02:10 +01007D000AD8A000,"Child of Light® Ultimate Edition",nvdec,playable,2020-12-16 10:23:10 +01002DE00C250000,"Children of Morta",gpu;nvdec,ingame,2022-09-13 17:48:47 +0100C1A00AC3E000,"Children of Zodiarcs",,playable,2020-10-04 14:23:33 +010046F012A04000,"Chinese Parents",,playable,2021-04-08 12:56:41 +01005A001489A000,"Chiptune Arrange Sound(DoDonPachi Resurrection)",32-bit;crash,ingame,2024-01-25 14:37:32 +01006A30124CA000,"Chocobo GP",gpu;crash,ingame,2022-06-04 14:52:18 +0100BF600BF26000,"Chocobo's Mystery Dungeon EVERY BUDDY!",slow,playable,2020-05-26 13:53:13 +01000BA0132EA000,"Choices That Matter: And The Sun Went Out",,playable,2020-12-17 15:44:08 +0100A1200CA3C000,"Chou no Doku Hana no Kusari: Taishou Irokoi Ibun",gpu;nvdec,ingame,2020-09-28 17:58:04 +010039A008E76000,"ChromaGun",,playable,2020-05-26 12:56:42 +010006800E13A000,"Chronos: Before the Ashes",UE4;gpu;nvdec,ingame,2020-12-11 22:16:35 +010039700BA7E000,"Circle of Sumo",,playable,2020-05-22 12:45:21 +01008FA00D686000,"Circuits",,playable,2022-09-19 11:52:50 +0100D8800B87C000,"Cities: Skylines - Nintendo Switch™ Edition",,playable,2020-12-16 10:34:57 +0100E4200D84E000,"Citizens of Space",gpu,boots,2023-10-22 06:45:44 +0100D9C012900000,"Citizens Unite!: Earth x Space",gpu,ingame,2023-10-22 06:44:19 +01005E501284E000,"City Bus Driving Simulator",,playable,2021-06-15 21:25:59 +0100A3A00CC7E000,"CLANNAD",,playable,2021-06-03 17:01:02 +01007B501372C000,"CLANNAD Side Stories",,playable,2022-10-26 15:03:04 +01005ED0107F4000,"Clash Force",,playable,2022-10-01 23:45:48 +010009300AA6C000,"Claybook",slow;nvdec;online;UE4,playable,2022-07-22 11:11:34 +010058900F52E000,"Clea",crash,ingame,2020-12-15 16:22:56 +010045E0142A4000,"Clea 2",,playable,2021-04-18 14:25:18 +01008C100C572000,"Clock Zero ~Shuuen no Ichibyou~ Devote",nvdec,playable,2022-12-04 22:19:14 +0100DF9013AD4000,"Clocker",,playable,2021-04-05 15:05:13 +0100B7200DAC6000,"Close to the Sun",crash;nvdec;UE4,boots,2021-11-04 09:19:41 +010047700D540000,"Clubhouse Games™: 51 Worldwide Classics",ldn-works,playable,2024-05-21 16:12:57 +0100C1401CEDC000,"Clue",crash;online,menus,2020-11-10 09:23:48 +010085A00821A000,"ClusterPuck 99",,playable,2021-01-06 00:28:12 +010096900A4D2000,"Clustertruck",slow,ingame,2021-02-19 21:07:09 +01005790110F0000,"Cobra Kai: The Karate Kid Saga Continues",,playable,2021-06-17 15:59:13 +01002E700C366000,"COCOON",gpu,ingame,2024-03-06 11:33:08 +010034E005C9C000,"Code of Princess EX",nvdec;online,playable,2021-06-03 10:50:13 +010086100CDCA000,"CODE SHIFTER",,playable,2020-08-09 15:20:55 +010002400F408000,"Code: Realize ~Future Blessings~",nvdec,playable,2023-03-31 16:57:47 +0100CF800C810000,"Coffee Crisis",,playable,2021-02-20 12:34:52 +010066200E1E6000,"Coffee Talk",,playable,2020-08-10 09:48:44 +0100178009648000,"Coffin Dodgers",,playable,2021-02-20 14:57:41 +010035B01706E000,"Cold Silence",cpu;crash,nothing,2024-07-11 17:06:14 +010083E00F40E000,"Collar X Malice",nvdec,playable,2022-10-02 11:51:56 +0100E3B00F412000,"Collar X Malice -Unlimited-",nvdec,playable,2022-10-04 15:30:40 +01002A600D7FC000,"Collection of Mana",,playable,2020-10-19 19:29:45 +0100B77012266000,"COLLECTION of SaGa FINAL FANTASY LEGEND",,playable,2020-12-30 19:11:16 +010030800BC36000,"Collidalot",nvdec,playable,2022-09-13 14:09:27 +0100CA100C0BA000,"Color Zen",,playable,2020-05-22 10:56:17 +010039B011312000,"Colorgrid",,playable,2020-10-04 01:50:52 +0100A7000BD28000,"Coloring Book",,playable,2022-07-22 11:17:05 +010020500BD86000,"Colors Live",gpu;services;crash,boots,2023-02-26 02:51:07 +0100E2F0128B4000,"Colossus Down",,playable,2021-02-04 20:49:50 +0100C4D00D16A000,"Commander Keen in Keen Dreams",gpu,ingame,2022-08-04 20:34:20 +0100E400129EC000,"Commander Keen in Keen Dreams: Definitive Edition",,playable,2021-05-11 19:33:54 +010065A01158E000,"Commandos 2 - HD Remaster",gpu;nvdec,ingame,2022-08-10 21:52:27 +010015801308E000,"Conarium",UE4;nvdec,playable,2021-04-26 17:57:53 +0100971011224000,"Concept Destruction",,playable,2022-09-29 12:28:56 +010043700C9B0000,"Conduct TOGETHER!",nvdec,playable,2021-02-20 12:59:00 +01007EF00399C000,"Conga Master Party!",,playable,2020-05-22 13:22:24 +0100A5600FAC0000,"Construction Simulator 3 - Console Edition",,playable,2023-02-06 09:31:23 +0100A330022C2000,"Constructor Plus",,playable,2020-05-26 12:37:40 +0100DCA00DA7E000,"Contra Anniversary Collection",,playable,2022-07-22 11:30:12 +0100F2600D710000,"CONTRA: ROGUE CORPS",crash;nvdec;regression,menus,2021-01-07 13:23:35 +0100B8200ECA6000,"CONTRA: ROGUE CORPS Demo",gpu,ingame,2022-09-04 16:46:52 +01007D701298A000,"Contraptions",,playable,2021-02-08 18:40:50 +0100041013360000,"Control Ultimate Edition - Cloud Version",Needs Update;crash;services,nothing,2021-04-18 22:34:06 +010058800E90A000,"Convoy: A Tactical Roguelike",,playable,2020-10-15 14:43:50 +0100B82010B6C000,"Cook, Serve, Delicious! 3?!",,playable,2022-10-09 12:09:34 +010060700EFBA000,"Cooking Mama: Cookstar",crash;loader-allocator,menus,2021-11-20 03:19:35 +01001E400FD58000,"Cooking Simulator",,playable,2021-04-18 13:25:23 +0100DF9010206000,"Cooking Tycoons - 3 in 1 Bundle",,playable,2020-11-16 22:44:26 +01005350126E0000,"Cooking Tycoons 2 - 3 in 1 Bundle",,playable,2020-11-16 22:19:33 +0100C5A0115C4000,"CopperBell",,playable,2020-10-04 15:54:36 +010016400B1FE000,"Corpse Party: Blood Drive",nvdec,playable,2021-03-01 12:44:23 +0100CCB01B1A0000,"COSMIC FANTASY COLLECTION",,ingame,2024-05-21 17:56:37 +010067C00A776000,"Cosmic Star Heroine",,playable,2021-02-20 14:30:47 +01003DD00F94A000,"COTTOn Reboot! [ コットン リブート! ]",,playable,2022-05-24 16:29:24 +010077001526E000,"Cotton/Guardian Saturn Tribute Games",gpu,boots,2022-11-27 21:00:51 +01000E301107A000,"Couch Co-Op Bundle Vol. 2",nvdec,playable,2022-10-02 12:04:21 +0100C1E012A42000,"Country Tales",,playable,2021-06-17 16:45:39 +01003370136EA000,"Cozy Grove",gpu,ingame,2023-07-30 22:22:19 +010073401175E000,"Crash Bandicoot™ 4: It’s About Time",nvdec;UE4,playable,2024-03-17 07:13:45 +0100D1B006744000,"Crash Bandicoot™ N. Sane Trilogy",,playable,2024-02-11 11:38:14 +010007900FCE2000,"Crash Drive 2",online,playable,2020-12-17 02:45:46 +010046600BD0E000,"Crash Dummy",nvdec,playable,2020-05-23 11:12:43 +0100BF200CD74000,"Crashbots",,playable,2022-07-22 13:50:52 +010027100BD16000,"Crashlands",,playable,2021-05-27 20:30:06 +0100F9F00C696000,"Crash™ Team Racing Nitro-Fueled",gpu;nvdec;online-broken,ingame,2023-06-25 02:40:17 +0100BF7006BCA000,"Crawl",,playable,2020-05-22 10:16:05 +0100C66007E96000,"Crayola Scoot",nvdec,playable,2022-07-22 14:01:55 +01005BA00F486000,"Crayon Shin-chan Ora to Hakase no Natsuyasumi Owaranai Nanokakan no Tabi",,playable,2021-07-21 10:41:33 +0100D470106DC000,"CRAYON SHINCHAN The Storm Called FLAMING KASUKABE RUNNER!!",services,menus,2020-03-20 14:00:57 +01006BC00C27A000,"Crazy Strike Bowling EX",UE4;gpu;nvdec,ingame,2020-08-07 18:15:59 +0100F9900D8C8000,"Crazy Zen Mini Golf",,playable,2020-08-05 14:00:00 +0100B0E010CF8000,"Creaks",,playable,2020-08-15 12:20:52 +01007C600D778000,"Creature in the Well",UE4;gpu,ingame,2020-11-16 12:52:40 +0100A19011EEE000,"Creepy Tale",,playable,2020-12-15 21:58:03 +01005C2013B00000,"Cresteaju",gpu,ingame,2021-03-24 10:46:06 +010022D00D4F0000,"Cricket 19",gpu,ingame,2021-06-14 14:56:07 +0100387017100000,"Cricket 22 The Official Game Of The Ashes",crash,boots,2023-10-18 08:01:57 +01005640080B0000,"Crimsonland",,playable,2021-05-27 20:50:54 +0100B0400EBC4000,"Cris Tales",crash,ingame,2021-07-29 15:10:53 +01004BC0166CC000,"CRISIS CORE –FINAL FANTASY VII– REUNION",,playable,2022-12-19 15:53:59 +01004F800C4DA000,"Croc's World",,playable,2020-05-22 11:21:09 +01009DB00DE12000,"Croc's World 2",,playable,2020-12-16 20:01:40 +010025200FC54000,"Croc's World 3",,playable,2020-12-30 18:53:26 +01000F0007D92000,"Croixleur Sigma",online,playable,2022-07-22 14:26:54 +01003D90058FC000,"CrossCode",,playable,2024-02-17 10:23:19 +0100B1E00AA56000,"Crossing Souls",nvdec,playable,2021-02-20 15:42:54 +0100059012BAE000,"Crown Trick",,playable,2021-06-16 19:36:29 +0100B41013C82000,"Cruis'n Blast",gpu,ingame,2023-07-30 10:33:47 +01000CC01C108000,"Crymachina Trial Edition ( Demo ) [ クライマキナ ]",demo,playable,2023-08-06 05:33:21 +0100CEA007D08000,"Crypt of the NecroDancer: Nintendo Switch Edition",nvdec,playable,2022-11-01 09:52:06 +0100582010AE0000,"Crysis 2 Remastered",deadlock,menus,2023-09-21 10:46:17 +0100CD3010AE2000,"Crysis 3 Remastered",deadlock,menus,2023-09-10 16:03:50 +0100E66010ADE000,"Crysis Remastered",nvdec,menus,2024-08-13 05:23:24 +0100972008234000,"Crystal Crisis",nvdec,playable,2021-02-20 13:52:44 +01006FA012FE0000,"Cthulhu Saves Christmas",,playable,2020-12-14 00:58:55 +010001600D1E8000,"Cube Creator X",crash,menus,2021-11-25 08:53:28 +010082E00F1CE000,"Cubers: Arena",nvdec;UE4,playable,2022-10-04 16:05:40 +010040D011D04000,"Cubicity",,playable,2021-06-14 14:19:51 +0100A5C00D162000,"Cuphead",,playable,2022-02-01 22:45:55 +0100F7E00DFC8000,"Cupid Parasite",gpu,ingame,2023-08-21 05:52:36 +010054501075C000,"Curious Cases",,playable,2020-08-10 09:30:48 +0100D4A0118EA000,"Curse of the Dead Gods",,playable,2022-08-30 12:25:38 +0100CE5014026000,"Curved Space",,playable,2023-01-14 22:03:50 +0100C1300DE74000,"Cyber Protocol",nvdec,playable,2020-09-28 14:47:40 +0100C1F0141AA000,"Cyber Shadow",,playable,2022-07-17 05:37:41 +01006B9013672000,"Cybxus Hearts",gpu;slow,ingame,2022-01-15 05:00:49 +010063100B2C2000,"Cytus α",nvdec,playable,2021-02-20 13:40:46 +0100B6400CA56000,"DAEMON X MACHINA™",UE4;audout;ldn-untested;nvdec,playable,2021-06-09 19:22:29 +010061300DF48000,"Dairoku: Ayakashimori",Needs Update;loader-allocator,nothing,2021-11-30 05:09:38 +0100BD2009A1C000,"Damsel",,playable,2022-09-06 11:54:39 +0100BFC002B4E000,"Dandara: Trials of Fear Edition",,playable,2020-05-26 12:42:33 +0100DFB00D808000,"Dandy Dungeon - Legend of Brave Yamada -",,playable,2021-01-06 09:48:47 +01003ED0099B0000,"Danger Mouse: The Danger Games",crash;online,boots,2022-07-22 15:49:45 +0100EFA013E7C000,"Danger Scavenger",nvdec,playable,2021-04-17 15:53:04 +0100417007F78000,"Danmaku Unlimited 3",,playable,2020-11-15 00:48:35 +01000330105BE000,"Darius Cozmic Collection",,playable,2021-02-19 20:59:06 +010059C00BED4000,"Darius Cozmic Collection Special Edition",,playable,2022-07-22 16:26:50 +010015800F93C000,"Dariusburst - Another Chronicle EX+",online,playable,2021-04-05 14:21:43 +01003D301357A000,"Dark Arcana: The Carnival",gpu;slow,ingame,2022-02-19 08:52:28 +010083A00BF6C000,"Dark Devotion",nvdec,playable,2022-08-09 09:41:18 +0100BFF00D5AE000,"Dark Quest 2",,playable,2020-11-16 21:34:52 +01004AB00A260000,"DARK SOULS™: REMASTERED",gpu;nvdec;online-broken,ingame,2024-04-09 19:47:58 +01001FA0034E2000,"Dark Witch Music Episode: Rudymical",,playable,2020-05-22 09:44:44 +01008F1008DA6000,"Darkest Dungeon",nvdec,playable,2022-07-22 18:49:18 +0100F2300D4BA000,"Darksiders Genesis",nvdec;online-broken;UE4;ldn-broken,playable,2022-09-21 18:06:25 +010071800BA98000,"Darksiders II Deathinitive Edition",gpu;nvdec;online-broken,ingame,2024-06-26 00:37:25 +0100E1400BA96000,"Darksiders Warmastered Edition",nvdec,playable,2023-03-02 18:08:09 +010033500B7B6000,"Darkwood",,playable,2021-01-08 21:24:06 +0100440012FFA000,"DARQ Complete Edition",audout,playable,2021-04-07 15:26:21 +0100BA500B660000,"Darts Up",,playable,2021-04-14 17:22:22 +0100F0B0081DA000,"Dawn of the Breakers",online-broken;vulkan-backend-bug,menus,2022-12-08 14:40:03 +0100FCF00F6CC000,"Day and Night",,playable,2020-12-17 12:30:51 +0100D0A009310000,"de Blob",nvdec,playable,2021-01-06 17:34:46 +010034E00A114000,"de Blob 2",nvdec,playable,2021-01-06 13:00:16 +01008E900471E000,"De Mambo",,playable,2021-04-10 12:39:40 +01004C400CF96000,"Dead by Daylight",nvdec;online-broken;UE4,boots,2022-09-13 14:32:13 +0100646009FBE000,"Dead Cells",,playable,2021-09-22 22:18:49 +01004C500BD40000,"Dead End Job",nvdec,playable,2022-09-19 12:48:44 +01009CC00C97C000,"DEAD OR ALIVE Xtreme 3 Scarlet",,playable,2022-07-23 17:05:06 +0100A5000F7AA000,"DEAD OR SCHOOL",nvdec,playable,2022-09-06 12:04:09 +0100A24011F52000,"Dead Z Meat",UE4;services,ingame,2021-04-14 16:50:16 +010095A011A14000,"Deadly Days",,playable,2020-11-27 13:38:55 +0100BAC011928000,"Deadly Premonition 2: A Blessing In Disguise",,playable,2021-06-15 14:12:36 +0100EBE00F22E000,"Deadly Premonition Origins",32-bit;nvdec,playable,2024-03-25 12:47:46 +010015600D814000,"Dear Magi - Mahou Shounen Gakka -",,playable,2020-11-22 16:45:16 +01000D60126B6000,"Death and Taxes",,playable,2020-12-15 20:27:49 +010012B011AB2000,"Death Come True",nvdec,playable,2021-06-10 22:30:49 +0100F3B00CF32000,"Death Coming",crash,nothing,2022-02-06 07:43:03 +0100AEC013DDA000,"Death end re;Quest",,playable,2023-07-09 12:19:54 +0100423009358000,"Death Road to Canada",gpu;audio;32-bit;crash,nothing,2023-06-28 15:39:26 +010085900337E000,"Death Squared",,playable,2020-12-04 13:00:15 +0100A51013550000,"Death Tales",,playable,2020-12-17 10:55:52 +0100492011A8A000,"Death's Hangover",gpu,boots,2023-08-01 22:38:06 +01009120119B4000,"Deathsmiles I・II",,playable,2024-04-08 19:29:00 +010034F00BFC8000,"Debris Infinity",nvdec;online,playable,2021-05-28 12:14:39 +010027700FD2E000,"Decay of Logos",nvdec,playable,2022-09-13 14:42:13 +01002CC0062B8000,"DEEMO",,playable,2022-07-24 11:34:33 +01008B10132A2000,"DEEMO -Reborn-",nvdec;online-broken,playable,2022-10-17 15:18:11 +010026800FA88000,"Deep Diving Adventures",,playable,2022-09-22 16:43:37 +0100FAF009562000,"Deep Ones",services,nothing,2020-04-03 02:54:19 +0100C3E00D68E000,"Deep Sky Derelicts: Definitive Edition",,playable,2022-09-27 11:21:08 +01000A700F956000,"Deep Space Rush",,playable,2020-07-07 23:30:33 +0100961011BE6000,"DeepOne",services-horizon;Needs Update,nothing,2024-01-18 15:01:05 +01008BB00F824000,"Defenders of Ekron: Definitive Edition",,playable,2021-06-11 16:31:03 +0100CDE0136E6000,"Defentron",,playable,2022-10-17 15:47:56 +010039300BDB2000,"Defunct",,playable,2021-01-08 21:33:46 +010067900B9C4000,"Degrees of Separation",,playable,2021-01-10 13:40:04 +010071C00CBA4000,"Dei Gratia no Rashinban",crash,nothing,2021-07-13 02:25:32 +010092E00E7F4000,"Deleveled",slow,playable,2020-12-15 21:02:29 +010023800D64A000,"DELTARUNE Chapter 1&2",,playable,2023-01-22 04:47:44 +010038B01D2CA000,"Dementium: The Ward",crash,boots,2024-09-02 08:28:14 +0100AB600ACB4000,"Demetrios - The BIG Cynical Adventure",,playable,2021-06-04 12:01:01 +010099D00D1A4000,"Demolish & Build 2018",,playable,2021-06-13 15:27:26 +010084600F51C000,"Demon Pit",nvdec,playable,2022-09-19 13:35:15 +0100309016E7A000,"Demon Slayer -Kimetsu no Yaiba- The Hinokami Chronicles",UE4,playable,2024-08-08 04:51:49 +0100A2B00BD88000,"Demon's Crystals",crash;regression,nothing,2022-12-07 16:33:17 +0100E29013818000,"Demon's Rise - Lords of Chaos",,playable,2021-04-06 16:20:06 +0100C3501094E000,"Demon's Rise - War for the Deep",,playable,2020-07-29 12:26:27 +0100161011458000,"Demon's Tier+",,playable,2021-06-09 17:25:36 +0100BE800E6D8000,"DEMON'S TILT",,playable,2022-09-19 13:22:46 +010000401313A000,"Demong Hunter",,playable,2020-12-12 15:27:08 +0100BC501355A000,"Densha de go!! Hashirou Yamanote Sen",nvdec;UE4,playable,2023-11-09 07:47:58 +0100C9100FAE2000,"Depixtion",,playable,2020-10-10 18:52:37 +01000BF00B6BC000,"Deployment",slow;online-broken,playable,2022-10-17 16:23:59 +010023600C704000,"Deponia",nvdec,playable,2021-01-26 17:17:19 +0100ED700469A000,"Deru - The Art of Cooperation",,playable,2021-01-07 16:59:59 +0100D4600D0E4000,"Descenders",gpu,ingame,2020-12-10 15:22:36 +0100D870102BC000,"Desire remaster ver.",crash,boots,2021-01-17 02:34:37 +010069500DD86000,"Destiny Connect: Tick-Tock Travelers",UE4;gpu;nvdec,ingame,2020-12-16 12:20:36 +01008BB011ED6000,"Destrobots",,playable,2021-03-06 14:37:05 +01009E701356A000,"Destroy All Humans!",gpu;nvdec;UE4,ingame,2023-01-14 22:23:53 +010030600E65A000,"Detective Dolittle",,playable,2021-03-02 14:03:59 +01009C0009842000,"Detective Gallo",nvdec,playable,2022-07-24 11:51:04 +01002D400B0F6000,"Detective Jinguji Saburo Prism of Eyes",,playable,2020-10-02 21:54:41 +010007500F27C000,"Detective Pikachu™ Returns",,playable,2023-10-07 10:24:59 +010031B00CF66000,"Devil Engine",,playable,2021-06-04 11:54:30 +01002F000E8F2000,"Devil Kingdom",,playable,2023-01-31 08:58:44 +0100E8000D5B8000,"Devil May Cry",nvdec,playable,2021-01-04 19:43:08 +01007CF00D5BA000,"Devil May Cry 2",nvdec,playable,2023-01-24 23:03:20 +01007B600D5BC000,"Devil May Cry 3 Special Edition",nvdec,playable,2024-07-08 12:33:23 +01003C900EFF6000,"Devil Slayer Raksasi",,playable,2022-10-26 19:42:32 +01009EA00A320000,"Devious Dungeon",,playable,2021-03-04 13:03:06 +01003F601025E000,"Dex",nvdec,playable,2020-08-12 16:48:12 +010044000CBCA000,"Dexteritrip",,playable,2021-01-06 12:51:12 +0100AFC00E06A000,"Dezatopia",online,playable,2021-06-15 21:06:11 +01001B300B9BE000,"Diablo III: Eternal Collection",online-broken;ldn-works,playable,2023-08-21 23:48:03 +0100726014352000,"Diablo® II: Resurrected™",gpu;nvdec,ingame,2023-08-18 18:42:47 +0100F73011456000,"Diabolic",,playable,2021-06-11 14:45:08 +010027400BD24000,"DIABOLIK LOVERS CHAOS LINEAGE",gpu;Needs Update,ingame,2023-06-08 02:20:44 +0100BBF011394000,"Dicey Dungeons",gpu;audio;slow,ingame,2023-08-02 20:30:12 +0100D98005E8C000,"Die for Valhalla!",,playable,2021-01-06 16:09:14 +0100BB900B5B4000,"Dies irae Amantes amentes For Nintendo Switch",32-bit;crash,nothing,2022-02-16 07:09:05 +0100A5A00DBB0000,"Dig Dog",gpu,ingame,2021-06-02 17:17:51 +01004DE011076000,"Digerati Indie Darling Bundle Vol. 3",,playable,2022-10-02 13:01:57 +010035D0121EC000,"Digerati Presents: The Dungeon Crawl Vol. 1",slow,ingame,2021-04-18 14:04:55 +010014E00DB56000,"Digimon Story Cyber Sleuth: Complete Edition",nvdec;opengl,playable,2022-09-13 15:02:37 +0100F00014254000,"Digimon World: Next Order",,playable,2023-05-09 20:41:06 +0100B6D00DA6E000,"Ding Dong XL",,playable,2020-07-14 16:13:19 +01002E4011924000,"Dininho Adventures",,playable,2020-10-03 17:25:51 +010027E0158A6000,"Dininho Space Adventure",,playable,2023-01-14 22:43:04 +0100A8A013DA4000,"Dirt Bike Insanity",,playable,2021-01-31 13:27:38 +01004CB01378A000,"Dirt Trackin Sprint Cars",nvdec;online-broken,playable,2022-10-17 16:34:56 +0100918014B02000,"Disagaea 6: Defiance of Destiny Demo",demo,playable,2022-10-26 20:02:04 +010020700E2A2000,"Disaster Report 4: Summer Memories",nvdec;UE4,playable,2022-09-27 19:41:31 +0100510004D2C000,"Disc Jam",UE4;ldn-untested;nvdec;online,playable,2021-04-08 16:40:35 +0100C81004780000,"Disco Dodgeball - REMIX",online,playable,2020-09-28 23:24:49 +01004B100AF18000,"Disgaea 1 Complete",,playable,2023-01-30 21:45:23 +0100A9800E9B4000,"Disgaea 4 Complete+",gpu;slow,playable,2020-02-18 10:54:28 +010068C00F324000,"Disgaea 4 Complete+ Demo",nvdec,playable,2022-09-13 15:21:59 +01005700031AE000,"Disgaea 5 Complete",nvdec,playable,2021-03-04 15:32:54 +0100ABC013136000,"Disgaea 6: Defiance of Destiny",deadlock,ingame,2023-04-15 00:50:32 +0100307011D80000,"Disgaea 6: Defiance of Destiny [ FG ] [ 魔界戦記ディスガイア6 ]",,playable,2021-06-08 13:20:33 +01005EE013888000,"Disgaea 6: Defiance of Destiny Demo [ 魔界戦記ディスガイア6 ]",gpu;demo,ingame,2022-12-06 15:27:59 +01000B70122A2000,"Disjunction",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2024-04-28 23:55:24 +0100A2F00EEFC000,"Disney Classic Games Collection",online-broken,playable,2022-09-13 15:44:17 +0100DA201EBF8000,"Disney Epic Mickey: Rebrushed",crash,ingame,2024-09-26 22:11:51 +0100F0401435E000,"Disney Speedstorm",services,boots,2023-11-27 02:15:32 +010012800EBAE000,"Disney TSUM TSUM FESTIVAL",crash,menus,2020-07-14 14:05:28 +01009740120FE000,"DISTRAINT 2",,playable,2020-09-03 16:08:12 +010075B004DD2000,"DISTRAINT: Deluxe Edition",,playable,2020-06-15 23:42:24 +010027400CDC6000,"Divinity: Original Sin 2 - Definitive Edition",services;crash;online-broken;regression,menus,2023-08-13 17:20:03 +01001770115C8000,"Dodo Peak",nvdec;UE4,playable,2022-10-04 16:13:05 +010077B0100DA000,"Dogurai",,playable,2020-10-04 02:40:16 +010048100D51A000,"Dokapon Up! Mugen no Roulette",gpu;Needs Update,menus,2022-12-08 19:39:10 +01005EE00BC78000,"Dokuro (ドクロ)",nvdec,playable,2020-12-17 14:47:09 +010007200AC0E000,"Don't Die, Mr Robot!",nvdec,playable,2022-09-02 18:34:38 +0100E470067A8000,"Don't Knock Twice",,playable,2024-05-08 22:37:58 +0100C4D00B608000,"Don't Sink",gpu,ingame,2021-02-26 15:41:11 +0100751007ADA000,"Don't Starve: Nintendo Switch Edition",nvdec,playable,2022-02-05 20:43:34 +010088B010DD2000,"Dongo Adventure",,playable,2022-10-04 16:22:26 +0100C1F0051B6000,"Donkey Kong Country™: Tropical Freeze",,playable,2024-08-05 16:46:10 +0100F2C00F060000,"Doodle Derby",,boots,2020-12-04 22:51:48 +0100416004C00000,"DOOM",gpu;slow;nvdec;online-broken,ingame,2024-09-23 15:40:07 +010018900DD00000,"DOOM (1993)",nvdec;online-broken,menus,2022-09-06 13:32:19 +01008CB01E52E000,"DOOM + DOOM II",opengl;ldn-untested;LAN,playable,2024-09-12 07:06:01 +010029D00E740000,"DOOM 3",crash,menus,2024-08-03 05:25:47 +01005D700E742000,"DOOM 64",nvdec;vulkan,playable,2020-10-13 23:47:28 +0100D4F00DD02000,"DOOM II (Classic)",nvdec;online,playable,2021-06-03 20:10:01 +0100B1A00D8CE000,"DOOM® Eternal",gpu;slow;nvdec;online-broken,ingame,2024-08-28 15:57:17 +01005ED00CD70000,"Door Kickers: Action Squad",online-broken;ldn-broken,playable,2022-09-13 16:28:53 +010073700E412000,"DORAEMON STORY OF SEASONS",nvdec,playable,2020-07-13 20:28:11 +0100F7300BD8E000,"Double Cross",,playable,2021-01-07 15:34:22 +0100B1500E9F2000,"Double Dragon & Kunio-kun: Retro Brawler Bundle",,playable,2020-09-01 12:48:46 +01001AD00E49A000,"DOUBLE DRAGON Ⅲ: The Sacred Stones",online,playable,2021-06-11 15:41:44 +01005B10132B2000,"Double Dragon Neon",gpu;audio;32-bit,ingame,2022-09-20 18:00:20 +01000F400C1A4000,"Double Kick Heroes",gpu,ingame,2020-10-03 14:33:59 +0100A5D00C7C0000,"Double Pug Switch",nvdec,playable,2022-10-10 10:59:35 +0100FC000EE10000,"Double Switch - 25th Anniversary Edition",nvdec,playable,2022-09-19 13:41:50 +0100B6600FE06000,"Down to Hell",gpu;nvdec,ingame,2022-09-19 14:01:26 +010093D00C726000,"Downwell",,playable,2021-04-25 20:05:24 +0100ED000D390000,"Dr Kawashima's Brain Training",services,ingame,2023-06-04 00:06:46 +01001B80099F6000,"Dracula's Legacy",nvdec,playable,2020-12-10 13:24:25 +0100566009238000,"DragoDino",gpu;nvdec,ingame,2020-08-03 20:49:16 +0100DBC00BD5A000,"Dragon Audit",crash,ingame,2021-05-16 14:24:46 +0100A250097F0000,"DRAGON BALL FighterZ",UE4;ldn-broken;nvdec;online,playable,2021-06-11 16:19:04 +010078D000F88000,"DRAGON BALL XENOVERSE 2 for Nintendo Switch",gpu;nvdec;online;ldn-untested,ingame,2022-07-24 12:31:01 +010051C0134F8000,"DRAGON BALL Z: KAKAROT + A NEW POWER AWAKENS SET",vulkan-backend-bug,playable,2024-08-28 00:03:50 +010099B00A2DC000,"Dragon Blaze for Nintendo Switch",32-bit,playable,2020-10-14 11:11:28 +010089700150E000,"Dragon Marked for Death: Advanced Attackers",ldn-untested;audout,playable,2022-03-10 06:44:34 +0100EFC00EFB2000,"DRAGON QUEST",gpu,boots,2021-11-09 03:31:32 +010008900705C000,"Dragon Quest Builders™",gpu;nvdec,ingame,2023-08-14 09:54:36 +010042000A986000,"DRAGON QUEST BUILDERS™ 2",,playable,2024-04-19 16:36:38 +0100CD3000BDC000,"Dragon Quest Heroes I + II (JP)",nvdec,playable,2021-04-08 14:27:16 +010062200EFB4000,"DRAGON QUEST II: Luminaries of the Legendary Line",,playable,2022-09-13 16:44:11 +01003E601E324000,"DRAGON QUEST III HD-2D Remake",vulkan-backend-bug;UE4;audout;mac-bug,ingame,2025-01-07 04:10:27 +010015600EFB6000,"DRAGON QUEST III: The Seeds of Salvation",gpu,boots,2021-11-09 03:38:34 +0100A77018EA0000,"DRAGON QUEST MONSTERS: The Dark Prince",,playable,2023-12-29 16:10:05 +0100217014266000,"Dragon Quest Treasures",gpu;UE4,ingame,2023-05-09 11:16:52 +0100E2E0152E4000,"Dragon Quest X Awakening Five Races Offline",nvdec;UE4,playable,2024-08-20 10:04:24 +01006C300E9F0000,"DRAGON QUEST® XI S: Echoes of an Elusive Age – Definitive Edition",UE4,playable,2021-11-27 12:27:11 +010032C00AC58000,"Dragon's Dogma: Dark Arisen",,playable,2022-07-24 12:58:33 +010027100C544000,"Dragon's Lair Trilogy",nvdec,playable,2021-01-13 22:12:07 +0100DA0006F50000,"DragonFangZ - The Rose & Dungeon of Time",,playable,2020-09-28 21:35:18 +0100F7800A434000,"Drawful 2",,ingame,2022-07-24 13:50:21 +0100B7E0102E4000,"Drawngeon: Dungeons of Ink and Paper",gpu,ingame,2022-09-19 15:41:25 +01008B20129F2000,"Dream",,playable,2020-12-15 19:55:07 +01000AA0093DC000,"Dream Alone",nvdec,playable,2021-01-27 19:41:50 +010034D00F330000,"DreamBall",UE4;crash;gpu,ingame,2020-08-05 14:45:25 +010058B00F3C0000,"Dreaming Canvas",UE4;gpu,ingame,2021-06-13 22:50:07 +0100D24013466000,"DREAMO",UE4,playable,2022-10-17 18:25:28 +0100ED200B6FC000,"DreamWorks Dragons Dawn of New Riders",nvdec,playable,2021-01-27 20:05:26 +0100236011B4C000,"DreamWorks Spirit Lucky’s Big Adventure",,playable,2022-10-27 13:30:52 +010058C00A916000,"Drone Fight",,playable,2022-07-24 14:31:56 +010052000A574000,"Drowning",,playable,2022-07-25 14:28:26 +0100652012F58000,"Drums",,playable,2020-12-17 17:21:51 +01005BC012C66000,"Duck Life Adventure",,playable,2022-10-10 11:27:03 +01007EF00CB88000,"Duke Nukem 3D: 20th Anniversary World Tour",32-bit;ldn-untested,playable,2022-08-19 22:22:40 +010068D0141F2000,"Dull Grey",,playable,2022-10-27 13:40:38 +0100926013600000,"Dungeon Nightmares 1 + 2 Collection",,playable,2022-10-17 18:54:22 +010034300F0E2000,"Dungeon of the Endless",nvdec,playable,2021-05-27 19:16:26 +0100E79009A94000,"Dungeon Stars",,playable,2021-01-18 14:28:37 +0100BE801360E000,"Dungeons & Bombs",,playable,2021-04-06 12:46:22 +0100EC30140B6000,"Dunk Lords",,playable,2024-06-26 00:07:26 +010011C00E636000,"Dusk Diver",crash;UE4,boots,2021-11-06 09:01:30 +0100B6E00A420000,"Dust: An Elysian Tail",,playable,2022-07-25 15:28:12 +0100D7E012F2E000,"Dustoff Z",,playable,2020-12-04 23:22:29 +01008C8012920000,"Dying Light: Definitive Edition",services-horizon,boots,2024-03-11 10:43:32 +01007DD00DFDE000,"Dyna Bomb",,playable,2020-06-07 13:26:55 +0100E9A00CB30000,"DYNASTY WARRIORS 8: Xtreme Legends Definitive Edition",nvdec,playable,2024-06-26 00:16:30 +010008900BC5A000,"DYSMANTLE",gpu,ingame,2024-07-15 16:24:12 +010054E01D878000,"EA SPORTS FC 25",crash,ingame,2024-09-25 21:07:50 +0100BDB01A0E6000,"EA SPORTS FC™ 24",,boots,2023-10-04 18:32:59 +01001C8016B4E000,"EA SPORTS FIFA 23 Nintendo Switch™ Legacy Edition",gpu;crash,ingame,2024-06-10 23:33:05 +01005DE00D05C000,"EA SPORTS™ FIFA 20 Nintendo Switch™ Legacy Edition",gpu;nvdec;online-broken;ldn-untested,ingame,2022-09-13 17:57:20 +010037400C7DA000,"Eagle Island Twist",,playable,2021-04-10 13:15:42 +0100B9E012992000,"Earth Defense Force World Brothers ( ま~るい地球が四角くなった!? デジボク地球防衛軍 )",UE4,playable,2022-12-07 12:59:16 +0100298014030000,"Earth Defense Force: World Brothers",UE4,playable,2022-10-27 14:13:31 +01009B7006C88000,"EARTH WARS",,playable,2021-06-05 11:18:33 +0100DFC00E472000,"Earthfall: Alien Horde",nvdec;UE4;ldn-untested,playable,2022-09-13 17:32:37 +01006E50042EA000,"EARTHLOCK",,playable,2021-06-05 11:51:02 +0100A2E00BB0C000,"EarthNight",,playable,2022-09-19 21:02:20 +0100DCE00B756000,"Earthworms",,playable,2022-07-25 16:28:55 +0100E3500BD84000,"Earthworms Demo",,playable,2021-01-05 16:57:11 +0100ECF01800C000,"Easy Come Easy Golf",online-broken;regression,playable,2024-04-04 16:15:00 +0100A9B009678000,"EAT BEAT DEADSPIKE-san",audio;Needs Update,playable,2022-12-02 19:25:29 +0100BCA016636000,"eBaseball Powerful Pro Yakyuu 2022",gpu;services-horizon;crash,nothing,2024-05-26 23:07:19 +01001F20100B8000,"Eclipse: Edge of Light",,playable,2020-08-11 23:06:29 +0100E0A0110F4000,"eCrossminton",,playable,2020-07-11 18:24:27 +0100ABE00DB4E000,"Edna & Harvey: Harvey's New Eyes",nvdec,playable,2021-01-26 14:36:08 +01004F000B716000,"Edna & Harvey: The Breakout – Anniversary Edition",crash;nvdec,ingame,2022-08-01 16:59:56 +01002550129F0000,"Effie",,playable,2022-10-27 14:36:39 +0100CC0010A46000,"Ego Protocol: Remastered",nvdec,playable,2020-12-16 20:16:35 +01004CC00B352000,"Eiga Sumikko Gurashi Tobidasu Ehon to Himitsu no Ko Game de Asobo Ehon no Sekai",,playable,2020-11-12 00:11:50 +01003AD013BD2000,"Eight Dragons",nvdec,playable,2022-10-27 14:47:28 +010020A01209C000,"El Hijo - A Wild West Tale",nvdec,playable,2021-04-19 17:44:08 +0100B5B00EF38000,"Elden: Path of the Forgotten",,playable,2020-12-15 00:33:19 +010068F012880000,"Eldrador® Creatures",slow,playable,2020-12-12 12:35:35 +010008E010012000,"ELEA: Paradigm Shift",UE4;crash,nothing,2020-10-04 19:07:43 +0100A6700AF10000,"Element",,playable,2022-07-25 17:17:16 +0100128003A24000,"Elliot Quest",,playable,2022-07-25 17:46:14 +010041A00FEC6000,"Ember",nvdec,playable,2022-09-19 21:16:11 +010071B012940000,"Embracelet",,playable,2020-12-04 23:45:00 +010017B0102A8000,"Emma: Lost in Memories",nvdec,playable,2021-01-28 16:19:10 +010068300E08E000,"Enchanted in the Moonlight - Kiryu, Chikage & Yukinojo -",gpu;nvdec,ingame,2022-11-20 16:18:45 +01007A4008486000,"Enchanting Mahjong Match",gpu,ingame,2020-04-17 22:01:31 +01004F3011F92000,"Endless Fables: Dark Moor",gpu;nvdec,ingame,2021-03-07 15:31:03 +010067B017588000,"Endless Ocean™ Luminous",services-horizon;crash,ingame,2024-05-30 02:05:57 +0100B8700BD14000,"Energy Cycle Edge",services,ingame,2021-11-30 05:02:31 +0100A8E0090B0000,"Energy Invasion",,playable,2021-01-14 21:32:26 +0100C6200A0AA000,"Enigmatis 2: The Mists of Ravenwood",crash;regression,boots,2021-06-06 15:15:30 +01009D60076F6000,"Enter the Gungeon",,playable,2022-07-25 20:28:33 +0100262009626000,"Epic Loon",nvdec,playable,2022-07-25 22:06:13 +01000FA0149B6000,"EQI",nvdec;UE4,playable,2022-10-27 16:42:32 +0100E95010058000,"EQQO",UE4;nvdec,playable,2021-06-13 23:10:51 +01000E8010A98000,"Escape First",,playable,2020-10-20 22:46:53 +010021201296A000,"Escape First 2",,playable,2021-03-24 11:59:41 +0100FEF00F0AA000,"Escape from Chernobyl",crash,boots,2022-09-19 21:36:58 +010023E013244000,"Escape from Life Inc",,playable,2021-04-19 17:34:09 +010092901203A000,"Escape From Tethys",,playable,2020-10-14 22:38:25 +0100B0F011A84000,"Escape Game Fort Boyard",,playable,2020-07-12 12:45:43 +0100F9600E746000,"ESP Ra.De. Psi",audio;slow,ingame,2024-03-07 15:05:08 +010073000FE18000,"Esports powerful pro yakyuu 2020",gpu;crash;Needs More Attention,ingame,2024-04-29 05:34:14 +01004F9012FD8000,"Estranged: The Departure",nvdec;UE4,playable,2022-10-24 10:37:58 +0100CB900B498000,"Eternum Ex",,playable,2021-01-13 20:28:32 +010092501EB2C000,"Europa (Demo)",gpu;crash;UE4,ingame,2024-04-23 10:47:12 +01007BE0160D6000,"EVE ghost enemies",gpu,ingame,2023-01-14 03:13:30 +010095E01581C000,"even if TEMPEST",gpu,ingame,2023-06-22 23:50:25 +010072C010002000,"Event Horizon: Space Defense",,playable,2020-07-31 20:31:24 +0100DCF0093EC000,"Everspace™ - Stellar Edition",UE4,playable,2022-08-14 01:16:24 +01006F900BF8E000,"Everybody 1-2-Switch!™",services;deadlock,nothing,2023-07-01 05:52:55 +010080600B53E000,"Evil Defenders",nvdec,playable,2020-09-28 17:11:00 +01006A800FA22000,"Evolution Board Game",online,playable,2021-01-20 22:37:56 +0100F2D00C7DE000,"Exception",online-broken,playable,2022-09-20 12:47:10 +0100DD30110CC000,"Exit the Gungeon",,playable,2022-09-22 17:04:43 +0100A82013976000,"Exodemon",,playable,2022-10-27 20:17:52 +0100FA800A1F4000,"EXORDER",nvdec,playable,2021-04-15 14:17:20 +01009B7010B42000,"Explosive Jake",crash,boots,2021-11-03 07:48:32 +0100EFE00A3C2000,"Eyes: The Horror Game",,playable,2021-01-20 21:59:46 +0100E3D0103CE000,"Fable of Fairy Stones",,playable,2021-05-05 21:04:54 +01004200189F4000,"Factorio",deadlock,boots,2024-06-11 19:26:16 +010073F0189B6000,"Fae Farm",,playable,2024-08-25 15:12:12 +010069100DB08000,"Faeria",nvdec;online-broken,menus,2022-10-04 16:44:41 +01008A6009758000,"Fairune Collection",,playable,2021-06-06 15:29:56 +0100F6D00B8F2000,"Fairy Fencer F™: Advent Dark Force",32-bit;crash;nvdec,ingame,2023-04-16 03:53:48 +0100CF900FA3E000,"FAIRY TAIL",nvdec,playable,2022-10-04 23:00:32 +01005A600BE60000,"Fall of Light: Darkest Edition",slow;nvdec,ingame,2024-07-24 04:19:26 +0100AA801258C000,"Fallen Legion Revenants",crash,menus,2021-11-25 08:53:20 +0100D670126F6000,"Famicom Detective Club™: The Girl Who Stands Behind",nvdec,playable,2022-10-27 20:41:40 +010033F0126F4000,"Famicom Detective Club™: The Missing Heir",nvdec,playable,2022-10-27 20:56:23 +010060200FC44000,"Family Feud®",online-broken,playable,2022-10-10 11:42:21 +0100034012606000,"Family Mysteries: Poisonous Promises",audio;crash,menus,2021-11-26 12:35:06 +010017C012726000,"Fantasy Friends",,playable,2022-10-17 19:42:39 +0100767008502000,"FANTASY HERO ~unsigned legacy~",,playable,2022-07-26 12:28:52 +0100944003820000,"Fantasy Strike",online,playable,2021-02-27 01:59:18 +01000E2012F6E000,"Fantasy Tavern Sextet -Vol.1 New World Days-",gpu;crash;Needs Update,ingame,2022-12-05 16:48:00 +01005C10136CA000,"Fantasy Tavern Sextet -Vol.2 Adventurer's Days-",gpu;slow;crash,ingame,2021-11-06 02:57:29 +010022700E7D6000,"FAR: Lone Sails",,playable,2022-09-06 16:33:05 +0100C9E00FD62000,"Farabel",,playable,2020-08-03 17:47:28 +0100ECD00C806000,"Farm Expert 2019 for Nintendo Switch",,playable,2020-07-09 21:42:57 +01000E400ED98000,"Farm Mystery",nvdec,playable,2022-09-06 16:46:47 +010086B00BB50000,"Farm Together",,playable,2021-01-19 20:01:19 +0100EB600E914000,"Farming Simulator 20",nvdec,playable,2021-06-13 10:52:44 +0100D04004176000,"Farming Simulator Nintendo Switch Edition",nvdec,playable,2021-01-19 14:46:44 +0100E99019B3A000,"Fashion Dreamer",,playable,2023-11-12 06:42:52 +01009510001CA000,"FAST RMX",slow;crash;ldn-partial,ingame,2024-06-22 20:48:58 +0100BEB015604000,"FATAL FRAME: Maiden of Black Water",,playable,2023-07-05 16:01:40 +0100DAE019110000,"FATAL FRAME: Mask of the Lunar Eclipse",Incomplete,playable,2024-04-11 06:01:30 +010051400B17A000,"Fate/EXTELLA LINK",ldn-untested;nvdec,playable,2021-01-27 00:45:50 +010053E002EA2000,"Fate/EXTELLA: The Umbral Star",gpu;nvdec;online-broken;vulkan-backend-bug;opengl-backend-bug,ingame,2023-04-24 23:37:55 +0100F6200B7D4000,"fault - milestone one",nvdec,playable,2021-03-24 10:41:49 +01005AC0068F6000,"Fear Effect Sedna",nvdec,playable,2021-01-19 13:10:33 +0100F5501CE12000,"Fearmonium",crash,boots,2024-03-06 11:26:11 +0100E4300CB3E000,"Feather",,playable,2021-06-03 14:11:27 +010003B00D3A2000,"Felix The Reaper",nvdec,playable,2020-10-20 23:43:03 +0100AA3009738000,"Feudal Alloy",,playable,2021-01-14 08:48:14 +01008D900B984000,"FEZ",gpu,ingame,2021-04-18 17:10:16 +01007510040E8000,"FIA European Truck Racing Championship",nvdec,playable,2022-09-06 17:51:59 +0100F7B002340000,"FIFA 18",gpu;online-broken;ldn-untested,ingame,2022-07-26 12:43:59 +0100FFA0093E8000,"FIFA 19",gpu;nvdec;online-broken;ldn-untested,ingame,2022-07-26 13:07:07 +01000A001171A000,"FIFA 21 Nintendo Switch™ Legacy Edition",gpu;online-broken,ingame,2023-12-11 22:10:19 +0100216014472000,"FIFA 22 Nintendo Switch™ Legacy Edition",gpu,ingame,2024-03-02 14:13:48 +01006980127F0000,"Fight Crab",online-broken;ldn-untested,playable,2022-10-05 10:24:04 +010047E010B3E000,"Fight of Animals",online,playable,2020-10-15 15:08:28 +0100C7D00E730000,"Fight'N Rage",,playable,2020-06-16 23:35:19 +0100D02014048000,"FIGHTING EX LAYER ANOTHER DASH",online-broken;UE4,playable,2024-04-07 10:22:33 +0100118009C68000,"Figment",nvdec,playable,2021-01-27 19:36:05 +010095600AA36000,"Fill-a-Pix: Phil's Epic Adventure",,playable,2020-12-22 13:48:22 +0100C3A00BB76000,"Fimbul",nvdec,playable,2022-07-26 13:31:47 +0100C8200E942000,"Fin and the Ancient Mystery",nvdec,playable,2020-12-17 16:40:39 +01000EA014150000,"FINAL FANTASY",crash,nothing,2024-09-05 20:55:30 +01006B7014156000,"FINAL FANTASY II",crash,nothing,2024-04-13 19:18:04 +01006F000B056000,"FINAL FANTASY IX",audout;nvdec,playable,2021-06-05 11:35:00 +0100AA201415C000,"FINAL FANTASY V",,playable,2023-04-26 01:11:55 +0100A5B00BDC6000,"FINAL FANTASY VII",,playable,2022-12-09 17:03:30 +01008B900DC0A000,"FINAL FANTASY VIII Remastered",nvdec,playable,2023-02-15 10:57:48 +0100BC300CB48000,"FINAL FANTASY X/X-2 HD Remaster",gpu,ingame,2022-08-16 20:29:26 +0100EB100AB42000,"FINAL FANTASY XII THE ZODIAC AGE",opengl;vulkan-backend-bug,playable,2024-08-11 07:01:54 +010068F00AA78000,"FINAL FANTASY XV POCKET EDITION HD",,playable,2021-01-05 17:52:08 +0100CE4010AAC000,"FINAL FANTASY® CRYSTAL CHRONICLES™ Remastered Edition",,playable,2023-04-02 23:39:12 +01001BA00AE4E000,"Final Light, The Prison",,playable,2020-07-31 21:48:44 +0100FF100FB68000,"Finding Teddy 2 : Definitive Edition",gpu,ingame,2024-04-19 16:51:33 +0100F4E013AAE000,"Fire & Water",,playable,2020-12-15 15:43:20 +0100F15003E64000,"Fire Emblem Warriors",nvdec,playable,2023-05-10 01:53:10 +010071F0143EA000,"Fire Emblem Warriors: Three Hopes",gpu;nvdec,ingame,2024-05-01 07:07:42 +0100A6301214E000,"Fire Emblem™ Engage",amd-vendor-bug;mac-bug,playable,2024-09-01 23:37:26 +0100A12011CC8000,"Fire Emblem™: Shadow Dragon & the Blade of Light",,playable,2022-10-17 19:49:14 +010055D009F78000,"Fire Emblem™: Three Houses",online-broken,playable,2024-09-14 23:53:50 +010025C014798000,"Fire: Ungh’s Quest",nvdec,playable,2022-10-27 21:41:26 +0100434003C58000,"Firefighters – The Simulation",,playable,2021-02-19 13:32:05 +0100BB1009E50000,"Firefighters: Airport Fire Department",,playable,2021-02-15 19:17:00 +0100AC300919A000,"Firewatch",,playable,2021-06-03 10:56:38 +0100BA9012B36000,"Firework",,playable,2020-12-04 20:20:09 +0100DEB00ACE2000,"Fishing Star World Tour",,playable,2022-09-13 19:08:51 +010069800D292000,"Fishing Universe Simulator",,playable,2021-04-15 14:00:43 +0100807008868000,"Fit Boxing",,playable,2022-07-26 19:24:55 +0100E7300AAD4000,"Fitness Boxing",,playable,2021-04-14 20:33:33 +0100073011382000,"Fitness Boxing 2: Rhythm & Exercise",crash,ingame,2021-04-14 20:40:48 +0100C7E0134BE000,"Five Dates",nvdec,playable,2020-12-11 15:17:11 +0100B6200D8D2000,"Five Nights at Freddy's",,playable,2022-09-13 19:26:36 +01004EB00E43A000,"Five Nights at Freddy's 2",,playable,2023-02-08 15:48:24 +010056100E43C000,"Five Nights at Freddy's 3",,playable,2022-09-13 20:58:07 +010083800E43E000,"Five Nights at Freddy's 4",,playable,2023-08-19 07:28:03 +0100F7901118C000,"Five Nights at Freddy's: Help Wanted",UE4,playable,2022-09-29 12:40:09 +01009060193C4000,"Five Nights at Freddy's: Security Breach",gpu;crash;mac-bug,ingame,2023-04-23 22:33:28 +01003B200E440000,"Five Nights at Freddy's: Sister Location",,playable,2023-10-06 09:00:58 +010038200E088000,"Flan",crash;regression,ingame,2021-11-17 07:39:28 +01000A0004C50000,"FLASHBACK™",nvdec,playable,2020-05-14 13:57:29 +0100C53004C52000,"Flat Heroes",gpu,ingame,2022-07-26 19:37:37 +0100B54012798000,"Flatland: Prologue",,playable,2020-12-11 20:41:12 +0100307004B4C000,"Flinthook",online,playable,2021-03-25 20:42:29 +010095A004040000,"Flip Wars",services;ldn-untested,ingame,2022-05-02 15:39:18 +01009FB002B2E000,"Flipping Death",,playable,2021-02-17 16:12:30 +0100D1700ACFC000,"Flood of Light",,playable,2020-05-15 14:15:25 +0100DF9005E7A000,"Floor Kids",nvdec,playable,2024-08-18 19:38:49 +010040700E8FC000,"Florence",,playable,2020-09-05 01:22:30 +0100F5D00CD58000,"Flowlines VS",,playable,2020-12-17 17:01:53 +010039C00E2CE000,"Flux8",nvdec,playable,2020-06-19 20:55:11 +0100EDA00BBBE000,"Fly O'Clock",,playable,2020-05-17 13:39:52 +0100FC300F4A4000,"Fly Punch Boom!",online,playable,2020-06-21 12:06:11 +0100419013A8A000,"Flying Hero X",crash,menus,2021-11-17 07:46:58 +010056000BA1C000,"Fobia",,playable,2020-12-14 21:05:23 +0100F3900D0F0000,"Food Truck Tycoon",,playable,2022-10-17 20:15:55 +01007CF013152000,"Football Manager 2021 Touch",gpu,ingame,2022-10-17 20:08:23 +0100EDC01990E000,"Football Manager 2023 Touch",gpu,ingame,2023-08-01 03:40:53 +010097F0099B4000,"Football Manager Touch 2018",,playable,2022-07-26 20:17:56 +010069400B6BE000,"For The King",nvdec,playable,2021-02-15 18:51:44 +01001D200BCC4000,"Forager",crash,menus,2021-11-24 07:10:17 +0100AE001256E000,"FORECLOSED",crash;Needs More Attention;nvdec,ingame,2022-12-06 14:41:12 +010044B00E70A000,"Foregone",deadlock,ingame,2020-12-17 15:26:53 +010059E00B93C000,"Forgotton Anne",nvdec,playable,2021-02-15 18:28:07 +01008EA00405C000,"forma.8",nvdec,playable,2020-11-15 01:04:32 +010025400AECE000,"Fortnite",services-horizon,nothing,2024-04-06 18:23:25 +0100AAE01E39C000,"Fortress Challenge - Fort Boyard",nvdec;slow,playable,2020-05-15 13:22:53 +0100CA500756C000,"Fossil Hunters",nvdec,playable,2022-07-27 11:37:20 +01008A100A028000,"FOX n FORESTS",,playable,2021-02-16 14:27:49 +0100D2501001A000,"FoxyLand",,playable,2020-07-29 20:55:20 +01000AC010024000,"FoxyLand 2",,playable,2020-08-06 14:41:30 +01004200099F2000,"Fractured Minds",,playable,2022-09-13 21:21:40 +0100F1A00A5DC000,"FRAMED Collection",nvdec,playable,2022-07-27 11:48:15 +0100AC40108D8000,"Fred3ric",,playable,2021-04-15 13:30:31 +01000490067AE000,"Frederic 2: Evil Strikes Back",,playable,2020-07-23 16:44:37 +01005B1006988000,"Frederic: Resurrection of Music",nvdec,playable,2020-07-23 16:59:53 +010082B00EE50000,"Freedom Finger",nvdec,playable,2021-06-09 19:31:30 +0100EB800B614000,"Freedom Planet",,playable,2020-05-14 12:23:06 +010003F00BD48000,"Friday the 13th: Killer Puzzle",,playable,2021-01-28 01:33:38 +010092A00C4B6000,"Friday the 13th: The Game Ultimate Slasher Edition",nvdec;online-broken;UE4,playable,2022-09-06 17:33:27 +0100F200178F4000,"FRONT MISSION 1st: Remake",,playable,2023-06-09 07:44:24 +0100861012474000,"Frontline Zed",,playable,2020-10-03 12:55:59 +0100B5300B49A000,"Frost",,playable,2022-07-27 12:00:36 +010038A007AA4000,"FruitFall Crush",,playable,2020-10-20 11:33:33 +01008D800AE4A000,"FullBlast",,playable,2020-05-19 10:34:13 +010002F00CC20000,"FUN! FUN! Animal Park",,playable,2021-04-14 17:08:52 +0100A8F00B3D0000,"FunBox Party",,playable,2020-05-15 12:07:02 +0100E7B00BF24000,"Funghi Explosion",,playable,2020-11-23 14:17:41 +01008E10130F8000,"Funimation",gpu,boots,2021-04-08 13:08:17 +0100EA501033C000,"Funny Bunny Adventures",,playable,2020-08-05 13:46:56 +01000EC00AF98000,"Furi",,playable,2022-07-27 12:21:20 +0100A6B00D4EC000,"Furwind",,playable,2021-02-19 19:44:08 +0100ECE00C0C4000,"Fury Unleashed",crash;services,ingame,2020-10-18 11:52:40 +010070000ED9E000,"Fury Unleashed Demo",,playable,2020-10-08 20:09:21 +0100E1F013674000,"FUSER™",nvdec;UE4,playable,2022-10-17 20:58:32 +0100A7A015E4C000,"Fushigi no Gensokyo Lotus Labyrinth",Needs Update;audio;gpu;nvdec,ingame,2021-01-20 15:30:02 +01003C300B274000,"Futari de! Nyanko Daisensou",,playable,2024-01-05 22:26:52 +010055801134E000,"FUZE Player",online-broken;vulkan-backend-bug,ingame,2022-10-18 12:23:53 +0100EAD007E98000,"FUZE4 Nintendo Switch",vulkan-backend-bug,playable,2022-09-06 19:25:01 +010067600F1A0000,"FuzzBall",crash,nothing,2021-03-29 20:13:21 +0100275011e54000,"G-MODE Archives 06 The strongest ever Julia Miyamoto",,playable,2020-10-15 13:06:26 +0100EB10108EA000,"G.I. Joe: Operation Blackout",UE4;crash,boots,2020-11-21 12:37:44 +010048600B14E000,"Gal Metal",,playable,2022-07-27 20:57:48 +010024700901A000,"Gal*Gun 2",nvdec;UE4,playable,2022-07-27 12:45:37 +0100047013378000,"Gal*Gun Returns [ ぎゃる☆がん りたーんず ]",nvdec,playable,2022-10-17 23:50:46 +0100C9800A454000,"GALAK-Z: Variant S",online-broken,boots,2022-07-29 11:59:12 +0100C62011050000,"Game Boy™ – Nintendo Switch Online",,playable,2023-03-21 12:43:48 +010012F017576000,"Game Boy™ Advance – Nintendo Switch Online",,playable,2023-02-16 20:38:15 +0100FA5010788000,"Game Builder Garage™",,ingame,2024-04-20 21:46:22 +0100AF700BCD2000,"Game Dev Story",,playable,2020-05-20 00:00:38 +01006BD00F8C0000,"Game Doraemon Nobita no Shin Kyoryu",gpu,ingame,2023-02-27 02:03:28 +01000FA00A4E4000,"Garage",,playable,2020-05-19 20:59:53 +010061E00E8BE000,"Garfield Kart Furious Racing",ldn-works;loader-allocator,playable,2022-09-13 21:40:25 +0100EA001069E000,"Gates Of Hell",slow,playable,2020-10-22 12:44:26 +010025500C098000,"Gato Roboto",,playable,2023-01-20 15:04:11 +010065E003FD8000,"Gear.Club Unlimited",,playable,2021-06-08 13:03:19 +010072900AFF0000,"Gear.Club Unlimited 2",nvdec;online-broken,playable,2022-07-29 12:52:16 +01000F000D9F0000,"Geki Yaba Runner Anniversary Edition",,playable,2021-02-19 18:59:07 +010052A00942A000,"Gekido Kintaro's Revenge",,playable,2020-10-27 12:44:05 +01009D000AF3A000,"Gelly Break Deluxe",UE4,playable,2021-03-03 16:04:02 +01001A4008192000,"Gem Smashers",nvdec,playable,2021-06-08 13:40:51 +010014901144C000,"Genetic Disaster",,playable,2020-06-19 21:41:12 +0100D7E0110B2000,"Genkai Tokki Moero Crystal H- 極限凸起 萌情水晶 H - 한계돌파 모에로크리스탈 H",32-bit,playable,2022-06-06 00:42:09 +010000300C79C000,"GensokyoDefenders",online-broken;UE4,playable,2022-07-29 13:48:12 +0100AC600EB4C000,"Gensou Rougoku no Kaleidscope",crash,menus,2021-11-24 08:45:07 +01007FC012FD4000,"Georifters",UE4;crash;nvdec,menus,2020-12-04 22:30:50 +010058F010296000,"GERRRMS",,playable,2020-08-15 11:32:52 +01006F30129F8000,"Get 10 quest",,playable,2020-08-03 12:48:39 +0100B5B00E77C000,"Get Over Here",,playable,2022-10-28 11:53:52 +0100EEB005ACC000,"Ghost 1.0",,playable,2021-02-19 20:48:47 +010063200C588000,"Ghost Blade HD",online-broken,playable,2022-09-13 21:51:21 +010057500E744000,"Ghost Grab 3000",,playable,2020-07-11 18:09:52 +010094C00E180000,"Ghost Parade",,playable,2020-07-14 00:43:54 +01004B301108C000,"Ghost Sweeper",,playable,2022-10-10 12:45:36 +010029B018432000,"Ghost Trick: Phantom Detective",,playable,2023-08-23 14:50:12 +010008A00F632000,"Ghostbusters: The Video Game Remastered",nvdec,playable,2021-09-17 07:26:57 +010090F012916000,"Ghostrunner",UE4;crash;gpu;nvdec,ingame,2020-12-17 13:01:59 +0100D6200F2BA000,"Ghosts 'n Goblins Resurrection",,playable,2023-05-09 12:40:41 +01003830092B8000,"Giana Sisters: Twisted Dreams - Owltimate Edition",,playable,2022-07-29 14:06:12 +0100D95012C0A000,"Gibbous - A Cthulhu Adventure",nvdec,playable,2022-10-10 12:57:17 +010045F00BFC2000,"GIGA WRECKER ALT.",,playable,2022-07-29 14:13:54 +01002C400E526000,"Gigantosaurus The Game",UE4,playable,2022-09-27 21:20:00 +0100C50007070000,"Ginger: Beyond the Crystal",,playable,2021-02-17 16:27:00 +01006BA013990000,"Girabox",,playable,2020-12-12 13:55:05 +01007E90116CE000,"Giraffe and Annika",UE4;crash,ingame,2020-12-04 22:41:57 +01006DD00CC96000,"Girls und Panzer Dream Tank Match DX",ldn-untested,playable,2022-09-12 16:07:11 +01005CB009E20000,"Glaive: Brick Breaker",,playable,2020-05-20 12:15:59 +0100B6F01227C000,"Glitch's Trip",,playable,2020-12-17 16:00:57 +0100EB501130E000,"Glyph",,playable,2021-02-08 19:56:51 +0100EB8011B0C000,"Gnome More War",,playable,2020-12-17 16:33:07 +010008D00CCEC000,"Gnomes Garden 2",,playable,2021-02-19 20:08:13 +010036C00D0D6000,"Gnomes Garden: Lost King",deadlock,menus,2021-11-18 11:14:03 +01008EF013A7C000,"Gnosia",,playable,2021-04-05 17:20:30 +01000C800FADC000,"Go All Out!",online-broken,playable,2022-09-21 19:16:34 +010055A0161F4000,"Go Rally",gpu,ingame,2023-08-16 21:18:23 +0100C1800A9B6000,"Go Vacation™",nvdec;ldn-works,playable,2024-05-13 19:28:53 +0100E6300F854000,"Go! Fish Go!",,playable,2020-07-27 13:52:28 +010032600C8CE000,"Goat Simulator: The GOATY",32-bit,playable,2022-07-29 21:02:33 +01001C700873E000,"GOD EATER 3",gpu;nvdec,ingame,2022-07-29 21:33:21 +0100F3D00B032000,"GOD WARS The Complete Legend",nvdec,playable,2020-05-19 14:37:50 +0100CFA0111C8000,"Gods Will Fall",,playable,2021-02-08 16:49:59 +0100D82009024000,"Goetia",,playable,2020-05-19 12:55:39 +01004D501113C000,"Going Under",deadlock;nvdec,ingame,2020-12-11 22:29:46 +0100126006EF0000,"GOKEN",,playable,2020-08-05 20:22:38 +010013800F0A4000,"Golazo!",,playable,2022-09-13 21:58:37 +01003C000D84C000,"Golem Gates",crash;nvdec;online-broken;UE4,ingame,2022-07-30 11:35:11 +0100779004172000,"Golf Story",,playable,2020-05-14 14:56:17 +01006FB00EBE0000,"Golf With Your Friends",online-broken,playable,2022-09-29 12:55:11 +0100EEC00AA6E000,"Gone Home",,playable,2022-08-01 11:14:20 +01007C2002B3C000,"GoNNER",,playable,2020-05-19 12:05:02 +0100B0500FE4E000,"Good Job!™",,playable,2021-03-02 13:15:55 +01003AD0123A2000,"Good Night, Knight",crash,nothing,2023-07-30 23:38:13 +0100F610122F6000,"Good Pizza, Great Pizza",,playable,2020-12-04 22:59:18 +010014C0100C6000,"Goosebumps Dead of Night",gpu;nvdec,ingame,2020-12-10 20:02:16 +0100B8000B190000,"Goosebumps The Game",,playable,2020-05-19 11:56:52 +0100F2A005C98000,"Gorogoa",,playable,2022-08-01 11:55:08 +01000C7003FE8000,"GORSD",,playable,2020-12-04 22:15:21 +0100E8D007E16000,"Gotcha Racing 2nd",,playable,2020-07-23 17:14:04 +01001010121DE000,"Gothic Murder: Adventure That Changes Destiny",deadlock;crash,ingame,2022-09-30 23:16:53 +01003FF009E60000,"Grab the Bottle",,playable,2020-07-14 17:06:41 +01004D10020F2000,"Graceful Explosion Machine",,playable,2020-05-19 20:36:55 +010038D00EC88000,"Grand Brix Shooter",slow,playable,2020-06-24 13:23:54 +010038100D436000,"Grand Guilds",UE4;nvdec,playable,2021-04-26 12:49:05 +0100BE600D07A000,"Grand Prix Story",,playable,2022-08-01 12:42:23 +05B1D2ABD3D30000,"Grand Theft Auto 3",services;crash;homebrew,nothing,2023-05-01 22:01:58 +0100E0600BBC8000,"GRANDIA HD Collection",crash,boots,2024-08-19 04:29:48 +010028200E132000,"Grass Cutter - Mutated Lawns",slow,ingame,2020-05-19 18:27:42 +010074E0099FA000,"Grave Danger",,playable,2020-05-18 17:41:28 +010054A013E0C000,"GraviFire",,playable,2021-04-05 17:13:32 +01002C2011828000,"Gravity Rider Zero",gpu;vulkan-backend-bug,ingame,2022-09-29 13:56:13 +0100BD800DFA6000,"Greedroid",,playable,2020-12-14 11:14:32 +010068D00AE68000,"GREEN",,playable,2022-08-01 12:54:15 +0100CBB0070EE000,"Green Game: TimeSwapper",nvdec,playable,2021-02-19 18:51:55 +0100DFE00F002000,"GREEN The Life Algorithm",,playable,2022-09-27 21:37:13 +0100DA7013792000,"Grey Skies: A War of the Worlds Story",UE4,playable,2022-10-24 11:13:59 +010031200981C000,"Grid Mania",,playable,2020-05-19 14:11:05 +0100197008B52000,"GRIDD: Retroenhanced",,playable,2020-05-20 11:32:40 +0100DC800A602000,"GRID™ Autosport",nvdec;online-broken;ldn-untested,playable,2023-03-02 20:14:45 +0100B7900B024000,"Grim Fandango Remastered",nvdec,playable,2022-08-01 13:55:58 +010078E012D80000,"Grim Legends 2: Song of the Dark Swan",nvdec,playable,2022-10-18 12:58:45 +010009F011F90000,"Grim Legends: The Forsaken Bride",nvdec,playable,2022-10-18 13:14:06 +01001E200F2F8000,"Grimshade",,playable,2022-10-02 12:44:20 +0100538012496000,"Grindstone",,playable,2023-02-08 15:54:06 +0100459009A2A000,"GRIP",nvdec;online-broken;UE4,playable,2022-08-01 15:00:22 +0100E1700C31C000,"GRIS",nvdec,playable,2021-06-03 13:33:44 +01009D7011B02000,"GRISAIA PHANTOM TRIGGER 01&02",nvdec,playable,2022-12-04 21:16:06 +01005250123B8000,"GRISAIA PHANTOM TRIGGER 03",audout,playable,2021-01-31 12:30:47 +0100D970123BA000,"GRISAIA PHANTOM TRIGGER 04",audout,playable,2021-01-31 12:40:37 +01002330123BC000,"GRISAIA PHANTOM TRIGGER 05",audout;nvdec,playable,2021-01-31 12:49:59 +0100CAF013AE6000,"GRISAIA PHANTOM TRIGGER 5.5",audout;nvdec,playable,2021-01-31 12:59:44 +010091300FFA0000,"Grizzland",gpu,ingame,2024-07-11 16:28:34 +0100EB500D92E000,"GROOVE COASTER WAI WAI PARTY!!!!",nvdec;ldn-broken,playable,2021-11-06 14:54:27 +01007E100456C000,"Guacamelee! 2",,playable,2020-05-15 14:56:59 +0100BAE00B470000,"Guacamelee! Super Turbo Championship Edition",,playable,2020-05-13 23:44:18 +010089900C9FA000,"Guess the Character",,playable,2020-05-20 13:14:19 +01005DC00D80C000,"Guess the word",,playable,2020-07-26 21:34:25 +01006F80082E4000,"GUILTY GEAR XX ACCENT CORE PLUS R",nvdec,playable,2021-01-13 09:28:33 +01003C6008940000,"GUNBIRD for Nintendo Switch",32-bit,playable,2021-06-04 19:16:01 +0100BCB00AE98000,"GUNBIRD2 for Nintendo Switch",,playable,2020-10-10 14:41:16 +01003FF010312000,"Gunka o haita neko",gpu;nvdec,ingame,2020-08-25 12:37:56 +010061000D318000,"Gunman Clive HD Collection",,playable,2020-10-09 12:17:35 +01006D4003BCE000,"Guns, Gore and Cannoli 2",online,playable,2021-01-06 18:43:59 +01008C800E654000,"Gunvolt Chronicles Luminous Avenger iX - Retail Version",,playable,2020-06-16 22:47:07 +0100763015C2E000,"Gunvolt Chronicles: Luminous Avenger iX 2",crash;Needs Update,nothing,2022-04-29 15:34:34 +01002C8018554000,"Gurimugurimoa OnceMore Demo",,playable,2022-07-29 22:07:31 +0100AC601DCA8000,"GYLT",crash,ingame,2024-03-18 20:16:51 +0100822012D76000,"HAAK",gpu,ingame,2023-02-19 14:31:05 +01007E100EFA8000,"Habroxia",,playable,2020-06-16 23:04:42 +0100535012974000,"Hades",vulkan,playable,2022-10-05 10:45:21 +0100618010D76000,"Hakoniwa Explorer Plus",slow,ingame,2021-02-19 16:56:19 +0100E0D00C336000,"Halloween Pinball",,playable,2021-01-12 16:00:46 +01006FF014152000,"Hamidashi Creative",gpu,ingame,2021-12-19 15:30:51 +01003B9007E86000,"Hammerwatch",online-broken;ldn-broken,playable,2022-08-01 16:28:46 +01003620068EA000,"Hand of Fate 2",,playable,2022-08-01 15:44:16 +0100973011358000,"Hang The Kings",,playable,2020-07-28 22:56:59 +010066C018E50000,"Happy Animals Mini Golf",gpu,ingame,2022-12-04 19:24:28 +0100ECE00D13E000,"Hard West",regression,nothing,2022-02-09 07:45:56 +0100D55011D60000,"Hardcore Maze Cube",,playable,2020-12-04 20:01:24 +01002F0011DD4000,"HARDCORE MECHA",slow,playable,2020-11-01 15:06:33 +01000C90117FA000,"HardCube",,playable,2021-05-05 18:33:03 +0100BB600C096000,"Hardway Party",,playable,2020-07-26 12:35:07 +0100D0500AD30000,"Harvest Life",,playable,2022-08-01 16:51:45 +010016B010FDE000,"Harvest Moon®: One World",,playable,2023-05-26 09:17:19 +0100A280187BC000,"Harvestella",UE4;vulkan-backend-bug;mac-bug,playable,2024-02-13 07:04:11 +0100E29001298000,"Has-Been Heroes",,playable,2021-01-13 13:31:48 +01001CC00FA1A000,"Hatsune Miku: Project DIVA Mega Mix",audio;online-broken,playable,2024-01-07 23:12:57 +01009E6014F18000,"Haunted Dawn: The Zombie Apocalypse",,playable,2022-10-28 12:31:51 +010023F008204000,"Haunted Dungeons:Hyakki Castle",,playable,2020-08-12 14:21:48 +0100E2600DBAA000,"Haven",,playable,2021-03-24 11:52:41 +0100EA900FB2C000,"Hayfever",loader-allocator,playable,2022-09-22 17:35:41 +0100EFE00E1DC000,"Headliner: NoviNews",online,playable,2021-03-01 11:36:00 +0100A8200C372000,"Headsnatchers",UE4;crash,menus,2020-07-14 13:29:14 +010067400EA5C000,"Headspun",,playable,2020-07-31 19:46:47 +0100D12008EE4000,"Heart&Slash",,playable,2021-01-13 20:56:32 +010059100D928000,"Heaven Dust",,playable,2020-05-17 14:02:41 +0100FD901000C000,"Heaven's Vault",crash,ingame,2021-02-08 18:22:01 +0100B9C012B66000,"Helheim Hassle",,playable,2020-10-14 11:38:36 +0100E4300C278000,"Hell is Other Demons",,playable,2021-01-13 13:23:02 +01000938017E5C00,"Hell Pie0",nvdec;UE4,playable,2022-11-03 16:48:46 +0100A4600E27A000,"Hell Warders",online,playable,2021-02-27 02:31:03 +010044500CF8E000,"Hellblade: Senua's Sacrifice",gpu;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-01 19:36:50 +010087D0084A8000,"Hello Kitty Kruisers With Sanrio Friends",nvdec,playable,2021-06-04 19:08:46 +0100FAA00B168000,"Hello Neighbor",UE4,playable,2022-08-01 21:32:23 +010092B00C4F0000,"Hello Neighbor Hide and Seek",UE4;gpu;slow,ingame,2020-10-24 10:59:57 +010024600C794000,"Hellpoint",,menus,2021-11-26 13:24:20 +0100BEA00E63A000,"Hero Express",nvdec,playable,2020-08-06 13:23:43 +010077D01094C000,"Hero-U: Rogue to Redemption",nvdec,playable,2021-03-24 11:40:01 +0100D2B00BC54000,"Heroes of Hammerwatch - Ultimate Edition",,playable,2022-08-01 18:30:21 +01001B70080F0000,"HEROINE ANTHEM ZERO episode 1",vulkan-backend-bug,playable,2022-08-01 22:02:36 +010057300B0DC000,"Heroki",gpu,ingame,2023-07-30 19:30:01 +0100C2700E338000,"Heroland",,playable,2020-08-05 15:35:39 +01007AC00E012000,"HexaGravity",,playable,2021-05-28 13:47:48 +01004E800F03C000,"Hidden",slow,ingame,2022-10-05 10:56:53 +0100F6A00A684000,"Higurashi no Naku Koro ni Hō",audio,ingame,2021-09-18 14:40:28 +0100F8D0129F4000,"Himehibi 1 gakki - Princess Days",crash,nothing,2021-11-03 08:34:19 +0100F3D008436000,"Hiragana Pixel Party",,playable,2021-01-14 08:36:50 +01004990132AC000,"HITMAN 3 - Cloud Version",Needs Update;crash;services,nothing,2021-04-18 22:35:07 +010083A018262000,"Hitman: Blood Money — Reprisal",deadlock,ingame,2024-09-28 16:28:50 +01004B100A5CC000,"Hob: The Definitive Edition",,playable,2021-01-13 09:39:19 +0100F7300ED2C000,"Hoggy2",,playable,2022-10-10 13:53:35 +0100F7E00C70E000,"Hogwarts Legacy",slow,ingame,2024-09-03 19:53:58 +0100633007D48000,"Hollow Knight",nvdec,playable,2023-01-16 15:44:56 +0100F2100061E800,"Hollow0",UE4;gpu,ingame,2021-03-03 23:42:56 +0100342009E16000,"Holy Potatoes! What The Hell?!",,playable,2020-07-03 10:48:56 +010071B00C904000,"HoPiKo",,playable,2021-01-13 20:12:38 +010087800EE5A000,"Hopping girl KOHANE Jumping Kingdom: Princess of the Black Rabbit",crash,boots,2023-02-19 00:51:21 +010086D011EB8000,"Horace",,playable,2022-10-10 14:03:50 +0100001019F6E000,"Horizon Chase 2",deadlock;slow;crash;UE4,ingame,2024-08-19 04:24:06 +01009EA00B714000,"Horizon Chase Turbo",,playable,2021-02-19 19:40:56 +0100E4200FA82000,"Horror Pinball Bundle",crash,menus,2022-09-13 22:15:34 +0100017007980000,"Hotel Transylvania 3 Monsters Overboard",nvdec,playable,2021-01-27 18:55:31 +0100D0E00E51E000,"Hotline Miami Collection",nvdec,playable,2022-09-09 16:41:19 +0100BDE008218000,"Hotshot Racing",gpu;nvdec;online-broken;ldn-untested;vulkan-backend-bug,ingame,2024-02-04 21:31:17 +0100CAE00EB02000,"House Flipper",,playable,2021-06-16 18:28:32 +0100F6800910A000,"Hover",online-broken,playable,2022-09-20 12:54:46 +0100A66003384000,"Hulu",online-broken,boots,2022-12-09 10:05:00 +0100701001D92000,"Human Resource Machine",32-bit,playable,2020-12-17 21:47:09 +01000CA004DCA000,"Human: Fall Flat",,playable,2021-01-13 18:36:05 +0100E1A00AF40000,"Hungry Shark® World",,playable,2021-01-13 18:26:08 +0100EBA004726000,"Huntdown",,playable,2021-04-05 16:59:54 +010068000CAC0000,"Hunter's Legacy: Purrfect Edition",,playable,2022-08-02 10:33:31 +0100C460040EA000,"Hunting Simulator",UE4,playable,2022-08-02 10:54:08 +010061F010C3A000,"Hunting Simulator 2",UE4,playable,2022-10-10 14:25:51 +0100B3300B4AA000,"Hyper Jam",UE4;crash,boots,2020-12-15 22:52:11 +01003B200B372000,"Hyper Light Drifter - Special Edition",vulkan-backend-bug,playable,2023-01-13 15:44:48 +01006C500A29C000,"HyperBrawl Tournament",crash;services,boots,2020-12-04 23:03:27 +0100A8B00F0B4000,"HYPERCHARGE Unboxed",nvdec;online-broken;UE4;ldn-untested,playable,2022-09-27 21:52:39 +010061400ED90000,"HyperParasite",nvdec;UE4,playable,2022-09-27 22:05:44 +0100959010466000,"Hypnospace Outlaw",nvdec,ingame,2023-08-02 22:46:49 +01002B00111A2000,"Hyrule Warriors: Age of Calamity",gpu;deadlock;slow;crash;nvdec;amd-vendor-bug,ingame,2024-02-28 00:47:00 +0100A2C01320E000,"Hyrule Warriors: Age of Calamity - Demo Version",slow,playable,2022-10-10 17:37:41 +0100AE00096EA000,"Hyrule Warriors: Definitive Edition",services-horizon;nvdec,ingame,2024-06-16 10:34:05 +0100849000BDA000,"I Am Setsuna",,playable,2021-11-28 11:06:11 +01001860140B0000,"I Saw Black Clouds",nvdec,playable,2021-04-19 17:22:16 +0100429006A06000,"I, Zombie",,playable,2021-01-13 14:53:44 +01004E5007E92000,"Ice Age Scrat's Nutty Adventure!",nvdec,playable,2022-09-13 22:22:29 +010053700A25A000,"Ice Cream Surfer",,playable,2020-07-29 12:04:07 +0100954014718000,"Ice Station Z",crash,menus,2021-11-21 20:02:15 +0100BE9007E7E000,"ICEY",,playable,2021-01-14 16:16:04 +0100BC60099FE000,"Iconoclasts",,playable,2021-08-30 21:11:04 +01001E700EB28000,"Idle Champions of the Forgotten Realms",online,boots,2020-12-17 18:24:57 +01002EC014BCA000,"IdolDays",gpu;crash,ingame,2021-12-19 15:31:28 +01006550129C6000,"If Found...",,playable,2020-12-11 13:43:14 +01001AC00ED72000,"If My Heart Had Wings",,playable,2022-09-29 14:54:57 +01009F20086A0000,"Ikaruga",,playable,2023-04-06 15:00:02 +010040900AF46000,"Ikenfell",,playable,2021-06-16 17:18:44 +01007BC00E55A000,"Immortal Planet",,playable,2022-09-20 13:40:43 +010079501025C000,"Immortal Realms: Vampire Wars",nvdec,playable,2021-06-17 17:41:46 +01000F400435A000,"Immortal Redneck",nvdec,playable,2021-01-27 18:36:28 +01004A600EC0A000,"Immortals Fenyx Rising™",gpu;crash,menus,2023-02-24 16:19:55 +0100737003190000,"IMPLOSION",nvdec,playable,2021-12-12 03:52:13 +0100A760129A0000,"In rays of the Light",,playable,2021-04-07 15:18:07 +0100A2101107C000,"Indie Puzzle Bundle Vol 1",,playable,2022-09-27 22:23:21 +010002A00CD68000,"Indiecalypse",nvdec,playable,2020-06-11 20:19:09 +01001D3003FDE000,"Indivisible",nvdec,playable,2022-09-29 15:20:57 +01002BD00F626000,"Inertial Drift",online-broken,playable,2022-10-11 12:22:19 +0100D4300A4CA000,"Infernium",UE4;regression,nothing,2021-01-13 16:36:07 +010039C001296000,"Infinite Minigolf",online,playable,2020-09-29 12:26:25 +01001CB00EFD6000,"Infliction: Extended Cut",nvdec;UE4,playable,2022-10-02 13:15:55 +0100F1401161E000,"INMOST",,playable,2022-10-05 11:27:40 +0100F200049C8000,"InnerSpace",,playable,2021-01-13 19:36:14 +0100D2D009028000,"INSIDE",,playable,2021-12-25 20:24:56 +0100EC7012D34000,"Inside Grass: A little adventure",,playable,2020-10-15 15:26:27 +010099700D750000,"Instant Sports",,playable,2022-09-09 12:59:40 +010099A011A46000,"Instant Sports Summer Games",gpu,menus,2020-09-02 13:39:28 +010031B0145B8000,"INSTANT SPORTS TENNIS",,playable,2022-10-28 16:42:17 +010041501005E000,"Interrogation: You will be deceived",,playable,2022-10-05 11:40:10 +01000F700DECE000,"Into the Dead 2",nvdec,playable,2022-09-14 12:36:14 +01001D0003B96000,"INVERSUS Deluxe",online-broken,playable,2022-08-02 14:35:36 +0100C5B00FADE000,"Invisible Fist",,playable,2020-08-08 13:25:52 +010031B00C48C000,"Invisible, Inc. Nintendo Switch Edition",crash,nothing,2021-01-29 16:28:13 +01005F400E644000,"Invisigun Reloaded",gpu;online,ingame,2021-06-10 12:13:24 +010041C00D086000,"Ion Fury",vulkan-backend-bug,ingame,2022-08-07 08:27:51 +010095C016C14000,"Iridium",,playable,2022-08-05 23:19:53 +0100AD300B786000,"Iris School of Wizardry -Vinculum Hearts-",,playable,2022-12-05 13:11:15 +0100945012168000,"Iris.Fall",nvdec,playable,2022-10-18 13:40:22 +01005270118D6000,"Iron Wings",slow,ingame,2022-08-07 08:32:57 +01004DB003E6A000,"IRONCAST",,playable,2021-01-13 13:54:29 +0100E5700CD56000,"Irony Curtain: From Matryoshka with Love",,playable,2021-06-04 20:12:37 +010063E0104BE000,"Is It Wrong to Try to Pick Up Girls in a Dungeon? Familia Myth Infinite Combate",,playable,2020-08-31 13:52:21 +0100F06013710000,"ISLAND",,playable,2021-05-06 15:11:47 +010077900440A000,"Island Flight Simulator",,playable,2021-06-04 19:42:46 +0100A2600FCA0000,"Island Saver",nvdec,playable,2020-10-23 22:07:02 +010065200D192000,"Isoland",,playable,2020-07-26 13:48:16 +0100F5600D194000,"Isoland 2 - Ashes of Time",,playable,2020-07-26 14:29:05 +010001F0145A8000,"Isolomus",services,boots,2021-11-03 07:48:21 +010068700C70A000,"ITTA",,playable,2021-06-07 03:15:52 +01004070022F0000,"Ittle Dew 2+",,playable,2020-11-17 11:44:32 +0100DEB00F12A000,"IxSHE Tell",nvdec,playable,2022-12-02 18:00:42 +0100D8E00C874000,"izneo",online-broken,menus,2022-08-06 15:56:23 +0100CD5008D9E000,"James Pond Codename Robocod",,playable,2021-01-13 09:48:45 +01005F4010AF0000,"Japanese Rail Sim: Journey to Kyoto",nvdec,playable,2020-07-29 17:14:21 +010002D00EDD0000,"JDM Racing",,playable,2020-08-03 17:02:37 +0100C2700AEB8000,"Jenny LeClue - Detectivu",crash,nothing,2020-12-15 21:07:07 +01006E400AE2A000,"Jeopardy!®",audout;nvdec;online,playable,2021-02-22 13:53:46 +0100E4900D266000,"Jet Kave Adventure",nvdec,playable,2022-09-09 14:50:39 +0100F3500C70C000,"Jet Lancer",gpu,ingame,2021-02-15 18:15:47 +0100A5A00AF26000,"Jettomero: Hero of the Universe",,playable,2022-08-02 14:46:43 +01008330134DA000,"Jiffy",gpu;opengl,ingame,2024-02-03 23:11:24 +01001F5006DF6000,"Jim is Moving Out!",deadlock,ingame,2020-06-03 22:05:19 +0100F4D00D8BE000,"Jinrui no Ninasama he",crash,ingame,2023-03-07 02:04:17 +010038D011F08000,"Jisei: The First Case HD",audio,playable,2022-10-05 11:43:33 +01007CE00C960000,"Job the Leprechaun",,playable,2020-06-05 12:10:06 +01007090104EC000,"John Wick Hex",,playable,2022-08-07 08:29:12 +01006E4003832000,"Johnny Turbo's Arcade: Bad Dudes",,playable,2020-12-10 12:30:56 +010069B002CDE000,"Johnny Turbo's Arcade: Gate Of Doom",,playable,2022-07-29 12:17:50 +010080D002CC6000,"Johnny Turbo's Arcade: Two Crude Dudes",,playable,2022-08-02 20:29:50 +0100D230069CC000,"Johnny Turbo's Arcade: Wizard Fire",,playable,2022-08-02 20:39:15 +01008120128C2000,"JoJos Bizarre Adventure All-Star Battle R",,playable,2022-12-03 10:45:10 +01008B60117EC000,"Journey to the Savage Planet",nvdec;UE4;ldn-untested,playable,2022-10-02 18:48:12 +0100C7600F654000,"Juicy Realm",,playable,2023-02-21 19:16:20 +0100B4D00C76E000,"JUMANJI: The Video Game",UE4;crash,boots,2020-07-12 13:52:25 +0100183010F12000,"JUMP FORCE - Deluxe Edition",nvdec;online-broken;UE4,playable,2023-10-01 15:56:05 +01003D601014A000,"Jump King",,playable,2020-06-09 10:12:39 +0100B9C012706000,"Jump Rope Challenge",services;crash;Needs Update,boots,2023-02-27 01:24:28 +0100D87009954000,"Jumping Joe & Friends",,playable,2021-01-13 17:09:42 +010069800D2B4000,"JUNK PLANET",,playable,2020-11-09 12:38:33 +0100CE100A826000,"Jurassic Pinball",,playable,2021-06-04 19:02:37 +010050A011344000,"Jurassic World Evolution: Complete Edition",cpu;crash,menus,2023-08-04 18:06:54 +0100BCE000598000,"Just Dance 2017®",online,playable,2021-03-05 09:46:01 +0100BEE017FC0000,"Just Dance 2023",,nothing,2023-06-05 16:44:54 +010075600AE96000,"Just Dance® 2019",gpu;online,ingame,2021-02-27 17:21:27 +0100DDB00DB38000,"Just Dance® 2020",,playable,2022-01-24 13:31:57 +0100EA6014BB8000,"Just Dance® 2022",gpu;services;crash;Needs Update,ingame,2022-10-28 11:01:53 +0100AC600CF0A000,"Just Die Already",UE4,playable,2022-12-13 13:37:50 +01002C301033E000,"Just Glide",,playable,2020-08-07 17:38:10 +0100830008426000,"Just Shapes & Beats",ldn-untested;nvdec,playable,2021-02-09 12:18:36 +010035A0044E8000,"JYDGE",,playable,2022-08-02 21:20:13 +0100D58012FC2000,"Kagamihara/Justice",crash,nothing,2021-06-21 16:41:29 +0100D5F00EC52000,"Kairobotica",,playable,2021-05-06 12:17:56 +0100BDC00A664000,"KAMEN RIDER CLIMAX SCRAMBLE",nvdec;ldn-untested,playable,2024-07-03 08:51:11 +0100A9801180E000,"KAMEN RIDER memory of heroez / Premium Sound Edition",,playable,2022-12-06 03:14:26 +010085300314E000,"KAMIKO",,playable,2020-05-13 12:48:57 +010042C011736000,"Kangokuto Mary Skelter Finale",audio;crash,ingame,2021-01-09 22:39:28 +01007FD00DB20000,"Katakoi Contrast - collection of branch -",nvdec,playable,2022-12-09 09:41:26 +0100D7000C2C6000,"Katamari Damacy REROLL",,playable,2022-08-02 21:35:05 +0100F9800EDFA000,"KATANA KAMI: A Way of the Samurai Story",slow,playable,2022-04-09 10:40:16 +010029600D56A000,"Katana ZERO",,playable,2022-08-26 08:09:09 +010038B00F142000,"Kaze and the Wild Masks",,playable,2021-04-19 17:11:03 +0100D7C01115E000,"Keen: One Girl Army",,playable,2020-12-14 23:19:52 +01008D400A584000,"Keep Talking and Nobody Explodes",,playable,2021-02-15 18:05:21 +01004B100BDA2000,"KEMONO FRIENDS PICROSS",,playable,2023-02-08 15:54:34 +0100A8200B15C000,"Kentucky Robo Chicken",,playable,2020-05-12 20:54:17 +0100327005C94000,"Kentucky Route Zero: TV Edition",,playable,2024-04-09 23:22:46 +0100DA200A09A000,"Kero Blaster",,playable,2020-05-12 20:42:52 +0100F680116A2000,"Kholat",UE4;nvdec,playable,2021-06-17 11:52:48 +0100C0A004C2C000,"Kid Tripp",crash,nothing,2020-10-15 07:41:23 +0100FB400D832000,"KILL la KILL -IF",,playable,2020-06-09 14:47:08 +010011B00910C000,"Kill The Bad Guy",,playable,2020-05-12 22:16:10 +0100F2900B3E2000,"Killer Queen Black",ldn-untested;online,playable,2021-04-08 12:46:18 +010014A00C5E0000,"Kin'iro no Corda Octave",,playable,2020-09-22 13:23:12 +010089000F0E8000,"Kine",UE4,playable,2022-09-14 14:28:37 +0100E6B00FFBA000,"King Lucas",,playable,2022-09-21 19:43:23 +0100B1300783E000,"King Oddball",,playable,2020-05-13 13:47:57 +01008D80148C8000,"King of Seas",nvdec;UE4,playable,2022-10-28 18:29:41 +0100515014A94000,"King of Seas Demo",nvdec;UE4,playable,2022-10-28 18:09:31 +01005D2011EA8000,"KINGDOM HEARTS Melody of Memory",crash;nvdec,ingame,2021-03-03 17:34:12 +0100A280121F6000,"Kingdom Rush",32-bit;crash;Needs More Attention,nothing,2022-10-05 12:34:00 +01005EF003FF2000,"Kingdom Two Crowns",,playable,2020-05-16 19:36:21 +0100BD9004AB6000,"Kingdom: New Lands",,playable,2022-08-02 21:48:50 +0100EF50132BE000,"Kingdoms of Amalur: Re-Reckoning",,playable,2023-08-10 13:05:08 +010091201605A000,"Kirby and the Forgotten Land (Demo version)",demo,playable,2022-08-21 21:03:01 +0100227010460000,"Kirby Fighters™ 2",ldn-works;online,playable,2021-06-17 13:06:39 +0100A8E016236000,"Kirby’s Dream Buffet™",crash;online-broken;Needs Update;ldn-works,ingame,2024-03-03 17:04:44 +010091D01A57E000,"Kirby’s Return to Dream Land Deluxe - Demo",demo,playable,2023-02-18 17:21:55 +01006B601380E000,"Kirby’s Return to Dream Land™ Deluxe",,playable,2024-05-16 19:58:04 +01004D300C5AE000,"Kirby™ and the Forgotten Land",gpu,ingame,2024-03-11 17:11:21 +01007E3006DDA000,"Kirby™ Star Allies",nvdec,playable,2023-11-15 17:06:19 +0100F3A00F4CA000,"Kissed by the Baddest Bidder",gpu;nvdec,ingame,2022-12-04 20:57:11 +01000C900A136000,"Kitten Squad",nvdec,playable,2022-08-03 12:01:59 +010079D00C8AE000,"Klondike Solitaire",,playable,2020-12-13 16:17:27 +0100A6800DE70000,"Knight Squad",,playable,2020-08-09 16:54:51 +010024B00E1D6000,"Knight Squad 2",nvdec;online-broken,playable,2022-10-28 18:38:09 +0100D51006AAC000,"Knight Terrors",,playable,2020-05-13 13:09:22 +01005F8010D98000,"Knightin'+",,playable,2020-08-31 18:18:21 +010004400B22A000,"Knights of Pen & Paper 2 Deluxiest Edition",,playable,2020-05-13 14:07:00 +0100D3F008746000,"Knights of Pen and Paper +1 Deluxier Edition",,playable,2020-05-11 21:46:32 +010001A00A1F6000,"Knock-Knock",nvdec,playable,2021-02-01 20:03:19 +01009EF00DDB4000,"Knockout City™",services;online-broken,boots,2022-12-09 09:48:58 +0100C57019BA2000,"Koa and the Five Pirates of Mara",gpu,ingame,2024-07-11 16:14:44 +01001E500401C000,"Koi DX",,playable,2020-05-11 21:37:51 +010052300F612000,"Koi no Hanasaku Hyakkaen",32-bit;gpu;nvdec,ingame,2020-10-03 14:17:10 +01005D200C9AA000,"Koloro",,playable,2022-08-03 12:34:02 +0100464009294000,"Kona",,playable,2022-08-03 12:48:19 +010016C011AAA000,"Kono Subarashii Sekai ni Shukufuku o Kono Yokubo no Isho ni Choai o",,playable,2023-04-26 09:51:08 +010088500D5EE000,"KORAL",UE4;crash;gpu,menus,2020-11-16 12:41:26 +0100EC8004762000,"KORG Gadget for Nintendo Switch",,playable,2020-05-13 13:57:24 +010046600CCA4000,"Kotodama: The 7 Mysteries of Fujisawa",audout,playable,2021-02-01 20:28:37 +010022801242C000,"KukkoroDays",crash,menus,2021-11-25 08:52:56 +010035A00DF62000,"KUNAI",nvdec,playable,2022-09-20 13:48:34 +010060400ADD2000,"Kunio-Kun: The World Classics Collection",online,playable,2021-01-29 20:21:46 +010037500F282000,"KUUKIYOMI 2: Consider It More! - New Era",crash;Needs Update,nothing,2021-11-02 09:34:40 +0100894011F62000,"Kwaidan ~Azuma manor story~",,playable,2022-10-05 12:50:44 +0100830004FB6000,"L.A. Noire",,playable,2022-08-03 16:49:35 +0100732009CAE000,"L.F.O. -Lost Future Omega-",UE4;deadlock,boots,2020-10-16 12:16:44 +0100F2B0123AE000,"L.O.L. Surprise! Remix: We Rule The World",,playable,2022-10-11 22:48:03 +010026000F662800,"LA-MULANA",gpu,ingame,2022-08-12 01:06:21 +0100E5D00F4AE000,"LA-MULANA 1 & 2",,playable,2022-09-22 17:56:36 +010038000F644000,"LA-MULANA 2",,playable,2022-09-03 13:45:57 +010058500B3E0000,"Labyrinth of Refrain: Coven of Dusk",,playable,2021-02-15 17:38:48 +010022D0089AE000,"Labyrinth of the Witch",,playable,2020-11-01 14:42:37 +0100BAB00E8C0000,"Langrisser I & II",,playable,2021-02-19 15:46:10 +0100E7200B272000,"Lanota",,playable,2019-09-04 01:58:14 +01005E000D3D8000,"Lapis x Labyrinth",,playable,2021-02-01 18:58:08 +0100AFE00E882000,"Laraan",,playable,2020-12-16 12:45:48 +0100DA700879C000,"Last Day of June",nvdec,playable,2021-06-08 11:35:32 +01009E100BDD6000,"LASTFIGHT",,playable,2022-09-20 13:54:55 +0100055007B86000,"Late Shift",nvdec,playable,2021-02-01 18:43:58 +01004EB00DACE000,"Later Daters Part One",,playable,2020-07-29 16:35:45 +01001730144DA000,"Layers of Fear 2",nvdec;UE4,playable,2022-10-28 18:49:52 +0100BF5006A7C000,"Layers of Fear: Legacy",nvdec,playable,2021-02-15 16:30:41 +0100CE500D226000,"Layton's Mystery Journey: Katrielle and the Millionaires' Conspiracy - Deluxe Edition",nvdec;opengl,playable,2022-09-14 15:01:57 +0100FDB00AA80000,"Layton's Mystery Journey: Katrielle and the Millionaires' Conspiracy DX+0",gpu;nvdec;opengl,ingame,2022-09-14 15:15:55 +01009C100390E000,"League of Evil",online,playable,2021-06-08 11:23:27 +01002E900CD6E000,"Left-Right : The Mansion",,playable,2020-05-13 13:02:12 +010079901C898000,"Legacy of Kain™ Soul Reaver 1&2 Remastered",,playable,2025-01-07 05:50:01 +01002DB007A96000,"Legend of Kay Anniversary",nvdec,playable,2021-01-29 18:38:29 +0100ECC00EF3C000,"Legend of the Skyfish",,playable,2020-06-24 13:04:22 +01007E900DFB6000,"Legend of the Tetrarchs",deadlock,ingame,2020-07-10 07:54:03 +0100A73006E74000,"Legendary Eleven",,playable,2021-06-08 12:09:03 +0100A7700B46C000,"Legendary Fishing",online,playable,2021-04-14 15:08:46 +0100739018020000,"LEGO® 2K Drive",gpu;ldn-works,ingame,2024-04-09 02:05:12 +01003A30012C0000,"LEGO® CITY Undercover",nvdec,playable,2024-09-30 08:44:27 +010070D009FEC000,"LEGO® DC Super-Villains",,playable,2021-05-27 18:10:37 +010052A00B5D2000,"LEGO® Harry Potter™ Collection",crash,ingame,2024-01-31 10:28:07 +010073C01AF34000,"LEGO® Horizon Adventures™",vulkan-backend-bug;opengl-backend-bug;UE4,ingame,2025-01-07 04:24:56 +01001C100E772000,"LEGO® Jurassic World",,playable,2021-05-27 17:00:20 +0100D3A00409E000,"LEGO® Marvel Super Heroes 2",crash,nothing,2023-03-02 17:12:33 +01006F600FFC8000,"LEGO® Marvel™ Super Heroes",,playable,2024-09-10 19:02:19 +01007FC00206E000,"LEGO® NINJAGO® Movie Video Game",crash,nothing,2022-08-22 19:12:53 +010042D00D900000,"LEGO® Star Wars™: The Skywalker Saga",gpu;slow,ingame,2024-04-13 20:08:46 +0100A01006E00000,"LEGO® The Incredibles",crash,nothing,2022-08-03 18:36:59 +0100838002AEA000,"LEGO® Worlds",crash;slow,ingame,2020-07-17 13:35:39 +0100E7500BF84000,"LEGRAND LEGACY: Tale of the Fatebounds",nvdec,playable,2020-07-26 12:27:36 +0100A8E00CAA0000,"Leisure Suit Larry - Wet Dreams Don't Dry",,playable,2022-08-03 19:51:44 +010031A0135CA000,"Leisure Suit Larry - Wet Dreams Dry Twice",,playable,2022-10-28 19:00:57 +01003AB00983C000,"Lethal League Blaze",online,playable,2021-01-29 20:13:31 +01008C300648E000,"Letter Quest Remastered",,playable,2020-05-11 21:30:34 +0100CE301678E800,"Letters - a written adventure",gpu,ingame,2023-02-21 20:12:38 +01009A200BE42000,"Levelhead",online,ingame,2020-10-18 11:44:51 +0100C960041DC000,"Levels+ : Addictive Puzzle Game",,playable,2020-05-12 13:51:39 +0100C8000F146000,"Liberated",gpu;nvdec,ingame,2024-07-04 04:58:24 +01003A90133A6000,"Liberated: Enhanced Edition",gpu;nvdec,ingame,2024-07-04 04:48:48 +01004360045C8000,"Lichtspeer: Double Speer Edition",,playable,2020-05-12 16:43:09 +010041F0128AE000,"Liege Dragon",,playable,2022-10-12 10:27:03 +010006300AFFE000,"Life Goes On",,playable,2021-01-29 19:01:20 +0100FD101186C000,"Life is Strange 2",UE4,playable,2024-07-04 05:05:58 +0100DC301186A000,"Life is Strange Remastered",UE4,playable,2022-10-03 16:54:44 +010008501186E000,"Life is Strange: Before the Storm Remastered",,playable,2023-09-28 17:15:44 +0100500012AB4000,"Life is Strange: True Colors™",gpu;UE4,ingame,2024-04-08 16:11:52 +01003AB012F00000,"Life of Boris: Super Slav",,ingame,2020-12-17 11:40:05 +0100B3A0135D6000,"Life of Fly",,playable,2021-01-25 23:41:07 +010069A01506E000,"Life of Fly 2",slow,playable,2022-10-28 19:26:52 +01005B6008132000,"Lifeless Planet: Premiere Edition",,playable,2022-08-03 21:25:13 +010030A006F6E000,"Light Fall",nvdec,playable,2021-01-18 14:55:36 +010087700D07C000,"Light Tracer",nvdec,playable,2021-05-05 19:15:43 +01009C8009026000,"LIMBO",cpu;32-bit,boots,2023-06-28 15:39:19 +0100EDE012B58000,"Linelight",,playable,2020-12-17 12:18:07 +0100FAD00E65E000,"Lines X",,playable,2020-05-11 15:28:30 +010032F01096C000,"Lines XL",,playable,2020-08-31 17:48:23 +0100943010310000,"Little Busters! Converted Edition",nvdec,playable,2022-09-29 15:34:56 +0100A3F009142000,"Little Dragons Café",,playable,2020-05-12 00:00:52 +010079A00D9E8000,"Little Friends: Dogs & Cats",,playable,2020-11-12 12:45:51 +0100B18001D8E000,"Little Inferno",32-bit;gpu;nvdec,ingame,2020-12-17 21:43:56 +0100E7000E826000,"Little Misfortune",nvdec,playable,2021-02-23 20:39:44 +0100FE0014200000,"Little Mouse's Encyclopedia",,playable,2022-10-28 19:38:58 +01002FC00412C000,"Little Nightmares Complete Edition",nvdec;UE4,playable,2022-08-03 21:45:35 +010097100EDD6000,"Little Nightmares II",UE4,playable,2023-02-10 18:24:44 +010093A0135D6000,"Little Nightmares II DEMO",UE4;demo;vulkan-backend-bug,playable,2024-05-16 18:47:20 +0100535014D76000,"Little Noah: Scion of Paradise",opengl-backend-bug,playable,2022-09-14 04:17:13 +0100E6D00E81C000,"Little Racer",,playable,2022-10-18 16:41:13 +0100DD700D95E000,"Little Shopping",,playable,2020-10-03 16:34:35 +01000FB00AA90000,"Little Town Hero",,playable,2020-10-15 23:28:48 +01000690085BE000,"Little Triangle",,playable,2020-06-17 14:46:26 +0100CF801776C000,"LIVE A LIVE",UE4;amd-vendor-bug,playable,2023-02-05 15:12:07 +0100BA000FC9C000,"LocO-SportS",,playable,2022-09-20 14:09:30 +010016C009374000,"Lode Runner Legacy",,playable,2021-01-10 14:10:28 +0100D2C013288000,"Lofi Ping Pong",crash,ingame,2020-12-15 20:09:22 +0100B6D016EE6000,"Lone Ruin",crash;nvdec,ingame,2023-01-17 06:41:19 +0100A0C00E0DE000,"Lonely Mountains: Downhill",online-broken,playable,2024-07-04 05:08:11 +010062A0178A8000,"LOOPERS",gpu;slow;crash,ingame,2022-06-17 19:21:45 +010064200F7D8000,"Lost Horizon",,playable,2020-09-01 13:41:22 +01005ED010642000,"Lost Horizon 2",nvdec,playable,2020-06-16 12:02:12 +01005FE01291A000,"Lost in Random™",gpu,ingame,2022-12-18 07:09:28 +0100133014510000,"Lost Lands 2: The Four Horsemen",nvdec,playable,2022-10-24 16:41:00 +0100156014C6A000,"Lost Lands 3: The Golden Curse",nvdec,playable,2022-10-24 16:30:00 +0100BDD010AC8000,"Lost Lands: Dark Overlord",,playable,2022-10-03 11:52:58 +010054600AC74000,"LOST ORBIT: Terminal Velocity",,playable,2021-06-14 12:21:12 +010046600B76A000,"Lost Phone Stories",services,ingame,2020-04-05 23:17:33 +01008AD013A86800,"Lost Ruins",gpu,ingame,2023-02-19 14:09:00 +010077B0038B2000,"LOST SPHEAR",,playable,2021-01-10 06:01:21 +0100018013124000,"Lost Words: Beyond the Page",,playable,2022-10-24 17:03:21 +0100D36011AD4000,"Love Letter from Thief X",gpu;nvdec,ingame,2023-11-14 03:55:31 +0100F0300B7BE000,"Ludomania",crash;services,nothing,2020-04-03 00:33:47 +010048701995E000,"Luigi's Mansion™ 2 HD",ldn-broken;amd-vendor-bug,ingame,2024-09-05 23:47:27 +0100DCA0064A6000,"Luigi’s Mansion™ 3",gpu;slow;Needs Update;ldn-works,ingame,2024-09-27 22:17:36 +010052B00B194000,"Lumini",,playable,2020-08-09 20:45:09 +0100FF00042EE000,"Lumo",nvdec,playable,2022-02-11 18:20:30 +0100F3100EB44000,"Lust for Darkness",nvdec,playable,2020-07-26 12:09:15 +0100F0B00F68E000,"Lust for Darkness: Dawn Edition",nvdec,playable,2021-06-16 13:47:46 +0100EC2011A80000,"Luxar",,playable,2021-03-04 21:11:57 +0100F2400D434000,"MachiKnights -Blood bagos-",nvdec;UE4,playable,2022-09-14 15:08:04 +010024A009428000,"Mad Carnage",,playable,2021-01-10 13:00:07 +01005E7013476000,"Mad Father",,playable,2020-11-12 13:22:10 +010061E00EB1E000,"Mad Games Tycoon",,playable,2022-09-20 14:23:14 +01004A200E722000,"Magazine Mogul",loader-allocator,playable,2022-10-03 12:05:34 +01008E500BF62000,"MagiCat",,playable,2020-12-11 15:22:07 +010032C011356000,"Magicolors",,playable,2020-08-12 18:39:11 +01008C300B624000,"Mahjong Solitaire Refresh",crash,boots,2022-12-09 12:02:55 +010099A0145E8000,"Mahluk dark demon",,playable,2021-04-15 13:14:24 +01001C100D80E000,"Mainlining",,playable,2020-06-05 01:02:00 +0100D9900F220000,"Maitetsu:Pure Station",,playable,2022-09-20 15:12:49 +0100A78017BD6000,"Makai Senki Disgaea 7",,playable,2023-10-05 00:22:18 +01005A700CC3C000,"Mana Spark",,playable,2020-12-10 13:41:01 +010093D00CB22000,"Maneater",nvdec;UE4,playable,2024-05-21 16:11:57 +0100361009B1A000,"Manifold Garden",,playable,2020-10-13 20:27:13 +0100C9A00952A000,"Manticore - Galaxy on Fire",crash;nvdec,boots,2024-02-04 04:37:24 +0100E98002F6E000,"Mantis Burn Racing",online-broken;ldn-broken,playable,2024-09-02 02:13:04 +01008E800D1FE000,"Marble Power Blast",,playable,2021-06-04 16:00:02 +01001B2012D5E000,"Märchen Forest",,playable,2021-02-04 21:33:34 +0100DA7017C9E000,"Marco & The Galaxy Dragon Demo",gpu;demo,ingame,2023-06-03 13:05:33 +01006D0017F7A000,"Mario & Luigi: Brothership",crash;slow;UE4;mac-bug,ingame,2025-01-07 04:00:00 +010002C00C270000,"MARIO & SONIC AT THE OLYMPIC GAMES TOKYO 2020",crash;online-broken;ldn-works,ingame,2024-08-23 16:12:55 +0100317013770000,"MARIO + RABBIDS SPARKS OF HOPE",gpu;Needs Update,ingame,2024-06-20 19:56:19 +010067300059A000,"Mario + Rabbids® Kingdom Battle",slow;opengl-backend-bug,playable,2024-05-06 10:16:54 +0100C9C00E25C000,"Mario Golf™: Super Rush",gpu,ingame,2024-08-18 21:31:48 +0100ED100BA3A000,"Mario Kart Live: Home Circuit™",services;crash;Needs More Attention,nothing,2022-12-07 22:36:52 +0100152000022000,"Mario Kart™ 8 Deluxe",32-bit;ldn-works;LAN;amd-vendor-bug,playable,2024-09-19 11:55:17 +01006FE013472000,"Mario Party™ Superstars",gpu;ldn-works;mac-bug,ingame,2024-05-16 11:23:34 +010019401051C000,"Mario Strikers™: Battle League",crash;nvdec,boots,2024-05-07 06:23:56 +0100BDE00862A000,"Mario Tennis™ Aces",gpu;nvdec;ldn-works;LAN,ingame,2024-09-28 15:54:40 +0100B99019412000,"Mario vs. Donkey Kong™",,playable,2024-05-04 21:22:39 +0100D9E01DBB0000,"Mario vs. Donkey Kong™ Demo",,playable,2024-02-18 10:40:06 +01009A700A538000,"Mark of the Ninja: Remastered",,playable,2022-08-04 15:48:30 +010044600FDF0000,"Marooners",nvdec;online-broken,playable,2022-10-18 21:35:26 +010060700AC50000,"MARVEL ULTIMATE ALLIANCE 3: The Black Order",nvdec;ldn-untested,playable,2024-02-14 19:51:51 +01003DE00C95E000,"Mary Skelter 2",crash;regression,ingame,2023-09-12 07:37:28 +0100113008262000,"Masquerada: Songs and Shadows",,playable,2022-09-20 15:18:54 +01004800197F0000,"Master Detective Archives: Rain Code",gpu,ingame,2024-04-19 20:11:09 +0100CC7009196000,"Masters of Anima",nvdec,playable,2022-08-04 16:00:09 +01004B100A1C4000,"MathLand",,playable,2020-09-01 15:40:06 +0100A8C011F26000,"Max and the book of chaos",,playable,2020-09-02 12:24:43 +01001C9007614000,"Max: The Curse of Brotherhood",nvdec,playable,2022-08-04 16:33:04 +0100E8B012FBC000,"Maze",,playable,2020-12-17 16:13:58 +0100EEF00CBC0000,"MEANDERS",UE4;gpu,ingame,2021-06-11 19:19:33 +0100EC000CE24000,"Mech Rage",,playable,2020-11-18 12:30:16 +0100C4F005EB4000,"Mecho Tales",,playable,2022-08-04 17:03:19 +0100E4600D31A000,"Mechstermination Force",,playable,2024-07-04 05:39:15 +01007580124C0000,"Medarot Classics Plus Kabuto Ver",,playable,2020-11-21 11:31:18 +0100228012682000,"Medarot Classics Plus Kuwagata Ver",,playable,2020-11-21 11:30:40 +0100BBC00CB9A000,"Mega Mall Story",slow,playable,2022-08-04 17:10:58 +0100B0C0086B0000,"Mega Man 11",,playable,2021-04-26 12:07:53 +010038E016264000,"Mega Man Battle Network Legacy Collection Vol. 1",,playable,2023-04-25 03:55:57 +0100734016266000,"Mega Man Battle Network Legacy Collection Vol. 2",,playable,2023-08-03 18:04:32 +01002D4007AE0000,"Mega Man Legacy Collection",gpu,ingame,2021-06-03 18:17:17 +0100842008EC4000,"Mega Man Legacy Collection 2",,playable,2021-01-06 08:47:59 +01005C60086BE000,"Mega Man X Legacy Collection",audio;crash;services,menus,2020-12-04 04:30:17 +010025C00D410000,"Mega Man Zero/ZX Legacy Collection",,playable,2021-06-14 16:17:32 +0100FC700F942000,"Megabyte Punch",,playable,2020-10-16 14:07:18 +010006F011220000,"Megadimension Neptunia VII",32-bit;nvdec,playable,2020-12-17 20:56:03 +010082B00E8B8000,"Megaquarium",,playable,2022-09-14 16:50:00 +010005A00B312000,"Megaton Rainfall",gpu;opengl,boots,2022-08-04 18:29:43 +0100EA100DF92000,"Meiji Katsugeki Haikara Ryuuseigumi - Seibai Shimaseu, Yonaoshi Kagyou",32-bit;nvdec,playable,2022-12-05 13:19:12 +0100B360068B2000,"Mekorama",gpu,boots,2021-06-17 16:37:21 +01000FA010340000,"Melbits World",nvdec;online,menus,2021-11-26 13:51:22 +0100F68019636000,"Melon Journey",,playable,2023-04-23 21:20:01 +010079C012896000,"Memories Off -Innocent Fille- for Dearest",,playable,2020-08-04 07:31:22 +010062F011E7C000,"Memory Lane",UE4,playable,2022-10-05 14:31:03 +0100EBE00D5B0000,"Meow Motors",UE4;gpu,ingame,2020-12-18 00:24:01 +0100273008FBC000,"Mercenaries Saga Chronicles",,playable,2021-01-10 12:48:19 +010094500C216000,"Mercenaries Wings: The False Phoenix",crash;services,nothing,2020-05-08 22:42:12 +0100F900046C4000,"Mercenary Kings: Reloaded Edition",online,playable,2020-10-16 13:05:58 +0100E5000D3CA000,"Merchants of Kaidan",,playable,2021-04-15 11:44:28 +01009A500D4A8000,"METAGAL",,playable,2020-06-05 00:05:48 +010047F01AA10000,"METAL GEAR SOLID 3: Snake Eater - Master Collection Version",services-horizon,menus,2024-07-24 06:34:06 +0100E8F00F6BE000,"METAL MAX Xeno Reborn",,playable,2022-12-05 15:33:53 +01002DE00E5D0000,"Metaloid: Origin",,playable,2020-06-04 20:26:35 +010055200E87E000,"Metamorphosis",UE4;audout;gpu;nvdec,ingame,2021-06-16 16:18:11 +0100D4900E82C000,"Metro 2033 Redux",gpu,ingame,2022-11-09 10:53:13 +0100F0400E850000,"Metro: Last Light Redux",slow;nvdec;vulkan-backend-bug,ingame,2023-11-01 11:53:52 +010012101468C000,"Metroid Prime™ Remastered",gpu;Needs Update;vulkan-backend-bug;opengl-backend-bug,ingame,2024-05-07 22:48:15 +010093801237C000,"Metroid™ Dread",,playable,2023-11-13 04:02:36 +0100A1200F20C000,"Midnight Evil",,playable,2022-10-18 22:55:19 +0100C1E0135E0000,"Mighty Fight Federation",online,playable,2021-04-06 18:39:56 +0100AD701344C000,"Mighty Goose",nvdec,playable,2022-10-28 20:25:38 +01000E2003FA0000,"MIGHTY GUNVOLT BURST",,playable,2020-10-19 16:05:49 +010060D00AE36000,"Mighty Switch Force! Collection",,playable,2022-10-28 20:40:32 +01003DA010E8A000,"Miitopia™",gpu;services-horizon,ingame,2024-09-06 10:39:13 +01007DA0140E8000,"Miitopia™ Demo",services;crash;demo,menus,2023-02-24 11:50:58 +01004B7009F00000,"Miles & Kilo",,playable,2020-10-22 11:39:49 +0100976008FBE000,"Millie",,playable,2021-01-26 20:47:19 +0100F5700C9A8000,"MIND: Path to Thalamus",UE4,playable,2021-06-16 17:37:25 +0100D71004694000,"Minecraft",crash;ldn-broken,ingame,2024-09-29 12:08:59 +01006C100EC08000,"Minecraft Dungeons",nvdec;online-broken;UE4,playable,2024-06-26 22:10:43 +01007C6012CC8000,"Minecraft Legends",gpu;crash,ingame,2024-03-04 00:32:24 +01006BD001E06000,"Minecraft: Nintendo Switch Edition",ldn-broken,playable,2023-10-15 01:47:08 +01003EF007ABA000,"Minecraft: Story Mode - Season Two",online-broken,playable,2023-03-04 00:30:50 +010059C002AC2000,"Minecraft: Story Mode - The Complete Adventure",crash;online-broken,boots,2022-08-04 18:56:58 +0100B7500F756000,"Minefield",,playable,2022-10-05 15:03:29 +01003560119A6000,"Mini Motor Racing X",,playable,2021-04-13 17:54:49 +0100FB700DE1A000,"Mini Trains",,playable,2020-07-29 23:06:20 +010039200EC66000,"Miniature - The Story Puzzle",UE4,playable,2022-09-14 17:18:50 +010069200EB80000,"Ministry of Broadcast",,playable,2022-08-10 00:31:16 +0100C3F000BD8000,"Minna de Wai Wai! Spelunker",crash,nothing,2021-11-03 07:17:11 +0100FAE010864000,"Minoria",,playable,2022-08-06 18:50:50 +01005AB015994000,"Miss Kobayashi's Dragonmaid Burst Forth!! Choro-gon☆Breath",gpu,playable,2022-03-28 02:22:24 +0100CFA0138C8000,"Missile Dancer",,playable,2021-01-31 12:22:03 +0100E3601495C000,"Missing Features: 2D",,playable,2022-10-28 20:52:54 +010059200CC40000,"Mist Hunter",,playable,2021-06-16 13:58:58 +0100F65011E52000,"Mittelborg: City of Mages",,playable,2020-08-12 19:58:06 +0100876015D74000,"MLB® The Show™ 22",gpu;slow,ingame,2023-04-25 06:28:43 +0100A9F01776A000,"MLB® The Show™ 22 Tech Test",services;crash;Needs Update;demo,nothing,2022-12-09 10:28:34 +0100913019170000,"MLB® The Show™ 23",gpu,ingame,2024-07-26 00:56:50 +0100E2E01C32E000,"MLB® The Show™ 24",services-horizon,nothing,2024-03-31 04:54:11 +010011300F74C000,"MO:Astray",crash,ingame,2020-12-11 21:45:44 +010020400BDD2000,"Moai VI: Unexpected Guests",slow,playable,2020-10-27 16:40:20 +0100D8700B712000,"Modern Combat Blackout",crash,nothing,2021-03-29 19:47:15 +010004900D772000,"Modern Tales: Age of Invention",slow,playable,2022-10-12 11:20:19 +0100B8500D570000,"Moero Chronicle™ Hyper",32-bit,playable,2022-08-11 07:21:56 +01004EB0119AC000,"Moero Crystal H",32-bit;nvdec;vulkan-backend-bug,playable,2023-07-05 12:04:22 +0100B46017500000,"MOFUMOFUSENSEN",gpu,menus,2024-09-21 21:51:08 +01004A400C320000,"Momodora: Reverie Under the Moonlight",deadlock,nothing,2022-02-06 03:47:43 +01002CC00BC4C000,"Momonga Pinball Adventures",,playable,2022-09-20 16:00:40 +010093100DA04000,"Momotaro Dentetsu Showa, Heisei, Reiwa mo Teiban!",gpu,ingame,2023-09-22 10:21:46 +0100FBD00ED24000,"MONKEY BARRELS",,playable,2022-09-14 17:28:52 +01004C500B8E0000,"Monkey King: Master of the Clouds",,playable,2020-09-28 22:35:48 +01003030161DC000,"Monomals",gpu,ingame,2024-08-06 22:02:51 +0100F3A00FB78000,"Mononoke Slashdown",crash,menus,2022-05-04 20:55:47 +01007430037F6000,"MONOPOLY® for Nintendo Switch™",nvdec;online-broken,playable,2024-02-06 23:13:01 +01005FF013DC2000,"MONOPOLY® Madness",,playable,2022-01-29 21:13:52 +0100E2D0128E6000,"Monster Blast",gpu,ingame,2023-09-02 20:02:32 +01006F7001D10000,"Monster Boy and the Cursed Kingdom",nvdec,playable,2022-08-04 20:06:32 +01005FC01000E000,"Monster Bugs Eat People",,playable,2020-07-26 02:05:34 +0100742007266000,"Monster Energy Supercross - The Official Videogame",nvdec;UE4,playable,2022-08-04 20:25:00 +0100F8100B982000,"Monster Energy Supercross - The Official Videogame 2",nvdec;UE4;ldn-untested,playable,2022-08-04 21:21:24 +010097800EA20000,"Monster Energy Supercross - The Official Videogame 3",UE4;audout;nvdec;online,playable,2021-06-14 12:37:54 +0100E9900ED74000,"Monster Farm",32-bit;nvdec,playable,2021-05-05 19:29:13 +0100770008DD8000,"Monster Hunter Generations Ultimate™",32-bit;online-broken;ldn-works,playable,2024-03-18 14:35:36 +0100B04011742000,"Monster Hunter Rise",gpu;slow;crash;nvdec;online-broken;Needs Update;ldn-works,ingame,2024-08-24 11:04:59 +010093A01305C000,"Monster Hunter Rise Demo",online-broken;ldn-works;demo,playable,2022-10-18 23:04:17 +0100E21011446000,"Monster Hunter Stories 2: Wings of Ruin",services,ingame,2022-07-10 19:27:30 +010042501329E000,"MONSTER HUNTER STORIES 2: WINGS OF RUIN Trial Version",demo,playable,2022-11-13 22:20:26 +0100C51003B46000,"Monster Hunter XX Demo",32-bit;cpu,nothing,2020-03-22 10:12:28 +0100C3800049C000,"Monster Hunter XX Nintendo Switch Ver ( Double Cross )",,playable,2024-07-21 14:08:09 +010088400366E000,"Monster Jam Crush It!",UE4;nvdec;online,playable,2021-04-08 19:29:27 +010095C00F354000,"Monster Jam Steel Titans",crash;nvdec;UE4,menus,2021-11-14 09:45:38 +010051B0131F0000,"Monster Jam Steel Titans 2",nvdec;UE4,playable,2022-10-24 17:17:59 +01004DE00DD44000,"Monster Puzzle",,playable,2020-09-28 22:23:10 +0100A0F00DA68000,"Monster Sanctuary",crash,ingame,2021-04-04 05:06:41 +0100D30010C42000,"Monster Truck Championship",slow;nvdec;online-broken;UE4,playable,2022-10-18 23:16:51 +01004E10142FE000,"Monster wo taoshite tsuyoi ken ya yoroi wo te ni shinasai. Shinde mo akiramezu ni tsuyoku nari nasai. Yuushatai ga maoh wo taosu sono hi wo shinzite imasu. - モンスターを倒して強い剣や鎧を手にしなさい。死んでも諦めずに強くなりなさい。勇者隊が魔王を倒すその日を信じています。",crash,ingame,2021-07-23 10:56:44 +010039F00EF70000,"Monstrum",,playable,2021-01-31 11:07:26 +0100C2E00B494000,"Moonfall Ultimate",nvdec,playable,2021-01-17 14:01:25 +0100E3D014ABC000,"Moorhuhn Jump and Run 'Traps and Treasures'",,playable,2024-03-08 15:10:02 +010045C00F274000,"Moorhuhn Kart 2",online-broken,playable,2022-10-28 21:10:35 +010040E00F642000,"Morbid: The Seven Acolytes",,playable,2022-08-09 17:21:58 +01004230123E0000,"More Dark",,playable,2020-12-15 16:01:06 +01005DA003E6E000,"Morphies Law",UE4;crash;ldn-untested;nvdec;online,menus,2020-11-22 17:05:29 +0100776003F0C000,"Morphite",,playable,2021-01-05 19:40:55 +0100F2200C984000,"Mortal Kombat 11",slow;nvdec;online-broken;ldn-broken,ingame,2024-06-19 02:22:17 +01006560184E6000,"Mortal Kombat™ 1",gpu,ingame,2024-09-04 15:45:47 +010032800D740000,"Mosaic",,playable,2020-08-11 13:07:35 +01002ED00B01C000,"Moto Racer 4",UE4;nvdec;online,playable,2021-04-08 19:09:11 +01003F200D0F2000,"Moto Rush GT",,playable,2022-08-05 11:23:55 +0100361007268000,"MotoGP™18",nvdec;UE4;ldn-untested,playable,2022-08-05 11:41:45 +01004B800D0E8000,"MotoGP™19",nvdec;online-broken;UE4,playable,2022-08-05 11:54:14 +01001FA00FBBC000,"MotoGP™20",ldn-untested,playable,2022-09-29 17:58:01 +01000F5013820000,"MotoGP™21",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2022-10-28 21:35:08 +010040401D564000,"MotoGP™24",gpu,ingame,2024-05-10 23:41:00 +01002A900D6D6000,"Motorsport Manager for Nintendo Switch™",nvdec,playable,2022-08-05 12:48:14 +01009DB00D6E0000,"Mountain Rescue Simulator",,playable,2022-09-20 16:36:48 +0100C4C00E73E000,"Moving Out",nvdec,playable,2021-06-07 21:17:24 +0100D3300F110000,"Mr Blaster",,playable,2022-09-14 17:56:24 +0100DCA011262000,"Mr. DRILLER DrillLand",nvdec,playable,2020-07-24 13:56:48 +010031F002B66000,"Mr. Shifty",slow,playable,2020-05-08 15:28:16 +01005EF00B4BC000,"Ms. Splosion Man",online,playable,2020-05-09 20:45:43 +010087C009246000,"Muddledash",services,ingame,2020-05-08 16:46:14 +01009D200952E000,"MudRunner - American Wilds",gpu;ldn-untested;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-16 11:40:52 +010073E008E6E000,"Mugsters",,playable,2021-01-28 17:57:17 +0100A8400471A000,"MUJO",,playable,2020-05-08 16:31:04 +0100211005E94000,"Mulaka",,playable,2021-01-28 18:07:20 +010038B00B9AE000,"Mummy Pinball",,playable,2022-08-05 16:08:11 +01008E200C5C2000,"Muse Dash",,playable,2020-06-06 14:41:29 +010035901046C000,"Mushroom Quest",,playable,2020-05-17 13:07:08 +0100700006EF6000,"Mushroom Wars 2",nvdec,playable,2020-09-28 15:26:08 +010046400F310000,"Music Racer",,playable,2020-08-10 08:51:23 +0100153006300000,"Musou Orochi 2 Ultimate",crash;nvdec,boots,2021-04-09 19:39:16 +0100F6000EAA8000,"Must Dash Amigos",,playable,2022-09-20 16:45:56 +01007B6006092000,"MUSYNX",,playable,2020-05-08 14:24:43 +0100C3E00ACAA000,"Mutant Football League: Dynasty Edition",online-broken,playable,2022-08-05 17:01:51 +01004BE004A86000,"Mutant Mudds Collection",,playable,2022-08-05 17:11:38 +0100E6B00DEA4000,"Mutant Year Zero: Road to Eden - Deluxe Edition",nvdec;UE4,playable,2022-09-10 13:31:10 +0100161009E5C000,"MX Nitro: Unleashed",,playable,2022-09-27 22:34:33 +0100218011E7E000,"MX vs ATV All Out",nvdec;UE4;vulkan-backend-bug,playable,2022-10-25 19:51:46 +0100D940063A0000,"MXGP3 - The Official Motocross Videogame",UE4;gpu;nvdec,ingame,2020-12-16 14:00:20 +01002C6012334000,"My Aunt is a Witch",,playable,2022-10-19 09:21:17 +0100F6F0118B8000,"My Butler",,playable,2020-06-27 13:46:23 +010031200B94C000,"My Friend Pedro",nvdec,playable,2021-05-28 11:19:17 +01000D700BE88000,"My Girlfriend is a Mermaid!?",nvdec,playable,2020-05-08 13:32:55 +010039000B68E000,"MY HERO ONE'S JUSTICE",UE4;crash;gpu;online,menus,2020-12-10 13:11:04 +01007E700DBF6000,"MY HERO ONE'S JUSTICE 2",UE4;gpu;nvdec,ingame,2020-12-18 14:08:47 +0100E4701373E000,"My Hidden Things",,playable,2021-04-15 11:26:06 +0100872012B34000,"My Little Dog Adventure",gpu,ingame,2020-12-10 17:47:37 +01008C600395A000,"My Little Riding Champion",slow,playable,2020-05-08 17:00:53 +010086B00C784000,"My Lovely Daughter: ReBorn",,playable,2022-11-24 17:25:32 +0100E7700C284000,"My Memory of Us",,playable,2022-08-20 11:03:14 +010028F00ABAE000,"My Riding Stables - Life with Horses",,playable,2022-08-05 21:39:07 +010042A00FBF0000,"My Riding Stables 2: A New Adventure",,playable,2021-05-16 14:14:59 +0100E25008E68000,"My Time at Portia",,playable,2021-05-28 12:42:55 +0100158011A08000,"My Universe - Cooking Star Restaurant",,playable,2022-10-19 10:00:44 +0100F71011A0A000,"My Universe - Fashion Boutique",nvdec,playable,2022-10-12 14:54:19 +0100CD5011A02000,"My Universe - PET CLINIC CATS & DOGS",crash;nvdec,boots,2022-02-06 02:05:53 +01006C301199C000,"My Universe - School Teacher",nvdec,playable,2021-01-21 16:02:52 +01000D5005974000,"N++ (NPLUSPLUS)",,playable,2022-08-05 21:54:58 +0100A6F00AC70000,"NAIRI: Tower of Shirin",nvdec,playable,2020-08-09 19:49:12 +010002F001220000,"NAMCO MUSEUM",ldn-untested,playable,2024-08-13 07:52:21 +0100DAA00AEE6000,"NAMCO MUSEUM™ ARCADE PAC™",,playable,2021-06-07 21:44:50 +010039F010E14000,"NAMCOT COLLECTION",audio,playable,2020-06-25 13:35:22 +010072B00BDDE000,"Narcos: Rise of the Cartels",UE4;crash;nvdec,boots,2021-03-22 13:18:47 +01006BB00800A000,"NARUTO SHIPPUDEN: Ultimate Ninja STORM 3 Full Burst",nvdec,playable,2024-06-16 14:58:05 +010084D00CF5E000,"NARUTO SHIPPUDEN™: Ultimate Ninja® STORM 4 ROAD TO BORUTO",,playable,2024-06-29 13:04:22 +0100D2D0190A4000,"NARUTO X BORUTO Ultimate Ninja STORM CONNECTIONS",services-horizon,nothing,2024-07-25 05:16:48 +0100715007354000,"NARUTO: Ultimate Ninja STORM",nvdec,playable,2022-08-06 14:10:31 +0100545016D5E000,"NASCAR Rivals",crash;Incomplete,ingame,2023-04-21 01:17:47 +0100103011894000,"Naught",UE4,playable,2021-04-26 13:31:45 +01001AE00C1B2000,"NBA 2K Playgrounds 2",nvdec;online-broken;UE4;vulkan-backend-bug,playable,2022-08-06 14:40:38 +0100760002048000,"NBA 2K18",gpu;ldn-untested,ingame,2022-08-06 14:17:51 +01001FF00B544000,"NBA 2K19",crash;ldn-untested;services,nothing,2021-04-16 13:07:21 +0100E24011D1E000,"NBA 2K21",gpu,boots,2022-10-05 15:31:51 +0100ACA017E4E800,"NBA 2K23",,boots,2023-10-10 23:07:14 +010006501A8D8000,"NBA 2K24 Kobe Bryant Edition",cpu;gpu,boots,2024-08-11 18:23:08 +010002900294A000,"NBA Playgrounds",nvdec;online-broken;UE4,playable,2022-08-06 17:06:59 +0100F5A008126000,"NBA Playgrounds - Enhanced Edition",nvdec;online-broken;UE4,playable,2022-08-06 16:13:44 +0100BBC00E4F8000,"Need a packet?",,playable,2020-08-12 16:09:01 +010029B0118E8000,"Need for Speed™ Hot Pursuit Remastered",online-broken,playable,2024-03-20 21:58:02 +010023500B0BA000,"Nefarious",,playable,2020-12-17 03:20:33 +01008390136FC000,"Negative: The Way of Shinobi",nvdec,playable,2021-03-24 11:29:41 +010065F00F55A000,"Neighbours back From Hell",nvdec,playable,2022-10-12 15:36:48 +0100B4900AD3E000,"NEKOPARA Vol.1",nvdec,playable,2022-08-06 18:25:54 +010012900C782000,"NEKOPARA Vol.2",,playable,2020-12-16 11:04:47 +010045000E418000,"NEKOPARA Vol.3",,playable,2022-10-03 12:49:04 +010049F013656000,"NEKOPARA Vol.4",crash,ingame,2021-01-17 01:47:18 +01006ED00BC76000,"Nelke & the Legendary Alchemists ~Ateliers of the New World~",,playable,2021-01-28 19:39:42 +01005F000B784000,"Nelly Cootalot: The Fowl Fleet",,playable,2020-06-11 20:55:42 +01001AB0141A8000,"Neo : The World Ends with You (DEMO)- 新すばらしきこのせかい (体験版)",crash,ingame,2021-07-18 07:29:18 +0100EBB00D2F4000,"Neo Cab",,playable,2021-04-24 00:27:58 +010040000DB98000,"Neo Cab Demo",crash,boots,2020-06-16 00:14:00 +010006D0128B4000,"NEOGEO POCKET COLOR SELECTION Vol.1",,playable,2023-07-08 20:55:36 +0100BAB01113A000,"Neon Abyss",,playable,2022-10-05 15:59:44 +010075E0047F8000,"Neon Chrome",,playable,2022-08-06 18:38:34 +010032000EAC6000,"Neon Drive",,playable,2022-09-10 13:45:48 +0100B9201406A000,"Neon White",crash,ingame,2023-02-02 22:25:06 +0100743008694000,"Neonwall",nvdec,playable,2022-08-06 18:49:52 +01001A201331E000,"Neoverse Trinity Edition",,playable,2022-10-19 10:28:03 +01000B2011352000,"Nerdook Bundle Vol. 1",gpu;slow,ingame,2020-10-07 14:27:10 +01008B0010160000,"Nerved",UE4,playable,2022-09-20 17:14:03 +0100BA0004F38000,"NeuroVoider",,playable,2020-06-04 18:20:05 +0100C20012A54000,"Nevaeh",gpu;nvdec,ingame,2021-06-16 17:29:03 +010039801093A000,"Never Breakup",,playable,2022-10-05 16:12:12 +0100F79012600000,"Neverending Nightmares",crash;gpu,boots,2021-04-24 01:43:35 +0100A9600EDF8000,"Neverlast",slow,ingame,2020-07-13 23:55:19 +010013700DA4A000,"Neverwinter Nights: Enhanced Edition",gpu;nvdec,menus,2024-09-30 02:59:19 +01004C200100E000,"New Frontier Days ~Founding Pioneers~",,playable,2020-12-10 12:45:07 +0100F4300BF2C000,"New Pokémon Snap™",,playable,2023-01-15 23:26:57 +010017700B6C2000,"New Super Lucky's Tale",,playable,2024-03-11 14:14:10 +0100EA80032EA000,"New Super Mario Bros.™ U Deluxe",32-bit,playable,2023-10-08 02:06:37 +0100B9500E886000,"Newt One",,playable,2020-10-17 21:21:48 +01005A5011A44000,"Nexomon: Extinction",,playable,2020-11-30 15:02:22 +0100B69012EC6000,"Nexoria: Dungeon Rogue Heroes",gpu,ingame,2021-10-04 18:41:29 +0100271004570000,"Next Up Hero",online,playable,2021-01-04 22:39:36 +0100E5600D446000,"Ni no Kuni: Wrath of the White Witch",32-bit;nvdec,boots,2024-07-12 04:52:59 +0100EDD00D530000,"Nice Slice",nvdec,playable,2020-06-17 15:13:27 +01000EC010BF4000,"Niche - a genetics survival game",nvdec,playable,2020-11-27 14:01:11 +010010701AFB2000,"Nickelodeon All-Star Brawl 2",,playable,2024-06-03 14:15:01 +0100D6200933C000,"Nickelodeon Kart Racers",,playable,2021-01-07 12:16:49 +010058800F860000,"Nicky - The Home Alone Golf Ball",,playable,2020-08-08 13:45:39 +0100A95012668000,"Nicole",audout,playable,2022-10-05 16:41:44 +0100B8E016F76000,"NieR:Automata The End of YoRHa Edition",slow;crash,ingame,2024-05-17 01:06:34 +0100F3A0095A6000,"Night Call",nvdec,playable,2022-10-03 12:57:00 +0100921006A04000,"Night in the Woods",,playable,2022-12-03 20:17:54 +0100D8500A692000,"Night Trap - 25th Anniversary Edition",nvdec,playable,2022-08-08 13:16:14 +01005F4009112000,"Nightmare Boy: The New Horizons of Reigns of Dreams, a Metroidvania journey with little rusty nightmares, the empire of knight final boss",,playable,2021-01-05 15:52:29 +01006E700B702000,"Nightmares from the Deep 2: The Siren`s Call",nvdec,playable,2022-10-19 10:58:53 +0100628004BCE000,"Nights of Azure 2: Bride of the New Moon",crash;nvdec;regression,menus,2022-11-24 16:00:39 +010042300C4F6000,"Nightshade/百花百狼",nvdec,playable,2020-05-10 19:43:31 +0100AA0008736000,"Nihilumbra",,playable,2020-05-10 16:00:12 +0100D03003F0E000,"Nine Parchments",ldn-untested,playable,2022-08-07 12:32:08 +0100E2F014F46000,"NINJA GAIDEN Σ",nvdec,playable,2022-11-13 16:27:02 +0100696014F4A000,"NINJA GAIDEN Σ2",nvdec,playable,2024-07-31 21:53:48 +01002AF014F4C000,"NINJA GAIDEN: Master Collection",nvdec,playable,2023-08-11 08:25:31 +010088E003A76000,"Ninja Shodown",,playable,2020-05-11 12:31:21 +010081D00A480000,"Ninja Striker!",,playable,2020-12-08 19:33:29 +0100CCD0073EA000,"Ninjala",online-broken;UE4,boots,2024-07-03 20:04:49 +010003C00B868000,"Ninjin: Clash of Carrots",online-broken,playable,2024-07-10 05:12:26 +0100746010E4C000,"NinNinDays",,playable,2022-11-20 15:17:29 +0100C9A00ECE6000,"Nintendo 64™ – Nintendo Switch Online",gpu;vulkan,ingame,2024-04-23 20:21:07 +0100D870045B6000,"Nintendo Entertainment System™ - Nintendo Switch Online",online,playable,2022-07-01 15:45:06 +0100C4B0034B2000,"Nintendo Labo Toy-Con 01 Variety Kit",gpu,ingame,2022-08-07 12:56:07 +01001E9003502000,"Nintendo Labo Toy-Con 03 Vehicle Kit",services;crash,menus,2022-08-03 17:20:11 +0100165003504000,"Nintendo Labo Toy-Con 04 VR Kit",services;crash,boots,2023-01-17 22:30:24 +01009AB0034E0000,"Nintendo Labo™ Toy-Con 02: Robot Kit",gpu,ingame,2022-08-07 13:03:19 +0100D2F00D5C0000,"Nintendo Switch™ Sports",deadlock,boots,2024-09-10 14:20:24 +01000EE017182000,"Nintendo Switch™ Sports Online Play Test",gpu,ingame,2022-03-16 07:44:12 +010037200C72A000,"Nippon Marathon",nvdec,playable,2021-01-28 20:32:46 +010020901088A000,"Nirvana Pilot Yume",,playable,2022-10-29 11:49:49 +01009B400ACBA000,"No Heroes Here",online,playable,2020-05-10 02:41:57 +0100853015E86000,"No Man's Sky",gpu,ingame,2024-07-25 05:18:17 +0100F0400F202000,"No More Heroes",32-bit,playable,2022-09-13 07:44:27 +010071400F204000,"No More Heroes 2: Desperate Struggle",32-bit;nvdec,playable,2022-11-19 01:38:13 +01007C600EB42000,"No More Heroes 3",gpu;UE4,ingame,2024-03-11 17:06:19 +01009F3011004000,"No Straight Roads",nvdec,playable,2022-10-05 17:01:38 +0100F7D00A1BC000,"NO THING",,playable,2021-01-04 19:06:01 +0100542012884000,"Nongunz: Doppelganger Edition",,playable,2022-10-29 12:00:39 +010016E011EFA000,"Norman's Great Illusion",,playable,2020-12-15 19:28:24 +01001A500AD6A000,"Norn9 ~Norn + Nonette~ LOFN",nvdec;vulkan-backend-bug,playable,2022-12-09 09:29:16 +01004840086FE000,"NORTH",nvdec,playable,2021-01-05 16:17:44 +0100A9E00D97A000,"Northgard",crash,menus,2022-02-06 02:05:35 +01008AE019614000,"nOS new Operating System",,playable,2023-03-22 16:49:08 +0100CB800B07E000,"NOT A HERO: SUPER SNAZZY EDITION",,playable,2021-01-28 19:31:24 +01004D500D9BE000,"Not Not - A Brain Buster",,playable,2020-05-10 02:05:26 +0100DAF00D0E2000,"Not Tonight: Take Back Control Edition",nvdec,playable,2022-10-19 11:48:47 +0100343013248000,"Nubarron: The adventure of an unlucky gnome",,playable,2020-12-17 16:45:17 +01005140089F6000,"Nuclien",,playable,2020-05-10 05:32:55 +010002700C34C000,"Numbala",,playable,2020-05-11 12:01:07 +010020500C8C8000,"Number Place 10000",gpu,menus,2021-11-24 09:14:23 +010003701002C000,"Nurse Love Syndrome",,playable,2022-10-13 10:05:22 +0000000000000000,"nx-hbmenu",Needs Update;homebrew,boots,2024-04-06 22:05:32 +,"nxquake2",services;crash;homebrew,nothing,2022-08-04 23:14:04 +010049F00EC30000,"Nyan Cat: Lost in Space",online,playable,2021-06-12 13:22:03 +01002E6014FC4000,"O---O",,playable,2022-10-29 12:12:14 +010074600CC7A000,"OBAKEIDORO!",nvdec;online,playable,2020-10-16 16:57:34 +01002A000C478000,"Observer",UE4;gpu;nvdec,ingame,2021-03-03 20:19:45 +01007D7001D0E000,"Oceanhorn - Monster of Uncharted Seas",,playable,2021-01-05 13:55:22 +01006CB010840000,"Oceanhorn 2: Knights of the Lost Realm",,playable,2021-05-21 18:26:10 +010096B00A08E000,"Octocopter: Double or Squids",,playable,2021-01-06 01:30:16 +0100CAB006F54000,"Octodad: Dadliest Catch",crash,boots,2021-04-23 15:26:12 +0100A3501946E000,"OCTOPATH TRAVELER II",gpu;amd-vendor-bug,ingame,2024-09-22 11:39:20 +010057D006492000,"Octopath Traveler™",UE4;crash;gpu,ingame,2020-08-31 02:34:36 +010084300C816000,"Odallus: The Dark Call",,playable,2022-08-08 12:37:58 +0100BB500EE3C000,"Oddworld: Munch's Oddysee",gpu;nvdec,ingame,2021-06-17 12:11:50 +01005E700ABB8000,"Oddworld: New 'n' Tasty",nvdec,playable,2021-06-17 17:51:32 +0100D210177C6000,"ODDWORLD: SOULSTORM",services-horizon;crash,boots,2024-08-18 13:13:26 +01002EA00ABBA000,"Oddworld: Stranger's Wrath",crash;nvdec;loader-allocator,menus,2021-11-23 09:23:21 +010029F00C876000,"Odium to the Core",gpu,ingame,2021-01-08 14:03:52 +01006F5013202000,"Off And On Again",,playable,2022-10-29 19:46:26 +01003CD00E8BC000,"Offroad Racing - Buggy X ATV X Moto",online-broken;UE4,playable,2022-09-14 18:53:22 +01003B900AE12000,"Oh My Godheads: Party Edition",,playable,2021-04-15 11:04:11 +0100F45006A00000,"Oh...Sir! The Hollywood Roast",,ingame,2020-12-06 00:42:30 +010030B00B2F6000,"OK K.O.! Let’s Play Heroes",nvdec,playable,2021-01-11 18:41:02 +0100276009872000,"OKAMI HD",nvdec,playable,2024-04-05 06:24:58 +01006AB00BD82000,"OkunoKA",online-broken,playable,2022-08-08 14:41:51 +0100CE2007A86000,"Old Man's Journey",nvdec,playable,2021-01-28 19:16:52 +0100C3D00923A000,"Old School Musical",,playable,2020-12-10 12:51:12 +010099000BA48000,"Old School Racer 2",,playable,2020-10-19 12:11:26 +0100E0200B980000,"OlliOlli: Switch Stance",gpu,boots,2024-04-25 08:36:37 +0100F9D00C186000,"Olympia Soiree",,playable,2022-12-04 21:07:12 +0100A8B00E14A000,"Olympic Games Tokyo 2020 – The Official Video Game™",ldn-untested;nvdec;online,playable,2021-01-06 01:20:24 +01001D600E51A000,"Omega Labyrinth Life",,playable,2021-02-23 21:03:03 +01005DE00CA34000,"Omega Vampire",nvdec,playable,2020-10-17 19:15:35 +0100CDC00C40A000,"Omensight: Definitive Edition",UE4;crash;nvdec,ingame,2020-07-26 01:45:14 +01006DB00D970000,"OMG Zombies!",32-bit,playable,2021-04-12 18:04:45 +010014E017B14000,"OMORI",,playable,2023-01-07 20:21:02 +0100A5F011800000,"Once Upon A Coma",nvdec,playable,2020-08-01 12:09:39 +0100BD3006A02000,"One More Dungeon",,playable,2021-01-06 09:10:58 +010076600FD64000,"One Person Story",,playable,2020-07-14 11:51:02 +0100774009CF6000,"ONE PIECE Pirate Warriors 3 Deluxe Edition",nvdec,playable,2020-05-10 06:23:52 +01008FE00E2F6000,"ONE PIECE: PIRATE WARRIORS 4",online-broken;ldn-untested,playable,2022-09-27 22:55:46 +0100574002AF4000,"ONE PIECE: Unlimited World Red Deluxe Edition",,playable,2020-05-10 22:26:32 +0100EEA00E3EA000,"One-Way Ticket",UE4,playable,2020-06-20 17:20:49 +0100463013246000,"Oneiros",,playable,2022-10-13 10:17:22 +010057C00D374000,"Oniken",,playable,2022-09-10 14:22:38 +010037900C814000,"Oniken: Unstoppable Edition",,playable,2022-08-08 14:52:06 +0100416008A12000,"Onimusha: Warlords",nvdec,playable,2020-07-31 13:08:39 +0100CF4011B2A000,"OniNaki",nvdec,playable,2021-02-27 21:52:42 +010074000BE8E000,"oOo: Ascension",,playable,2021-01-25 14:13:34 +0100D5400BD90000,"Operación Triunfo 2017",services;nvdec,ingame,2022-08-08 15:06:42 +01006CF00CFA4000,"Operencia: The Stolen Sun",UE4;nvdec,playable,2021-06-08 13:51:07 +01004A200BE82000,"OPUS Collection",,playable,2021-01-25 15:24:04 +010049C0075F0000,"OPUS: The Day We Found Earth",nvdec,playable,2021-01-21 18:29:31 +0100F9A012892000,"Ord.",,playable,2020-12-14 11:59:06 +010061D00DB74000,"Ori and the Blind Forest: Definitive Edition",nvdec;online-broken,playable,2022-09-14 19:58:13 +010005800F46E000,"Ori and the Blind Forest: Definitive Edition Demo",,playable,2022-09-10 14:40:12 +01008DD013200000,"Ori and the Will of the Wisps",gpu,ingame,2025-01-11 06:09:54 +01006C70102EA000,"Orn: The Tiny Forest Sprite",UE4;gpu,ingame,2020-08-07 14:25:30 +0100E5900F49A000,"Othercide",nvdec,playable,2022-10-05 19:04:38 +01006AA00EE44000,"Otokomizu",,playable,2020-07-13 21:00:44 +01006AF013A9E000,"Otti: The House Keeper",,playable,2021-01-31 12:11:24 +01000320060AC000,"OTTTD: Over The Top Tower Defense",slow,ingame,2020-10-10 19:31:07 +010097F010FE6000,"Our Two Bedroom Story",gpu;nvdec,ingame,2023-10-10 17:41:20 +0100D5D00C6BE000,"Our World Is Ended.",nvdec,playable,2021-01-19 22:46:57 +01005A700A166000,"OUT OF THE BOX",,playable,2021-01-28 01:34:27 +0100D9F013102000,"Outbreak Lost Hope",crash,boots,2021-04-26 18:01:23 +01006EE013100000,"Outbreak The Nightmare Chronicles",,playable,2022-10-13 10:41:57 +0100A0D013464000,"Outbreak: Endless Nightmares",,playable,2022-10-29 12:35:49 +0100C850130FE000,"Outbreak: Epidemic",,playable,2022-10-13 10:27:31 +0100B450130FC000,"Outbreak: The New Nightmare",,playable,2022-10-19 15:42:07 +0100B8900EFA6000,"Outbuddies DX",gpu,ingame,2022-08-04 22:39:24 +0100DE70085E8000,"Outlast 2",crash;nvdec,ingame,2022-01-22 22:28:05 +01008D4007A1E000,"Outlast: Bundle of Terror",nvdec;loader-allocator;vulkan-backend-bug,playable,2024-01-27 04:44:26 +01009B900401E000,"Overcooked Special Edition",,playable,2022-08-08 20:48:52 +01006FD0080B2000,"Overcooked! 2",ldn-untested,playable,2022-08-08 16:48:10 +0100F28011892000,"Overcooked! All You Can Eat",ldn-untested;online,playable,2021-04-15 10:33:52 +0100D7F00EC64000,"Overlanders",nvdec;UE4,playable,2022-09-14 20:15:06 +01008EA00E816000,"OVERPASS™",online-broken;UE4;ldn-untested,playable,2022-10-17 15:29:47 +0100647012F62000,"Override 2: Super Mech League",online-broken;UE4,playable,2022-10-19 15:56:04 +01008A700F7EE000,"Override: Mech City Brawl - Super Charged Mega Edition",nvdec;online-broken;UE4,playable,2022-09-20 17:33:32 +0100F8600E21E000,"Overwatch® 2",deadlock,boots,2022-09-14 20:22:22 +01005F000CC18000,"OVERWHELM",,playable,2021-01-21 18:37:18 +0100BC2004FF4000,"Owlboy",,playable,2020-10-19 14:24:45 +0100AD9012510000,"PAC-MAN™ 99",gpu;online-broken,ingame,2024-04-23 00:48:25 +010024C001224000,"PAC-MAN™ CHAMPIONSHIP EDITION 2 PLUS",,playable,2021-01-19 22:06:18 +011123900AEE0000,"Paladins",online,menus,2021-01-21 19:21:37 +0100F0D004CAE000,"PAN-PAN A tiny big adventure",audout,playable,2021-01-25 14:42:00 +010083700B730000,"Pang Adventures",,playable,2021-04-10 12:16:59 +010006E00DFAE000,"Pantsu Hunter: Back to the 90s",,playable,2021-02-19 15:12:27 +0100C6A00E94A000,"Panzer Dragoon: Remake",,playable,2020-10-04 04:03:55 +01004AE0108E0000,"Panzer Paladin",,playable,2021-05-05 18:26:00 +010004500DE50000,"Paper Dolls Original",UE4;crash,boots,2020-07-13 20:26:21 +0100A3900C3E2000,"Paper Mario™: The Origami King",audio;Needs Update,playable,2024-08-09 18:27:40 +0100ECD018EBE000,"Paper Mario™: The Thousand-Year Door",gpu;intel-vendor-bug;slow,ingame,2025-01-07 04:27:35 +01006AD00B82C000,"Paperbound Brawlers",,playable,2021-01-25 14:32:15 +0100DC70174E0000,"Paradigm Paradox",vulkan-backend-bug,playable,2022-12-03 22:28:13 +01007FB010DC8000,"Paradise Killer",UE4,playable,2022-10-05 19:33:05 +010063400B2EC000,"Paranautical Activity",,playable,2021-01-25 13:49:19 +01006B5012B32000,"Part Time UFO™",crash,ingame,2023-03-03 03:13:05 +01007FC00A040000,"Party Arcade",online-broken;UE4;ldn-untested,playable,2022-08-09 12:32:53 +0100B8E00359E000,"Party Golf",nvdec,playable,2022-08-09 12:38:30 +010022801217E000,"Party Hard 2",nvdec,playable,2022-10-05 20:31:48 +010027D00F63C000,"Party Treats",,playable,2020-07-02 00:05:00 +01001E500EA16000,"Path of Sin: Greed",crash,menus,2021-11-24 08:00:00 +010031F006E76000,"Pato Box",,playable,2021-01-25 15:17:52 +01001F201121E000,"PAW Patrol Mighty Pups Save Adventure Bay",,playable,2022-10-13 12:17:55 +0100360016800000,"PAW Patrol: Grand Prix",gpu,ingame,2024-05-03 16:16:11 +0100CEC003A4A000,"PAW Patrol: On a Roll!",nvdec,playable,2021-01-28 21:14:49 +01000C4015030000,"Pawapoke R",services-horizon,nothing,2024-05-14 14:28:32 +0100A56006CEE000,"Pawarumi",online-broken,playable,2022-09-10 15:19:33 +0100274004052000,"PAYDAY 2",nvdec;online-broken;ldn-untested,playable,2022-08-09 12:56:39 +010085700ABC8000,"PBA Pro Bowling",nvdec;online-broken;UE4,playable,2022-09-14 23:00:49 +0100F95013772000,"PBA Pro Bowling 2021",online-broken;UE4,playable,2022-10-19 16:46:40 +010072800CBE8000,"PC Building Simulator",,playable,2020-06-12 00:31:58 +010002100CDCC000,"Peaky Blinders: Mastermind",,playable,2022-10-19 16:56:35 +010028A0048A6000,"Peasant Knight",,playable,2020-12-22 09:30:50 +0100C510049E0000,"Penny-Punching Princess",,playable,2022-08-09 13:37:05 +0100CA901AA9C000,"Penny’s Big Breakaway",amd-vendor-bug,playable,2024-05-27 07:58:51 +0100563005B70000,"Perception",UE4;crash;nvdec,menus,2020-12-18 11:49:23 +010011700D1B2000,"Perchang",,playable,2021-01-25 14:19:52 +010089F00A3B4000,"Perfect Angle",,playable,2021-01-21 18:48:45 +01005CD012DC0000,"Perky Little Things",crash;vulkan,boots,2024-08-04 07:22:46 +01005EB013FBA000,"Persephone",,playable,2021-03-23 22:39:19 +0100A0300FC3E000,"Perseverance",,playable,2020-07-13 18:48:27 +010062B01525C000,"Persona 4 Golden",,playable,2024-08-07 17:48:07 +01005CA01580E000,"Persona 5 Royal",gpu,ingame,2024-08-17 21:45:15 +010087701B092000,"Persona 5 Tactica",,playable,2024-04-01 22:21:03 +0100E4F010D92000,"Persona 5: Scramble",deadlock,boots,2020-10-04 03:22:29 +0100801011C3E000,"Persona® 5 Strikers",nvdec;mac-bug,playable,2023-09-26 09:36:01 +010044400EEAE000,"Petoons Party",nvdec,playable,2021-03-02 21:07:58 +010053401147C000,"PGA TOUR 2K21",deadlock;nvdec,ingame,2022-10-05 21:53:50 +0100DDD00C0EA000,"Phantaruk",,playable,2021-06-11 18:09:54 +0100063005C86000,"Phantom Breaker: Battle Grounds Overdrive",audio;nvdec,playable,2024-02-29 14:20:35 +010096F00E5B0000,"Phantom Doctrine",UE4,playable,2022-09-15 10:51:50 +0100C31005A50000,"Phantom Trigger",,playable,2022-08-09 14:27:30 +0100CB000A142000,"Phoenix Wright: Ace Attorney Trilogy",,playable,2023-09-15 22:03:12 +0100DA400F624000,"PHOGS!",online,playable,2021-01-18 15:18:37 +0100BF1003B9A000,"Physical Contact: 2048",slow,playable,2021-01-25 15:18:32 +01008110036FE000,"Physical Contact: SPEED",,playable,2022-08-09 14:40:46 +010077300A86C000,"PIANISTA",online-broken,playable,2022-08-09 14:52:56 +010012100E8DC000,"PICROSS LORD OF THE NAZARICK",,playable,2023-02-08 15:54:56 +0100C9600A88E000,"PICROSS S2",,playable,2020-10-15 12:01:40 +010079200D330000,"PICROSS S3",,playable,2020-10-15 11:55:27 +0100C250115DC000,"PICROSS S4",,playable,2020-10-15 12:33:46 +0100AC30133EC000,"PICROSS S5",,playable,2022-10-17 18:51:42 +010025901432A000,"PICROSS S6",,playable,2022-10-29 17:52:19 +01009B2016104000,"PICROSS S7",,playable,2022-02-16 12:51:25 +010043B00E1CE000,"PictoQuest",,playable,2021-02-27 15:03:16 +0100D06003056000,"Piczle Lines DX",UE4;crash;nvdec,menus,2020-11-16 04:21:31 +010017600B532000,"Piczle Lines DX 500 More Puzzles!",UE4,playable,2020-12-15 23:42:51 +01000FD00D5CC000,"Pig Eat Ball",services,ingame,2021-11-30 01:57:45 +01001CB0106F8000,"Pikmin 3 Deluxe Demo",32-bit;crash;demo;gpu,ingame,2021-06-16 18:38:07 +0100E0B019974000,"Pikmin 4 Demo",gpu;nvdec;UE4;demo;amd-vendor-bug,ingame,2023-09-22 21:41:08 +0100AA80194B0000,"Pikmin™ 1",audio,ingame,2024-05-28 18:56:11 +0100D680194B2000,"Pikmin™ 1+2",gpu,ingame,2023-07-31 08:53:41 +0100F4C009322000,"Pikmin™ 3 Deluxe",gpu;32-bit;nvdec;Needs Update,ingame,2024-09-03 00:28:26 +0100B7C00933A000,"Pikmin™ 4",gpu;crash;UE4,ingame,2024-08-26 03:39:08 +0100D6200E130000,"Pillars of Eternity: Complete Edition",,playable,2021-02-27 00:24:21 +01007A500B0B2000,"Pilot Sports",,playable,2021-01-20 15:04:17 +0100DA70186D4000,"Pinball FX",,playable,2024-05-03 17:09:11 +0100DB7003828000,"Pinball FX3",online-broken,playable,2022-11-11 23:49:07 +01002BA00D662000,"Pine",slow,ingame,2020-07-29 16:57:39 +010041100B148000,"Pinstripe",,playable,2020-11-26 10:40:40 +01002B20174EE000,"Piofiore: Episodio 1926",,playable,2022-11-23 18:36:05 +01009240117A2000,"Piofiore: Fated Memories",nvdec,playable,2020-11-30 14:27:50 +0100EA2013BCC000,"Pixel Game Maker Series Puzzle Pedestrians",,playable,2022-10-24 20:15:50 +0100859013CE6000,"Pixel Game Maker Series Werewolf Princess Kaguya",crash;services,nothing,2021-03-26 00:23:07 +010060A00F5E8000,"Pixel Gladiator",,playable,2020-07-08 02:41:26 +010000E00E612000,"Pixel Puzzle Makeout League",,playable,2022-10-13 12:34:00 +0100382011002000,"PixelJunk Eden 2",crash,ingame,2020-12-17 11:55:52 +0100E4D00A690000,"PixelJunk™ Monsters 2",,playable,2021-06-07 03:40:01 +01004A900C352000,"Pizza Titan Ultra",nvdec,playable,2021-01-20 15:58:42 +05000FD261232000,"Pizza Tower",crash,ingame,2024-09-16 00:21:56 +0100FF8005EB2000,"Plague Road",,playable,2022-08-09 15:27:14 +010030B00C316000,"Planescape: Torment and Icewind Dale: Enhanced Editions",cpu;32-bit;crash;Needs Update,boots,2022-09-10 03:58:26 +010003C0099EE000,"PLANET ALPHA",UE4;gpu,ingame,2020-12-16 14:42:20 +01007EA019CFC000,"Planet Cube: Edge",,playable,2023-03-22 17:10:12 +0100F0A01F112000,"planetarian: The Reverie of a Little Planet & Snow Globe",,playable,2020-10-17 20:26:20 +010087000428E000,"Plantera Deluxe",,playable,2022-08-09 15:36:28 +0100C56010FD8000,"Plants vs. Zombies: Battle for Neighborville™ Complete Edition",gpu;audio;crash,boots,2024-09-02 12:58:14 +0100E5B011F48000,"PLOID SAGA",,playable,2021-04-19 16:58:45 +01009440095FE000,"Pode",nvdec,playable,2021-01-25 12:58:35 +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 +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 +01009AD008C4C000,"Pokémon: Let's Go, Pikachu! demo",slow;demo,playable,2023-11-26 11:23:20 +0100000011D90000,"Pokémon™ Brilliant Diamond",gpu;ldn-works,ingame,2024-08-28 13:26:35 +010015F008C54000,"Pokémon™ HOME",Needs Update;crash;services,menus,2020-12-06 06:01:51 +01001F5010DFA000,"Pokémon™ Legends: Arceus",gpu;Needs Update;ldn-works,ingame,2024-09-19 10:02:02 +01005D100807A000,"Pokémon™ Quest",,playable,2022-02-22 16:12:32 +0100A3D008C5C000,"Pokémon™ Scarlet",gpu;nvdec;ldn-works;amd-vendor-bug,ingame,2023-12-14 13:18:29 +01008F6008C5E000,"Pokémon™ Violet",gpu;nvdec;ldn-works;amd-vendor-bug;mac-bug,ingame,2024-07-30 02:51:48 +0100187003A36000,"Pokémon™: Let’s Go, Eevee!",crash;nvdec;online-broken;ldn-broken,ingame,2024-06-01 15:03:04 +010003F003A34000,"Pokémon™: Let’s Go, Pikachu!",crash;nvdec;online-broken;ldn-broken,ingame,2024-03-15 07:55:41 +0100B3F000BE2000,"Pokkén Tournament™ DX",nvdec;ldn-works;opengl-backend-bug;LAN;amd-vendor-bug;intel-vendor-bug,playable,2024-07-18 23:11:08 +010030D005AE6000,"Pokkén Tournament™ DX Demo",demo;opengl-backend-bug,playable,2022-08-10 12:03:19 +0100A3500B4EC000,"Polandball: Can Into Space",,playable,2020-06-25 15:13:26 +0100EAB00605C000,"Poly Bridge",services,playable,2020-06-08 23:32:41 +010017600B180000,"Polygod",slow;regression,ingame,2022-08-10 14:38:14 +010074B00ED32000,"Polyroll",gpu,boots,2021-07-01 16:16:50 +010096B01179A000,"Ponpu",,playable,2020-12-16 19:09:34 +01005C5011086000,"Pooplers",,playable,2020-11-02 11:52:10 +01007EF013CA0000,"Port Royale 4",crash;nvdec,menus,2022-10-30 14:34:06 +01007BB017812000,"Portal",,playable,2024-06-12 03:48:29 +0100ABD01785C000,"Portal 2",gpu,ingame,2023-02-20 22:44:15 +010050D00FE0C000,"Portal Dogs",,playable,2020-09-04 12:55:46 +0100437004170000,"Portal Knights",ldn-untested;online,playable,2021-05-27 19:29:04 +01005FC010EB2000,"Potata: Fairy Flower",nvdec,playable,2020-06-17 09:51:34 +01000A4014596000,"Potion Party",,playable,2021-05-06 14:26:54 +0100E1E00CF1A000,"Power Rangers: Battle for the Grid",,playable,2020-06-21 16:52:42 +0100D1C01C194000,"Powerful Pro Baseball 2024-2025",gpu,ingame,2024-08-25 06:40:48 +01008E100E416000,"PowerSlave Exhumed",gpu,ingame,2023-07-31 23:19:10 +010054F01266C000,"Prehistoric Dude",gpu,ingame,2020-10-12 12:38:48 +0100DB200D3E4000,"Pretty Princess Magical Coordinate",,playable,2020-10-15 11:43:41 +01007F00128CC000,"Pretty Princess Party",,playable,2022-10-19 17:23:58 +010009300D278000,"Preventive Strike",nvdec,playable,2022-10-06 10:55:51 +0100210019428000,"Prince of Persia The Lost Crown",crash,ingame,2024-06-08 21:31:58 +01007A3009184000,"Princess Peach™: Showtime!",UE4,playable,2024-09-21 13:39:45 +010024701DC2E000,"Princess Peach™: Showtime! Demo",UE4;demo,playable,2024-03-10 17:46:45 +01001FA01451C000,"Prinny Presents NIS Classics Volume 1: Phantom Brave: The Hermuda Triangle Remastered / Soul Nomad & the World Eaters",crash;Needs Update,boots,2023-02-02 07:23:09 +01008FA01187A000,"Prinny® 2: Dawn of Operation Panties, Dood!",32-bit,playable,2022-10-13 12:42:58 +01007A0011878000,"Prinny®: Can I Really Be the Hero?",32-bit;nvdec,playable,2023-10-22 09:25:25 +010007F00879E000,"PriPara: All Idol Perfect Stage",,playable,2022-11-22 16:35:52 +010029200AB1C000,"Prison Architect: Nintendo Switch™ Edition",,playable,2021-04-10 12:27:58 +0100C1801B914000,"Prison City",gpu,ingame,2024-03-01 08:19:33 +0100F4800F872000,"Prison Princess",,playable,2022-11-20 15:00:25 +0100A9800A1B6000,"Professional Construction – The Simulation",slow,playable,2022-08-10 15:15:45 +010077B00BDD8000,"Professional Farmer: Nintendo Switch™ Edition",slow,playable,2020-12-16 13:38:19 +010018300C83A000,"Professor Lupo and his Horrible Pets",,playable,2020-06-12 00:08:45 +0100D1F0132F6000,"Professor Lupo: Ocean",,playable,2021-04-14 16:33:33 +0100BBD00976C000,"Project Highrise: Architect's Edition",,playable,2022-08-10 17:19:12 +0100ACE00DAB6000,"Project Nimbus: Complete Edition",nvdec;UE4;vulkan-backend-bug,playable,2022-08-10 17:35:43 +01002980140F6000,"Project TRIANGLE STRATEGY™ Debut Demo",UE4;demo,playable,2022-10-24 21:40:27 +0100BDB01150E000,"Project Warlock",,playable,2020-06-16 10:50:41 +01009F100BC52000,"Psikyo Collection Vol 1",32-bit,playable,2020-10-11 13:18:47 +0100A2300DB78000,"Psikyo Collection Vol. 3",,ingame,2021-06-07 02:46:23 +01009D400C4A8000,"Psikyo Collection Vol.2",32-bit,playable,2021-06-07 03:22:07 +01007A200F2E2000,"Psikyo Shooting Stars Alpha",32-bit,playable,2021-04-13 12:03:43 +0100D7400F2E4000,"Psikyo Shooting Stars Bravo",32-bit,playable,2021-06-14 12:09:07 +0100EC100A790000,"PSYVARIAR DELTA",nvdec,playable,2021-01-20 13:01:46 +0100AE700F184000,"Puchitto kurasutā",Need-Update;crash;services,menus,2020-07-04 16:44:28 +0100D61010526000,"Pulstario",,playable,2022-10-06 11:02:01 +01009AE00B788000,"Pumped BMX Pro",nvdec;online-broken,playable,2022-09-20 17:40:50 +01006C10131F6000,"Pumpkin Jack",nvdec;UE4,playable,2022-10-13 12:52:32 +010016400F07E000,"Push the Crate",nvdec;UE4,playable,2022-09-15 13:28:41 +0100B60010432000,"Push the Crate 2",UE4;gpu;nvdec,ingame,2021-06-10 14:20:01 +0100F1200F6D8000,"Pushy and Pully in Blockland",,playable,2020-07-04 11:44:41 +0100AAE00CAB4000,"Puyo Puyo Champions",online,playable,2020-06-19 11:35:08 +010038E011940000,"Puyo Puyo™ Tetris® 2",ldn-untested,playable,2023-09-26 11:35:25 +0100C5700ECE0000,"Puzzle & Dragons GOLD",slow,playable,2020-05-13 15:09:34 +010079E01A1E0000,"Puzzle Bobble Everybubble!",audio;ldn-works,playable,2023-06-10 03:53:40 +010043100F0EA000,"Puzzle Book",,playable,2020-09-28 13:26:01 +0100476004A9E000,"Puzzle Box Maker",nvdec;online-broken,playable,2022-08-10 18:00:52 +0100A4E017372000,"Pyramid Quest",gpu,ingame,2023-08-16 21:14:52 +0100F1100E606000,"Q-YO Blaster",gpu,ingame,2020-06-07 22:36:53 +010023600AA34000,"Q.U.B.E. 2",UE4,playable,2021-03-03 21:38:57 +0100A8D003BAE000,"Qbics Paint",gpu;services,ingame,2021-06-07 10:54:09 +0100BA5012E54000,"QUAKE",gpu;crash,menus,2022-08-08 12:40:34 +010048F0195E8000,"Quake II",,playable,2023-08-15 03:42:14 +,"QuakespasmNX",crash;homebrew,nothing,2022-07-23 19:28:07 +010045101288A000,"Quantum Replica",nvdec;UE4,playable,2022-10-30 21:17:22 +0100F1400BA88000,"Quarantine Circular",,playable,2021-01-20 15:24:15 +0100DCF00F13A000,"Queen's Quest 4: Sacred Truce",nvdec,playable,2022-10-13 12:59:21 +0100492012378000,"Quell",gpu,ingame,2021-06-11 15:59:53 +01001DE005012000,"Quest of Dungeons",,playable,2021-06-07 10:29:22 +010067D011E68000,"QuietMansion2",,playable,2020-09-03 14:59:35 +0100AF100EE76000,"Quiplash 2 InterLASHional: The Say Anything Party Game!",online-working,playable,2022-10-19 17:43:45 +0100E5400BE64000,"R-Type Dimensions EX",,playable,2020-10-09 12:04:43 +0100F930136B6000,"R-Type® Final 2",slow;nvdec;UE4,ingame,2022-10-30 21:46:29 +01007B0014300000,"R-Type® Final 2 Demo",slow;nvdec;UE4;demo,ingame,2022-10-24 21:57:42 +0100B5A004302000,"R.B.I. Baseball 17",online-working,playable,2022-08-11 11:55:47 +01005CC007616000,"R.B.I. Baseball 18",nvdec;online-working,playable,2022-08-11 11:27:52 +0100FCB00BF40000,"R.B.I. Baseball 19",nvdec;online-working,playable,2022-08-11 11:43:52 +010061400E7D4000,"R.B.I. Baseball 20",,playable,2021-06-15 21:16:29 +0100B4A0115CA000,"R.B.I. Baseball 21",online-working,playable,2022-10-24 22:31:45 +01005BF00E4DE000,"Rabi-Ribi",,playable,2022-08-06 17:02:44 +010075D00DD04000,"Race with Ryan",UE4;gpu;nvdec;slow,ingame,2020-11-16 04:35:33 +0100B8100C54A000,"Rack N Ruin",,playable,2020-09-04 15:20:26 +010024400C516000,"RAD",gpu;crash;UE4,menus,2021-11-29 02:01:56 +010000600CD54000,"Rad Rodgers Radical Edition",nvdec;online-broken,playable,2022-08-10 19:57:23 +0100DA400E07E000,"Radiation City",crash,ingame,2022-09-30 11:15:04 +01009E40095EE000,"Radiation Island",opengl;vulkan-backend-bug,ingame,2022-08-11 10:51:04 +0100C8B00D2BE000,"Radical Rabbit Stew",,playable,2020-08-03 12:02:56 +0100BAD013B6E000,"Radio Commander",nvdec,playable,2021-03-24 11:20:46 +01008FA00ACEC000,"RADIOHAMMER STATION",audout,playable,2021-02-26 20:20:06 +01003D00099EC000,"Raging Justice",,playable,2021-06-03 14:06:50 +01005CD013116000,"Raiden IV x Mikado Remix [ 雷電Ⅳ×MIKADO remix ]",,playable,2022-07-29 15:50:13 +01002B000D97E000,"Raiden V: Director's Cut",deadlock;nvdec,boots,2024-07-12 07:31:46 +01002EE00DC02000,"Railway Empire - Nintendo Switch™ Edition",nvdec,playable,2022-10-03 13:53:50 +01003C700D0DE000,"Rain City",,playable,2020-10-08 16:59:03 +0100BDD014232000,"Rain on Your Parade",,playable,2021-05-06 19:32:04 +010047600BF72000,"Rain World",,playable,2023-05-10 23:34:08 +01009D9010B9E000,"Rainbows, toilets & unicorns",nvdec,playable,2020-10-03 18:08:18 +010010B00DDA2000,"Raji: An Ancient Epic",UE4;gpu;nvdec,ingame,2020-12-16 10:05:25 +010042A00A9CC000,"Rapala Fishing Pro Series",nvdec,playable,2020-12-16 13:26:53 +0100E73010754000,"Rascal Fight",,playable,2020-10-08 13:23:30 +010003F00C5C0000,"Rawr-Off",crash;nvdec,menus,2020-07-02 00:14:44 +01005FF002E2A000,"Rayman® Legends Definitive Edition",nvdec;ldn-works,playable,2023-05-27 18:33:07 +0100F03011616000,"Re:Turn - One Way Trip",,playable,2022-08-29 22:42:53 +01000B20117B8000,"Re:ZERO -Starting Life in Another World- The Prophecy of the Throne",gpu;crash;nvdec;vulkan,boots,2023-03-07 21:27:24 +0100A8A00E462000,"Real Drift Racing",,playable,2020-07-25 14:31:31 +010048600CC16000,"Real Heroes: Firefighter",,playable,2022-09-20 18:18:44 +0100E64010BAA000,"realMyst: Masterpiece Edition",nvdec,playable,2020-11-30 15:25:42 +01000F300F082000,"Reaper: Tale of a Pale Swordsman",,playable,2020-12-12 15:12:23 +0100D9B00E22C000,"Rebel Cops",,playable,2022-09-11 10:02:53 +0100CAA01084A000,"Rebel Galaxy Outlaw",nvdec,playable,2022-12-01 07:44:56 +0100EF0015A9A000,"Record of Lodoss War-Deedlit in Wonder Labyrinth-",deadlock;Needs Update;Incomplete,ingame,2022-01-19 10:00:59 +0100CF600FF7A000,"Red Bow",services,ingame,2021-11-29 03:51:34 +0100351013A06000,"Red Colony",,playable,2021-01-25 20:44:41 +01007820196A6000,"Red Dead Redemption",amd-vendor-bug,playable,2024-09-13 13:26:13 +0100069010592000,"Red Death",,playable,2020-08-30 13:07:37 +010075000C608000,"Red Faction Guerrilla Re-Mars-tered",ldn-untested;nvdec;online,playable,2021-06-07 03:02:13 +01002290070E4000,"Red Game Without a Great Name",,playable,2021-01-19 21:42:35 +010045400D73E000,"Red Siren: Space Defense",UE4,playable,2021-04-25 21:21:29 +0100D8A00E880000,"Red Wings: Aces of the Sky",,playable,2020-06-12 01:19:53 +01000D100DCF8000,"Redeemer: Enhanced Edition",nvdec;UE4;vulkan-backend-bug,playable,2022-09-11 10:20:24 +0100326010B98000,"Redout: Space Assault",UE4,playable,2022-10-19 23:04:35 +010007C00E558000,"Reel Fishing: Road Trip Adventure",,playable,2021-03-02 16:06:43 +010045D01273A000,"Reflection of Mine",audio,playable,2020-12-17 15:06:37 +01003AA00F5C4000,"Refreshing Sideways Puzzle Ghost Hammer",,playable,2020-10-18 12:08:54 +01007A800D520000,"Refunct",UE4,playable,2020-12-15 22:46:21 +0100FDF0083A6000,"Regalia: Of Men and Monarchs - Royal Edition",,playable,2022-08-11 12:24:01 +01005FD00F15A000,"Regions of Ruin",,playable,2020-08-05 11:38:58 +0100B5800C0E4000,"Reine des Fleurs",cpu;crash,boots,2020-09-27 18:50:39 +0100F1900B144000,"REKT! High Octane Stunts",online,playable,2020-09-28 12:33:56 +01002AD013C52000,"Relicta",nvdec;UE4,playable,2022-10-31 12:48:33 +010095900B436000,"RemiLore",,playable,2021-06-03 18:58:15 +0100FBD00F5F6000,"Remothered: Broken Porcelain",UE4;gpu;nvdec,ingame,2021-06-17 15:13:11 +01001F100E8AE000,"Remothered: Tormented Fathers",nvdec;UE4,playable,2022-10-19 23:26:50 +01008EE00B22C000,"Rento Fortune",ldn-untested;online,playable,2021-01-19 19:52:21 +01007CC0130C6000,"Renzo Racer",,playable,2021-03-23 22:28:05 +01003C400AD42000,"Rescue Tale",,playable,2022-09-20 18:40:18 +010099A00BC1E000,"resident evil 4",nvdec,playable,2022-11-16 21:16:04 +010018100CD46000,"Resident Evil 5",nvdec,playable,2024-02-18 17:15:29 +01002A000CD48000,"Resident Evil 6",nvdec,playable,2022-09-15 14:31:47 +0100643002136000,"Resident Evil Revelations",nvdec;ldn-untested,playable,2022-08-11 12:44:19 +010095300212A000,"Resident Evil Revelations 2",online-broken;ldn-untested,playable,2022-08-11 12:57:50 +0100E7F00FFB8000,"Resolutiion",crash,boots,2021-04-25 21:57:56 +0100FF201568E000,"Restless Night",crash,nothing,2022-02-09 10:54:49 +0100069000078000,"Retail Interactive Display Menu (DevQuestMenu)",services;crash,nothing,2022-08-11 13:19:41 +010086E00BCB2000,"Retimed",,playable,2022-08-11 13:32:39 +0100F17004156000,"Retro City Rampage DX",,playable,2021-01-05 17:04:17 +01000ED014A2C000,"Retro Machina",online-broken,playable,2022-10-31 13:38:58 +010032E00E6E2000,"Return of the Obra Dinn",,playable,2022-09-15 19:56:45 +010027400F708000,"Revenge of Justice",nvdec,playable,2022-11-20 15:43:23 +0100E2E00EA42000,"Reventure",,playable,2022-09-15 20:07:06 +010071D00F156000,"REZ PLZ",,playable,2020-10-24 13:26:12 +0100729012D18000,"Rhythm Fighter",crash,nothing,2021-02-16 18:51:30 +010081D0100F0000,"Rhythm of the Gods",UE4;crash,nothing,2020-10-03 17:39:59 +01009D5009234000,"RICO",nvdec;online-broken,playable,2022-08-11 20:16:40 +01002C700C326000,"Riddled Corpses EX",,playable,2021-06-06 16:02:44 +0100AC600D898000,"Rift Keeper",,playable,2022-09-20 19:48:20 +0100A62002042000,"RiME",UE4;crash;gpu,boots,2020-07-20 15:52:38 +01006AC00EE6E000,"Rimelands: Hammer of Thor",,playable,2022-10-13 13:32:56 +01002FF008C24000,"RingFit Adventure",crash;services,nothing,2021-04-14 19:00:01 +010088E00B816000,"RIOT - Civil Unrest",,playable,2022-08-11 20:27:56 +01002A6006AA4000,"Riptide GP: Renegade",online,playable,2021-04-13 23:33:02 +010065B00B0EC000,"Rise and Shine",,playable,2020-12-12 15:56:43 +0100E9C010EA8000,"Rise of Insanity",,playable,2020-08-30 15:42:14 +01006BA00E652000,"Rise: Race The Future",,playable,2021-02-27 13:29:06 +010020C012F48000,"Rising Hell",,playable,2022-10-31 13:54:02 +010076D00E4BA000,"Risk of Rain 2",online-broken,playable,2024-03-04 17:01:05 +0100E8300A67A000,"RISK® Global Domination",nvdec;online-broken,playable,2022-08-01 18:53:28 +010042500FABA000,"Ritual: Crown of Horns",,playable,2021-01-26 16:01:47 +0100BD300F0EC000,"Ritual: Sorcerer Angel",,playable,2021-03-02 13:51:19 +0100A7D008392000,"Rival Megagun",nvdec;online,playable,2021-01-19 14:01:46 +010069C00401A000,"RIVE: Ultimate Edition",,playable,2021-03-24 18:45:55 +01004E700DFE6000,"River City Girls",nvdec,playable,2020-06-10 23:44:09 +01002E80168F4000,"River City Girls 2",,playable,2022-12-07 00:46:27 +0100B2100767C000,"River City Melee Mach!!",online-broken,playable,2022-09-20 20:51:57 +01008AC0115C6000,"RMX Real Motocross",,playable,2020-10-08 21:06:15 +010053000B986000,"Road Redemption",online-broken,playable,2022-08-12 11:26:20 +010002F009A7A000,"Road to Ballhalla",UE4,playable,2021-06-07 02:22:36 +0100735010F58000,"Road To Guangdong",slow,playable,2020-10-12 12:15:32 +010068200C5BE000,"Roarr! Jurassic Edition",,playable,2022-10-19 23:57:45 +0100618004096000,"Robonauts",nvdec,playable,2022-08-12 11:33:23 +010039A0117C0000,"ROBOTICS;NOTES DaSH",,playable,2020-11-16 23:09:54 +01002A900EE8A000,"ROBOTICS;NOTES ELITE",,playable,2020-11-26 10:28:20 +010044A010BB8000,"Robozarro",,playable,2020-09-03 13:33:40 +01000CC012D74000,"Rock 'N Racing Bundle Grand Prix & Rally",,playable,2021-01-06 20:23:57 +0100A1B00DB36000,"Rock of Ages 3: Make & Break",UE4,playable,2022-10-06 12:18:29 +0100513005AF4000,"Rock'N Racing Off Road DX",,playable,2021-01-10 15:27:15 +01005EE0036EC000,"Rocket League®",gpu;online-broken;ldn-untested,ingame,2024-02-08 19:51:36 +0100E88009A34000,"Rocket Wars",,playable,2020-07-24 14:27:39 +0100EC7009348000,"Rogue Aces",gpu;services;nvdec,ingame,2021-11-30 02:18:30 +01009FA010848000,"Rogue Heroes: Ruins of Tasos",online,playable,2021-04-01 15:41:25 +010056500AD50000,"Rogue Legacy",,playable,2020-08-10 19:17:28 +0100F3B010F56000,"Rogue Robots",,playable,2020-06-16 12:16:11 +01001CC00416C000,"Rogue Trooper Redux",nvdec;online-broken,playable,2022-08-12 11:53:01 +0100C7300C0EC000,"RogueCube",,playable,2021-06-16 12:16:42 +0100B7200FC96000,"Roll'd",,playable,2020-07-04 20:24:01 +01004900113F8000,"RollerCoaster Tycoon 3 Complete Edition",32-bit,playable,2022-10-17 14:18:01 +0100E3900B598000,"RollerCoaster Tycoon Adventures",nvdec,playable,2021-01-05 18:14:18 +010076200CA16000,"Rolling Gunner",,playable,2021-05-26 12:54:18 +0100579011B40000,"Rolling Sky 2",,playable,2022-11-03 10:21:12 +010050400BD38000,"Roman Rumble in Las Vegum - Asterix & Obelix XXL 2",deadlock;nvdec,ingame,2022-07-21 17:54:14 +01001F600829A000,"Romancing SaGa 2",,playable,2022-08-12 12:02:24 +0100D0400D27A000,"Romancing SaGa 3",audio;gpu,ingame,2020-06-27 20:26:18 +010088100DD42000,"Roof Rage",crash;regression,boots,2023-11-12 03:47:18 +0100F3000FA58000,"Roombo: First Blood",nvdec,playable,2020-08-05 12:11:37 +0100936011556000,"Root Double -Before Crime * After Days- Xtend Edition",crash,nothing,2022-02-05 02:03:49 +010030A00DA3A000,"Root Letter: Last Answer",vulkan-backend-bug,playable,2022-09-17 10:25:57 +0100AFE00DDAC000,"Royal Roads",,playable,2020-11-17 12:54:38 +0100E2C00B414000,"RPG Maker MV",nvdec,playable,2021-01-05 20:12:01 +01005CD015986000,"rRootage Reloaded",,playable,2022-08-05 23:20:18 +0000000000000000,"RSDKv5u",homebrew,ingame,2024-04-01 16:25:34 +010009B00D33C000,"Rugby Challenge 4",slow;online-broken;UE4,playable,2022-10-06 12:45:53 +01006EC00F2CC000,"RUINER",UE4,playable,2022-10-03 14:11:33 +010074F00DE4A000,"Run the Fan",,playable,2021-02-27 13:36:28 +0100ADF00700E000,"Runbow",online,playable,2021-01-08 22:47:44 +0100D37009B8A000,"Runbow Deluxe Edition",online-broken,playable,2022-08-12 12:20:25 +010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49 +010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17 +010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36 +0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01 +010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43 +0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09 +010007700CFA2000,"Saboteur II: Avenging Angel",Needs Update;cpu;crash,nothing,2021-01-26 14:47:37 +0100D94012FE8000,"Saboteur SiO",slow,ingame,2020-12-17 16:59:49 +0100A5200C2E0000,"Safety First!",,playable,2021-01-06 09:05:23 +0100A51013530000,"SaGa Frontier Remastered",nvdec,playable,2022-11-03 13:54:56 +010003A00D0B4000,"SaGa SCARLET GRACE: AMBITIONS™",,playable,2022-10-06 13:20:31 +01008D100D43E000,"Saints Row IV®: Re-Elected™",ldn-untested;LAN,playable,2023-12-04 18:33:37 +0100DE600BEEE000,"SAINTS ROW®: THE THIRD™ - THE FULL PACKAGE",slow;LAN,playable,2023-08-24 02:40:58 +01007F000EB36000,"Sakai and...",nvdec,playable,2022-12-15 13:53:19 +0100B1400E8FE000,"Sakuna: Of Rice and Ruin",,playable,2023-07-24 13:47:13 +0100BBF0122B4000,"Sally Face",,playable,2022-06-06 18:41:24 +0100D250083B4000,"Salt and Sanctuary",,playable,2020-10-22 11:52:19 +0100CD301354E000,"Sam & Max Save the World",,playable,2020-12-12 13:11:51 +010014000C63C000,"Samsara: Deluxe Edition",,playable,2021-01-11 15:14:12 +0100ADF0096F2000,"Samurai Aces for Nintendo Switch",32-bit,playable,2020-11-24 20:26:55 +01006C600E46E000,"Samurai Jack: Battle Through Time",nvdec;UE4,playable,2022-10-06 13:33:59 +01002DF00F76C000,"SAMURAI SHODOWN",UE4;crash;nvdec,menus,2020-09-06 02:17:00 +0100F6800F48E000,"SAMURAI SHODOWN NEOGEO COLLECTION",nvdec,playable,2021-06-14 17:12:56 +0100B6501A360000,"Samurai Warrior",,playable,2023-02-27 18:42:38 +01000EA00B23C000,"Sangoku Rensenki ~Otome no Heihou!~",gpu;nvdec,ingame,2020-10-17 19:13:14 +0100A4700BC98000,"Satsujin Tantei Jack the Ripper",,playable,2021-06-21 16:32:54 +0100F0000869C000,"Saturday Morning RPG",nvdec,playable,2022-08-12 12:41:50 +01006EE00380C000,"Sausage Sports Club",gpu,ingame,2021-01-10 05:37:17 +0100C8300FA90000,"Save Koch",,playable,2022-09-26 17:06:56 +0100D6E008700000,"Save the Ninja Clan",,playable,2021-01-11 13:56:37 +010091000F72C000,"Save Your Nuts",nvdec;online-broken;UE4,playable,2022-09-27 23:12:02 +0100AA00128BA000,"Saviors of Sapphire Wings / Stranger of Sword City Revisited",crash,menus,2022-10-24 23:00:46 +01001C3012912000,"Say No! More",,playable,2021-05-06 13:43:34 +010010A00A95E000,"Sayonara Wild Hearts",,playable,2023-10-23 03:20:01 +0100ACB004006000,"Schlag den Star",slow;nvdec,playable,2022-08-12 14:28:22 +0100394011C30000,"Scott Pilgrim vs. The World™: The Game – Complete Edition",services-horizon;crash,nothing,2024-07-12 08:13:03 +0100E7100B198000,"Scribblenauts Mega Pack",nvdec,playable,2020-12-17 22:56:14 +01001E40041BE000,"Scribblenauts Showdown",gpu;nvdec,ingame,2020-12-17 23:05:53 +0100829018568000,"SD GUNDAM BATTLE ALLIANCE Demo",audio;crash;demo,ingame,2022-08-01 23:01:20 +010055700CEA8000,"SD GUNDAM G GENERATION CROSS RAYS",nvdec,playable,2022-09-15 20:58:44 +010022900D3EC00,"SD GUNDAM G GENERATION CROSS RAYS PREMIUM G SOUND EDITION",nvdec,playable,2022-09-15 20:45:57 +0100E4A00D066000,"Sea King",UE4;nvdec,playable,2021-06-04 15:49:22 +0100AFE012BA2000,"Sea of Solitude: The Director's Cut",gpu,ingame,2024-07-12 18:29:29 +01008C0016544000,"Sea of Stars",,playable,2024-03-15 20:27:12 +010036F0182C4000,"Sea of Stars Demo",demo,playable,2023-02-12 15:33:56 +0100C2400D68C000,"SeaBed",,playable,2020-05-17 13:25:37 +010077100CA6E000,"Season Match Bundle",,playable,2020-10-27 16:15:22 +010028F010644000,"Secret Files 3",nvdec,playable,2020-10-24 15:32:39 +010075D0101FA000,"Seek Hearts",,playable,2022-11-22 15:06:26 +0100394010844000,"Seers Isle",,playable,2020-11-17 12:28:50 +0100A8900AF04000,"SEGA AGES Alex Kidd in Miracle World",online,playable,2021-05-05 16:35:47 +01001E600AF08000,"SEGA AGES Gain Ground",online,playable,2021-05-05 16:16:27 +0100D4D00AC62000,"SEGA AGES Out Run",,playable,2021-01-11 13:13:59 +01005A300C9F6000,"SEGA AGES Phantasy Star",,playable,2021-01-11 12:49:48 +01005F600CB0E000,"SEGA AGES Puyo Puyo",online,playable,2021-05-05 16:09:28 +010051F00AC5E000,"SEGA AGES Sonic The Hedgehog",slow,playable,2023-03-05 20:16:31 +01000D200C614000,"SEGA AGES Sonic The Hedgehog 2",,playable,2022-09-21 20:26:35 +0100C3E00B700000,"SEGA AGES Space Harrier",,playable,2021-01-11 12:57:40 +010054400D2E6000,"SEGA AGES Virtua Racing",online-broken,playable,2023-01-29 17:08:39 +01001E700AC60000,"SEGA AGES Wonder Boy: Monster Land",online,playable,2021-05-05 16:28:25 +0100B3C014BDA000,"SEGA Genesis™ – Nintendo Switch Online",crash;regression,nothing,2022-04-11 07:27:21 +0100F7300B24E000,"SEGA Mega Drive Classics",online,playable,2021-01-05 11:08:00 +01009840046BC000,"Semispheres",,playable,2021-01-06 23:08:31 +0100D1800D902000,"SENRAN KAGURA Peach Ball",,playable,2021-06-03 15:12:10 +0100E0C00ADAC000,"SENRAN KAGURA Reflexions",,playable,2020-03-23 19:15:23 +01009E500D29C000,"Sentinels of Freedom",,playable,2021-06-14 16:42:19 +0100A5D012DAC000,"SENTRY",,playable,2020-12-13 12:00:24 +010059700D4A0000,"Sephirothic Stories",services,menus,2021-11-25 08:52:17 +010007D00D43A000,"Serious Sam Collection",vulkan-backend-bug,boots,2022-10-13 13:53:34 +0100B2C00E4DA000,"Served!",nvdec,playable,2022-09-28 12:46:00 +010018400C24E000,"Seven Knights -Time Wanderer-",vulkan-backend-bug,playable,2022-10-13 22:08:54 +0100D6F016676000,"Seven Pirates H",,playable,2024-06-03 14:54:12 +0100157004512000,"Severed",,playable,2020-12-15 21:48:48 +0100D5500DA94000,"Shadow Blade: Reload",nvdec,playable,2021-06-11 18:40:43 +0100BE501382A000,"Shadow Gangs",cpu;gpu;crash;regression,ingame,2024-04-29 00:07:26 +0100C3A013840000,"Shadow Man Remastered",gpu,ingame,2024-05-20 06:01:39 +010073400B696000,"Shadowgate",,playable,2021-04-24 07:32:57 +0100371013B3E000,"Shadowrun Returns",gpu;Needs Update,ingame,2022-10-04 21:32:31 +01008310154C4000,"Shadowrun: Dragonfall - Director's Cut",gpu;Needs Update,ingame,2022-10-04 20:52:18 +0100C610154CA000,"Shadowrun: Hong Kong - Extended Edition",gpu;Needs Update,ingame,2022-10-04 20:53:09 +010000000EEF0000,"Shadows 2: Perfidia",,playable,2020-08-07 12:43:46 +0100AD700CBBE000,"Shadows of Adam",,playable,2021-01-11 13:35:58 +01002A800C064000,"Shadowverse Champions Battle",,playable,2022-10-02 22:59:29 +01003B90136DA000,"Shadowverse: Champion's Battle",crash,nothing,2023-03-06 00:31:50 +0100820013612000,"Shady Part of Me",,playable,2022-10-20 11:31:55 +0100B10002904000,"Shakedown: Hawaii",,playable,2021-01-07 09:44:36 +01008DA012EC0000,"Shakes on a Plane",crash,menus,2021-11-25 08:52:25 +0100B4900E008000,"Shalnor Legends: Sacred Lands",,playable,2021-06-11 14:57:11 +010006C00CC10000,"Shanky: The Vegan`s Nightmare",,playable,2021-01-26 15:03:55 +0100430013120000,"Shantae",,playable,2021-05-21 04:53:26 +0100EFD00A4FA000,"Shantae and the Pirate's Curse",,playable,2024-04-29 17:21:57 +0100EB901040A000,"Shantae and the Seven Sirens",nvdec,playable,2020-06-19 12:23:40 +01006A200936C000,"Shantae: Half- Genie Hero Ultimate Edition",,playable,2020-06-04 20:14:20 +0100ADA012370000,"Shantae: Risky's Revenge - Director's Cut",,playable,2022-10-06 20:47:39 +01003AB01062C000,"Shaolin vs Wutang",deadlock,nothing,2021-03-29 20:38:54 +0100B250009B9600,"Shape Of The World0",UE4,playable,2021-03-05 16:42:28 +01004F50085F2000,"She Remembered Caterpillars",,playable,2022-08-12 17:45:14 +01000320110C2000,"She Sees Red - Interactive Movie",nvdec,playable,2022-09-30 11:30:15 +01009EB004CB0000,"Shelter Generations",,playable,2021-06-04 16:52:39 +010020F014DBE000,"Sherlock Holmes: The Devil’s Daughter",gpu,ingame,2022-07-11 00:07:26 +0100B1000AC3A000,"Shift Happens",,playable,2021-01-05 21:24:18 +01000E8009E1C000,"Shift Quantum",UE4;crash,ingame,2020-11-06 21:54:08 +01000750084B2000,"Shiftlings - Enhanced Edition",nvdec,playable,2021-03-04 13:49:54 +01003B0012DC2000,"Shin Megami Tensei III Nocturne HD Remaster",,playable,2022-11-03 22:53:27 +010045800ED1E000,"Shin Megami Tensei III NOCTURNE HD REMASTER",gpu;Needs Update,ingame,2022-11-03 19:57:01 +010063B012DC6000,"Shin Megami Tensei V",UE4,playable,2024-02-21 06:30:07 +010069C01AB82000,"Shin Megami Tensei V: Vengeance",gpu;vulkan-backend-bug,ingame,2024-07-14 11:28:24 +01009050133B4000,"Shing! (サムライフォース:斬!)",nvdec,playable,2022-10-22 00:48:54 +01009A5009A9E000,"Shining Resonance Refrain",nvdec,playable,2022-08-12 18:03:01 +01004EE0104F6000,"Shinsekai Into the Depths™",,playable,2022-09-28 14:07:51 +0100C2F00A568000,"Shio",,playable,2021-02-22 16:25:09 +0100B2E00F13E000,"Shipped",,playable,2020-11-21 14:22:32 +01000E800FCB4000,"Ships",,playable,2021-06-11 16:14:37 +01007430122D0000,"Shiren the Wanderer: The Tower of Fortune and the Dice of Fate",nvdec,playable,2022-10-20 11:44:36 +010027300A660000,"Shiritsu Berubara Gakuen ~Versailles no Bara Re*imagination~",cpu;crash,boots,2020-09-27 19:01:25 +01000244016BAE00,"Shiro0",gpu,ingame,2024-01-13 08:54:39 +0100CCE00DDB6000,"Shoot 1UP DX",,playable,2020-12-13 12:32:47 +01001180021FA000,"Shovel Knight: Specter of Torment",,playable,2020-05-30 08:34:17 +010057D0021E8000,"Shovel Knight: Treasure Trove",,playable,2021-02-14 18:24:39 +01003DD00BF0E000,"Shred! 2 - ft Sam Pilgrim",,playable,2020-05-30 14:34:09 +01001DE0076A4000,"Shu",nvdec,playable,2020-05-30 09:08:59 +0100A7900B936000,"Shut Eye",,playable,2020-07-23 18:08:35 +010044500C182000,"Sid Meier’s Civilization VI",ldn-untested,playable,2024-04-08 16:03:40 +01007FC00B674000,"Sigi - A Fart for Melusina",,playable,2021-02-22 16:46:58 +0100F1400B0D6000,"Silence",nvdec,playable,2021-06-03 14:46:17 +0100A32010618000,"Silent World",,playable,2020-08-28 13:45:13 +010045500DFE2000,"Silk",nvdec,playable,2021-06-10 15:34:37 +010016D00A964000,"SilverStarChess",,playable,2021-05-06 15:25:57 +0100E8C019B36000,"Simona's Requiem",gpu,ingame,2023-02-21 18:29:19 +01006FE010438000,"Sin Slayers",,playable,2022-10-20 11:53:52 +01002820036A8000,"Sine Mora EX",gpu;online-broken,ingame,2022-08-12 19:36:18 +0100F10012002000,"Singled Out",online,playable,2020-08-03 13:06:18 +0100B8800F858000,"Sinless",nvdec,playable,2020-08-09 20:18:55 +0100B16009C10000,"SINNER: Sacrifice for Redemption",nvdec;UE4;vulkan-backend-bug,playable,2022-08-12 20:37:33 +0100E9201410E000,"Sir Lovelot",,playable,2021-04-05 16:21:46 +0100134011E32000,"Skate City",,playable,2022-11-04 11:37:39 +0100B2F008BD8000,"Skee-Ball",,playable,2020-11-16 04:44:07 +01001A900F862000,"Skelattack",,playable,2021-06-09 15:26:26 +01008E700F952000,"Skelittle: A Giant Party!",,playable,2021-06-09 19:08:34 +01006C000DC8A000,"Skelly Selest",,playable,2020-05-30 15:38:18 +0100D67006F14000,"Skies of Fury DX",,playable,2020-05-30 16:40:54 +010046B00DE62000,"Skullgirls 2nd Encore",,playable,2022-09-15 21:21:25 +0100D1100BF9C000,"Skulls of the Shogun: Bone-A-Fide Edition",,playable,2020-08-31 18:58:12 +0100D7B011654000,"Skully",nvdec;UE4,playable,2022-10-06 13:52:59 +010083100B5CA000,"Sky Force Anniversary",online-broken,playable,2022-08-12 20:50:07 +01006FE005B6E000,"Sky Force Reloaded",,playable,2021-01-04 20:06:57 +010003F00CC98000,"Sky Gamblers - Afterburner",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-12 21:04:55 +010093D00AC38000,"Sky Gamblers: Storm Raiders",gpu;audio;32-bit,ingame,2022-08-12 21:13:36 +010068200E96E000,"Sky Gamblers: Storm Raiders 2",gpu,ingame,2022-09-13 12:24:04 +01004F0010A02000,"Sky Racket",,playable,2020-09-07 12:22:24 +0100DDB004F30000,"Sky Ride",,playable,2021-02-22 16:53:07 +0100C5700434C000,"Sky Rogue",,playable,2020-05-30 08:26:28 +0100C52011460000,"Sky: Children of the Light",cpu;online-broken,nothing,2023-02-23 10:57:10 +010041C01014E000,"Skybolt Zack",,playable,2021-04-12 18:28:00 +0100A0A00D1AA000,"SKYHILL",,playable,2021-03-05 15:19:11 +0100CCC0002E6000,"Skylanders Imaginators",crash;services,boots,2020-05-30 18:49:18 +010021A00ABEE000,"SKYPEACE",,playable,2020-05-29 14:14:30 +0100EA400BF44000,"SkyScrappers",,playable,2020-05-28 22:11:25 +0100F3C00C400000,"SkyTime",slow,ingame,2020-05-30 09:24:51 +01003AD00DEAE000,"SlabWell: The Quest For Kaktun's Alpaca",,playable,2021-02-22 17:02:51 +0100224004004000,"Slain: Back from Hell",,playable,2022-08-12 23:36:19 +010026300BA4A000,"Slay the Spire",,playable,2023-01-20 15:09:26 +0100501006494000,"Slayaway Camp: Butcher's Cut",opengl-backend-bug,playable,2022-08-12 23:44:05 +01004E900EDDA000,"Slayin 2",gpu,ingame,2024-04-19 16:15:26 +01004AC0081DC000,"Sleep Tight",gpu;UE4,ingame,2022-08-13 00:17:32 +0100F4500AA4E000,"Slice, Dice & Rice",online,playable,2021-02-22 17:44:23 +010010D011E1C000,"Slide Stars",crash,menus,2021-11-25 08:53:43 +0100112003B8A000,"Slime-san",,playable,2020-05-30 16:15:12 +01002AA00C974000,"SMASHING THE BATTLE",,playable,2021-06-11 15:53:57 +0100C9100B06A000,"SmileBASIC 4",gpu,menus,2021-07-29 17:35:59 +0100207007EB2000,"Smoke And Sacrifice",,playable,2022-08-14 12:38:27 +01009790186FE000,"SMURFS KART",,playable,2023-10-18 00:55:00 +0100F2800D46E000,"Snack World The Dungeon Crawl Gold",gpu;slow;nvdec;audout,ingame,2022-05-01 21:12:44 +0100C0F0020E8000,"Snake Pass",nvdec;UE4,playable,2022-01-03 04:31:52 +010075A00BA14000,"Sniper Elite 3 Ultimate Edition",ldn-untested,playable,2024-04-18 07:47:49 +010007B010FCC000,"Sniper Elite 4",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2024-06-18 17:53:15 +0100BB000A3AA000,"Sniper Elite V2 Remastered",slow;nvdec;online-broken;ldn-untested,ingame,2022-08-14 13:23:13 +01008E20047DC000,"Snipperclips Plus: Cut It Out, Together!",,playable,2023-02-14 20:20:13 +0100704000B3A000,"Snipperclips™ – Cut it out, together!",,playable,2022-12-05 12:44:55 +01004AB00AEF8000,"SNK 40th ANNIVERSARY COLLECTION",,playable,2022-08-14 13:33:15 +010027F00AD6C000,"SNK HEROINES Tag Team Frenzy",nvdec;online-broken;ldn-untested,playable,2022-08-14 14:19:25 +01008DA00CBBA000,"Snooker 19",nvdec;online-broken;UE4,playable,2022-09-11 17:43:22 +010045300516E000,"Snow Moto Racing Freedom",gpu;vulkan-backend-bug,ingame,2022-08-15 16:05:14 +0100BE200C34A000,"Snowboarding The Next Phase",nvdec,playable,2021-02-23 12:56:58 +0100FBD013AB6000,"SnowRunner",services;crash,boots,2023-10-07 00:01:16 +010017B012AFC000,"Soccer Club Life: Playing Manager",gpu,ingame,2022-10-25 11:59:22 +0100B5000E05C000,"Soccer Pinball",UE4;gpu,ingame,2021-06-15 20:56:51 +010011A00A9A8000,"Soccer Slammers",,playable,2020-05-30 07:48:14 +010095C00F9DE000,"Soccer, Tactics & Glory",gpu,ingame,2022-09-26 17:15:58 +0100590009C38000,"SOL DIVIDE -SWORD OF DARKNESS- for Nintendo Switch",32-bit,playable,2021-06-09 14:13:03 +0100A290048B0000,"Soldam: Drop, Connect, Erase",,playable,2020-05-30 09:18:54 +010008600D1AC000,"Solo: Islands of the Heart",gpu;nvdec,ingame,2022-09-11 17:54:43 +01009EE00E91E000,"Some Distant Memory",,playable,2022-09-15 21:48:19 +01004F401BEBE000,"Song of Nunu: A League of Legends Story",,ingame,2024-07-12 18:53:44 +0100E5400BF94000,"Songbird Symphony",,playable,2021-02-27 02:44:04 +010031D00A604000,"Songbringer",,playable,2020-06-22 10:42:02 +0000000000000000,"Sonic 1 (2013)",crash;homebrew,ingame,2024-04-06 18:31:20 +0000000000000000,"Sonic 2 (2013)",crash;homebrew,ingame,2024-04-01 16:25:30 +0000000000000000,"Sonic A.I.R",homebrew,ingame,2024-04-01 16:25:32 +0000000000000000,"Sonic CD",crash;homebrew,ingame,2024-04-01 16:25:31 +010040E0116B8000,"Sonic Colors: Ultimate",,playable,2022-11-12 21:24:26 +01001270012B6000,"SONIC FORCES™",,playable,2024-07-28 13:11:21 +01004AD014BF0000,"Sonic Frontiers",gpu;deadlock;amd-vendor-bug;intel-vendor-bug,ingame,2024-09-05 09:18:53 +01009AA000FAA000,"Sonic Mania",,playable,2020-06-08 17:30:57 +01009FB016286000,"Sonic Origins",crash,ingame,2024-06-02 07:20:15 +01008F701C074000,"SONIC SUPERSTARS",gpu;nvdec,ingame,2023-10-28 17:48:07 +010088801C150000,"Sonic Superstars Digital Art Book with Mini Digital Soundtrack",,playable,2024-08-20 13:26:56 +01005EA01C0FC000,"SONIC X SHADOW GENERATIONS",crash,ingame,2025-01-07 04:20:45 +010064F00C212000,"Soul Axiom Rebooted",nvdec;slow,ingame,2020-09-04 12:41:01 +0100F2100F0B2000,"Soul Searching",,playable,2020-07-09 18:39:07 +01008F2005154000,"South Park™: The Fractured but Whole™ - Standard Edition",slow;online-broken,playable,2024-07-08 17:47:28 +0100B9F00C162000,"Space Blaze",,playable,2020-08-30 16:18:05 +010005500E81E000,"Space Cows",UE4;crash,menus,2020-06-15 11:33:20 +0100707011722000,"Space Elite Force",,playable,2020-11-27 15:21:05 +010047B010260000,"Space Pioneer",,playable,2022-10-20 12:24:37 +010010A009830000,"Space Ribbon",,playable,2022-08-15 17:17:10 +0000000000000000,"SpaceCadetPinball",homebrew,ingame,2024-04-18 19:30:04 +0100D9B0041CE000,"Spacecats with Lasers",,playable,2022-08-15 17:22:44 +010034800FB60000,"Spaceland",,playable,2020-11-01 14:31:56 +010028D0045CE000,"Sparkle 2",,playable,2020-10-19 11:51:39 +01000DC007E90000,"Sparkle Unleashed",,playable,2021-06-03 14:52:15 +0100E4F00AE14000,"Sparkle ZERO",gpu;slow,ingame,2020-03-23 18:19:18 +01007ED00C032000,"Sparklite",,playable,2022-08-06 11:35:41 +0100E6A009A26000,"Spartan",UE4;nvdec,playable,2021-03-05 15:53:19 +010020500E7A6000,"Speaking Simulator",,playable,2020-10-08 13:00:39 +01008B000A5AE000,"Spectrum",,playable,2022-08-16 11:15:59 +0100F18010BA0000,"Speed 3: Grand Prix",UE4,playable,2022-10-20 12:32:31 +010040F00AA9A000,"Speed Brawl",slow,playable,2020-09-18 22:08:16 +01000540139F6000,"Speed Limit",gpu,ingame,2022-09-02 18:37:40 +010061F013A0E000,"Speed Truck Racing",,playable,2022-10-20 12:57:04 +0100E74007EAC000,"Spellspire",,playable,2022-08-16 11:21:21 +010021F004270000,"Spelunker Party!",services,boots,2022-08-16 11:25:49 +0100710013ABA000,"Spelunky",,playable,2021-11-20 17:45:03 +0100BD500BA94000,"Sphinx and the Cursed Mummy",gpu;32-bit;opengl,ingame,2024-05-20 06:00:51 +010092A0102AE000,"Spider Solitaire",,playable,2020-12-16 16:19:30 +010076D0122A8000,"Spinch",,playable,2024-07-12 19:02:10 +01001E40136FE000,"Spinny's Journey",crash,ingame,2021-11-30 03:39:44 +010023E008702000,"Spiral Splatter",,playable,2020-06-04 14:03:57 +0100D1B00B6FA000,"Spirit Hunter: Death Mark",,playable,2020-12-13 10:56:25 +0100FAE00E19A000,"Spirit Hunter: NG",32-bit,playable,2020-12-17 20:38:47 +01005E101122E000,"Spirit of the North",UE4,playable,2022-09-30 11:40:47 +01000AC00F5EC000,"Spirit Roots",nvdec,playable,2020-07-10 13:33:32 +0100BD400DC52000,"Spiritfarer",gpu,ingame,2022-10-06 16:31:38 +01009D60080B4000,"SpiritSphere DX",,playable,2021-07-03 23:37:49 +010042700E3FC000,"Spitlings",online-broken,playable,2022-10-06 16:42:39 +01003BC0000A0000,"Splatoon™ 2",ldn-works;LAN,playable,2024-07-12 19:11:15 +0100C2500FC20000,"Splatoon™ 3",ldn-works;opengl-backend-bug;LAN;amd-vendor-bug,playable,2024-08-04 23:49:11 +0100BA0018500000,"Splatoon™ 3: Splatfest World Premiere",gpu;online-broken;demo,ingame,2022-09-19 03:17:12 +010062800D39C000,"SpongeBob SquarePants: Battle for Bikini Bottom - Rehydrated",online-broken;UE4;ldn-broken;vulkan-backend-bug,playable,2023-08-01 19:29:34 +01009FB0172F4000,"SpongeBob SquarePants: The Cosmic Shake",gpu;UE4,ingame,2023-08-01 19:29:53 +010097C01336A000,"Spooky Chase",,playable,2022-11-04 12:17:44 +0100C6100D75E000,"Spooky Ghosts Dot Com",,playable,2021-06-15 15:16:11 +0100DE9005170000,"Sports Party",nvdec,playable,2021-03-05 13:40:42 +0100E04009BD4000,"Spot The Difference",,playable,2022-08-16 11:49:52 +010052100D1B4000,"Spot The Differences: Party!",,playable,2022-08-16 11:55:26 +01000E6015350000,"Spy Alarm",services,ingame,2022-12-09 10:12:51 +01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51 +010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33 +0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05 +010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08 +0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32 +0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16 +010065301A2E0000,"STAR OCEAN THE SECOND STORY R",crash,ingame,2024-06-01 02:39:59 +010060D00F658000,"Star Renegades",nvdec,playable,2020-12-11 12:19:23 +0100D7000AE6A000,"Star Story: The Horizon Escape",,playable,2020-08-11 22:31:38 +01009DF015776000,"Star Trek Prodigy: Supernova",nvdec;UE4;opengl-backend-bug,playable,2022-10-14 10:18:50 +0100BD100FFBE000,"STAR WARS™ Episode I Racer",slow;nvdec,playable,2022-10-03 16:08:36 +0100BB500EACA000,"STAR WARS™ Jedi Knight II: Jedi Outcast™",gpu,ingame,2022-09-15 22:51:00 +01008CA00FAE8000,"STAR WARS™ Jedi Knight: Jedi Academy",gpu,boots,2021-06-16 12:35:30 +01006DA00DEAC000,"Star Wars™ Pinball",online-broken,playable,2022-09-11 18:53:31 +0100FA10115F8000,"STAR WARS™ Republic Commando™",gpu;32-bit,ingame,2023-10-31 15:57:17 +010040701B948000,"STAR WARS™: Battlefront Classic Collection",gpu;vulkan,ingame,2024-07-12 19:24:21 +0100854015868000,"STAR WARS™: Knights of the Old Republic™",gpu;deadlock,boots,2024-02-12 10:13:51 +0100153014544000,"STAR WARS™: The Force Unleashed™",,playable,2024-05-01 17:41:28 +01005EB00EA10000,"Star-Crossed Myth - The Department of Wishes -",gpu,ingame,2021-06-04 19:34:36 +0100E6B0115FC000,"Star99",online,menus,2021-11-26 14:18:51 +01002100137BA000,"Stardash",,playable,2021-01-21 16:31:19 +0100E65002BB8000,"Stardew Valley",online-broken;ldn-untested,playable,2024-02-14 03:11:19 +01002CC003FE6000,"Starlink: Battle for Atlas™ Digital Edition",services-horizon;crash;Needs Update,nothing,2024-05-05 17:25:11 +010098E010FDA000,"Starlit Adventures Golden Stars",,playable,2020-11-21 12:14:43 +01001BB00AC26000,"STARSHIP AVENGER Operation: Take Back Earth",,playable,2021-01-12 15:52:55 +010000700A572000,"State of Anarchy: Master of Mayhem",nvdec,playable,2021-01-12 19:00:05 +0100844004CB6000,"State of Mind",UE4;crash,boots,2020-06-22 22:17:50 +0100616009082000,"STAY",crash;services,boots,2021-04-23 14:24:52 +0100B61009C60000,"STAY COOL, KOBAYASHI-SAN!: A RIVER CITY RANSOM STORY",,playable,2021-01-26 17:37:28 +01008010118CC000,"Steam Prison",nvdec,playable,2021-04-01 15:34:11 +0100AE100DAFA000,"Steam Tactics",,playable,2022-10-06 16:53:45 +01004DD00C87A000,"Steamburg",,playable,2021-01-13 08:42:01 +01009320084A4000,"SteamWorld Dig",,playable,2024-08-19 12:12:23 +0100CA9002322000,"SteamWorld Dig 2",,playable,2022-12-21 19:25:42 +0100F6D00D83E000,"SteamWorld Quest: Hand of Gilgamech",nvdec,playable,2020-11-09 13:10:04 +01001C6014772000,"Steel Assault",,playable,2022-12-06 14:48:30 +010042800B880000,"STEINS;GATE ELITE",,playable,2020-08-04 07:33:32 +0100CB400E9BC000,"STEINS;GATE: My Darling's Embrace",nvdec,playable,2022-11-20 16:48:34 +01002DE01043E000,"Stela",UE4,playable,2021-06-15 13:28:34 +01005A700C954000,"Stellar Interface",,playable,2022-10-20 13:44:33 +0100BC800EDA2000,"STELLATUM",gpu,playable,2021-03-07 16:30:23 +0100775004794000,"Steredenn: Binary Stars",,playable,2021-01-13 09:19:42 +0100AE0006474000,"Stern Pinball Arcade",,playable,2022-08-16 14:24:41 +0100E24006FA8000,"Stikbold! A Dodgeball Adventure DELUXE",,playable,2021-01-11 20:12:54 +010077B014518000,"Stitchy in Tooki Trouble",,playable,2021-05-06 16:25:53 +010070D00F640000,"STONE",UE4,playable,2022-09-30 11:53:32 +010074400F6A8000,"Stories Untold",nvdec,playable,2022-12-22 01:08:46 +010040D00BCF4000,"Storm Boy",,playable,2022-10-20 14:15:06 +0100B2300B932000,"Storm In A Teacup",gpu,ingame,2021-11-06 02:03:19 +0100D5D00DAF2000,"Story of a Gladiator",,playable,2020-07-29 15:08:18 +010017301007E000,"STORY OF SEASONS Pioneers of Olive [ 牧場物語 オリーブタウンと希望の大地 ]",,playable,2021-03-18 11:42:19 +0100ED400EEC2000,"STORY OF SEASONS: Friends of Mineral Town",,playable,2022-10-03 16:40:31 +010078D00E8F4000,"Stranded Sails - Explorers of the Cursed Islands",slow;nvdec;UE4,playable,2022-09-16 11:58:38 +01000A6013F86000,"Strange Field Football",,playable,2022-11-04 12:25:57 +0100DD600DD48000,"Stranger Things 3: The Game",,playable,2021-01-11 17:44:09 +0100D7E011C64000,"Strawberry Vinegar",nvdec,playable,2022-12-05 16:25:40 +010075101EF84000,"Stray",crash,ingame,2025-01-07 04:03:00 +0100024008310000,"Street Fighter 30th Anniversary Collection",online-broken;ldn-partial,playable,2022-08-20 16:50:47 +010012400D202000,"Street Outlaws: The List",nvdec,playable,2021-06-11 12:15:32 +0100888011CB2000,"Street Power Soccer",UE4;crash,boots,2020-11-21 12:28:57 +0100EC9010258000,"Streets of Rage 4",nvdec;online,playable,2020-07-07 21:21:22 +0100BDE012928000,"Strife: Veteran Edition",gpu,ingame,2022-01-15 05:10:42 +010039100DACC000,"Strike Force - War on Terror",crash;Needs Update,menus,2021-11-24 08:08:20 +010038A00E6C6000,"Strike Force Kitty",nvdec,playable,2020-07-29 16:22:15 +010072500D52E000,"Strike Suit Zero: Director's Cut",crash,boots,2021-04-23 17:15:14 +0100FF5005B76000,"STRIKERS1945 for Nintendo Switch",32-bit,playable,2021-06-03 19:35:04 +0100720008ED2000,"STRIKERS1945 Ⅱ for Nintendo Switch",32-bit,playable,2021-06-03 19:43:00 +0100681011B56000,"Struggling",,playable,2020-10-15 20:37:03 +0100AF000B4AE000,"Stunt Kite Party",nvdec,playable,2021-01-25 17:16:56 +0100C5500E7AE000,"STURMWIND EX",audio;32-bit,playable,2022-09-16 12:01:39 +01001C1009892000,"Subarashiki Kono Sekai -Final Remix-",services;slow,ingame,2020-02-10 16:21:51 +010001400E474000,"Subdivision Infinity DX",UE4;crash,boots,2021-03-03 14:26:46 +0100E6400BCE8000,"Sublevel Zero Redux",,playable,2022-09-16 12:30:03 +0100EDA00D866000,"Submerged",nvdec;UE4;vulkan-backend-bug,playable,2022-08-16 15:17:01 +0100429011144000,"Subnautica",vulkan-backend-bug,playable,2022-11-04 13:07:29 +010014C011146000,"Subnautica: Below Zero",,playable,2022-12-23 14:15:13 +0100BF9012AC6000,"Suguru Nature",crash,ingame,2021-07-29 11:36:27 +01005CD00A2A2000,"Suicide Guy",,playable,2021-01-26 13:13:54 +0100DE000C2E4000,"Suicide Guy: Sleepin' Deeply",Needs More Attention,ingame,2022-09-20 23:45:25 +01003D50126A4000,"Sumire",,playable,2022-11-12 13:40:43 +0100A130109B2000,"Summer in Mara",nvdec,playable,2021-03-06 14:10:38 +01004E500DB9E000,"Summer Sweetheart",nvdec,playable,2022-09-16 12:51:46 +0100BFE014476000,"Sunblaze",,playable,2022-11-12 13:59:23 +01002D3007962000,"Sundered: Eldritch Edition",gpu,ingame,2021-06-07 11:46:00 +0100F7000464A000,"Super Beat Sports™",ldn-untested,playable,2022-08-16 16:05:50 +010051A00D716000,"Super Blood Hockey",,playable,2020-12-11 20:01:41 +01007AD00013E000,"Super Bomberman R",nvdec;online-broken;ldn-works,playable,2022-08-16 19:19:14 +0100B87017D94000,"SUPER BOMBERMAN R 2",deadlock,boots,2023-09-29 13:19:51 +0100D9B00DB5E000,"Super Cane Magic ZERO",,playable,2022-09-12 15:33:46 +010065F004E5E000,"Super Chariot",,playable,2021-06-03 13:19:01 +0100E5E00C464000,"SUPER DRAGON BALL HEROES WORLD MISSION",nvdec;online-broken,playable,2022-08-17 12:56:30 +010023100B19A000,"Super Dungeon Tactics",,playable,2022-10-06 17:40:40 +010056800B534000,"Super Inefficient Golf",UE4,playable,2022-08-17 15:53:45 +010015700D5DC000,"Super Jumpy Ball",,playable,2020-07-04 18:40:36 +0100196009998000,"Super Kickers League Ultimate",,playable,2021-01-26 13:36:48 +01003FB00C5A8000,"Super Kirby Clash™",ldn-works,playable,2024-07-30 18:21:55 +010000D00F81A000,"Super Korotama",,playable,2021-06-06 19:06:22 +01003E300FCAE000,"Super Loop Drive",nvdec;UE4,playable,2022-09-22 10:58:05 +054507E0B7552000,"Super Mario 64",homebrew,ingame,2024-03-20 16:57:27 +0100277011F1A000,"Super Mario Bros.™ 35",online-broken,menus,2022-08-07 16:27:25 +010015100B514000,"Super Mario Bros.™ Wonder",amd-vendor-bug,playable,2024-09-06 13:21:21 +01009B90006DC000,"Super Mario Maker™ 2",online-broken;ldn-broken,playable,2024-08-25 11:05:19 +0100000000010000,"Super Mario Odyssey™",nvdec;intel-vendor-bug;mac-bug,playable,2024-08-25 01:32:34 +010036B0034E4000,"Super Mario Party™",gpu;Needs Update;ldn-works,ingame,2024-06-21 05:10:16 +0100BC0018138000,"Super Mario RPG™",gpu;audio;nvdec,ingame,2024-06-19 17:43:42 +0000000000000000,"Super Mario World",homebrew,boots,2024-06-13 01:40:31 +010049900F546000,"Super Mario™ 3D All-Stars",services-horizon;slow;vulkan;amd-vendor-bug,ingame,2024-05-07 02:38:16 +010028600EBDA000,"Super Mario™ 3D World + Bowser’s Fury",ldn-works,playable,2024-07-31 10:45:37 +01004F8006A78000,"Super Meat Boy",services,playable,2020-04-02 23:10:07 +01009C200D60E000,"Super Meat Boy Forever",gpu,boots,2021-04-26 14:25:39 +0100BDD00EC5C000,"Super Mega Space Blaster Special Turbo",online,playable,2020-08-06 12:13:25 +010031F019294000,"Super Monkey Ball Banana Rumble",,playable,2024-06-28 10:39:18 +0100B2A00E1E0000,"Super Monkey Ball: Banana Blitz HD",online-broken,playable,2022-09-16 13:16:25 +01006D000D2A0000,"Super Mutant Alien Assault",,playable,2020-06-07 23:32:45 +01004D600AC14000,"Super Neptunia RPG",nvdec,playable,2022-08-17 16:38:52 +01008D300C50C000,"Super Nintendo Entertainment System™ - Nintendo Switch Online",,playable,2021-01-05 00:29:48 +0100284007D6C000,"Super One More Jump",,playable,2022-08-17 16:47:47 +01001F90122B2000,"Super Punch Patrol",,playable,2024-07-12 19:49:02 +0100331005E8E000,"Super Putty Squad",gpu;32-bit,ingame,2024-04-29 15:51:54 +01006C900CC60000,"SUPER ROBOT WARS T",online,playable,2021-03-25 11:00:40 +0100CA400E300000,"SUPER ROBOT WARS V",online,playable,2020-06-23 12:56:37 +010026800E304000,"SUPER ROBOT WARS X",online,playable,2020-08-05 19:18:51 +01004CF00A60E000,"Super Saurio Fly",nvdec,playable,2020-08-06 13:12:14 +010039700D200000,"Super Skelemania",,playable,2020-06-07 22:59:50 +01006A800016E000,"Super Smash Bros.™ Ultimate",gpu;crash;nvdec;ldn-works;intel-vendor-bug,ingame,2024-09-14 23:05:21 +0100D61012270000,"Super Soccer Blast",gpu,ingame,2022-02-16 08:39:12 +0100A9300A4AE000,"Super Sportmatchen",,playable,2022-08-19 12:34:40 +0100FB400F54E000,"Super Street: Racer",UE4,playable,2022-09-16 13:43:14 +010000500DB50000,"Super Tennis Blast",,playable,2022-08-19 16:20:48 +0100C6800D770000,"Super Toy Cars 2",gpu;regression,ingame,2021-03-02 20:15:15 +010035B00B3F0000,"Super Volley Blast",,playable,2022-08-19 18:14:40 +0100FF60051E2000,"Superbeat: Xonic EX",crash;nvdec,ingame,2022-08-19 18:54:40 +0100630010252000,"SuperEpic: The Entertainment War",,playable,2022-10-13 23:02:48 +01001A500E8B4000,"SUPERHOT",,playable,2021-05-05 19:51:30 +010075701153A000,"Superliminal",,playable,2020-09-03 13:20:50 +0100C01012654000,"Supermarket Shriek",,playable,2022-10-13 23:19:20 +0100A6E01201C000,"Supraland",nvdec;UE4;opengl-backend-bug,playable,2022-10-14 09:49:11 +010029A00AEB0000,"Survive! MR.CUBE",,playable,2022-10-20 14:44:47 +01005AB01119C000,"SUSHI REVERSI",,playable,2021-06-11 19:26:58 +0100DDD0085A4000,"Sushi Striker™: The Way of Sushido",nvdec,playable,2020-06-26 20:49:11 +0100D6D00EC2C000,"Sweet Witches",nvdec,playable,2022-10-20 14:56:37 +010049D00C8B0000,"Swimsanity!",online,menus,2021-11-26 14:27:16 +01005DF00DC26000,"SWORD ART ONLINE: FATAL BULLET Complete Edition",UE4;gpu;online,ingame,2021-06-09 16:58:50 +01001B600D1D6000,"SWORD ART ONLINE: Hollow Realization Deluxe Edition",nvdec,playable,2022-08-19 19:19:15 +01000D70049BE000,"Sword of the Guardian",,playable,2020-07-16 12:24:39 +0100E4701355C000,"Sword of the Necromancer",crash,ingame,2022-12-10 01:28:39 +01004BB00421E000,"Syberia 1 & 2",,playable,2021-12-24 12:06:25 +010028C003FD6000,"Syberia 2",gpu,ingame,2022-08-24 12:43:03 +0100CBE004E6C000,"Syberia 3",nvdec,playable,2021-01-25 16:15:12 +010007300C482000,"Sydney Hunter and the Curse of the Mayan",,playable,2020-06-15 12:15:57 +0100D8400DAF0000,"SYNAPTIC DRIVE",online,playable,2020-09-07 13:44:05 +01009E700F448000,"Synergia",,playable,2021-04-06 17:58:04 +01009BF00E7D2000,"SYNTHETIK: Ultimate",gpu;crash,ingame,2022-08-30 03:19:25 +010015B00BB00000,"Table Top Racing: World Tour - Nitro Edition",,playable,2020-04-05 23:21:30 +01000F20083A8000,"Tactical Mind",,playable,2021-01-25 18:05:00 +0100BD700F5F0000,"Tactical Mind 2",,playable,2020-07-01 23:11:07 +0100E12013C1A000,"Tactics Ogre: Reborn",vulkan-backend-bug,playable,2024-04-09 06:21:35 +01007C7006AEE000,"Tactics V: Obsidian Brigade",,playable,2021-02-28 15:09:42 +01002C000B552000,"Taiko no Tatsujin: Drum 'n' Fun!",online-broken;ldn-broken,playable,2023-05-20 15:10:12 +0100BCA0135A0000,"Taiko no Tatsujin: Rhythm Festival",,playable,2023-11-13 13:16:34 +0100DD6012644000,"Taiko no Tatsujin: Rhythmic Adventure Pack",,playable,2020-12-03 07:28:26 +0100346017304000,"Taiko Risshiden V DX",crash,nothing,2022-06-06 16:25:31 +010040A00EA26000,"Taimumari: Complete Edition",,playable,2022-12-06 13:34:49 +0100F0C011A68000,"Tales from the Borderlands",nvdec,playable,2022-10-25 18:44:14 +0100408007078000,"Tales of the Tiny Planet",,playable,2021-01-25 15:47:41 +01002C0008E52000,"Tales of Vesperia™: Definitive Edition",,playable,2024-09-28 03:20:47 +010012800EE3E000,"Tamashii",,playable,2021-06-10 15:26:20 +010008A0128C4000,"Tamiku",gpu,ingame,2021-06-15 20:06:55 +010048F007ADE000,"Tangledeep",crash,boots,2021-01-05 04:08:41 +01007DB010D2C000,"TaniNani",crash;kernel,nothing,2021-04-08 03:06:44 +0100E06012BB4000,"Tank Mechanic Simulator",,playable,2020-12-11 15:10:45 +01007A601318C000,"Tanuki Justice",opengl,playable,2023-02-21 18:28:10 +01004DF007564000,"Tanzia",,playable,2021-06-07 11:10:25 +01002D4011208000,"Task Force Kampas",,playable,2020-11-30 14:44:15 +0100B76011DAA000,"Taxi Chaos",slow;online-broken;UE4,playable,2022-10-25 19:13:00 +0100F43011E5A000,"Tcheco in the Castle of Lucio",,playable,2020-06-27 13:35:43 +010092B0091D0000,"Team Sonic Racing",online-broken;ldn-works,playable,2024-02-05 15:05:27 +0100FE701475A000,"Teenage Mutant Ninja Turtles: Shredder's Revenge",deadlock;crash,boots,2024-09-28 09:31:39 +01005CF01E784000,"Teenage Mutant Ninja Turtles: Splintered Fate",,playable,2024-08-03 13:50:42 +0100FDB0154E4000,"Teenage Mutant Ninja Turtles: The Cowabunga Collection",,playable,2024-01-22 19:39:04 +010021100DF22000,"Telling Lies",,playable,2020-10-23 21:14:51 +0100C8B012DEA000,"Temtem",online-broken,menus,2022-12-17 17:36:11 +0100B2600A398000,"TENGAI for Nintendo Switch",32-bit,playable,2020-11-25 19:52:26 +0100D7A005DFC000,"Tennis",,playable,2020-06-01 20:50:36 +01002970080AA000,"Tennis in the Face",,playable,2022-08-22 14:10:54 +0100092006814000,"Tennis World Tour",online-broken,playable,2022-08-22 14:27:10 +0100950012F66000,"Tennis World Tour 2",online-broken,playable,2022-10-14 10:43:16 +0100E46006708000,"Terraria",online-broken,playable,2022-09-12 16:14:57 +010070C00FB56000,"TERROR SQUID",online-broken,playable,2023-10-30 22:29:29 +010043700EB68000,"TERRORHYTHM (TRRT)",,playable,2021-02-27 13:18:14 +0100FBC007EAE000,"Tesla vs Lovecraft",,playable,2023-11-21 06:19:36 +01005C8005F34000,"Teslagrad",,playable,2021-02-23 14:41:02 +01006F701507A000,"Tested on Humans: Escape Room",,playable,2022-11-12 14:42:52 +0100671016432000,"TETRA for Nintendo Switch™ International Edition",,playable,2020-06-26 20:49:55 +01004E500A15C000,"TETRA's Escape",,playable,2020-06-03 18:21:14 +010040600C5CE000,"Tetris 99 Retail Bundle",gpu;online-broken;ldn-untested,ingame,2024-05-02 16:36:41 +0100EC000D39A000,"Tetsumo Party",,playable,2020-06-09 22:39:55 +01008ED0087A4000,"The Adventure Pals",,playable,2022-08-22 14:48:52 +0100137010152000,"The Adventures of 00 Dilly®",,playable,2020-12-30 19:32:29 +01003B400A00A000,"The Adventures of Bertram Fiddle: Episode 1: A Dreadly Business",nvdec,playable,2022-09-17 11:07:56 +010035C00A4BC000,"The Adventures of Elena Temple",,playable,2020-06-03 23:15:35 +010045A00E038000,"The Alliance Alive HD Remastered",nvdec,playable,2021-03-07 15:43:45 +010079A0112BE000,"The Almost Gone",,playable,2020-07-05 12:33:07 +0100CD500DDAE000,"The Bard's Tale ARPG: Remastered and Resnarkled",gpu;nvdec;online-working,ingame,2024-07-18 12:52:01 +01001E50141BC000,"The Battle Cats Unite!",deadlock,ingame,2021-12-14 21:38:34 +010089600E66A000,"The Big Journey",,playable,2022-09-16 14:03:08 +010021C000B6A000,"The Binding of Isaac: Afterbirth+",,playable,2021-04-26 14:11:56 +0100A5A00B2AA000,"The Bluecoats North & South",nvdec,playable,2020-12-10 21:22:29 +010062500BFC0000,"The Book of Unwritten Tales 2",,playable,2021-06-09 14:42:53 +01002A2004530000,"The Bridge",,playable,2020-06-03 13:53:26 +01008D700AB14000,"The Bug Butcher",,playable,2020-06-03 12:02:04 +01001B40086E2000,"The Bunker",nvdec,playable,2022-09-16 14:24:05 +010069100B7F0000,"The Caligula Effect: Overdose",UE4;gpu,ingame,2021-01-04 11:07:50 +010066800E9F8000,"The Childs Sight",,playable,2021-06-11 19:04:56 +0100B7C01169C000,"The Coma 2: Vicious Sisters",gpu,ingame,2020-06-20 12:51:51 +010033100691A000,"The Coma: Recut",,playable,2020-06-03 15:11:23 +01004170113D4000,"The Complex",nvdec,playable,2022-09-28 14:35:41 +01000F20102AC000,"The Copper Canyon Dixie Dash",UE4,playable,2022-09-29 11:42:29 +01000850037C0000,"The Count Lucanor",nvdec,playable,2022-08-22 15:26:37 +0100EBA01548E000,"The Cruel King and the Great Hero",gpu;services,ingame,2022-12-02 07:02:08 +010051800E922000,"The Dark Crystal: Age of Resistance Tactics",,playable,2020-08-11 13:43:41 +01003DE00918E000,"The Darkside Detective",,playable,2020-06-03 22:16:18 +01000A10041EA000,"The Elder Scrolls V: Skyrim",gpu;crash,ingame,2024-07-14 03:21:31 +01004A9006B84000,"The End Is Nigh",,playable,2020-06-01 11:26:45 +0100CA100489C000,"The Escapists 2",nvdec,playable,2020-09-24 12:31:31 +01001B700BA7C000,"The Escapists: Complete Edition",,playable,2021-02-24 17:50:31 +0100C2E0129A6000,"The Executioner",nvdec,playable,2021-01-23 00:31:28 +01006050114D4000,"The Experiment: Escape Room",gpu,ingame,2022-09-30 13:20:35 +0100B5900DFB2000,"The Eyes of Ara",,playable,2022-09-16 14:44:06 +01002DD00AF9E000,"The Fall",gpu,ingame,2020-05-31 23:31:16 +01003E5002320000,"The Fall Part 2: Unbound",,playable,2021-11-06 02:18:08 +0100CDC00789E000,"The Final Station",nvdec,playable,2022-08-22 15:54:39 +010098800A1E4000,"The First Tree",,playable,2021-02-24 15:51:05 +0100C38004DCC000,"The Flame In The Flood: Complete Edition",gpu;nvdec;UE4,ingame,2022-08-22 16:23:49 +010007700D4AC000,"The Forbidden Arts",,playable,2021-01-26 16:26:24 +010030700CBBC000,"The friends of Ringo Ishikawa",,playable,2022-08-22 16:33:17 +01006350148DA000,"The Gardener and the Wild Vines",gpu,ingame,2024-04-29 16:32:10 +0100B13007A6A000,"The Gardens Between",,playable,2021-01-29 16:16:53 +010036E00FB20000,"The Great Ace Attorney Chronicles",,playable,2023-06-22 21:26:29 +010007B012514000,"The Great Perhaps",,playable,2020-09-02 15:57:04 +01003B300E4AA000,"THE GRISAIA TRILOGY",,playable,2021-01-31 15:53:59 +01001950137D8000,"The Hong Kong Massacre",crash,ingame,2021-01-21 12:06:56 +01004AD00E094000,"The House of Da Vinci",,playable,2021-01-05 14:17:19 +01005A80113D2000,"The House of Da Vinci 2",,playable,2020-10-23 20:47:17 +010088401495E000,"The House of the Dead: Remake",,playable,2025-01-11 00:36:01 +0100E24004510000,"The Hunt - Championship Edition",32-bit,menus,2022-07-21 20:21:25 +01008940086E0000,"The Infectious Madness of Doctor Dekker",nvdec,playable,2022-08-22 16:45:01 +0100B0B00B318000,"The Inner World",nvdec,playable,2020-06-03 21:22:29 +0100A9D00B31A000,"The Inner World - The Last Wind Monk",nvdec,playable,2020-11-16 13:09:40 +0100AE5003EE6000,"The Jackbox Party Pack",online-working,playable,2023-05-28 09:28:40 +010015D003EE4000,"The Jackbox Party Pack 2",online-working,playable,2022-08-22 18:23:40 +0100CC80013D6000,"The Jackbox Party Pack 3",slow;online-working,playable,2022-08-22 18:41:06 +0100E1F003EE8000,"The Jackbox Party Pack 4",online-working,playable,2022-08-22 18:56:34 +010052C00B184000,"The Journey Down: Chapter One",nvdec,playable,2021-02-24 13:32:41 +01006BC00B188000,"The Journey Down: Chapter Three",nvdec,playable,2021-02-24 13:45:27 +01009AB00B186000,"The Journey Down: Chapter Two",nvdec,playable,2021-02-24 13:32:13 +010020500BD98000,"The King's Bird",,playable,2022-08-22 19:07:46 +010031B00DB34000,"the Knight & the Dragon",gpu,ingame,2023-08-14 10:31:43 +01007AF012E16000,"The Language Of Love",Needs Update;crash,nothing,2020-12-03 17:54:00 +010079C017F5E000,"The Lara Croft Collection",services-horizon;deadlock,nothing,2024-07-12 22:45:51 +0100449011506000,"The Last Campfire",,playable,2022-10-20 16:44:19 +0100AAD011592000,"The Last Dead End",gpu;UE4,ingame,2022-10-20 16:59:44 +0100AC800D022000,"THE LAST REMNANT Remastered",nvdec;UE4,playable,2023-02-09 17:24:44 +0100B1900F0B6000,"The Legend of Dark Witch",,playable,2020-07-12 15:18:33 +01001920156C2000,"The Legend of Heroes: Trails from Zero",gpu;mac-bug,ingame,2024-09-14 21:41:41 +01005420101DA000,"The Legend of Heroes: Trails of Cold Steel III",,playable,2020-12-16 10:59:18 +01009B101044C000,"The Legend of Heroes: Trails of Cold Steel III Demo",demo;nvdec,playable,2021-04-23 01:07:32 +0100D3C010DE8000,"The Legend of Heroes: Trails of Cold Steel IV",nvdec,playable,2021-04-23 14:01:05 +01005E5013862000,"THE LEGEND OF HEROES: ZERO NO KISEKI KAI [英雄傳說 零之軌跡:改]",crash,nothing,2021-09-30 14:41:07 +01008CF01BAAC000,"The Legend of Zelda Echoes of Wisdom",nvdec;ASTC;intel-vendor-bug,playable,2024-10-01 14:11:01 +0100509005AF2000,"The Legend of Zelda: Breath of the Wild Demo",demo,ingame,2022-12-24 05:02:58 +01007EF00011E000,"The Legend of Zelda™: Breath of the Wild",gpu;amd-vendor-bug;mac-bug,ingame,2024-09-23 19:35:46 +01006BB00C6F0000,"The Legend of Zelda™: Link’s Awakening",gpu;nvdec;mac-bug,ingame,2023-08-09 17:37:40 +01002DA013484000,"The Legend of Zelda™: Skyward Sword HD",gpu,ingame,2024-06-14 16:48:29 +0100F2C0115B6000,"The Legend of Zelda™: Tears of the Kingdom",gpu;amd-vendor-bug;intel-vendor-bug;mac-bug,ingame,2024-08-24 12:38:30 +0100A4400BE74000,"The LEGO Movie 2 Videogame",,playable,2023-03-01 11:23:37 +010064B00B95C000,"The Liar Princess and the Blind Prince",audio;slow,playable,2020-06-08 21:23:28 +0100735004898000,"The Lion's Song",,playable,2021-06-09 15:07:16 +0100A5000D590000,"The Little Acre",nvdec,playable,2021-03-02 20:22:27 +01007A700A87C000,"The Long Dark",,playable,2021-02-21 14:19:52 +010052B003A38000,"The Long Reach",nvdec,playable,2021-02-24 14:09:48 +01003C3013300000,"The Long Return",slow,playable,2020-12-10 21:05:10 +0100CE1004E72000,"The Longest Five Minutes",gpu,boots,2023-02-19 18:33:11 +0100F3D0122C2000,"The Longing",gpu,ingame,2022-11-12 15:00:58 +010085A00C5E8000,"The Lord of the Rings: Adventure Card Game - Definitive Edition",online-broken,menus,2022-09-16 15:19:32 +01008A000A404000,"The Lost Child",nvdec,playable,2021-02-23 15:44:20 +0100BAB00A116000,"The Low Road",,playable,2021-02-26 13:23:22 +01005F3006AFE000,"The Mahjong",Needs Update;crash;services,nothing,2021-04-01 22:06:22 +0100DC300AC78000,"The Messenger",,playable,2020-03-22 13:51:37 +0100DEC00B2BC000,"The Midnight Sanctuary",nvdec;UE4;vulkan-backend-bug,playable,2022-10-03 17:17:32 +0100F1B00B456000,"The MISSING: J.J. Macfield and the Island of Memories",,playable,2022-08-22 19:36:18 +010033300AC1A000,"The Mooseman",,playable,2021-02-24 12:58:57 +01005E9016BDE000,"The movie The Quintessential Bride -Five Memories Spent with You-",,playable,2023-12-14 14:43:43 +0100496004194000,"The Mummy Demastered",,playable,2021-02-23 13:11:27 +01004C500AAF6000,"The Mystery of the Hudson Case",,playable,2020-06-01 11:03:36 +01000CF0084BC000,"The Next Penelope",,playable,2021-01-29 16:26:11 +01001FB00E386000,"THE NINJA SAVIORS Return of the Warriors",online,playable,2021-03-25 23:48:07 +0100B080184BC000,"The Oregon Trail",gpu,ingame,2022-11-25 16:11:49 +0100B0101265C000,"The Otterman Empire",UE4;gpu,ingame,2021-06-17 12:27:15 +01000BC01801A000,"The Outbound Ghost",,nothing,2024-03-02 17:10:58 +0100626011656000,"The Outer Worlds",gpu;nvdec;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-10-03 17:55:32 +01005C500D690000,"The Park",UE4;crash;gpu,ingame,2020-12-18 12:50:07 +010050101127C000,"The Persistence",nvdec,playable,2021-06-06 19:15:40 +0100CD300880E000,"The Pinball Arcade",online-broken,playable,2022-08-22 19:49:46 +01006BD018B54000,"The Plucky Squire",crash,ingame,2024-09-27 22:32:33 +0100E6A00B960000,"The Princess Guide",,playable,2021-02-24 14:23:34 +010058A00BF1C000,"The Raven Remastered",nvdec,playable,2022-08-22 20:02:47 +0100EB100D17C000,"The Red Strings Club",,playable,2020-06-01 10:51:18 +010079400BEE0000,"The Room",,playable,2021-04-14 18:57:05 +010033100EE12000,"The Ryuo's Work is Never Done!",,playable,2022-03-29 00:35:37 +01002BA00C7CE000,"The Savior's Gang",gpu;nvdec;UE4,ingame,2022-09-21 12:37:48 +0100F3200E7CA000,"The Settlers®: New Allies",deadlock,nothing,2023-10-25 00:18:05 +0100F89003BC8000,"The Sexy Brutale",,playable,2021-01-06 17:48:28 +01001FF00BEE8000,"The Shapeshifting Detective",nvdec,playable,2021-01-10 13:10:49 +010028D00BA1A000,"The Sinking City",nvdec;UE4,playable,2022-09-12 16:41:55 +010041C00A68C000,"The Spectrum Retreat",,playable,2022-10-03 18:52:40 +010029300E5C4000,"The Stanley Parable: Ultra Deluxe",gpu,ingame,2024-07-12 23:18:26 +010007F00AF56000,"The Station",,playable,2022-09-28 18:15:27 +0100858010DC4000,"the StoryTale",,playable,2022-09-03 13:00:25 +0100AA400A238000,"The Stretchers™",nvdec;UE4,playable,2022-09-16 15:40:58 +0100E3100450E000,"The Strike - Championship Edition",gpu;32-bit,boots,2022-12-09 15:58:16 +0100EF200DA60000,"The Survivalists",,playable,2020-10-27 15:51:13 +010040D00B7CE000,"The Swindle",nvdec,playable,2022-08-22 20:53:52 +010037D00D568000,"The Swords of Ditto: Mormo's Curse",slow,ingame,2020-12-06 00:13:12 +01009B300D76A000,"The Tiny Bang Story",,playable,2021-03-05 15:39:05 +0100C3300D8C4000,"The Touryst",crash,ingame,2023-08-22 01:32:38 +010047300EBA6000,"The Tower of Beatrice",,playable,2022-09-12 16:51:42 +010058000A576000,"The Town of Light: Deluxe Edition",gpu,playable,2022-09-21 12:51:34 +0100B0E0086F6000,"The Trail: Frontier Challenge",slow,playable,2022-08-23 15:10:51 +0100EA100F516000,"The Turing Test",nvdec,playable,2022-09-21 13:24:07 +010064E00ECBC000,"The Unicorn Princess",,playable,2022-09-16 16:20:56 +0100BCF00E970000,"The Vanishing of Ethan Carter",UE4,playable,2021-06-09 17:14:47 +0100D0500B0A6000,"The VideoKid",nvdec,playable,2021-01-06 09:28:24 +01008CF00BA38000,"The Voice",services,menus,2020-07-28 20:48:49 +010056E00B4F4000,"The Walking Dead: A New Frontier",,playable,2022-09-21 13:40:48 +010099100B6AC000,"The Walking Dead: Season Two",,playable,2020-08-09 12:57:06 +010029200B6AA000,"The Walking Dead: The Complete First Season",,playable,2021-06-04 13:10:56 +010060F00AA70000,"The Walking Dead: The Final Season - Season Pass",online-broken,playable,2022-08-23 17:22:32 +010095F010568000,"The Wanderer: Frankenstein's Creature",,playable,2020-07-11 12:49:51 +01008B200FC6C000,"The Wardrobe: Even Better Edition",,playable,2022-09-16 19:14:55 +01003D100E9C6000,"The Witcher 3: Wild Hunt",nvdec;vulkan-backend-bug;amd-vendor-bug,playable,2024-02-22 12:21:51 +0100B1300FF08000,"The Wonderful 101: Remastered",slow;nvdec,playable,2022-09-30 13:49:28 +0100C1500B82E000,"The World Ends with You®: Final Remix",ldn-untested,playable,2022-07-09 01:11:21 +0100E6200D56E000,"The World Next Door",,playable,2022-09-21 14:15:23 +010075900CD1C000,"Thea: The Awakening",,playable,2021-01-18 15:08:47 +010081B01777C000,"THEATRHYTHM FINAL BAR LINE",Incomplete,ingame,2024-08-05 14:24:55 +01001C2010D08000,"They Bleed Pixels",gpu,ingame,2024-08-09 05:52:18 +0100768010970000,"They Came From the Sky",,playable,2020-06-12 16:38:19 +0100CE700F62A000,"Thief of Thieves: Season One",crash;loader-allocator,nothing,2021-11-03 07:16:30 +0100CE400E34E000,"Thief Simulator",,playable,2023-04-22 04:39:11 +01009BD003B36000,"Thimbleweed Park",,playable,2022-08-24 11:15:31 +0100F2300A5DA000,"Think of the Children",deadlock,menus,2021-11-23 09:04:45 +0100066004D68000,"This Is the Police",,playable,2022-08-24 11:37:05 +01004C100A04C000,"This is the Police 2",,playable,2022-08-24 11:49:17 +0100C7C00F77C000,"This Strange Realm Of Mine",,playable,2020-08-28 12:07:24 +0100A8700BC2A000,"This War of Mine: Complete Edition",gpu;32-bit;nvdec,ingame,2022-08-24 12:00:44 +0100AC500EEE8000,"THOTH",,playable,2020-08-05 18:35:28 +0100E910103B4000,"Thronebreaker: The Witcher Tales",nvdec,playable,2021-06-03 16:40:15 +01006F6002840000,"Thumper",gpu,ingame,2024-08-12 02:41:07 +01000AC011588000,"Thy Sword",crash,ingame,2022-09-30 16:43:14 +0100E9000C42C000,"Tick Tock: A Tale for Two",,menus,2020-07-14 14:49:38 +0100B6D00C2DE000,"Tied Together",nvdec,playable,2021-04-10 14:03:46 +010074500699A000,"Timber Tennis: Versus",online,playable,2020-10-03 17:07:15 +01004C500B698000,"Time Carnage",,playable,2021-06-16 17:57:28 +0100F770045CA000,"Time Recoil",,playable,2022-08-24 12:44:03 +0100DD300CF3A000,"Timespinner",gpu,ingame,2022-08-09 09:39:11 +0100393013A10000,"Timothy and the Mysterious Forest",gpu;slow,ingame,2021-06-02 00:42:11 +0100F7C010AF6000,"Tin & Kuna",,playable,2020-11-17 12:16:12 +0100DF900FC52000,"Tiny Gladiators",,playable,2020-12-14 00:09:43 +010061A00AE64000,"Tiny Hands Adventure",,playable,2022-08-24 16:07:48 +010074800741A000,"TINY METAL",UE4;gpu;nvdec,ingame,2021-03-05 17:11:57 +01005D0011A40000,"Tiny Racer",,playable,2022-10-07 11:13:03 +010002401AE94000,"Tiny Thor",gpu,ingame,2024-07-26 08:37:35 +0100A73016576000,"Tinykin",gpu,ingame,2023-06-18 12:12:24 +0100FE801185E000,"Titan Glory",,boots,2022-10-07 11:36:40 +0100605008268000,"Titan Quest",nvdec;online-broken,playable,2022-08-19 21:54:15 +01009C400E93E000,"Titans Pinball",slow,playable,2020-06-09 16:53:52 +010019500DB1E000,"Tlicolity Eyes - twinkle showtime -",gpu,boots,2021-05-29 19:43:44 +010036700F83E000,"To the Moon",,playable,2021-03-20 15:33:38 +010014900865A000,"Toast Time: Smash Up!",crash;services,menus,2020-04-03 12:26:59 +0100A4A00B2E8000,"Toby: The Secret Mine",nvdec,playable,2021-01-06 09:22:33 +0100B5200BB7C000,"ToeJam & Earl: Back in the Groove!",,playable,2021-01-06 22:56:58 +0100B5E011920000,"TOHU",slow,playable,2021-02-08 15:40:44 +0100F3400A432000,"Toki",nvdec,playable,2021-01-06 19:59:23 +01003E500F962000,"Tokyo Dark – Remembrance –",nvdec,playable,2021-06-10 20:09:49 +0100A9400C9C2000,"Tokyo Mirage Sessions™ #FE Encore",32-bit;nvdec,playable,2022-07-07 09:41:07 +0100E2E00CB14000,"Tokyo School Life",,playable,2022-09-16 20:25:54 +010024601BB16000,"Tomb Raider I-III Remastered Starring Lara Croft",gpu;opengl,ingame,2024-09-27 12:32:04 +0100D7F01E49C000,"Tomba! Special Edition",services-horizon,nothing,2024-09-15 21:59:54 +0100D400100F8000,"Tonight We Riot",,playable,2021-02-26 15:55:09 +0100CC00102B4000,"Tony Hawk's™ Pro Skater™ 1 + 2",gpu;Needs Update,ingame,2024-09-24 08:18:14 +010093F00E818000,"Tools Up!",crash,ingame,2020-07-21 12:58:17 +01009EA00E2B8000,"Toon War",,playable,2021-06-11 16:41:53 +010090400D366000,"Torchlight II",,playable,2020-07-27 14:18:37 +010075400DDB8000,"Torchlight III",nvdec;online-broken;UE4,playable,2022-10-14 22:20:17 +01007AF011732000,"TORICKY-S",deadlock,menus,2021-11-25 08:53:36 +0100BEB010F2A000,"Torn Tales: Rebound Edition",,playable,2020-11-01 14:11:59 +0100A64010D48000,"Total Arcade Racing",,playable,2022-11-12 15:12:48 +0100512010728000,"Totally Reliable Delivery Service",online-broken,playable,2024-09-27 19:32:22 +01004E900B082000,"Touhou Genso Wanderer Reloaded",gpu;nvdec,ingame,2022-08-25 11:57:36 +010010F004022000,"Touhou Kobuto V: Burst Battle",,playable,2021-01-11 15:28:58 +0100E9D00D6C2000,"TOUHOU Spell Bubble",,playable,2020-10-18 11:43:43 +0100F7B00595C000,"Tower Of Babel",,playable,2021-01-06 17:05:15 +010094600DC86000,"Tower Of Time",gpu;nvdec,ingame,2020-07-03 11:11:12 +0100A1C00359C000,"TowerFall",,playable,2020-05-16 18:58:07 +0100F6200F77E000,"Towertale",,playable,2020-10-15 13:56:58 +010049E00BA34000,"Townsmen - A Kingdom Rebuilt",nvdec,playable,2022-10-14 22:48:59 +01009FF00A160000,"Toy Stunt Bike: Tiptop's Trials",UE4,playable,2021-04-10 13:56:34 +0100192010F5A000,"Tracks - Toybox Edition",UE4;crash,nothing,2021-02-08 15:19:18 +0100BCA00843A000,"Trailblazers",,playable,2021-03-02 20:40:49 +010009F004E66000,"Transcripted",,playable,2022-08-25 12:13:11 +01005E500E528000,"TRANSFORMERS: BATTLEGROUNDS",online,playable,2021-06-17 18:08:19 +0100BE500BEA2000,"Transistor",,playable,2020-10-22 11:28:02 +0100A8D010BFA000,"Travel Mosaics 2: Roman Holiday",,playable,2021-05-26 12:33:16 +0100102010BFC000,"Travel Mosaics 3: Tokyo Animated",,playable,2021-05-26 12:06:27 +010096D010BFE000,"Travel Mosaics 4: Adventures In Rio",,playable,2021-05-26 11:54:58 +01004C4010C00000,"Travel Mosaics 5: Waltzing Vienna",,playable,2021-05-26 11:49:35 +0100D520119D6000,"Travel Mosaics 6: Christmas Around the World",,playable,2021-05-26 00:52:47 +01000BD0119DE000,"Travel Mosaics 7: Fantastic Berlin",,playable,2021-05-22 18:37:34 +01007DB00A226000,"Travel Mosaics: A Paris Tour",,playable,2021-05-26 12:42:26 +010011600C946000,"Travis Strikes Again: No More Heroes",nvdec;UE4,playable,2022-08-25 12:36:38 +01006EB004B0E000,"Treadnauts",,playable,2021-01-10 14:57:41 +0100D7800E9E0000,"Trials of Mana",UE4,playable,2022-09-30 21:50:37 +0100E1D00FBDE000,"Trials of Mana Demo",nvdec;UE4;demo;vulkan-backend-bug,playable,2022-09-26 18:00:02 +01003E800A102000,"Trials Rising Standard Edition",,playable,2024-02-11 01:36:39 +0100CC80140F8000,"TRIANGLE STRATEGY™",gpu;Needs Update;UE4;vulkan-backend-bug,ingame,2024-09-25 20:48:37 +010064E00A932000,"Trine 2: Complete Story",nvdec,playable,2021-06-03 11:45:20 +0100DEC00A934000,"Trine 3: The Artifacts of Power",ldn-untested;online,playable,2021-06-03 12:01:24 +010055E00CA68000,"Trine 4: The Nightmare Prince",gpu,nothing,2025-01-07 05:47:46 +0100D9000A930000,"Trine Enchanted Edition",ldn-untested;nvdec,playable,2021-06-03 11:28:15 +01002D7010A54000,"Trinity Trigger",crash,ingame,2023-03-03 03:09:09 +0100868013FFC000,"TRIVIAL PURSUIT Live! 2",,boots,2022-12-19 00:04:33 +0100F78002040000,"Troll and I™",gpu;nvdec,ingame,2021-06-04 16:58:50 +0100145011008000,"Trollhunters: Defenders of Arcadia",gpu;nvdec,ingame,2020-11-30 13:27:09 +0100FBE0113CC000,"Tropico 6 - Nintendo Switch™ Edition",nvdec;UE4,playable,2022-10-14 23:21:03 +0100D06018DCA000,"Trouble Witches Final! Episode 01: Daughters of Amalgam",,playable,2024-04-08 15:08:11 +0100B5B0113CE000,"Troubleshooter",UE4;crash,nothing,2020-10-04 13:46:50 +010089600FB72000,"Trover Saves The Universe",UE4;crash,nothing,2020-10-03 10:25:27 +0100E6300D448000,"Trüberbrook",,playable,2021-06-04 17:08:00 +0100F2100AA5C000,"Truck and Logistics Simulator",,playable,2021-06-11 13:29:08 +0100CB50107BA000,"Truck Driver",online-broken,playable,2022-10-20 17:42:33 +0100E75004766000,"True Fear: Forsaken Souls - Part 1",nvdec,playable,2020-12-15 21:39:52 +010099900CAB2000,"TT Isle of Man",nvdec,playable,2020-06-22 12:25:13 +010000400F582000,"TT Isle of Man Ride on the Edge 2",gpu;nvdec;online-broken,ingame,2022-09-30 22:13:05 +0100752011628000,"TTV2",,playable,2020-11-27 13:21:36 +0100AFE00452E000,"Tumblestone",,playable,2021-01-07 17:49:20 +010085500D5F6000,"Turok",gpu,ingame,2021-06-04 13:16:24 +0100CDC00D8D6000,"Turok 2: Seeds of Evil",gpu;vulkan,ingame,2022-09-12 17:50:05 +010004B0130C8000,"Turrican Flashback",audout,playable,2021-08-30 10:07:56 +0100B1F0090F2000,"TurtlePop: Journey to Freedom",,playable,2020-06-12 17:45:39 +0100047009742000,"Twin Robots: Ultimate Edition",nvdec,playable,2022-08-25 14:24:03 +010031200E044000,"Two Point Hospital™",crash;nvdec,ingame,2022-09-22 11:22:23 +010038400C2FE000,"TY the Tasmanian Tiger™ HD",32-bit;crash;nvdec,menus,2020-12-17 21:15:00 +010073A00C4B2000,"Tyd wag vir Niemand",,playable,2021-03-02 13:39:53 +0100D5B00D6DA000,"Type:Rider",,playable,2021-01-06 13:12:55 +010040D01222C000,"UBERMOSH: SANTICIDE",,playable,2020-11-27 15:05:01 +0100992010BF8000,"Ubongo",,playable,2021-02-04 21:15:01 +010079000B56C000,"UglyDolls: An Imperfect Adventure",nvdec;UE4,playable,2022-08-25 14:42:16 +010048901295C000,"Ultimate Fishing Simulator",,playable,2021-06-16 18:38:23 +01009D000FAE0000,"Ultimate Racing 2D",,playable,2020-08-05 17:27:09 +010045200A1C2000,"Ultimate Runner",,playable,2022-08-29 12:52:40 +01006B601117E000,"Ultimate Ski Jumping 2020",online,playable,2021-03-02 20:54:11 +01002D4012222000,"Ultra Hat Dimension",services;audio,menus,2021-11-18 09:05:20 +01009C000415A000,"Ultra Hyperball",,playable,2021-01-06 10:09:55 +01007330027EE000,"Ultra Street Fighter® II: The Final Challengers",ldn-untested,playable,2021-11-25 07:54:58 +01006A300BA2C000,"Umineko no Naku Koro ni Saku - うみねこのなく頃に咲 ~猫箱と夢想の交響曲~",audout,playable,2023-05-04 17:25:23 +0100592005164000,"UNBOX: Newbie's Adventure",UE4,playable,2022-08-29 13:12:56 +01002D900C5E4000,"Uncanny Valley",nvdec,playable,2021-06-04 13:28:45 +010076F011F54000,"Undead & Beyond",nvdec,playable,2022-10-04 09:11:18 +01008F3013E4E000,"Under Leaves",,playable,2021-05-22 18:13:58 +010080B00AD66000,"Undertale",,playable,2022-08-31 17:31:46 +01008F80049C6000,"Unepic",,playable,2024-01-15 17:03:00 +01007820096FC000,"UnExplored",,playable,2021-01-06 10:02:16 +01007D1013512000,"Unhatched",,playable,2020-12-11 12:11:09 +010069401ADB8000,"Unicorn Overlord",,playable,2024-09-27 14:04:32 +0100B1400D92A000,"Unit 4",,playable,2020-12-16 18:54:13 +010045200D3A4000,"Unknown Fate",slow,ingame,2020-10-15 12:27:42 +0100AB2010B4C000,"Unlock The King",,playable,2020-09-01 13:58:27 +0100A3E011CB0000,"Unlock the King 2",,playable,2021-06-15 20:43:55 +01005AA00372A000,"UNO® for Nintendo Switch",nvdec;ldn-untested,playable,2022-07-28 14:49:47 +0100E5D00CC0C000,"Unravel Two",nvdec,playable,2024-05-23 15:45:05 +010001300CC4A000,"Unruly Heroes",,playable,2021-01-07 18:09:31 +0100B410138C0000,"Unspottable",,playable,2022-10-25 19:28:49 +010082400BCC6000,"Untitled Goose Game",,playable,2020-09-26 13:18:06 +0100E49013190000,"Unto The End",gpu,ingame,2022-10-21 11:13:29 +0100B110109F8000,"Urban Flow",services,playable,2020-07-05 12:51:47 +010054F014016000,"Urban Street Fighting",,playable,2021-02-20 19:16:36 +01001B10068EC000,"Urban Trial Playground",UE4;nvdec;online,playable,2021-03-25 20:56:51 +0100A2500EB92000,"Urban Trial Tricky",nvdec;UE4,playable,2022-12-06 13:07:56 +01007C0003AEC000,"Use Your Words",nvdec;online-broken,menus,2022-08-29 17:22:10 +0100D4300EBF8000,"Uta no Prince-sama Amazing Aria & Sweet Serenade LOVE",crash;Needs More Attention;Needs Update,nothing,2022-02-09 08:57:44 +010024200E00A000,"Uta no☆Prince-sama♪ Repeat Love",nvdec,playable,2022-12-09 09:21:51 +010029B00CC3E000,"UTOPIA 9 - A Volatile Vacation",nvdec,playable,2020-12-16 17:06:42 +010064400B138000,"V-Rally 4",gpu;nvdec,ingame,2021-06-07 19:37:31 +0100A6700D66E000,"VA-11 HALL-A",,playable,2021-02-26 15:05:34 +01009E2003FE2000,"Vaccine",nvdec,playable,2021-01-06 01:02:07 +010089700F30C000,"Valfaris",,playable,2022-09-16 21:37:24 +0100CAF00B744000,"Valkyria Chronicles",32-bit;crash;nvdec,ingame,2022-11-23 20:03:32 +01005C600AC68000,"Valkyria Chronicles 4",audout;nvdec,playable,2021-06-03 18:12:25 +0100FBD00B91E000,"Valkyria Chronicles 4 Demo",slow;demo,ingame,2022-08-29 20:39:07 +0100E0E00B108000,"Valley",nvdec,playable,2022-09-28 19:27:58 +010089A0197E4000,"Vampire Survivors",,ingame,2024-06-17 09:57:38 +010020C00FFB6000,"Vampire: The Masquerade - Coteries of New York",,playable,2020-10-04 14:55:22 +01000BD00CE64000,"VAMPYR",nvdec;UE4,playable,2022-09-16 22:15:51 +01007C500D650000,"Vandals",,playable,2021-01-27 21:45:46 +010030F00CA1E000,"Vaporum",nvdec,playable,2021-05-28 14:25:33 +010045C0109F2000,"VARIABLE BARRICADE NS",nvdec,playable,2022-02-26 15:50:13 +0100FE200AF48000,"VASARA Collection",nvdec,playable,2021-02-28 15:26:10 +0100AD300E4FA000,"Vasilis",,playable,2020-09-01 15:05:35 +01009CD003A0A000,"Vegas Party",,playable,2021-04-14 19:21:41 +010098400E39E000,"Vektor Wars",online-broken;vulkan-backend-bug,playable,2022-10-04 09:23:46 +01003A8018E60000,"Vengeful Guardian: Moonrider",deadlock,boots,2024-03-17 23:35:37 +010095B00DBC8000,"Venture Kid",crash;gpu,ingame,2021-04-18 16:33:17 +0100C850134A0000,"Vera Blanc: Full Moon",audio,playable,2020-12-17 12:09:30 +0100379013A62000,"Very Very Valet",nvdec,playable,2022-11-12 15:25:51 +01006C8014DDA000,"Very Very Valet Demo",crash;Needs Update;demo,boots,2022-11-12 15:26:13 +010057B00712C000,"Vesta",nvdec,playable,2022-08-29 21:03:39 +0100E81007A06000,"Victor Vran Overkill Edition",gpu;deadlock;nvdec;opengl,ingame,2022-08-30 11:46:56 +01005880063AA000,"Violett",nvdec,playable,2021-01-28 13:09:36 +010037900CB1C000,"Viviette",,playable,2021-06-11 15:33:40 +0100D010113A8000,"Void Bastards",,playable,2022-10-15 00:04:19 +0100FF7010E7E000,"void tRrLM(); //Void Terrarium",gpu;Needs Update;regression,ingame,2023-02-10 01:13:25 +010078D0175EE000,"void* tRrLM2(); //Void Terrarium 2",,playable,2023-12-21 11:00:41 +0100B1A0066DC000,"Volgarr the Viking",,playable,2020-12-18 15:25:50 +0100A7900E79C000,"Volta-X",online-broken,playable,2022-10-07 12:20:51 +01004D8007368000,"Vostok Inc.",,playable,2021-01-27 17:43:59 +0100B1E0100A4000,"Voxel Galaxy",,playable,2022-09-28 22:45:02 +0100AFA011068000,"Voxel Pirates",,playable,2022-09-28 22:55:02 +0100BFB00D1F4000,"Voxel Sword",,playable,2022-08-30 14:57:27 +01004E90028A2000,"Vroom in the night sky",Needs Update;vulkan-backend-bug,playable,2023-02-20 02:32:29 +0100C7C00AE6C000,"VSR: Void Space Racing",,playable,2021-01-27 14:08:59 +0100B130119D0000,"Waifu Uncovered",crash,ingame,2023-02-27 01:17:46 +0100E29010A4A000,"Wanba Warriors",,playable,2020-10-04 17:56:22 +010078800825E000,"Wanderjahr TryAgainOrWalkAway",,playable,2020-12-16 09:46:04 +0100B27010436000,"Wanderlust Travel Stories",,playable,2021-04-07 16:09:12 +0100F8A00853C000,"Wandersong",nvdec,playable,2021-06-04 15:33:34 +0100D67013910000,"Wanna Survive",,playable,2022-11-12 21:15:43 +010056901285A000,"War Dogs: Red's Return",,playable,2022-11-13 15:29:01 +01004FA01391A000,"War Of Stealth - assassin",,playable,2021-05-22 17:34:38 +010035A00D4E6000,"War Party",nvdec,playable,2021-01-27 18:26:32 +010049500DE56000,"War Tech Fighters",nvdec,playable,2022-09-16 22:29:31 +010084D00A134000,"War Theatre",gpu,ingame,2021-06-07 19:42:45 +0100B6B013B8A000,"War Truck Simulator",,playable,2021-01-31 11:22:54 +0100563011B4A000,"War-Torn Dreams",crash,nothing,2020-10-21 11:36:16 +010054900F51A000,"WARBORN",,playable,2020-06-25 12:36:47 +01000F0002BB6000,"Wargroove",online-broken,playable,2022-08-31 10:30:45 +0100C6000EEA8000,"Warhammer 40,000: Mechanicus",nvdec,playable,2021-06-13 10:46:38 +0100E5600D7B2000,"WARHAMMER 40,000: SPACE WOLF",online-broken,playable,2022-09-20 21:11:20 +010031201307A000,"Warhammer Age of Sigmar: Storm Ground",nvdec;online-broken;UE4,playable,2022-11-13 15:46:14 +01002FF00F460000,"Warhammer Quest 2: The End Times",,playable,2020-08-04 15:28:03 +0100563010E0C000,"WarioWare™: Get It Together!",gpu;opengl-backend-bug,ingame,2024-04-23 01:04:56 +010045B018EC2000,"WarioWare™: Move It!",,playable,2023-11-14 00:23:51 +0100E0400E320000,"Warlocks 2: God Slayers",,playable,2020-12-16 17:36:50 +0100DB300A026000,"Warp Shift",nvdec,playable,2020-12-15 14:48:48 +010032700EAC4000,"WarriOrb",UE4,playable,2021-06-17 15:45:14 +0100E8500AD58000,"WARRIORS OROCHI 4 ULTIMATE",nvdec;online-broken,playable,2024-08-07 01:50:37 +0100CD900FB24000,"WARTILE",UE4;crash;gpu,menus,2020-12-11 21:56:10 +010039A00BC64000,"Wasteland 2: Director's Cut",nvdec,playable,2021-01-27 13:34:11 +0100B79011F06000,"Water Balloon Mania",,playable,2020-10-23 20:20:59 +0100BA200C378000,"Way of the Passive Fist",gpu,ingame,2021-02-26 21:07:06 +0100560010E3E000,"We should talk.",crash,nothing,2020-08-03 12:32:36 +010096000EEBA000,"Welcome to Hanwell",UE4;crash,boots,2020-08-03 11:54:57 +0100D7F010B94000,"Welcome to Primrose Lake",,playable,2022-10-21 11:30:57 +010035600EC94000,"Wenjia",,playable,2020-06-08 11:38:30 +010031B00A4E8000,"West of Loathing",,playable,2021-01-28 12:35:19 +010038900DFE0000,"What Remains of Edith Finch",slow;UE4,playable,2022-08-31 19:57:59 +010033600ADE6000,"Wheel of Fortune®",crash;Needs More Attention;nvdec,boots,2023-11-12 20:29:24 +0100DFC00405E000,"Wheels of Aurelia",,playable,2021-01-27 21:59:25 +010027D011C9C000,"Where Angels Cry",gpu;nvdec,ingame,2022-09-30 22:24:47 +0100FDB0092B4000,"Where Are My Friends?",,playable,2022-09-21 14:39:26 +01000C000C966000,"Where the Bees Make Honey",,playable,2020-07-15 12:40:49 +010017500E7E0000,"Whipseey and the Lost Atlas",,playable,2020-06-23 20:24:14 +010015A00AF1E000,"Whispering Willows",nvdec,playable,2022-09-30 22:33:05 +010027F0128EA000,"Who Wants to Be a Millionaire?",crash,nothing,2020-12-11 20:22:42 +0100C7800CA06000,"Widget Satchel",,playable,2022-09-16 22:41:07 +0100CFC00A1D8000,"Wild Guns™ Reloaded",,playable,2021-01-28 12:29:05 +010071F00D65A000,"Wilmot's Warehouse",audio;gpu,ingame,2021-06-02 17:24:32 +010048800B638000,"Windjammers",online,playable,2020-10-13 11:24:25 +010059900BA3C000,"Windscape",,playable,2022-10-21 11:49:42 +0100D6800CEAC000,"Windstorm: An Unexpected Arrival",UE4,playable,2021-06-07 19:33:19 +01005A100B314000,"Windstorm: Start of a Great Friendship",UE4;gpu;nvdec,ingame,2020-12-22 13:17:48 +010035B012F28000,"Wing of Darkness",UE4,playable,2022-11-13 16:03:51 +0100A4A015FF0000,"Winter Games 2023",deadlock,menus,2023-11-07 20:47:36 +010012A017F18800,"Witch On The Holy Night",,playable,2023-03-06 23:28:11 +0100454012E32000,"Witch Spring 3 Re:Fine -The Story of the Marionette Witch Eirudy-",crash,ingame,2021-08-08 11:56:18 +01002FC00C6D0000,"Witch Thief",,playable,2021-01-27 18:16:07 +010061501904E000,"Witch's Garden",gpu;crash;vulkan-backend-bug;opengl-backend-bug,ingame,2023-01-11 02:11:24 +0100BD4011FFE000,"Witcheye",,playable,2020-12-14 22:56:08 +0100522007AAA000,"Wizard of Legend",,playable,2021-06-07 12:20:46 +010081900F9E2000,"Wizards of Brandel",,nothing,2020-10-14 15:52:33 +0100C7600E77E000,"Wizards: Wand of Epicosity",,playable,2022-10-07 12:32:06 +01009040091E0000,"Wolfenstein II®: The New Colossus™",gpu,ingame,2024-04-05 05:39:46 +01003BD00CAAE000,"Wolfenstein: Youngblood",online-broken,boots,2024-07-12 23:49:20 +010037A00F5E2000,"Wonder Blade",,playable,2020-12-11 17:55:31 +0100B49016FF0000,"Wonder Boy Anniversary Collection",deadlock,nothing,2023-04-20 16:01:48 +0100EB2012E36000,"Wonder Boy Asha in Monster World",crash,nothing,2021-11-03 08:45:06 +0100A6300150C000,"Wonder Boy: The Dragon's Trap",,playable,2021-06-25 04:53:21 +0100F5D00C812000,"Wondershot",,playable,2022-08-31 21:05:31 +0100E0300EB04000,"Woodle Tree 2: Deluxe",gpu;slow,ingame,2020-06-04 18:44:00 +0100288012966000,"Woodsalt",,playable,2021-04-06 17:01:48 +010083E011BC8000,"Wordify",,playable,2020-10-03 09:01:07 +01009D500A194000,"World Conqueror X",,playable,2020-12-22 16:10:29 +010072000BD32000,"WORLD OF FINAL FANTASY MAXIMA",,playable,2020-06-07 13:57:23 +010009E001D90000,"World of Goo",gpu;32-bit;crash;regression,boots,2024-04-12 05:52:14 +010061F01DB7C800,"World of Goo 2",,boots,2024-08-08 22:52:49 +01001E300B038000,"World Soccer Pinball",,playable,2021-01-06 00:37:02 +010048900CF64000,"Worldend Syndrome",,playable,2021-01-03 14:16:32 +01008E9007064000,"WorldNeverland - Elnea Kingdom",,playable,2021-01-28 17:44:23 +010000301025A000,"Worlds of Magic: Planar Conquest",,playable,2021-06-12 12:51:28 +01009CD012CC0000,"Worm Jazz",gpu;services;UE4;regression,ingame,2021-11-10 10:33:04 +01001AE005166000,"Worms W.M.D",gpu;crash;nvdec;ldn-untested,boots,2023-09-16 21:42:59 +010037500C4DE000,"Worse Than Death",,playable,2021-06-11 16:05:40 +01006F100EB16000,"Woven",nvdec,playable,2021-06-02 13:41:08 +010087800DCEA000,"WRC 8 FIA World Rally Championship",nvdec,playable,2022-09-16 23:03:36 +01001A0011798000,"WRC 9 The Official Game",gpu;slow;nvdec,ingame,2022-10-25 19:47:39 +0100DC0012E48000,"Wreckfest",,playable,2023-02-12 16:13:00 +0100C5D00EDB8000,"Wreckin' Ball Adventure",UE4,playable,2022-09-12 18:56:28 +010033700418A000,"Wulverblade",nvdec,playable,2021-01-27 22:29:05 +01001C400482C000,"Wunderling DX",audio;crash,ingame,2022-09-10 13:20:12 +01003B401148E000,"Wurroom",,playable,2020-10-07 22:46:21 +010081700EDF4000,"WWE 2K Battlegrounds",nvdec;online-broken;UE4,playable,2022-10-07 12:44:40 +010009800203E000,"WWE 2K18",nvdec;online-broken,ingame,2025-01-17 11:36:56 +0100DF100B97C000,"X-Morph: Defense",,playable,2020-06-22 11:05:31 +0100D0B00FB74000,"XCOM® 2 Collection",gpu;crash,ingame,2022-10-04 09:38:30 +0100CC9015360000,"XEL",gpu,ingame,2022-10-03 10:19:39 +0100C9F009F7A000,"Xenoblade Chronicles 2: Torna ~ The Golden Country",slow;nvdec,playable,2023-01-28 16:47:28 +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 +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 +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 +0100725019978000,"YGGDRA UNION ~WE'LL NEVER FIGHT ALONE~",,playable,2020-04-03 02:20:47 +0100634008266000,"YIIK: A Postmodern RPG",,playable,2021-01-28 13:38:37 +0100C0000CEEA000,"Yo kai watch 1 for Nintendo Switch",gpu;opengl,ingame,2024-05-28 11:11:49 +010086C00AF7C000,"Yo-Kai Watch 4++",,playable,2024-06-18 20:21:44 +010002D00632E000,"Yoku's Island Express",nvdec,playable,2022-09-03 13:59:02 +0100F47016F26000,"Yomawari 3",,playable,2022-05-10 08:26:51 +010012F00B6F2000,"Yomawari: The Long Night Collection",,playable,2022-09-03 14:36:59 +0100CC600ABB2000,"Yonder: The Cloud Catcher Chronicles (Retail Only)",,playable,2021-01-28 14:06:25 +0100BE50042F6000,"Yono and the Celestial Elephants",,playable,2021-01-28 18:23:58 +0100F110029C8000,"Yooka-Laylee",,playable,2021-01-28 14:21:45 +010022F00DA66000,"Yooka-Laylee and the Impossible Lair",,playable,2021-03-05 17:32:21 +01006000040C2000,"Yoshi’s Crafted World™",gpu;audout,ingame,2021-08-30 13:25:51 +0100AE800C9C6000,"Yoshi’s Crafted World™ Demo",gpu,boots,2020-12-16 14:57:40 +0100BBA00B23E000,"Yoshiwara Higanbana Kuon no Chigiri",nvdec,playable,2020-10-17 19:14:46 +01003A400C3DA800,"YouTube",,playable,2024-06-08 05:24:10 +00100A7700CCAA40,"Youtubers Life00",nvdec,playable,2022-09-03 14:56:19 +0100E390124D8000,"Ys IX: Monstrum Nox",,playable,2022-06-12 04:14:42 +0100F90010882000,"Ys Origin",nvdec,playable,2024-04-17 05:07:33 +01007F200B0C0000,"Ys VIII: Lacrimosa of DANA",nvdec,playable,2023-08-05 09:26:41 +010022400BE5A000,"Yu-Gi-Oh! Legacy of the Duelist : Link Evolution",,playable,2024-09-27 21:48:43 +01002D60188DE000,"Yu-Gi-Oh! Rush Duel: Dawn of the Battle Royale!! Let's Go! Go Rush!!",crash,ingame,2023-03-17 01:54:01 +010037D00DBDC000,"YU-NO: A girl who chants love at the bound of this world.",nvdec,playable,2021-01-26 17:03:52 +0100B56011502000,"Yumeutsutsu Re:After",,playable,2022-11-20 16:09:06 +0100DE200C0DA000,"Yunohana Spring! - Mellow Times -",audio;crash,menus,2020-09-27 19:27:40 +0100307011C44000,"Yuppie Psycho: Executive Edition",crash,ingame,2020-12-11 10:37:06 +0100FC900963E000,"Yuri",,playable,2021-06-11 13:08:50 +010092400A678000,"Zaccaria Pinball",online-broken,playable,2022-09-03 15:44:28 +0100E7900C4C0000,"Zarvot",,playable,2021-01-28 13:51:36 +01005F200F7C2000,"Zen Chess Collection",,playable,2020-07-01 22:28:27 +01008DD0114AE000,"Zenge",,playable,2020-10-22 13:23:57 +0100057011E50000,"Zengeon",services-horizon;crash,boots,2024-04-29 15:43:07 +0100AAC00E692000,"Zenith",,playable,2022-09-17 09:57:02 +0100A6A00894C000,"ZERO GUNNER 2- for Nintendo Switch",,playable,2021-01-04 20:17:14 +01004B001058C000,"Zero Strain",services;UE4,menus,2021-11-10 07:48:32 +010021300F69E000,"Zettai kaikyu gakuen",gpu;nvdec,ingame,2020-08-25 15:15:54 +0100D7B013DD0000,"Ziggy the Chaser",,playable,2021-02-04 20:34:27 +010086700EF16000,"ZikSquare",gpu,ingame,2021-11-06 02:02:48 +010069C0123D8000,"Zoids Wild Blast Unleashed",nvdec,playable,2022-10-15 11:26:59 +0100C7300EEE4000,"Zombie Army Trilogy",ldn-untested;online,playable,2020-12-16 12:02:28 +01006CF00DA8C000,"Zombie Driver Immortal Edition",nvdec,playable,2020-12-14 23:15:10 +0100CFE003A64000,"ZOMBIE GOLD RUSH",online,playable,2020-09-24 12:56:08 +01001740116EC000,"Zombie's Cool",,playable,2020-12-17 12:41:26 +01000E5800D32C00,"Zombieland: Double Tap - Road Trip0",,playable,2022-09-17 10:08:45 +0100CD300A1BA000,"Zombillie",,playable,2020-07-23 17:42:23 +01001EE00A6B0000,"Zotrix: Solar Division",,playable,2021-06-07 20:34:05 +0100B9B00C6A4000,"この世の果てで恋を唄う少女YU-NO",audio,ingame,2021-01-22 07:00:16 +0100E8600C504000,"スーパーファミコン Nintendo Switch Online",slow,ingame,2020-03-14 05:48:38 +01000BB01CB8A000,"トラブル・マギア ~訳アリ少女は未来を勝ち取るために異国の魔法学校へ留学します~(Trouble Magia ~Wakeari Shoujo wa Mirai o Kachitoru Tame ni Ikoku no Mahou Gakkou e Ryuugaku Shimasu~)",,nothing,2024-09-28 07:03:14 +010065500B218000,"メモリーズオフ - Innocent Fille",,playable,2022-12-02 17:36:48 +010032400E700000,"二ノ国 白き聖灰の女王",services;32-bit,menus,2023-04-16 17:11:06 +0100F3100DA46000,"初音ミク Project DIVA MEGA39's",audio;loader-allocator,playable,2022-07-29 11:45:52 +010047F012BE2000,"密室のサクリファイス/ABYSS OF THE SACRIFICE",nvdec,playable,2022-10-21 13:56:28 +0100BF401AF9C000,"御伽活劇 豆狸のバケル ~オラクル祭太郎の祭難!!~ (Otogi Katsugeki Mameda no Bakeru Oracle Saitarou no Sainan!!)",slow,playable,2023-12-31 14:37:17 +0100AFA01750C000,"死神と少女/Shinigami to Shoujo",gpu;Incomplete,ingame,2024-03-22 01:06:45 +01001BA01EBFC000,"燃えよ! 乙女道士 ~華遊恋語~ (Moeyo! Otome Doushi Kayu Koigatari)",services-horizon,nothing,2024-09-28 12:22:55 +0100936018EB4000,"牧場物語 Welcome!ワンダフルライフ",crash,ingame,2023-04-25 19:43:52 +0100F4401940A000,"超探偵事件簿 レインコード (Master Detective Archives: Rain Code)",crash,ingame,2024-02-12 20:58:31 +010064801A01C000,"超次元ゲイム ネプテューヌ GameMaker R:Evolution",crash,nothing,2023-10-30 22:37:40 +0100F3400332C000,"ゼノブレイド2",deadlock;amd-vendor-bug,ingame,2024-03-28 14:31:41 diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs index 13d9fac68..694633f97 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs @@ -406,7 +406,7 @@ namespace ARMeilleure.Instructions { Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2); - return EmitUnaryMathCall(context, nameof(Math.Abs), res); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res); }); } } @@ -451,7 +451,7 @@ namespace ARMeilleure.Instructions { Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2); - return EmitUnaryMathCall(context, nameof(Math.Abs), res); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res); }); } } @@ -483,7 +483,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Abs), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1); }); } } @@ -522,7 +522,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Abs), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1); }); } } @@ -2246,7 +2246,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Floor), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1); }); } } @@ -2265,7 +2265,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Floor), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1); }); } } @@ -2322,7 +2322,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1); }); } } @@ -2341,7 +2341,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1); }); } } @@ -2390,7 +2390,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Truncate), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1); }); } } @@ -2409,7 +2409,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Truncate), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1); }); } } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs index c807fc858..284f3f576 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs @@ -43,7 +43,7 @@ namespace ARMeilleure.Instructions } else { - EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1)); + EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1)); } } @@ -66,7 +66,7 @@ namespace ARMeilleure.Instructions } else { - EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1)); + EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1)); } } else diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs index aab677869..8fcb06286 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs @@ -726,8 +726,8 @@ namespace ARMeilleure.Instructions if (absolute) { - ne = EmitUnaryMathCall(context, nameof(Math.Abs), ne); - me = EmitUnaryMathCall(context, nameof(Math.Abs), me); + ne = EmitUnaryMathCall(context, nameof(MathHelper.Abs), ne); + me = EmitUnaryMathCall(context, nameof(MathHelper.Abs), me); } Operand e = EmitSoftFloatCall(context, name, ne, me); diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs index 3363a7c77..a5d4744f7 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs @@ -333,7 +333,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1)); + EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1)); } } @@ -349,7 +349,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1), signed: true, scalar: false); + EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1), signed: true, scalar: false); } } @@ -365,7 +365,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1)); + EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1)); } } @@ -538,7 +538,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1)); + EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1)); } } @@ -554,7 +554,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1)); + EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1)); } } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs index 8eef6b14d..216726df9 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs @@ -357,10 +357,10 @@ namespace ARMeilleure.Instructions toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert); break; case 0b10: // Towards positive infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert); break; case 0b11: // Towards negative infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert); break; } @@ -494,10 +494,10 @@ namespace ARMeilleure.Instructions toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert); break; case 0b10: // Towards positive infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert); break; case 0b11: // Towards negative infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert); break; } @@ -534,7 +534,7 @@ namespace ARMeilleure.Instructions } else { - EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Floor), m)); + EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), m)); } } @@ -574,7 +574,7 @@ namespace ARMeilleure.Instructions } else { - EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Ceiling), m)); + EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), m)); } } @@ -613,7 +613,7 @@ namespace ARMeilleure.Instructions } else { - EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Truncate), op1)); + EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1)); } } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs index abd0d9acc..634e5c18b 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs @@ -460,8 +460,8 @@ namespace ARMeilleure.Instructions IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; MethodInfo info = (op.Size & 1) == 0 - ? typeof(MathF).GetMethod(name, new Type[] { typeof(float) }) - : typeof(Math).GetMethod(name, new Type[] { typeof(double) }); + ? typeof(MathHelperF).GetMethod(name, new Type[] { typeof(float) }) + : typeof(MathHelper).GetMethod(name, new Type[] { typeof(double) }); return context.Call(info, n); } @@ -470,11 +470,11 @@ namespace ARMeilleure.Instructions { IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; - string name = nameof(Math.Round); + string name = nameof(MathHelper.Round); MethodInfo info = (op.Size & 1) == 0 - ? typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(MidpointRounding) }) - : typeof(Math).GetMethod(name, new Type[] { typeof(double), typeof(MidpointRounding) }); + ? typeof(MathHelperF).GetMethod(name, new Type[] { typeof(float), typeof(int) }) + : typeof(MathHelper).GetMethod(name, new Type[] { typeof(double), typeof(int) }); return context.Call(info, n, Const((int)roundMode)); } @@ -510,16 +510,16 @@ namespace ARMeilleure.Instructions context.MarkLabel(lbl1); context.BranchIf(lbl2, rMode, rP, Comparison.NotEqual); - context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Ceiling), op)); + context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op)); context.Branch(lblEnd); context.MarkLabel(lbl2); context.BranchIf(lbl3, rMode, rM, Comparison.NotEqual); - context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Floor), op)); + context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Floor), op)); context.Branch(lblEnd); context.MarkLabel(lbl3); - context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Truncate), op)); + context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op)); context.Branch(lblEnd); context.MarkLabel(lblEnd); diff --git a/src/ARMeilleure/Instructions/MathHelper.cs b/src/ARMeilleure/Instructions/MathHelper.cs new file mode 100644 index 000000000..a11ce9d2e --- /dev/null +++ b/src/ARMeilleure/Instructions/MathHelper.cs @@ -0,0 +1,71 @@ +using System; +using System.Runtime.InteropServices; + +namespace ARMeilleure.Instructions +{ + static class MathHelper + { + [UnmanagedCallersOnly] + public static double Abs(double value) + { + return Math.Abs(value); + } + + [UnmanagedCallersOnly] + public static double Ceiling(double value) + { + return Math.Ceiling(value); + } + + [UnmanagedCallersOnly] + public static double Floor(double value) + { + return Math.Floor(value); + } + + [UnmanagedCallersOnly] + public static double Round(double value, int mode) + { + return Math.Round(value, (MidpointRounding)mode); + } + + [UnmanagedCallersOnly] + public static double Truncate(double value) + { + return Math.Truncate(value); + } + } + + static class MathHelperF + { + [UnmanagedCallersOnly] + public static float Abs(float value) + { + return MathF.Abs(value); + } + + [UnmanagedCallersOnly] + public static float Ceiling(float value) + { + return MathF.Ceiling(value); + } + + [UnmanagedCallersOnly] + public static float Floor(float value) + { + return MathF.Floor(value); + } + + [UnmanagedCallersOnly] + public static float Round(float value, int mode) + { + return MathF.Round(value, (MidpointRounding)mode); + } + + [UnmanagedCallersOnly] + public static float Truncate(float value) + { + return MathF.Truncate(value); + } + } +} diff --git a/src/ARMeilleure/Instructions/NativeInterface.cs b/src/ARMeilleure/Instructions/NativeInterface.cs index 0cd3754f7..9d6279613 100644 --- a/src/ARMeilleure/Instructions/NativeInterface.cs +++ b/src/ARMeilleure/Instructions/NativeInterface.cs @@ -2,6 +2,7 @@ using ARMeilleure.Memory; using ARMeilleure.State; using ARMeilleure.Translation; using System; +using System.Runtime.InteropServices; namespace ARMeilleure.Instructions { @@ -34,6 +35,7 @@ namespace ARMeilleure.Instructions Context = null; } + [UnmanagedCallersOnly] public static void Break(ulong address, int imm) { Statistics.PauseTimer(); @@ -43,6 +45,7 @@ namespace ARMeilleure.Instructions Statistics.ResumeTimer(); } + [UnmanagedCallersOnly] public static void SupervisorCall(ulong address, int imm) { Statistics.PauseTimer(); @@ -52,6 +55,7 @@ namespace ARMeilleure.Instructions Statistics.ResumeTimer(); } + [UnmanagedCallersOnly] public static void Undefined(ulong address, int opCode) { Statistics.PauseTimer(); @@ -62,26 +66,31 @@ namespace ARMeilleure.Instructions } #region "System registers" + [UnmanagedCallersOnly] public static ulong GetCtrEl0() { return GetContext().CtrEl0; } + [UnmanagedCallersOnly] public static ulong GetDczidEl0() { return GetContext().DczidEl0; } + [UnmanagedCallersOnly] public static ulong GetCntfrqEl0() { return GetContext().CntfrqEl0; } + [UnmanagedCallersOnly] public static ulong GetCntpctEl0() { return GetContext().CntpctEl0; } + [UnmanagedCallersOnly] public static ulong GetCntvctEl0() { return GetContext().CntvctEl0; @@ -89,26 +98,31 @@ namespace ARMeilleure.Instructions #endregion #region "Read" + [UnmanagedCallersOnly] public static byte ReadByte(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static ushort ReadUInt16(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static uint ReadUInt32(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static ulong ReadUInt64(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static V128 ReadVector128(ulong address) { return GetMemoryManager().ReadGuest(address); @@ -116,47 +130,56 @@ namespace ARMeilleure.Instructions #endregion #region "Write" + [UnmanagedCallersOnly] public static void WriteByte(ulong address, byte value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteUInt16(ulong address, ushort value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteUInt32(ulong address, uint value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteUInt64(ulong address, ulong value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteVector128(ulong address, V128 value) { GetMemoryManager().WriteGuest(address, value); } #endregion + [UnmanagedCallersOnly] public static void EnqueueForRejit(ulong address) { Context.Translator.EnqueueForRejit(address, GetContext().ExecutionMode); } - public static void SignalMemoryTracking(ulong address, ulong size, bool write) + [UnmanagedCallersOnly] + public static void SignalMemoryTracking(ulong address, ulong size, byte write) { - GetMemoryManager().SignalMemoryTracking(address, size, write); + GetMemoryManager().SignalMemoryTracking(address, size, write == 1); } + [UnmanagedCallersOnly] public static void ThrowInvalidMemoryAccess(ulong address) { throw new InvalidAccessException(address); } + [UnmanagedCallersOnly] public static ulong GetFunctionAddress(ulong address) { TranslatedFunction function = Context.Translator.GetOrTranslate(address, GetContext().ExecutionMode); @@ -164,12 +187,14 @@ namespace ARMeilleure.Instructions return (ulong)function.FuncPointer.ToInt64(); } + [UnmanagedCallersOnly] public static void InvalidateCacheLine(ulong address) { Context.Translator.InvalidateJitCacheRegion(address, InstEmit.DczSizeInBytes); } - public static bool CheckSynchronization() + [UnmanagedCallersOnly] + public static byte CheckSynchronization() { Statistics.PauseTimer(); @@ -179,7 +204,7 @@ namespace ARMeilleure.Instructions Statistics.ResumeTimer(); - return context.Running; + return (byte)(context.Running ? 1 : 0); } public static ExecutionContext GetContext() diff --git a/src/ARMeilleure/Instructions/SoftFallback.cs b/src/ARMeilleure/Instructions/SoftFallback.cs index 899326c4b..178be6f79 100644 --- a/src/ARMeilleure/Instructions/SoftFallback.cs +++ b/src/ARMeilleure/Instructions/SoftFallback.cs @@ -1,11 +1,13 @@ using ARMeilleure.State; using System; +using System.Runtime.InteropServices; namespace ARMeilleure.Instructions { static class SoftFallback { #region "ShrImm64" + [UnmanagedCallersOnly] public static long SignedShrImm64(long value, long roundConst, int shift) { if (roundConst == 0L) @@ -48,6 +50,7 @@ namespace ARMeilleure.Instructions } } + [UnmanagedCallersOnly] public static ulong UnsignedShrImm64(ulong value, long roundConst, int shift) { if (roundConst == 0L) @@ -92,6 +95,7 @@ namespace ARMeilleure.Instructions #endregion #region "Saturation" + [UnmanagedCallersOnly] public static int SatF32ToS32(float value) { if (float.IsNaN(value)) @@ -103,6 +107,7 @@ namespace ARMeilleure.Instructions value <= int.MinValue ? int.MinValue : (int)value; } + [UnmanagedCallersOnly] public static long SatF32ToS64(float value) { if (float.IsNaN(value)) @@ -114,6 +119,7 @@ namespace ARMeilleure.Instructions value <= long.MinValue ? long.MinValue : (long)value; } + [UnmanagedCallersOnly] public static uint SatF32ToU32(float value) { if (float.IsNaN(value)) @@ -125,6 +131,7 @@ namespace ARMeilleure.Instructions value <= uint.MinValue ? uint.MinValue : (uint)value; } + [UnmanagedCallersOnly] public static ulong SatF32ToU64(float value) { if (float.IsNaN(value)) @@ -136,6 +143,7 @@ namespace ARMeilleure.Instructions value <= ulong.MinValue ? ulong.MinValue : (ulong)value; } + [UnmanagedCallersOnly] public static int SatF64ToS32(double value) { if (double.IsNaN(value)) @@ -147,6 +155,7 @@ namespace ARMeilleure.Instructions value <= int.MinValue ? int.MinValue : (int)value; } + [UnmanagedCallersOnly] public static long SatF64ToS64(double value) { if (double.IsNaN(value)) @@ -158,6 +167,7 @@ namespace ARMeilleure.Instructions value <= long.MinValue ? long.MinValue : (long)value; } + [UnmanagedCallersOnly] public static uint SatF64ToU32(double value) { if (double.IsNaN(value)) @@ -169,6 +179,7 @@ namespace ARMeilleure.Instructions value <= uint.MinValue ? uint.MinValue : (uint)value; } + [UnmanagedCallersOnly] public static ulong SatF64ToU64(double value) { if (double.IsNaN(value)) @@ -182,6 +193,7 @@ namespace ARMeilleure.Instructions #endregion #region "Count" + [UnmanagedCallersOnly] public static ulong CountLeadingSigns(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.). { value ^= value >> 1; @@ -201,6 +213,7 @@ namespace ARMeilleure.Instructions private static ReadOnlySpan ClzNibbleTbl => new byte[] { 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; + [UnmanagedCallersOnly] public static ulong CountLeadingZeros(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.). { if (value == 0ul) @@ -224,41 +237,49 @@ namespace ARMeilleure.Instructions #endregion #region "Table" + [UnmanagedCallersOnly] public static V128 Tbl1(V128 vector, int bytes, V128 tb0) { return TblOrTbx(default, vector, bytes, tb0); } + [UnmanagedCallersOnly] public static V128 Tbl2(V128 vector, int bytes, V128 tb0, V128 tb1) { return TblOrTbx(default, vector, bytes, tb0, tb1); } + [UnmanagedCallersOnly] public static V128 Tbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2) { return TblOrTbx(default, vector, bytes, tb0, tb1, tb2); } + [UnmanagedCallersOnly] public static V128 Tbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3) { return TblOrTbx(default, vector, bytes, tb0, tb1, tb2, tb3); } + [UnmanagedCallersOnly] public static V128 Tbx1(V128 dest, V128 vector, int bytes, V128 tb0) { return TblOrTbx(dest, vector, bytes, tb0); } + [UnmanagedCallersOnly] public static V128 Tbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1) { return TblOrTbx(dest, vector, bytes, tb0, tb1); } + [UnmanagedCallersOnly] public static V128 Tbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2) { return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2); } + [UnmanagedCallersOnly] public static V128 Tbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3) { return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2, tb3); @@ -300,14 +321,22 @@ namespace ARMeilleure.Instructions private const uint Crc32RevPoly = 0xedb88320; private const uint Crc32cRevPoly = 0x82f63b78; + [UnmanagedCallersOnly] public static uint Crc32b(uint crc, byte value) => Crc32(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32h(uint crc, ushort value) => Crc32h(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32w(uint crc, uint value) => Crc32w(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32x(uint crc, ulong value) => Crc32x(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32cb(uint crc, byte value) => Crc32(crc, Crc32cRevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32ch(uint crc, ushort value) => Crc32h(crc, Crc32cRevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32cw(uint crc, uint value) => Crc32w(crc, Crc32cRevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32cx(uint crc, ulong value) => Crc32x(crc, Crc32cRevPoly, value); private static uint Crc32h(uint crc, uint poly, ushort val) @@ -358,21 +387,25 @@ namespace ARMeilleure.Instructions #endregion #region "Aes" + [UnmanagedCallersOnly] public static V128 Decrypt(V128 value, V128 roundKey) { return CryptoHelper.AesInvSubBytes(CryptoHelper.AesInvShiftRows(value ^ roundKey)); } + [UnmanagedCallersOnly] public static V128 Encrypt(V128 value, V128 roundKey) { return CryptoHelper.AesSubBytes(CryptoHelper.AesShiftRows(value ^ roundKey)); } + [UnmanagedCallersOnly] public static V128 InverseMixColumns(V128 value) { return CryptoHelper.AesInvMixColumns(value); } + [UnmanagedCallersOnly] public static V128 MixColumns(V128 value) { return CryptoHelper.AesMixColumns(value); @@ -380,6 +413,7 @@ namespace ARMeilleure.Instructions #endregion #region "Sha1" + [UnmanagedCallersOnly] public static V128 HashChoose(V128 hash_abcd, uint hash_e, V128 wk) { for (int e = 0; e <= 3; e++) @@ -400,11 +434,13 @@ namespace ARMeilleure.Instructions return hash_abcd; } + [UnmanagedCallersOnly] public static uint FixedRotate(uint hash_e) { return hash_e.Rol(30); } + [UnmanagedCallersOnly] public static V128 HashMajority(V128 hash_abcd, uint hash_e, V128 wk) { for (int e = 0; e <= 3; e++) @@ -425,6 +461,7 @@ namespace ARMeilleure.Instructions return hash_abcd; } + [UnmanagedCallersOnly] public static V128 HashParity(V128 hash_abcd, uint hash_e, V128 wk) { for (int e = 0; e <= 3; e++) @@ -445,6 +482,7 @@ namespace ARMeilleure.Instructions return hash_abcd; } + [UnmanagedCallersOnly] public static V128 Sha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11) { ulong t2 = w4_7.Extract(0); @@ -455,6 +493,7 @@ namespace ARMeilleure.Instructions return result ^ (w0_3 ^ w8_11); } + [UnmanagedCallersOnly] public static V128 Sha1SchedulePart2(V128 tw0_3, V128 w12_15) { V128 t = tw0_3 ^ (w12_15 >> 32); @@ -499,16 +538,19 @@ namespace ARMeilleure.Instructions #endregion #region "Sha256" + [UnmanagedCallersOnly] public static V128 HashLower(V128 hash_abcd, V128 hash_efgh, V128 wk) { return Sha256Hash(hash_abcd, hash_efgh, wk, part1: true); } + [UnmanagedCallersOnly] public static V128 HashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk) { return Sha256Hash(hash_abcd, hash_efgh, wk, part1: false); } + [UnmanagedCallersOnly] public static V128 Sha256SchedulePart1(V128 w0_3, V128 w4_7) { V128 result = new(); @@ -527,6 +569,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static V128 Sha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15) { V128 result = new(); @@ -628,6 +671,7 @@ namespace ARMeilleure.Instructions } #endregion + [UnmanagedCallersOnly] public static V128 PolynomialMult64_128(ulong op1, ulong op2) { V128 result = V128.Zero; diff --git a/src/ARMeilleure/Instructions/SoftFloat.cs b/src/ARMeilleure/Instructions/SoftFloat.cs index a67349e6e..7895ca1dc 100644 --- a/src/ARMeilleure/Instructions/SoftFloat.cs +++ b/src/ARMeilleure/Instructions/SoftFloat.cs @@ -1,6 +1,7 @@ using ARMeilleure.State; using System; using System.Diagnostics; +using System.Runtime.InteropServices; namespace ARMeilleure.Instructions { @@ -312,6 +313,7 @@ namespace ARMeilleure.Instructions static class SoftFloat16_32 { + [UnmanagedCallersOnly] public static float FPConvert(ushort valueBits) { ExecutionContext context = NativeInterface.GetContext(); @@ -487,6 +489,7 @@ namespace ARMeilleure.Instructions static class SoftFloat16_64 { + [UnmanagedCallersOnly] public static double FPConvert(ushort valueBits) { ExecutionContext context = NativeInterface.GetContext(); @@ -662,6 +665,7 @@ namespace ARMeilleure.Instructions static class SoftFloat32_16 { + [UnmanagedCallersOnly] public static ushort FPConvert(float value) { ExecutionContext context = NativeInterface.GetContext(); @@ -781,12 +785,19 @@ namespace ARMeilleure.Instructions static class SoftFloat32 { + [UnmanagedCallersOnly] public static float FPAdd(float value1, float value2) { - return FPAddFpscr(value1, value2, false); + return FPAddFpscrImpl(value1, value2, false); } - public static float FPAddFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPAddFpscr(float value1, float value2, byte standardFpscr) + { + return FPAddFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPAddFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -837,7 +848,8 @@ namespace ARMeilleure.Instructions return result; } - public static int FPCompare(float value1, float value2, bool signalNaNs) + [UnmanagedCallersOnly] + public static int FPCompare(float value1, float value2, byte signalNaNs) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = context.Fpcr; @@ -851,7 +863,7 @@ namespace ARMeilleure.Instructions { result = 0b0011; - if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs) + if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1) { SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr); } @@ -875,12 +887,13 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPCompareEQ(float value1, float value2) { - return FPCompareEQFpscr(value1, value2, false); + return FPCompareEQFpscrImpl(value1, value2, false); } - public static float FPCompareEQFpscr(float value1, float value2, bool standardFpscr) + private static float FPCompareEQFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -907,12 +920,25 @@ namespace ARMeilleure.Instructions return result; } - public static float FPCompareGE(float value1, float value2) + [UnmanagedCallersOnly] + public static float FPCompareEQFpscr(float value1, float value2, byte standardFpscr) { - return FPCompareGEFpscr(value1, value2, false); + return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1); } - public static float FPCompareGEFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareGE(float value1, float value2) + { + return FPCompareGEFpscrImpl(value1, value2, false); + } + + [UnmanagedCallersOnly] + public static float FPCompareGEFpscr(float value1, float value2, byte standardFpscr) + { + return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPCompareGEFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -936,12 +962,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPCompareGT(float value1, float value2) { - return FPCompareGTFpscr(value1, value2, false); + return FPCompareGTFpscrImpl(value1, value2, false); } - public static float FPCompareGTFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareGTFpscr(float value1, float value2, byte standardFpscr) + { + return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPCompareGTFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -965,26 +998,31 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPCompareLE(float value1, float value2) { - return FPCompareGE(value2, value1); + return FPCompareGEFpscrImpl(value2, value1, false); } + [UnmanagedCallersOnly] public static float FPCompareLT(float value1, float value2) { - return FPCompareGT(value2, value1); + return FPCompareGTFpscrImpl(value2, value1, false); } - public static float FPCompareLEFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareLEFpscr(float value1, float value2, byte standardFpscr) { - return FPCompareGEFpscr(value2, value1, standardFpscr); + return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1); } - public static float FPCompareLTFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareLTFpscr(float value1, float value2, byte standardFpscr) { - return FPCompareGTFpscr(value2, value1, standardFpscr); + return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1); } + [UnmanagedCallersOnly] public static float FPDiv(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1037,12 +1075,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMax(float value1, float value2) { - return FPMaxFpscr(value1, value2, false); + return FPMaxFpscrImpl(value1, value2, false); } - public static float FPMaxFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMaxFpscr(float value1, float value2, byte standardFpscr) + { + return FPMaxFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMaxFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1103,12 +1148,13 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMaxNum(float value1, float value2) { - return FPMaxNumFpscr(value1, value2, false); + return FPMaxNumFpscrImpl(value1, value2, false); } - public static float FPMaxNumFpscr(float value1, float value2, bool standardFpscr) + private static float FPMaxNumFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1125,15 +1171,28 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(true); } - return FPMaxFpscr(value1, value2, standardFpscr); + return FPMaxFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] + public static float FPMaxNumFpscr(float value1, float value2, byte standardFpscr) + { + return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + [UnmanagedCallersOnly] public static float FPMin(float value1, float value2) { - return FPMinFpscr(value1, value2, false); + return FPMinFpscrImpl(value1, value2, false); } - public static float FPMinFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMinFpscr(float value1, float value2, byte standardFpscr) + { + return FPMinFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMinFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1194,12 +1253,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMinNum(float value1, float value2) { - return FPMinNumFpscr(value1, value2, false); + return FPMinNumFpscrImpl(value1, value2, false); } - public static float FPMinNumFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMinNumFpscr(float value1, float value2, byte standardFpscr) + { + return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMinNumFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1216,15 +1282,22 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(false); } - return FPMinFpscr(value1, value2, standardFpscr); + return FPMinFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] public static float FPMul(float value1, float value2) { - return FPMulFpscr(value1, value2, false); + return FPMulFpscrImpl(value1, value2, false); } - public static float FPMulFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMulFpscr(float value1, float value2, byte standardFpscr) + { + return FPMulFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMulFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1271,12 +1344,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMulAdd(float valueA, float value1, float value2) { - return FPMulAddFpscr(valueA, value1, value2, false); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static float FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMulAddFpscr(float valueA, float value1, float value2, byte standardFpscr) + { + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); + } + + private static float FPMulAddFpscrImpl(float valueA, float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1342,20 +1422,23 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMulSub(float valueA, float value1, float value2) { value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static float FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMulSubFpscr(float valueA, float value1, float value2, byte standardFpscr) { value1 = value1.FPNeg(); - return FPMulAddFpscr(valueA, value1, value2, standardFpscr); + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); } + [UnmanagedCallersOnly] public static float FPMulX(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1401,27 +1484,36 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPNegMulAdd(float valueA, float value1, float value2) { valueA = valueA.FPNeg(); value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static float FPNegMulSub(float valueA, float value1, float value2) { valueA = valueA.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static float FPRecipEstimate(float value) { - return FPRecipEstimateFpscr(value, false); + return FPRecipEstimateFpscrImpl(value, false); } - public static float FPRecipEstimateFpscr(float value, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPRecipEstimateFpscr(float value, byte standardFpscr) + { + return FPRecipEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static float FPRecipEstimateFpscrImpl(float value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1508,6 +1600,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRecipStep(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1533,15 +1626,16 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } - result = FPSubFpscr(FPTwo(false), product, true); + result = FPSubFpscrImpl(FPTwo(false), product, true); } return result; } + [UnmanagedCallersOnly] public static float FPRecipStepFused(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1585,6 +1679,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRecpX(float value) { ExecutionContext context = NativeInterface.GetContext(); @@ -1610,12 +1705,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRSqrtEstimate(float value) { - return FPRSqrtEstimateFpscr(value, false); + return FPRSqrtEstimateFpscrImpl(value, false); } - public static float FPRSqrtEstimateFpscr(float value, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPRSqrtEstimateFpscr(float value, byte standardFpscr) + { + return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static float FPRSqrtEstimateFpscrImpl(float value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1729,6 +1831,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRSqrtStep(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1754,7 +1857,7 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } result = FPHalvedSub(FPThree(false), product, context, fpcr); @@ -1763,6 +1866,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRSqrtStepFused(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1806,6 +1910,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPSqrt(float value) { ExecutionContext context = NativeInterface.GetContext(); @@ -1848,12 +1953,13 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPSub(float value1, float value2) { - return FPSubFpscr(value1, value2, false); + return FPSubFpscrImpl(value1, value2, false); } - public static float FPSubFpscr(float value1, float value2, bool standardFpscr) + private static float FPSubFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2094,6 +2200,7 @@ namespace ARMeilleure.Instructions static class SoftFloat64_16 { + [UnmanagedCallersOnly] public static ushort FPConvert(double value) { ExecutionContext context = NativeInterface.GetContext(); @@ -2213,12 +2320,19 @@ namespace ARMeilleure.Instructions static class SoftFloat64 { + [UnmanagedCallersOnly] public static double FPAdd(double value1, double value2) { - return FPAddFpscr(value1, value2, false); + return FPAddFpscrImpl(value1, value2, false); } - public static double FPAddFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPAddFpscr(double value1, double value2, byte standardFpscr) + { + return FPAddFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPAddFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2269,7 +2383,8 @@ namespace ARMeilleure.Instructions return result; } - public static int FPCompare(double value1, double value2, bool signalNaNs) + [UnmanagedCallersOnly] + public static int FPCompare(double value1, double value2, byte signalNaNs) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = context.Fpcr; @@ -2283,7 +2398,7 @@ namespace ARMeilleure.Instructions { result = 0b0011; - if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs) + if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1) { SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr); } @@ -2307,12 +2422,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareEQ(double value1, double value2) { - return FPCompareEQFpscr(value1, value2, false); + return FPCompareEQFpscrImpl(value1, value2, false); } - public static double FPCompareEQFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareEQFpscr(double value1, double value2, byte standardFpscr) + { + return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPCompareEQFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2339,12 +2461,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareGE(double value1, double value2) { - return FPCompareGEFpscr(value1, value2, false); + return FPCompareGEFpscrImpl(value1, value2, false); } - public static double FPCompareGEFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareGEFpscr(double value1, double value2, byte standardFpscr) + { + return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPCompareGEFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2368,12 +2497,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareGT(double value1, double value2) { - return FPCompareGTFpscr(value1, value2, false); + return FPCompareGTFpscrImpl(value1, value2, false); } - public static double FPCompareGTFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareGTFpscr(double value1, double value2, byte standardFpscr) + { + return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPCompareGTFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2397,26 +2533,31 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareLE(double value1, double value2) { - return FPCompareGE(value2, value1); + return FPCompareGEFpscrImpl(value2, value1, false); } + [UnmanagedCallersOnly] public static double FPCompareLT(double value1, double value2) { - return FPCompareGT(value2, value1); + return FPCompareGTFpscrImpl(value2, value1, false); } - public static double FPCompareLEFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareLEFpscr(double value1, double value2, byte standardFpscr) { - return FPCompareGEFpscr(value2, value1, standardFpscr); + return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1); } - public static double FPCompareLTFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareLTFpscr(double value1, double value2, byte standardFpscr) { - return FPCompareGTFpscr(value2, value1, standardFpscr); + return FPCompareGTFpscrImpl(value2, value1, standardFpscr == 1); } + [UnmanagedCallersOnly] public static double FPDiv(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -2469,12 +2610,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMax(double value1, double value2) { - return FPMaxFpscr(value1, value2, false); + return FPMaxFpscrImpl(value1, value2, false); } - public static double FPMaxFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMaxFpscr(double value1, double value2, byte standardFpscr) + { + return FPMaxFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMaxFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2535,12 +2683,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMaxNum(double value1, double value2) { - return FPMaxNumFpscr(value1, value2, false); + return FPMaxNumFpscrImpl(value1, value2, false); } - public static double FPMaxNumFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMaxNumFpscr(double value1, double value2, byte standardFpscr) + { + return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMaxNumFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2557,15 +2712,22 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(true); } - return FPMaxFpscr(value1, value2, standardFpscr); + return FPMaxFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] public static double FPMin(double value1, double value2) { - return FPMinFpscr(value1, value2, false); + return FPMinFpscrImpl(value1, value2, false); } - public static double FPMinFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMinFpscr(double value1, double value2, byte standardFpscr) + { + return FPMinFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMinFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2626,12 +2788,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMinNum(double value1, double value2) { - return FPMinNumFpscr(value1, value2, false); + return FPMinNumFpscrImpl(value1, value2, false); } - public static double FPMinNumFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMinNumFpscr(double value1, double value2, byte standardFpscr) + { + return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMinNumFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2648,15 +2817,22 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(false); } - return FPMinFpscr(value1, value2, standardFpscr); + return FPMinFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] public static double FPMul(double value1, double value2) { - return FPMulFpscr(value1, value2, false); + return FPMulFpscrImpl(value1, value2, false); } - public static double FPMulFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMulFpscr(double value1, double value2, byte standardFpscr) + { + return FPMulFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMulFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2703,12 +2879,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMulAdd(double valueA, double value1, double value2) { - return FPMulAddFpscr(valueA, value1, value2, false); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static double FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMulAddFpscr(double valueA, double value1, double value2, byte standardFpscr) + { + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); + } + + private static double FPMulAddFpscrImpl(double valueA, double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2774,20 +2957,23 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMulSub(double valueA, double value1, double value2) { value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static double FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMulSubFpscr(double valueA, double value1, double value2, byte standardFpscr) { value1 = value1.FPNeg(); - return FPMulAddFpscr(valueA, value1, value2, standardFpscr); + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); } + [UnmanagedCallersOnly] public static double FPMulX(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -2833,27 +3019,36 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPNegMulAdd(double valueA, double value1, double value2) { valueA = valueA.FPNeg(); value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static double FPNegMulSub(double valueA, double value1, double value2) { valueA = valueA.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static double FPRecipEstimate(double value) { - return FPRecipEstimateFpscr(value, false); + return FPRecipEstimateFpscrImpl(value, false); } - public static double FPRecipEstimateFpscr(double value, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPRecipEstimateFpscr(double value, byte standardFpscr) + { + return FPRecipEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static double FPRecipEstimateFpscrImpl(double value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2940,6 +3135,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRecipStep(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -2965,7 +3161,7 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } result = FPSubFpscr(FPTwo(false), product, true); @@ -2974,6 +3170,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRecipStepFused(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -3017,6 +3214,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRecpX(double value) { ExecutionContext context = NativeInterface.GetContext(); @@ -3042,12 +3240,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRSqrtEstimate(double value) { - return FPRSqrtEstimateFpscr(value, false); + return FPRSqrtEstimateFpscrImpl(value, false); } - public static double FPRSqrtEstimateFpscr(double value, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPRSqrtEstimateFpscr(double value, byte standardFpscr) + { + return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static double FPRSqrtEstimateFpscrImpl(double value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -3161,6 +3366,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRSqrtStep(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -3186,7 +3392,7 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } result = FPHalvedSub(FPThree(false), product, context, fpcr); @@ -3195,6 +3401,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRSqrtStepFused(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -3238,6 +3445,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPSqrt(double value) { ExecutionContext context = NativeInterface.GetContext(); @@ -3280,6 +3488,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPSub(double value1, double value2) { return FPSubFpscr(value1, value2, false); diff --git a/src/ARMeilleure/Translation/DelegateInfo.cs b/src/ARMeilleure/Translation/DelegateInfo.cs index d3b535de1..64ee7bc9c 100644 --- a/src/ARMeilleure/Translation/DelegateInfo.cs +++ b/src/ARMeilleure/Translation/DelegateInfo.cs @@ -4,15 +4,9 @@ namespace ARMeilleure.Translation { class DelegateInfo { -#pragma warning disable IDE0052 // Remove unread private member - private readonly Delegate _dlg; // Ensure that this delegate will not be garbage collected. -#pragma warning restore IDE0052 - - public nint FuncPtr { get; } - - public DelegateInfo(Delegate dlg, nint funcPtr) + public nint FuncPtr { get; private set; } + public DelegateInfo(nint funcPtr) { - _dlg = dlg; FuncPtr = funcPtr; } } diff --git a/src/ARMeilleure/Translation/Delegates.cs b/src/ARMeilleure/Translation/Delegates.cs index d8c1cfd58..d4f46108c 100644 --- a/src/ARMeilleure/Translation/Delegates.cs +++ b/src/ARMeilleure/Translation/Delegates.cs @@ -1,9 +1,7 @@ using ARMeilleure.Instructions; -using ARMeilleure.State; using System; using System.Collections.Generic; using System.Reflection; -using System.Runtime.InteropServices; namespace ARMeilleure.Translation { @@ -34,21 +32,7 @@ namespace ARMeilleure.Translation return _delegates.Values[index].FuncPtr; // O(1). } - - public static nint GetDelegateFuncPtr(MethodInfo info) - { - ArgumentNullException.ThrowIfNull(info); - - string key = GetKey(info); - - if (!_delegates.TryGetValue(key, out DelegateInfo dlgInfo)) // O(log(n)). - { - throw new KeyNotFoundException($"({nameof(key)} = {key})"); - } - - return dlgInfo.FuncPtr; - } - + public static int GetDelegateIndex(MethodInfo info) { ArgumentNullException.ThrowIfNull(info); @@ -64,12 +48,12 @@ namespace ARMeilleure.Translation return index; } - - private static void SetDelegateInfo(Delegate dlg, nint funcPtr) + + private static void SetDelegateInfo(MethodInfo method) { - string key = GetKey(dlg.Method); + string key = GetKey(method); - _delegates.Add(key, new DelegateInfo(dlg, funcPtr)); // ArgumentException (key). + _delegates.Add(key, new DelegateInfo(method.MethodHandle.GetFunctionPointer())); // ArgumentException (key). } private static string GetKey(MethodInfo info) @@ -83,528 +67,179 @@ namespace ARMeilleure.Translation { _delegates = new SortedList(); - var dlgMathAbs = new MathAbs(Math.Abs); - var dlgMathCeiling = new MathCeiling(Math.Ceiling); - var dlgMathFloor = new MathFloor(Math.Floor); - var dlgMathRound = new MathRound(Math.Round); - var dlgMathTruncate = new MathTruncate(Math.Truncate); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Abs))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Ceiling))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Floor))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Round))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Truncate))); - var dlgMathFAbs = new MathFAbs(MathF.Abs); - var dlgMathFCeiling = new MathFCeiling(MathF.Ceiling); - var dlgMathFFloor = new MathFFloor(MathF.Floor); - var dlgMathFRound = new MathFRound(MathF.Round); - var dlgMathFTruncate = new MathFTruncate(MathF.Truncate); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Abs))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Ceiling))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Floor))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Round))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Truncate))); - var dlgNativeInterfaceBreak = new NativeInterfaceBreak(NativeInterface.Break); - var dlgNativeInterfaceCheckSynchronization = new NativeInterfaceCheckSynchronization(NativeInterface.CheckSynchronization); - var dlgNativeInterfaceEnqueueForRejit = new NativeInterfaceEnqueueForRejit(NativeInterface.EnqueueForRejit); - var dlgNativeInterfaceGetCntfrqEl0 = new NativeInterfaceGetCntfrqEl0(NativeInterface.GetCntfrqEl0); - var dlgNativeInterfaceGetCntpctEl0 = new NativeInterfaceGetCntpctEl0(NativeInterface.GetCntpctEl0); - var dlgNativeInterfaceGetCntvctEl0 = new NativeInterfaceGetCntvctEl0(NativeInterface.GetCntvctEl0); - var dlgNativeInterfaceGetCtrEl0 = new NativeInterfaceGetCtrEl0(NativeInterface.GetCtrEl0); - var dlgNativeInterfaceGetDczidEl0 = new NativeInterfaceGetDczidEl0(NativeInterface.GetDczidEl0); - var dlgNativeInterfaceGetFunctionAddress = new NativeInterfaceGetFunctionAddress(NativeInterface.GetFunctionAddress); - var dlgNativeInterfaceInvalidateCacheLine = new NativeInterfaceInvalidateCacheLine(NativeInterface.InvalidateCacheLine); - var dlgNativeInterfaceReadByte = new NativeInterfaceReadByte(NativeInterface.ReadByte); - var dlgNativeInterfaceReadUInt16 = new NativeInterfaceReadUInt16(NativeInterface.ReadUInt16); - var dlgNativeInterfaceReadUInt32 = new NativeInterfaceReadUInt32(NativeInterface.ReadUInt32); - var dlgNativeInterfaceReadUInt64 = new NativeInterfaceReadUInt64(NativeInterface.ReadUInt64); - var dlgNativeInterfaceReadVector128 = new NativeInterfaceReadVector128(NativeInterface.ReadVector128); - var dlgNativeInterfaceSignalMemoryTracking = new NativeInterfaceSignalMemoryTracking(NativeInterface.SignalMemoryTracking); - var dlgNativeInterfaceSupervisorCall = new NativeInterfaceSupervisorCall(NativeInterface.SupervisorCall); - var dlgNativeInterfaceThrowInvalidMemoryAccess = new NativeInterfaceThrowInvalidMemoryAccess(NativeInterface.ThrowInvalidMemoryAccess); - var dlgNativeInterfaceUndefined = new NativeInterfaceUndefined(NativeInterface.Undefined); - var dlgNativeInterfaceWriteByte = new NativeInterfaceWriteByte(NativeInterface.WriteByte); - var dlgNativeInterfaceWriteUInt16 = new NativeInterfaceWriteUInt16(NativeInterface.WriteUInt16); - var dlgNativeInterfaceWriteUInt32 = new NativeInterfaceWriteUInt32(NativeInterface.WriteUInt32); - var dlgNativeInterfaceWriteUInt64 = new NativeInterfaceWriteUInt64(NativeInterface.WriteUInt64); - var dlgNativeInterfaceWriteVector128 = new NativeInterfaceWriteVector128(NativeInterface.WriteVector128); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Break))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.CheckSynchronization))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.EnqueueForRejit))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntfrqEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntpctEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntvctEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCtrEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetDczidEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFunctionAddress))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.InvalidateCacheLine))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SignalMemoryTracking))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SupervisorCall))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ThrowInvalidMemoryAccess))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Undefined))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128))); - var dlgSoftFallbackCountLeadingSigns = new SoftFallbackCountLeadingSigns(SoftFallback.CountLeadingSigns); - var dlgSoftFallbackCountLeadingZeros = new SoftFallbackCountLeadingZeros(SoftFallback.CountLeadingZeros); - var dlgSoftFallbackCrc32b = new SoftFallbackCrc32b(SoftFallback.Crc32b); - var dlgSoftFallbackCrc32cb = new SoftFallbackCrc32cb(SoftFallback.Crc32cb); - var dlgSoftFallbackCrc32ch = new SoftFallbackCrc32ch(SoftFallback.Crc32ch); - var dlgSoftFallbackCrc32cw = new SoftFallbackCrc32cw(SoftFallback.Crc32cw); - var dlgSoftFallbackCrc32cx = new SoftFallbackCrc32cx(SoftFallback.Crc32cx); - var dlgSoftFallbackCrc32h = new SoftFallbackCrc32h(SoftFallback.Crc32h); - var dlgSoftFallbackCrc32w = new SoftFallbackCrc32w(SoftFallback.Crc32w); - var dlgSoftFallbackCrc32x = new SoftFallbackCrc32x(SoftFallback.Crc32x); - var dlgSoftFallbackDecrypt = new SoftFallbackDecrypt(SoftFallback.Decrypt); - var dlgSoftFallbackEncrypt = new SoftFallbackEncrypt(SoftFallback.Encrypt); - var dlgSoftFallbackFixedRotate = new SoftFallbackFixedRotate(SoftFallback.FixedRotate); - var dlgSoftFallbackHashChoose = new SoftFallbackHashChoose(SoftFallback.HashChoose); - var dlgSoftFallbackHashLower = new SoftFallbackHashLower(SoftFallback.HashLower); - var dlgSoftFallbackHashMajority = new SoftFallbackHashMajority(SoftFallback.HashMajority); - var dlgSoftFallbackHashParity = new SoftFallbackHashParity(SoftFallback.HashParity); - var dlgSoftFallbackHashUpper = new SoftFallbackHashUpper(SoftFallback.HashUpper); - var dlgSoftFallbackInverseMixColumns = new SoftFallbackInverseMixColumns(SoftFallback.InverseMixColumns); - var dlgSoftFallbackMixColumns = new SoftFallbackMixColumns(SoftFallback.MixColumns); - var dlgSoftFallbackPolynomialMult64_128 = new SoftFallbackPolynomialMult64_128(SoftFallback.PolynomialMult64_128); - var dlgSoftFallbackSatF32ToS32 = new SoftFallbackSatF32ToS32(SoftFallback.SatF32ToS32); - var dlgSoftFallbackSatF32ToS64 = new SoftFallbackSatF32ToS64(SoftFallback.SatF32ToS64); - var dlgSoftFallbackSatF32ToU32 = new SoftFallbackSatF32ToU32(SoftFallback.SatF32ToU32); - var dlgSoftFallbackSatF32ToU64 = new SoftFallbackSatF32ToU64(SoftFallback.SatF32ToU64); - var dlgSoftFallbackSatF64ToS32 = new SoftFallbackSatF64ToS32(SoftFallback.SatF64ToS32); - var dlgSoftFallbackSatF64ToS64 = new SoftFallbackSatF64ToS64(SoftFallback.SatF64ToS64); - var dlgSoftFallbackSatF64ToU32 = new SoftFallbackSatF64ToU32(SoftFallback.SatF64ToU32); - var dlgSoftFallbackSatF64ToU64 = new SoftFallbackSatF64ToU64(SoftFallback.SatF64ToU64); - var dlgSoftFallbackSha1SchedulePart1 = new SoftFallbackSha1SchedulePart1(SoftFallback.Sha1SchedulePart1); - var dlgSoftFallbackSha1SchedulePart2 = new SoftFallbackSha1SchedulePart2(SoftFallback.Sha1SchedulePart2); - var dlgSoftFallbackSha256SchedulePart1 = new SoftFallbackSha256SchedulePart1(SoftFallback.Sha256SchedulePart1); - var dlgSoftFallbackSha256SchedulePart2 = new SoftFallbackSha256SchedulePart2(SoftFallback.Sha256SchedulePart2); - var dlgSoftFallbackSignedShrImm64 = new SoftFallbackSignedShrImm64(SoftFallback.SignedShrImm64); - var dlgSoftFallbackTbl1 = new SoftFallbackTbl1(SoftFallback.Tbl1); - var dlgSoftFallbackTbl2 = new SoftFallbackTbl2(SoftFallback.Tbl2); - var dlgSoftFallbackTbl3 = new SoftFallbackTbl3(SoftFallback.Tbl3); - var dlgSoftFallbackTbl4 = new SoftFallbackTbl4(SoftFallback.Tbl4); - var dlgSoftFallbackTbx1 = new SoftFallbackTbx1(SoftFallback.Tbx1); - var dlgSoftFallbackTbx2 = new SoftFallbackTbx2(SoftFallback.Tbx2); - var dlgSoftFallbackTbx3 = new SoftFallbackTbx3(SoftFallback.Tbx3); - var dlgSoftFallbackTbx4 = new SoftFallbackTbx4(SoftFallback.Tbx4); - var dlgSoftFallbackUnsignedShrImm64 = new SoftFallbackUnsignedShrImm64(SoftFallback.UnsignedShrImm64); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingSigns))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingZeros))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32b))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cb))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32ch))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cw))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cx))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32h))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32w))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32x))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.FixedRotate))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashChoose))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashLower))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashMajority))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashParity))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashUpper))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.PolynomialMult64_128))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShrImm64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl3))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl4))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx3))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx4))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShrImm64))); - var dlgSoftFloat16_32FPConvert = new SoftFloat16_32FPConvert(SoftFloat16_32.FPConvert); - var dlgSoftFloat16_64FPConvert = new SoftFloat16_64FPConvert(SoftFloat16_64.FPConvert); + SetDelegateInfo(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert))); + SetDelegateInfo(typeof(SoftFloat16_64).GetMethod(nameof(SoftFloat16_64.FPConvert))); - var dlgSoftFloat32FPAdd = new SoftFloat32FPAdd(SoftFloat32.FPAdd); - var dlgSoftFloat32FPAddFpscr = new SoftFloat32FPAddFpscr(SoftFloat32.FPAddFpscr); // A32 only. - var dlgSoftFloat32FPCompare = new SoftFloat32FPCompare(SoftFloat32.FPCompare); - var dlgSoftFloat32FPCompareEQ = new SoftFloat32FPCompareEQ(SoftFloat32.FPCompareEQ); - var dlgSoftFloat32FPCompareEQFpscr = new SoftFloat32FPCompareEQFpscr(SoftFloat32.FPCompareEQFpscr); // A32 only. - var dlgSoftFloat32FPCompareGE = new SoftFloat32FPCompareGE(SoftFloat32.FPCompareGE); - var dlgSoftFloat32FPCompareGEFpscr = new SoftFloat32FPCompareGEFpscr(SoftFloat32.FPCompareGEFpscr); // A32 only. - var dlgSoftFloat32FPCompareGT = new SoftFloat32FPCompareGT(SoftFloat32.FPCompareGT); - var dlgSoftFloat32FPCompareGTFpscr = new SoftFloat32FPCompareGTFpscr(SoftFloat32.FPCompareGTFpscr); // A32 only. - var dlgSoftFloat32FPCompareLE = new SoftFloat32FPCompareLE(SoftFloat32.FPCompareLE); - var dlgSoftFloat32FPCompareLEFpscr = new SoftFloat32FPCompareLEFpscr(SoftFloat32.FPCompareLEFpscr); // A32 only. - var dlgSoftFloat32FPCompareLT = new SoftFloat32FPCompareLT(SoftFloat32.FPCompareLT); - var dlgSoftFloat32FPCompareLTFpscr = new SoftFloat32FPCompareLTFpscr(SoftFloat32.FPCompareLTFpscr); // A32 only. - var dlgSoftFloat32FPDiv = new SoftFloat32FPDiv(SoftFloat32.FPDiv); - var dlgSoftFloat32FPMax = new SoftFloat32FPMax(SoftFloat32.FPMax); - var dlgSoftFloat32FPMaxFpscr = new SoftFloat32FPMaxFpscr(SoftFloat32.FPMaxFpscr); // A32 only. - var dlgSoftFloat32FPMaxNum = new SoftFloat32FPMaxNum(SoftFloat32.FPMaxNum); - var dlgSoftFloat32FPMaxNumFpscr = new SoftFloat32FPMaxNumFpscr(SoftFloat32.FPMaxNumFpscr); // A32 only. - var dlgSoftFloat32FPMin = new SoftFloat32FPMin(SoftFloat32.FPMin); - var dlgSoftFloat32FPMinFpscr = new SoftFloat32FPMinFpscr(SoftFloat32.FPMinFpscr); // A32 only. - var dlgSoftFloat32FPMinNum = new SoftFloat32FPMinNum(SoftFloat32.FPMinNum); - var dlgSoftFloat32FPMinNumFpscr = new SoftFloat32FPMinNumFpscr(SoftFloat32.FPMinNumFpscr); // A32 only. - var dlgSoftFloat32FPMul = new SoftFloat32FPMul(SoftFloat32.FPMul); - var dlgSoftFloat32FPMulFpscr = new SoftFloat32FPMulFpscr(SoftFloat32.FPMulFpscr); // A32 only. - var dlgSoftFloat32FPMulAdd = new SoftFloat32FPMulAdd(SoftFloat32.FPMulAdd); - var dlgSoftFloat32FPMulAddFpscr = new SoftFloat32FPMulAddFpscr(SoftFloat32.FPMulAddFpscr); // A32 only. - var dlgSoftFloat32FPMulSub = new SoftFloat32FPMulSub(SoftFloat32.FPMulSub); - var dlgSoftFloat32FPMulSubFpscr = new SoftFloat32FPMulSubFpscr(SoftFloat32.FPMulSubFpscr); // A32 only. - var dlgSoftFloat32FPMulX = new SoftFloat32FPMulX(SoftFloat32.FPMulX); - var dlgSoftFloat32FPNegMulAdd = new SoftFloat32FPNegMulAdd(SoftFloat32.FPNegMulAdd); - var dlgSoftFloat32FPNegMulSub = new SoftFloat32FPNegMulSub(SoftFloat32.FPNegMulSub); - var dlgSoftFloat32FPRecipEstimate = new SoftFloat32FPRecipEstimate(SoftFloat32.FPRecipEstimate); - var dlgSoftFloat32FPRecipEstimateFpscr = new SoftFloat32FPRecipEstimateFpscr(SoftFloat32.FPRecipEstimateFpscr); // A32 only. - var dlgSoftFloat32FPRecipStep = new SoftFloat32FPRecipStep(SoftFloat32.FPRecipStep); // A32 only. - var dlgSoftFloat32FPRecipStepFused = new SoftFloat32FPRecipStepFused(SoftFloat32.FPRecipStepFused); - var dlgSoftFloat32FPRecpX = new SoftFloat32FPRecpX(SoftFloat32.FPRecpX); - var dlgSoftFloat32FPRSqrtEstimate = new SoftFloat32FPRSqrtEstimate(SoftFloat32.FPRSqrtEstimate); - var dlgSoftFloat32FPRSqrtEstimateFpscr = new SoftFloat32FPRSqrtEstimateFpscr(SoftFloat32.FPRSqrtEstimateFpscr); // A32 only. - var dlgSoftFloat32FPRSqrtStep = new SoftFloat32FPRSqrtStep(SoftFloat32.FPRSqrtStep); // A32 only. - var dlgSoftFloat32FPRSqrtStepFused = new SoftFloat32FPRSqrtStepFused(SoftFloat32.FPRSqrtStepFused); - var dlgSoftFloat32FPSqrt = new SoftFloat32FPSqrt(SoftFloat32.FPSqrt); - var dlgSoftFloat32FPSub = new SoftFloat32FPSub(SoftFloat32.FPSub); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAdd))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompare))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQ))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGE))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGT))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLE))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLT))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPDiv))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMax))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNum))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMin))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNum))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMul))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAdd))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSub))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSubFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulX))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulAdd))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulSub))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimate))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStepFused))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecpX))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimate))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStepFused))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSqrt))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSub))); - var dlgSoftFloat32_16FPConvert = new SoftFloat32_16FPConvert(SoftFloat32_16.FPConvert); + SetDelegateInfo(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert))); - var dlgSoftFloat64FPAdd = new SoftFloat64FPAdd(SoftFloat64.FPAdd); - var dlgSoftFloat64FPAddFpscr = new SoftFloat64FPAddFpscr(SoftFloat64.FPAddFpscr); // A32 only. - var dlgSoftFloat64FPCompare = new SoftFloat64FPCompare(SoftFloat64.FPCompare); - var dlgSoftFloat64FPCompareEQ = new SoftFloat64FPCompareEQ(SoftFloat64.FPCompareEQ); - var dlgSoftFloat64FPCompareEQFpscr = new SoftFloat64FPCompareEQFpscr(SoftFloat64.FPCompareEQFpscr); // A32 only. - var dlgSoftFloat64FPCompareGE = new SoftFloat64FPCompareGE(SoftFloat64.FPCompareGE); - var dlgSoftFloat64FPCompareGEFpscr = new SoftFloat64FPCompareGEFpscr(SoftFloat64.FPCompareGEFpscr); // A32 only. - var dlgSoftFloat64FPCompareGT = new SoftFloat64FPCompareGT(SoftFloat64.FPCompareGT); - var dlgSoftFloat64FPCompareGTFpscr = new SoftFloat64FPCompareGTFpscr(SoftFloat64.FPCompareGTFpscr); // A32 only. - var dlgSoftFloat64FPCompareLE = new SoftFloat64FPCompareLE(SoftFloat64.FPCompareLE); - var dlgSoftFloat64FPCompareLEFpscr = new SoftFloat64FPCompareLEFpscr(SoftFloat64.FPCompareLEFpscr); // A32 only. - var dlgSoftFloat64FPCompareLT = new SoftFloat64FPCompareLT(SoftFloat64.FPCompareLT); - var dlgSoftFloat64FPCompareLTFpscr = new SoftFloat64FPCompareLTFpscr(SoftFloat64.FPCompareLTFpscr); // A32 only. - var dlgSoftFloat64FPDiv = new SoftFloat64FPDiv(SoftFloat64.FPDiv); - var dlgSoftFloat64FPMax = new SoftFloat64FPMax(SoftFloat64.FPMax); - var dlgSoftFloat64FPMaxFpscr = new SoftFloat64FPMaxFpscr(SoftFloat64.FPMaxFpscr); // A32 only. - var dlgSoftFloat64FPMaxNum = new SoftFloat64FPMaxNum(SoftFloat64.FPMaxNum); - var dlgSoftFloat64FPMaxNumFpscr = new SoftFloat64FPMaxNumFpscr(SoftFloat64.FPMaxNumFpscr); // A32 only. - var dlgSoftFloat64FPMin = new SoftFloat64FPMin(SoftFloat64.FPMin); - var dlgSoftFloat64FPMinFpscr = new SoftFloat64FPMinFpscr(SoftFloat64.FPMinFpscr); // A32 only. - var dlgSoftFloat64FPMinNum = new SoftFloat64FPMinNum(SoftFloat64.FPMinNum); - var dlgSoftFloat64FPMinNumFpscr = new SoftFloat64FPMinNumFpscr(SoftFloat64.FPMinNumFpscr); // A32 only. - var dlgSoftFloat64FPMul = new SoftFloat64FPMul(SoftFloat64.FPMul); - var dlgSoftFloat64FPMulFpscr = new SoftFloat64FPMulFpscr(SoftFloat64.FPMulFpscr); // A32 only. - var dlgSoftFloat64FPMulAdd = new SoftFloat64FPMulAdd(SoftFloat64.FPMulAdd); - var dlgSoftFloat64FPMulAddFpscr = new SoftFloat64FPMulAddFpscr(SoftFloat64.FPMulAddFpscr); // A32 only. - var dlgSoftFloat64FPMulSub = new SoftFloat64FPMulSub(SoftFloat64.FPMulSub); - var dlgSoftFloat64FPMulSubFpscr = new SoftFloat64FPMulSubFpscr(SoftFloat64.FPMulSubFpscr); // A32 only. - var dlgSoftFloat64FPMulX = new SoftFloat64FPMulX(SoftFloat64.FPMulX); - var dlgSoftFloat64FPNegMulAdd = new SoftFloat64FPNegMulAdd(SoftFloat64.FPNegMulAdd); - var dlgSoftFloat64FPNegMulSub = new SoftFloat64FPNegMulSub(SoftFloat64.FPNegMulSub); - var dlgSoftFloat64FPRecipEstimate = new SoftFloat64FPRecipEstimate(SoftFloat64.FPRecipEstimate); - var dlgSoftFloat64FPRecipEstimateFpscr = new SoftFloat64FPRecipEstimateFpscr(SoftFloat64.FPRecipEstimateFpscr); // A32 only. - var dlgSoftFloat64FPRecipStep = new SoftFloat64FPRecipStep(SoftFloat64.FPRecipStep); // A32 only. - var dlgSoftFloat64FPRecipStepFused = new SoftFloat64FPRecipStepFused(SoftFloat64.FPRecipStepFused); - var dlgSoftFloat64FPRecpX = new SoftFloat64FPRecpX(SoftFloat64.FPRecpX); - var dlgSoftFloat64FPRSqrtEstimate = new SoftFloat64FPRSqrtEstimate(SoftFloat64.FPRSqrtEstimate); - var dlgSoftFloat64FPRSqrtEstimateFpscr = new SoftFloat64FPRSqrtEstimateFpscr(SoftFloat64.FPRSqrtEstimateFpscr); // A32 only. - var dlgSoftFloat64FPRSqrtStep = new SoftFloat64FPRSqrtStep(SoftFloat64.FPRSqrtStep); // A32 only. - var dlgSoftFloat64FPRSqrtStepFused = new SoftFloat64FPRSqrtStepFused(SoftFloat64.FPRSqrtStepFused); - var dlgSoftFloat64FPSqrt = new SoftFloat64FPSqrt(SoftFloat64.FPSqrt); - var dlgSoftFloat64FPSub = new SoftFloat64FPSub(SoftFloat64.FPSub); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAdd))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompare))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQ))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGE))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGT))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLE))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLT))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPDiv))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMax))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNum))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMin))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNum))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMul))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAdd))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSub))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSubFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulX))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulAdd))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulSub))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimate))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStepFused))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecpX))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimate))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStepFused))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSqrt))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSub))); - var dlgSoftFloat64_16FPConvert = new SoftFloat64_16FPConvert(SoftFloat64_16.FPConvert); - - SetDelegateInfo(dlgMathAbs, Marshal.GetFunctionPointerForDelegate(dlgMathAbs)); - SetDelegateInfo(dlgMathCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathCeiling)); - SetDelegateInfo(dlgMathFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFloor)); - SetDelegateInfo(dlgMathRound, Marshal.GetFunctionPointerForDelegate(dlgMathRound)); - SetDelegateInfo(dlgMathTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathTruncate)); - - SetDelegateInfo(dlgMathFAbs, Marshal.GetFunctionPointerForDelegate(dlgMathFAbs)); - SetDelegateInfo(dlgMathFCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathFCeiling)); - SetDelegateInfo(dlgMathFFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFFloor)); - SetDelegateInfo(dlgMathFRound, Marshal.GetFunctionPointerForDelegate(dlgMathFRound)); - SetDelegateInfo(dlgMathFTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathFTruncate)); - - SetDelegateInfo(dlgNativeInterfaceBreak, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceBreak)); - SetDelegateInfo(dlgNativeInterfaceCheckSynchronization, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceCheckSynchronization)); - SetDelegateInfo(dlgNativeInterfaceEnqueueForRejit, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceEnqueueForRejit)); - SetDelegateInfo(dlgNativeInterfaceGetCntfrqEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntfrqEl0)); - SetDelegateInfo(dlgNativeInterfaceGetCntpctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntpctEl0)); - SetDelegateInfo(dlgNativeInterfaceGetCntvctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntvctEl0)); - SetDelegateInfo(dlgNativeInterfaceGetCtrEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCtrEl0)); - SetDelegateInfo(dlgNativeInterfaceGetDczidEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetDczidEl0)); - SetDelegateInfo(dlgNativeInterfaceGetFunctionAddress, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetFunctionAddress)); - SetDelegateInfo(dlgNativeInterfaceInvalidateCacheLine, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceInvalidateCacheLine)); - SetDelegateInfo(dlgNativeInterfaceReadByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadByte)); - SetDelegateInfo(dlgNativeInterfaceReadUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt16)); - SetDelegateInfo(dlgNativeInterfaceReadUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt32)); - SetDelegateInfo(dlgNativeInterfaceReadUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt64)); - SetDelegateInfo(dlgNativeInterfaceReadVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadVector128)); - SetDelegateInfo(dlgNativeInterfaceSignalMemoryTracking, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSignalMemoryTracking)); - SetDelegateInfo(dlgNativeInterfaceSupervisorCall, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSupervisorCall)); - SetDelegateInfo(dlgNativeInterfaceThrowInvalidMemoryAccess, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceThrowInvalidMemoryAccess)); - SetDelegateInfo(dlgNativeInterfaceUndefined, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceUndefined)); - SetDelegateInfo(dlgNativeInterfaceWriteByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteByte)); - SetDelegateInfo(dlgNativeInterfaceWriteUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt16)); - SetDelegateInfo(dlgNativeInterfaceWriteUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt32)); - SetDelegateInfo(dlgNativeInterfaceWriteUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt64)); - SetDelegateInfo(dlgNativeInterfaceWriteVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteVector128)); - - SetDelegateInfo(dlgSoftFallbackCountLeadingSigns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingSigns)); - SetDelegateInfo(dlgSoftFallbackCountLeadingZeros, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingZeros)); - SetDelegateInfo(dlgSoftFallbackCrc32b, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32b)); - SetDelegateInfo(dlgSoftFallbackCrc32cb, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cb)); - SetDelegateInfo(dlgSoftFallbackCrc32ch, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32ch)); - SetDelegateInfo(dlgSoftFallbackCrc32cw, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cw)); - SetDelegateInfo(dlgSoftFallbackCrc32cx, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cx)); - SetDelegateInfo(dlgSoftFallbackCrc32h, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32h)); - SetDelegateInfo(dlgSoftFallbackCrc32w, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32w)); - SetDelegateInfo(dlgSoftFallbackCrc32x, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32x)); - SetDelegateInfo(dlgSoftFallbackDecrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackDecrypt)); - SetDelegateInfo(dlgSoftFallbackEncrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackEncrypt)); - SetDelegateInfo(dlgSoftFallbackFixedRotate, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackFixedRotate)); - SetDelegateInfo(dlgSoftFallbackHashChoose, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashChoose)); - SetDelegateInfo(dlgSoftFallbackHashLower, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashLower)); - SetDelegateInfo(dlgSoftFallbackHashMajority, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashMajority)); - SetDelegateInfo(dlgSoftFallbackHashParity, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashParity)); - SetDelegateInfo(dlgSoftFallbackHashUpper, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashUpper)); - SetDelegateInfo(dlgSoftFallbackInverseMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackInverseMixColumns)); - SetDelegateInfo(dlgSoftFallbackMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackMixColumns)); - SetDelegateInfo(dlgSoftFallbackPolynomialMult64_128, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackPolynomialMult64_128)); - SetDelegateInfo(dlgSoftFallbackSatF32ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS32)); - SetDelegateInfo(dlgSoftFallbackSatF32ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS64)); - SetDelegateInfo(dlgSoftFallbackSatF32ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU32)); - SetDelegateInfo(dlgSoftFallbackSatF32ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU64)); - SetDelegateInfo(dlgSoftFallbackSatF64ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS32)); - SetDelegateInfo(dlgSoftFallbackSatF64ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS64)); - SetDelegateInfo(dlgSoftFallbackSatF64ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU32)); - SetDelegateInfo(dlgSoftFallbackSatF64ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU64)); - SetDelegateInfo(dlgSoftFallbackSha1SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart1)); - SetDelegateInfo(dlgSoftFallbackSha1SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart2)); - SetDelegateInfo(dlgSoftFallbackSha256SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart1)); - SetDelegateInfo(dlgSoftFallbackSha256SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart2)); - SetDelegateInfo(dlgSoftFallbackSignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSignedShrImm64)); - SetDelegateInfo(dlgSoftFallbackTbl1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl1)); - SetDelegateInfo(dlgSoftFallbackTbl2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl2)); - SetDelegateInfo(dlgSoftFallbackTbl3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl3)); - SetDelegateInfo(dlgSoftFallbackTbl4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl4)); - SetDelegateInfo(dlgSoftFallbackTbx1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx1)); - SetDelegateInfo(dlgSoftFallbackTbx2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx2)); - SetDelegateInfo(dlgSoftFallbackTbx3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx3)); - SetDelegateInfo(dlgSoftFallbackTbx4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx4)); - SetDelegateInfo(dlgSoftFallbackUnsignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackUnsignedShrImm64)); - - SetDelegateInfo(dlgSoftFloat16_32FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_32FPConvert)); - SetDelegateInfo(dlgSoftFloat16_64FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_64FPConvert)); - - SetDelegateInfo(dlgSoftFloat32FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAdd)); - SetDelegateInfo(dlgSoftFloat32FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompare)); - SetDelegateInfo(dlgSoftFloat32FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQ)); - SetDelegateInfo(dlgSoftFloat32FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGE)); - SetDelegateInfo(dlgSoftFloat32FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGT)); - SetDelegateInfo(dlgSoftFloat32FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLE)); - SetDelegateInfo(dlgSoftFloat32FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLT)); - SetDelegateInfo(dlgSoftFloat32FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPDiv)); - SetDelegateInfo(dlgSoftFloat32FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMax)); - SetDelegateInfo(dlgSoftFloat32FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNum)); - SetDelegateInfo(dlgSoftFloat32FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMin)); - SetDelegateInfo(dlgSoftFloat32FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNum)); - SetDelegateInfo(dlgSoftFloat32FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMul)); - SetDelegateInfo(dlgSoftFloat32FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAdd)); - SetDelegateInfo(dlgSoftFloat32FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSub)); - SetDelegateInfo(dlgSoftFloat32FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSubFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulX)); - SetDelegateInfo(dlgSoftFloat32FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulAdd)); - SetDelegateInfo(dlgSoftFloat32FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulSub)); - SetDelegateInfo(dlgSoftFloat32FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimate)); - SetDelegateInfo(dlgSoftFloat32FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStepFused)); - SetDelegateInfo(dlgSoftFloat32FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecpX)); - SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimate)); - SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStepFused)); - SetDelegateInfo(dlgSoftFloat32FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSqrt)); - SetDelegateInfo(dlgSoftFloat32FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSub)); - - SetDelegateInfo(dlgSoftFloat32_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32_16FPConvert)); - - SetDelegateInfo(dlgSoftFloat64FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAdd)); - SetDelegateInfo(dlgSoftFloat64FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompare)); - SetDelegateInfo(dlgSoftFloat64FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQ)); - SetDelegateInfo(dlgSoftFloat64FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGE)); - SetDelegateInfo(dlgSoftFloat64FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGT)); - SetDelegateInfo(dlgSoftFloat64FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLE)); - SetDelegateInfo(dlgSoftFloat64FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLT)); - SetDelegateInfo(dlgSoftFloat64FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPDiv)); - SetDelegateInfo(dlgSoftFloat64FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMax)); - SetDelegateInfo(dlgSoftFloat64FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNum)); - SetDelegateInfo(dlgSoftFloat64FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMin)); - SetDelegateInfo(dlgSoftFloat64FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNum)); - SetDelegateInfo(dlgSoftFloat64FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMul)); - SetDelegateInfo(dlgSoftFloat64FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAdd)); - SetDelegateInfo(dlgSoftFloat64FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSub)); - SetDelegateInfo(dlgSoftFloat64FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSubFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulX)); - SetDelegateInfo(dlgSoftFloat64FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulAdd)); - SetDelegateInfo(dlgSoftFloat64FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulSub)); - SetDelegateInfo(dlgSoftFloat64FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimate)); - SetDelegateInfo(dlgSoftFloat64FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStepFused)); - SetDelegateInfo(dlgSoftFloat64FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecpX)); - SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimate)); - SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStepFused)); - SetDelegateInfo(dlgSoftFloat64FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSqrt)); - SetDelegateInfo(dlgSoftFloat64FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSub)); - - SetDelegateInfo(dlgSoftFloat64_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64_16FPConvert)); + SetDelegateInfo(typeof(SoftFloat64_16).GetMethod(nameof(SoftFloat64_16.FPConvert))); } - - private delegate double MathAbs(double value); - private delegate double MathCeiling(double a); - private delegate double MathFloor(double d); - private delegate double MathRound(double value, MidpointRounding mode); - private delegate double MathTruncate(double d); - - private delegate float MathFAbs(float x); - private delegate float MathFCeiling(float x); - private delegate float MathFFloor(float x); - private delegate float MathFRound(float x, MidpointRounding mode); - private delegate float MathFTruncate(float x); - - private delegate void NativeInterfaceBreak(ulong address, int imm); - private delegate bool NativeInterfaceCheckSynchronization(); - private delegate void NativeInterfaceEnqueueForRejit(ulong address); - private delegate ulong NativeInterfaceGetCntfrqEl0(); - private delegate ulong NativeInterfaceGetCntpctEl0(); - private delegate ulong NativeInterfaceGetCntvctEl0(); - private delegate ulong NativeInterfaceGetCtrEl0(); - private delegate ulong NativeInterfaceGetDczidEl0(); - private delegate ulong NativeInterfaceGetFunctionAddress(ulong address); - private delegate void NativeInterfaceInvalidateCacheLine(ulong address); - private delegate byte NativeInterfaceReadByte(ulong address); - private delegate ushort NativeInterfaceReadUInt16(ulong address); - private delegate uint NativeInterfaceReadUInt32(ulong address); - private delegate ulong NativeInterfaceReadUInt64(ulong address); - private delegate V128 NativeInterfaceReadVector128(ulong address); - private delegate void NativeInterfaceSignalMemoryTracking(ulong address, ulong size, bool write); - private delegate void NativeInterfaceSupervisorCall(ulong address, int imm); - private delegate void NativeInterfaceThrowInvalidMemoryAccess(ulong address); - private delegate void NativeInterfaceUndefined(ulong address, int opCode); - private delegate void NativeInterfaceWriteByte(ulong address, byte value); - private delegate void NativeInterfaceWriteUInt16(ulong address, ushort value); - private delegate void NativeInterfaceWriteUInt32(ulong address, uint value); - private delegate void NativeInterfaceWriteUInt64(ulong address, ulong value); - private delegate void NativeInterfaceWriteVector128(ulong address, V128 value); - - private delegate ulong SoftFallbackCountLeadingSigns(ulong value, int size); - private delegate ulong SoftFallbackCountLeadingZeros(ulong value, int size); - private delegate uint SoftFallbackCrc32b(uint crc, byte value); - private delegate uint SoftFallbackCrc32cb(uint crc, byte value); - private delegate uint SoftFallbackCrc32ch(uint crc, ushort value); - private delegate uint SoftFallbackCrc32cw(uint crc, uint value); - private delegate uint SoftFallbackCrc32cx(uint crc, ulong value); - private delegate uint SoftFallbackCrc32h(uint crc, ushort value); - private delegate uint SoftFallbackCrc32w(uint crc, uint value); - private delegate uint SoftFallbackCrc32x(uint crc, ulong value); - private delegate V128 SoftFallbackDecrypt(V128 value, V128 roundKey); - private delegate V128 SoftFallbackEncrypt(V128 value, V128 roundKey); - private delegate uint SoftFallbackFixedRotate(uint hash_e); - private delegate V128 SoftFallbackHashChoose(V128 hash_abcd, uint hash_e, V128 wk); - private delegate V128 SoftFallbackHashLower(V128 hash_abcd, V128 hash_efgh, V128 wk); - private delegate V128 SoftFallbackHashMajority(V128 hash_abcd, uint hash_e, V128 wk); - private delegate V128 SoftFallbackHashParity(V128 hash_abcd, uint hash_e, V128 wk); - private delegate V128 SoftFallbackHashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk); - private delegate V128 SoftFallbackInverseMixColumns(V128 value); - private delegate V128 SoftFallbackMixColumns(V128 value); - private delegate V128 SoftFallbackPolynomialMult64_128(ulong op1, ulong op2); - private delegate int SoftFallbackSatF32ToS32(float value); - private delegate long SoftFallbackSatF32ToS64(float value); - private delegate uint SoftFallbackSatF32ToU32(float value); - private delegate ulong SoftFallbackSatF32ToU64(float value); - private delegate int SoftFallbackSatF64ToS32(double value); - private delegate long SoftFallbackSatF64ToS64(double value); - private delegate uint SoftFallbackSatF64ToU32(double value); - private delegate ulong SoftFallbackSatF64ToU64(double value); - private delegate V128 SoftFallbackSha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11); - private delegate V128 SoftFallbackSha1SchedulePart2(V128 tw0_3, V128 w12_15); - private delegate V128 SoftFallbackSha256SchedulePart1(V128 w0_3, V128 w4_7); - private delegate V128 SoftFallbackSha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15); - private delegate long SoftFallbackSignedShrImm64(long value, long roundConst, int shift); - private delegate V128 SoftFallbackTbl1(V128 vector, int bytes, V128 tb0); - private delegate V128 SoftFallbackTbl2(V128 vector, int bytes, V128 tb0, V128 tb1); - private delegate V128 SoftFallbackTbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2); - private delegate V128 SoftFallbackTbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3); - private delegate V128 SoftFallbackTbx1(V128 dest, V128 vector, int bytes, V128 tb0); - private delegate V128 SoftFallbackTbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1); - private delegate V128 SoftFallbackTbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2); - private delegate V128 SoftFallbackTbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3); - private delegate ulong SoftFallbackUnsignedShrImm64(ulong value, long roundConst, int shift); - - private delegate float SoftFloat16_32FPConvert(ushort valueBits); - - private delegate double SoftFloat16_64FPConvert(ushort valueBits); - - private delegate float SoftFloat32FPAdd(float value1, float value2); - private delegate float SoftFloat32FPAddFpscr(float value1, float value2, bool standardFpscr); - private delegate int SoftFloat32FPCompare(float value1, float value2, bool signalNaNs); - private delegate float SoftFloat32FPCompareEQ(float value1, float value2); - private delegate float SoftFloat32FPCompareEQFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareGE(float value1, float value2); - private delegate float SoftFloat32FPCompareGEFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareGT(float value1, float value2); - private delegate float SoftFloat32FPCompareGTFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareLE(float value1, float value2); - private delegate float SoftFloat32FPCompareLEFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareLT(float value1, float value2); - private delegate float SoftFloat32FPCompareLTFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPDiv(float value1, float value2); - private delegate float SoftFloat32FPMax(float value1, float value2); - private delegate float SoftFloat32FPMaxFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMaxNum(float value1, float value2); - private delegate float SoftFloat32FPMaxNumFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMin(float value1, float value2); - private delegate float SoftFloat32FPMinFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMinNum(float value1, float value2); - private delegate float SoftFloat32FPMinNumFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMul(float value1, float value2); - private delegate float SoftFloat32FPMulFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMulAdd(float valueA, float value1, float value2); - private delegate float SoftFloat32FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMulSub(float valueA, float value1, float value2); - private delegate float SoftFloat32FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMulX(float value1, float value2); - private delegate float SoftFloat32FPNegMulAdd(float valueA, float value1, float value2); - private delegate float SoftFloat32FPNegMulSub(float valueA, float value1, float value2); - private delegate float SoftFloat32FPRecipEstimate(float value); - private delegate float SoftFloat32FPRecipEstimateFpscr(float value, bool standardFpscr); - private delegate float SoftFloat32FPRecipStep(float value1, float value2); - private delegate float SoftFloat32FPRecipStepFused(float value1, float value2); - private delegate float SoftFloat32FPRecpX(float value); - private delegate float SoftFloat32FPRSqrtEstimate(float value); - private delegate float SoftFloat32FPRSqrtEstimateFpscr(float value, bool standardFpscr); - private delegate float SoftFloat32FPRSqrtStep(float value1, float value2); - private delegate float SoftFloat32FPRSqrtStepFused(float value1, float value2); - private delegate float SoftFloat32FPSqrt(float value); - private delegate float SoftFloat32FPSub(float value1, float value2); - - private delegate ushort SoftFloat32_16FPConvert(float value); - - private delegate double SoftFloat64FPAdd(double value1, double value2); - private delegate double SoftFloat64FPAddFpscr(double value1, double value2, bool standardFpscr); - private delegate int SoftFloat64FPCompare(double value1, double value2, bool signalNaNs); - private delegate double SoftFloat64FPCompareEQ(double value1, double value2); - private delegate double SoftFloat64FPCompareEQFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareGE(double value1, double value2); - private delegate double SoftFloat64FPCompareGEFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareGT(double value1, double value2); - private delegate double SoftFloat64FPCompareGTFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareLE(double value1, double value2); - private delegate double SoftFloat64FPCompareLEFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareLT(double value1, double value2); - private delegate double SoftFloat64FPCompareLTFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPDiv(double value1, double value2); - private delegate double SoftFloat64FPMax(double value1, double value2); - private delegate double SoftFloat64FPMaxFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMaxNum(double value1, double value2); - private delegate double SoftFloat64FPMaxNumFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMin(double value1, double value2); - private delegate double SoftFloat64FPMinFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMinNum(double value1, double value2); - private delegate double SoftFloat64FPMinNumFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMul(double value1, double value2); - private delegate double SoftFloat64FPMulFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMulAdd(double valueA, double value1, double value2); - private delegate double SoftFloat64FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMulSub(double valueA, double value1, double value2); - private delegate double SoftFloat64FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMulX(double value1, double value2); - private delegate double SoftFloat64FPNegMulAdd(double valueA, double value1, double value2); - private delegate double SoftFloat64FPNegMulSub(double valueA, double value1, double value2); - private delegate double SoftFloat64FPRecipEstimate(double value); - private delegate double SoftFloat64FPRecipEstimateFpscr(double value, bool standardFpscr); - private delegate double SoftFloat64FPRecipStep(double value1, double value2); - private delegate double SoftFloat64FPRecipStepFused(double value1, double value2); - private delegate double SoftFloat64FPRecpX(double value); - private delegate double SoftFloat64FPRSqrtEstimate(double value); - private delegate double SoftFloat64FPRSqrtEstimateFpscr(double value, bool standardFpscr); - private delegate double SoftFloat64FPRSqrtStep(double value1, double value2); - private delegate double SoftFloat64FPRSqrtStepFused(double value1, double value2); - private delegate double SoftFloat64FPSqrt(double value); - private delegate double SoftFloat64FPSub(double value1, double value2); - - private delegate ushort SoftFloat64_16FPConvert(double value); } } diff --git a/src/ARMeilleure/Translation/EmitterContext.cs b/src/ARMeilleure/Translation/EmitterContext.cs index 22b6b9842..3d800e16f 100644 --- a/src/ARMeilleure/Translation/EmitterContext.cs +++ b/src/ARMeilleure/Translation/EmitterContext.cs @@ -97,7 +97,7 @@ namespace ARMeilleure.Translation public virtual Operand Call(MethodInfo info, params Operand[] callArgs) { - nint funcPtr = Delegates.GetDelegateFuncPtr(info); + nint funcPtr = info.MethodHandle.GetFunctionPointer(); OperandType returnType = GetOperandType(info.ReturnType); diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs index 4675abc49..894e825cf 100644 --- a/src/ARMeilleure/Translation/PTC/Ptc.cs +++ b/src/ARMeilleure/Translation/PTC/Ptc.cs @@ -29,8 +29,8 @@ namespace ARMeilleure.Translation.PTC { private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0"; - - private const uint InternalVersion = 6997; //! To be incremented manually for each change to the ARMeilleure project. + + private const uint InternalVersion = 6998; //! To be incremented manually for each change to the ARMeilleure project. private const string ActualDir = "0"; private const string BackupDir = "1"; diff --git a/src/Ryujinx.Common/Configuration/DirtyHack.cs b/src/Ryujinx.Common/Configuration/DirtyHack.cs index 6e21fe44e..9ab9a26a5 100644 --- a/src/Ryujinx.Common/Configuration/DirtyHack.cs +++ b/src/Ryujinx.Common/Configuration/DirtyHack.cs @@ -25,7 +25,7 @@ namespace Ryujinx.Common.Configuration { var unpackedFields = packedHack.UnpackBitFields(PackedFormat); if (unpackedFields is not [var hack, var value]) - throw new ArgumentException(nameof(packedHack)); + throw new Exception("The unpack operation on the integer resulted in an invalid unpacked result."); return new EnabledDirtyHack((DirtyHack)hack, (int)value); } diff --git a/src/Ryujinx.Common/RyujinxException.cs b/src/Ryujinx.Common/RyujinxException.cs new file mode 100644 index 000000000..dbb5184e4 --- /dev/null +++ b/src/Ryujinx.Common/RyujinxException.cs @@ -0,0 +1,10 @@ +using System; + +namespace Ryujinx.Common +{ + public class RyujinxException : Exception + { + public RyujinxException(string message) : base(message) + { } + } +} diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index ab6cfeb03..dca634d9d 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -1,4 +1,4 @@ -using Gommon; +using Gommon; using Ryujinx.Common.Configuration; using System; using System.Linq; @@ -47,6 +47,9 @@ namespace Ryujinx.Common public static readonly string[] DiscordGameAssetKeys = [ + "010008900705c000", // Dragon Quest Builders + "010042000a986000", // Dragon Quest Builders 2 + "010055d009f78000", // Fire Emblem: Three Houses "0100a12011cc8000", // Fire Emblem: Shadow Dragon "0100a6301214e000", // Fire Emblem Engage @@ -105,17 +108,18 @@ namespace Ryujinx.Common "0100f4c009322000", // Pikmin 3 Deluxe "0100b7c00933a000", // Pikmin 4 + "0100f4300bf2c000", // New Pokémon Snap + "0100000011d90000", // Pokémon Brilliant Diamond + "01001f5010dfa000", // Pokémon Legends: Arceus "010003f003a34000", // Pokémon: Let's Go Pikachu! "0100187003a36000", // Pokémon: Let's Go Eevee! - "0100abf008968000", // Pokémon Sword - "01008db008c2c000", // Pokémon Shield - "0100000011d90000", // Pokémon Brilliant Diamond - "010018e011d92000", // Pokémon Shining Pearl - "01001f5010dfa000", // Pokémon Legends: Arceus + "01003d200baa2000", // Pokémon Mystery Dungeon - Rescue Team DX "0100a3d008c5c000", // Pokémon Scarlet + "01008db008c2c000", // Pokémon Shield + "010018e011d92000", // Pokémon Shining Pearl + "0100abf008968000", // Pokémon Sword "01008f6008c5e000", // Pokémon Violet "0100b3f000be2000", // Pokkén Tournament DX - "0100f4300bf2c000", // New Pokémon Snap "01003bc0000a0000", // Splatoon 2 (US) "0100f8f0000a2000", // Splatoon 2 (EU) @@ -165,12 +169,21 @@ namespace Ryujinx.Common "01005ea01c0fc000", // SONIC X SHADOW GENERATIONS "01005ea01c0fc001", // ^ + "0100ff500e34a000", // Xenoblade Chronicles - Definitive Edition + "0100e95004038000", // Xenoblade Chronicles 2 + "010074f013262000", // Xenoblade Chronicles 3 + "010056e00853a000", // A Hat in Time + "0100fd1014726000", // Baldurs Gate: Dark Alliance "0100dbf01000a000", // Burnout Paradise Remastered "0100744001588000", // Cars 3: Driven to Win "0100b41013c82000", // Cruis'n Blast + "010085900337e000", // Death Squared "01001b300b9be000", // Diablo III: Eternal Collection "01008c8012920000", // Dying Light Platinum Edition + "01001cc01b2d4000", // Goat Simulator 3 + "01003620068ea000", // Hand of Fate 2 + "010085500130a000", // Lego City: Undercover "010073c01af34000", // LEGO Horizon Adventures "0100770008dd8000", // Monster Hunter Generations Ultimate "0100b04011742000", // Monster Hunter Rise @@ -189,6 +202,8 @@ namespace Ryujinx.Common "01000a10041ea000", // The Elder Scrolls V: Skyrim "010057a01e4d4000", // TSUKIHIME -A piece of blue glass moon- "010080b00ad66000", // Undertale + "010069401adb8000", // Unicorn Overlord + "0100534009ff2000", // Yonder - The cloud catcher chronicles ]; } } diff --git a/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs b/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs index e79248a47..f7f78b613 100644 --- a/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs +++ b/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs @@ -168,13 +168,15 @@ namespace Ryujinx.Graphics.Vulkan return BinarySearch(list, offset, size) >= 0; } - public readonly IEnumerable FindOverlaps(int offset, int size) + public readonly List FindOverlaps(int offset, int size) { var list = _ranges; if (list == null) { - yield break; + return null; } + + List result = null; int index = BinarySearch(list, offset, size); @@ -187,10 +189,12 @@ namespace Ryujinx.Graphics.Vulkan do { - yield return list[index++]; + (result ??= []).Add(list[index++]); } while (index < list.Count && list[index].OverlapsWith(offset, size)); } + + return result; } private static int BinarySearch(List list, int offset, int size) diff --git a/src/Ryujinx.Graphics.Vulkan/Vendor.cs b/src/Ryujinx.Graphics.Vulkan/Vendor.cs index 55ae0cd81..6a2a76a88 100644 --- a/src/Ryujinx.Graphics.Vulkan/Vendor.cs +++ b/src/Ryujinx.Graphics.Vulkan/Vendor.cs @@ -92,7 +92,7 @@ namespace Ryujinx.Graphics.Vulkan DriverId.MesaDozen => "Dozen", DriverId.MesaNvk => "NVK", DriverId.ImaginationOpenSourceMesa => "Imagination (Open)", - DriverId.MesaAgxv => "Honeykrisp", + DriverId.MesaHoneykrisp => "Honeykrisp", _ => id.ToString(), }; } diff --git a/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs b/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs index 05bddc76f..cf99b0e7a 100644 --- a/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs @@ -26,10 +26,20 @@ namespace Ryujinx.HLE.HOS.Applets { _normalSession = normalSession; _interactiveSession = interactiveSession; - - // TODO(jduncanator): Parse PlayerSelectConfig from input data - _normalSession.Push(BuildResponse()); - + + UserProfile selected = _system.Device.UIHandler.ShowPlayerSelectDialog(); + if (selected == null) + { + _normalSession.Push(BuildResponse()); + } + else if (selected.UserId == new UserId("00000000000000000000000000000080")) + { + _normalSession.Push(BuildGuestResponse()); + } + else + { + _normalSession.Push(BuildResponse(selected)); + } AppletStateChanged?.Invoke(this, null); _system.ReturnFocus(); @@ -37,16 +47,34 @@ namespace Ryujinx.HLE.HOS.Applets return ResultCode.Success; } - private byte[] BuildResponse() + private byte[] BuildResponse(UserProfile selectedUser) { - UserProfile currentUser = _system.AccountManager.LastOpenedUser; - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.Write((ulong)PlayerSelectResult.Success); - currentUser.UserId.Write(writer); + selectedUser.UserId.Write(writer); + + return stream.ToArray(); + } + + private byte[] BuildGuestResponse() + { + using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using BinaryWriter writer = new(stream); + + writer.Write(new byte()); + + return stream.ToArray(); + } + + private byte[] BuildResponse() + { + using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using BinaryWriter writer = new(stream); + + writer.Write((ulong)PlayerSelectResult.Failure); return stream.ToArray(); } diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index f9c5ddecf..627b649df 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -284,7 +284,7 @@ namespace Ryujinx.HLE.HOS ProcessCreationInfo creationInfo = new("Service", 1, 0, 0x8000000, 1, Flags, 0, 0); uint[] defaultCapabilities = { - 0x030363F7, + (((uint)KScheduler.CpuCoresCount - 1) << 24) + (((uint)KScheduler.CpuCoresCount - 1) << 16) + 0x63F7u, 0x1FFFFFCF, 0x207FFFEF, 0x47E0060F, diff --git a/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs b/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs index 89d788c54..7e2e9cacc 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs @@ -63,6 +63,7 @@ namespace Ryujinx.HLE.HOS.Kernel TickSource = tickSource; Device = device; Memory = memory; + KScheduler.CpuCoresCount = device.CpuCoresCount; Running = true; diff --git a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs index f5ecba752..e05fc8397 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs @@ -37,7 +37,7 @@ namespace Ryujinx.HLE.HOS.Kernel return result; } - process.DefaultCpuCore = 3; + process.DefaultCpuCore = KScheduler.CpuCoresCount - 1; context.Processes.TryAdd(process.Pid, process); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index b4aa5ca5c..82c3d2e70 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -277,7 +277,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - result = Capabilities.InitializeForUser(capabilities, MemoryManager); + result = Capabilities.InitializeForUser(capabilities, MemoryManager, IsApplication); if (result != Result.Success) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs index ebab67bb8..745d3edd8 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs @@ -35,15 +35,15 @@ namespace Ryujinx.HLE.HOS.Kernel.Process DebuggingFlags &= ~3u; KernelReleaseVersion = KProcess.KernelVersionPacked; - return Parse(capabilities, memoryManager); + return Parse(capabilities, memoryManager, false); } - public Result InitializeForUser(ReadOnlySpan capabilities, KPageTableBase memoryManager) + public Result InitializeForUser(ReadOnlySpan capabilities, KPageTableBase memoryManager, bool isApplication) { - return Parse(capabilities, memoryManager); + return Parse(capabilities, memoryManager, isApplication); } - private Result Parse(ReadOnlySpan capabilities, KPageTableBase memoryManager) + private Result Parse(ReadOnlySpan capabilities, KPageTableBase memoryManager, bool isApplication) { int mask0 = 0; int mask1 = 0; @@ -54,7 +54,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process if (cap.GetCapabilityType() != CapabilityType.MapRange) { - Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager); + Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager, isApplication); if (result != Result.Success) { @@ -120,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return Result.Success; } - private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTableBase memoryManager) + private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTableBase memoryManager, bool isApplication) { CapabilityType code = cap.GetCapabilityType(); @@ -176,6 +176,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process AllowedCpuCoresMask = GetMaskFromMinMax(lowestCpuCore, highestCpuCore); AllowedThreadPriosMask = GetMaskFromMinMax(lowestThreadPrio, highestThreadPrio); + if (isApplication) + Ryujinx.Common.Logging.Logger.Info?.Print(Ryujinx.Common.Logging.LogClass.Application, $"Application requested cores with index range {lowestCpuCore} to {highestCpuCore}"); + break; } diff --git a/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index 2f487243d..1b6433af6 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -2683,7 +2683,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidCombination; } - if ((uint)preferredCore > 3) + if ((uint)preferredCore > KScheduler.CpuCoresCount - 1) { if ((preferredCore | 2) != -1) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index 8ef77902c..19f1b8be0 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -9,13 +9,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading partial class KScheduler : IDisposable { public const int PrioritiesCount = 64; - public const int CpuCoresCount = 4; + public static int CpuCoresCount; private const int RoundRobinTimeQuantumMs = 10; - private static readonly int[] _preemptionPriorities = { 59, 59, 59, 63 }; - - private static readonly int[] _srcCoresHighestPrioThreads = new int[CpuCoresCount]; + private static int[] _srcCoresHighestPrioThreads; private readonly KernelContext _context; private readonly int _coreId; @@ -47,6 +45,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _coreId = coreId; _currentThread = null; + + if (_srcCoresHighestPrioThreads == null) + { + _srcCoresHighestPrioThreads = new int[CpuCoresCount]; + } + } + + private static int PreemptionPriorities(int index) + { + return index == CpuCoresCount - 1 ? 63 : 59; } public static ulong SelectThreads(KernelContext context) @@ -437,7 +445,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading for (int core = 0; core < CpuCoresCount; core++) { - RotateScheduledQueue(context, core, _preemptionPriorities[core]); + RotateScheduledQueue(context, core, PreemptionPriorities(core)); } context.CriticalSection.Leave(); diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs index aa57a0310..6fdfe1398 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs @@ -56,7 +56,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc ProfilesJson profilesJson = JsonHelper.DeserializeFromFile(_profilesJsonPath, _serializerContext.ProfilesJson); return profilesJson.Profiles - .FindFirst(profile => profile.AccountState == AccountState.Open) + .FindFirst(profile => profile.UserId == profilesJson.LastOpened) .Convert(profileJson => new UserProfile(new UserId(profileJson.UserId), profileJson.Name, profileJson.Image, profileJson.LastModifiedTimestamp)); } diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg b/src/Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg new file mode 100644 index 000000000..8310994de Binary files /dev/null and b/src/Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg differ diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs index 556e35ea6..c1856535b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs @@ -702,6 +702,18 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } + + [CommandCmif(92)] + // SetGestureOutputRanges(pid, ushort Unknown0) + public ResultCode SetGestureOutputRanges(ServiceCtx context) + { + ulong pid = context.Request.HandleDesc.PId; + ushort unknown0 = context.RequestData.ReadUInt16(); + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { pid, unknown0 }); + + return ResultCode.Success; + } [CommandCmif(100)] // SetSupportedNpadStyleSet(pid, nn::applet::AppletResourceUserId, nn::hid::NpadStyleTag) diff --git a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs index f67699b90..40329aa36 100644 --- a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -24,14 +24,14 @@ namespace Ryujinx.HLE.HOS.Services // not large enough. private const int PointerBufferSize = 0x8000; - private readonly static uint[] _defaultCapabilities = { - 0x030363F7, + private static uint[] _defaultCapabilities => [ + (((uint)KScheduler.CpuCoresCount - 1) << 24) + (((uint)KScheduler.CpuCoresCount - 1) << 16) + 0x63F7u, 0x1FFFFFCF, 0x207FFFEF, 0x47E0060F, 0x0048BFFF, 0x01007FFF, - }; + ]; // The amount of time Dispose() will wait to Join() the thread executing the ServerLoop() private static readonly TimeSpan _threadJoinTimeout = TimeSpan.FromSeconds(3); diff --git a/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs b/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs index 65748be33..846c4dc4f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs @@ -244,6 +244,15 @@ namespace Ryujinx.HLE.HOS.Services.Settings return ResultCode.Success; } + [CommandCmif(68)] + // GetSerialNumber() -> buffer + public ResultCode GetSerialNumber(ServiceCtx context) + { + context.ResponseData.Write(Encoding.ASCII.GetBytes("RYU00000000000")); + + return ResultCode.Success; + } + [CommandCmif(77)] // GetDeviceNickName() -> buffer public ResultCode GetDeviceNickName(ServiceCtx context) diff --git a/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs b/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs index 4a2a910f8..ade67b9c0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs @@ -51,6 +51,9 @@ namespace Ryujinx.HLE.HOS.Services.Spl context.ResponseData.Write(configValue); + if (result == SmcResult.Success) + return ResultCode.Success; + return (ResultCode)((int)result << 9) | ResultCode.ModuleId; } diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs index ebbeb1398..6279ec3b4 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs @@ -26,7 +26,17 @@ namespace Ryujinx.HLE.Loaders.Processes private ulong _latestPid; - public ProcessResult ActiveApplication => _processesByPid[_latestPid]; + public ProcessResult ActiveApplication + { + get + { + if (!_processesByPid.TryGetValue(_latestPid, out ProcessResult value)) + throw new RyujinxException( + $"The HLE Process map did not have a process with ID {_latestPid}. Are you missing firmware?"); + + return value; + } + } public ProcessLoader(Switch device) { diff --git a/src/Ryujinx.HLE/Ryujinx.HLE.csproj b/src/Ryujinx.HLE/Ryujinx.HLE.csproj index d42ecf8b8..f551f1a18 100644 --- a/src/Ryujinx.HLE/Ryujinx.HLE.csproj +++ b/src/Ryujinx.HLE/Ryujinx.HLE.csproj @@ -48,6 +48,7 @@ + diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index 25e65354f..e15fab03a 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -32,6 +32,8 @@ namespace Ryujinx.HLE public TamperMachine TamperMachine { get; } public IHostUIHandler UIHandler { get; } + public int CpuCoresCount = 4; //Switch 1 has 4 cores + public VSyncMode VSyncMode { get; set; } = VSyncMode.Switch; public bool CustomVSyncIntervalEnabled { get; set; } = false; public int CustomVSyncInterval { get; set; } diff --git a/src/Ryujinx.HLE/UI/IHostUIHandler.cs b/src/Ryujinx.HLE/UI/IHostUIHandler.cs index 88af83735..8ccb5cf89 100644 --- a/src/Ryujinx.HLE/UI/IHostUIHandler.cs +++ b/src/Ryujinx.HLE/UI/IHostUIHandler.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Applets; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; namespace Ryujinx.HLE.UI @@ -59,5 +60,11 @@ namespace Ryujinx.HLE.UI /// Gets fonts and colors used by the host. /// IHostUITheme HostUITheme { get; } + + + /// + /// Displays the player select dialog and returns the selected profile. + /// + UserProfile ShowPlayerSelectDialog(); } } diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj deleted file mode 100644 index 01efe04ba..000000000 --- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj +++ /dev/null @@ -1,36 +0,0 @@ - - - - true - $(DefaultItemExcludes);._* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs b/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs index c69eca7ee..2ba0b60a3 100644 --- a/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs +++ b/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs @@ -19,7 +19,7 @@ namespace Ryujinx.UI.LocaleGenerator StringBuilder enumSourceBuilder = new(); enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;"); - enumSourceBuilder.AppendLine("internal enum LocaleKeys"); + enumSourceBuilder.AppendLine("public enum LocaleKeys"); enumSourceBuilder.AppendLine("{"); foreach (var line in lines) { diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 402874cdd..3a430c8c4 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -3,7 +3,6 @@ using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Input; using Avalonia.Threading; -using Gommon; using LibHac.Common; using LibHac.Ns; using LibHac.Tools.FsSystem; @@ -43,7 +42,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.Input; using Ryujinx.Input.HLE; -using Silk.NET.Vulkan; using SkiaSharp; using SPB.Graphics.Vulkan; using System; @@ -491,7 +489,7 @@ namespace Ryujinx.Ava Dispatcher.UIThread.InvokeAsync(() => { - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar); }); _viewModel.SetUiProgressHandlers(Device); @@ -874,7 +872,7 @@ namespace Ryujinx.Ava Device?.System.TogglePauseEmulation(false); _viewModel.IsPaused = false; - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar); Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed"); } @@ -883,7 +881,7 @@ namespace Ryujinx.Ava Device?.System.TogglePauseEmulation(true); _viewModel.IsPaused = true; - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, LocaleManager.Instance[LocaleKeys.Paused]); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar, LocaleManager.Instance[LocaleKeys.Paused]); Logger.Info?.Print(LogClass.Emulation, "Emulation was paused"); } diff --git a/src/Ryujinx/Assets/Fonts/Mono/AUTHORS.txt b/src/Ryujinx/Assets/Fonts/Mono/AUTHORS.txt new file mode 100644 index 000000000..881494169 --- /dev/null +++ b/src/Ryujinx/Assets/Fonts/Mono/AUTHORS.txt @@ -0,0 +1,10 @@ +# This is the official list of project authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS.txt file. +# See the latter for an explanation. +# +# Names should be added to this file as: +# Name or Organization + +JetBrains <> +Philipp Nurullin +Konstantin Bulenkov diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Bold.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Bold.ttf new file mode 100644 index 000000000..f78f84fb4 Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Bold.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-BoldItalic.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-BoldItalic.ttf new file mode 100644 index 000000000..9fb8c8325 Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-BoldItalic.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Italic.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Italic.ttf new file mode 100644 index 000000000..4e9c3802d Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Italic.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Regular.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Regular.ttf new file mode 100644 index 000000000..70d2ec9e2 Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Regular.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/OFL.txt b/src/Ryujinx/Assets/Fonts/Mono/OFL.txt new file mode 100644 index 000000000..8bee4148c --- /dev/null +++ b/src/Ryujinx/Assets/Fonts/Mono/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml index 878b5e7f1..3d0c91840 100644 --- a/src/Ryujinx/Assets/Styles/Styles.xaml +++ b/src/Ryujinx/Assets/Styles/Styles.xaml @@ -402,7 +402,7 @@ 13 26 28 - 700 + 900 756 diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 3e3693cce..9117a553b 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -82,7 +82,7 @@ "es_ES": "Applet Editor Mii", "fr_FR": "Éditeur de Mii", "he_IL": "", - "it_IT": "", + "it_IT": "Applet Editor Mii", "ja_JP": "", "ko_KR": "Mii 편집 애플릿", "no_NO": "Mii-redigeringsapplet", @@ -92,9 +92,9 @@ "sv_SE": "Redigera Mii-applet", "th_TH": "", "tr_TR": "", - "uk_UA": "Аплет для редагування Mii", + "uk_UA": "Аплет редагування Mii", "zh_CN": "Mii 小程序", - "zh_TW": "" + "zh_TW": "Mii 編輯器小程式" } }, { @@ -107,7 +107,7 @@ "es_ES": "Abre el editor de Mii en modo autónomo", "fr_FR": "Ouvrir l'éditeur Mii en mode Standalone", "he_IL": "פתח את יישומון עורך ה- Mii במצב עצמאי", - "it_IT": "Apri l'applet Mii Editor in modalità Standalone", + "it_IT": "Apri l'applet Editor Mii in modalità Standalone", "ja_JP": "スタンドアロンモードで Mii エディタアプレットを開きます", "ko_KR": "독립 실행형 모드로 Mii 편집기 애플릿 열기", "no_NO": "Åpne Mii Redigerings program i eget vindu", @@ -332,7 +332,7 @@ "es_ES": "No se encontraron aplicaciones en el archivo seleccionado.", "fr_FR": "Aucun jeu trouvé dans le fichier sélectionné", "he_IL": "", - "it_IT": "Nessuna applicazione trovata nel file selezionato", + "it_IT": "Nessuna applicazione trovata nel file selezionato.", "ja_JP": "", "ko_KR": "선택한 파일에서 앱을 찾을 수 없습니다.", "no_NO": "Ingen apper ble funnet i valgt fil.", @@ -382,7 +382,7 @@ "es_ES": "Cargar DLC Desde Carpeta", "fr_FR": "Charger les DLC depuis le dossier des DLC", "he_IL": "", - "it_IT": "Carica DLC Da una Cartella", + "it_IT": "Carica DLC da una cartella", "ja_JP": "", "ko_KR": "폴더에서 DLC 불러오기", "no_NO": "Last inn DLC fra mappe", @@ -407,7 +407,7 @@ "es_ES": "Cargar Actualizaciones de Títulos Desde Carpeta", "fr_FR": "Charger les mises à jour depuis le dossier des mises à jour", "he_IL": "", - "it_IT": "Carica Aggiornamenti Da una Cartella", + "it_IT": "Carica aggiornamenti da una cartella", "ja_JP": "", "ko_KR": "폴더에서 타이틀 업데이트 불러오기", "no_NO": "Last inn titteloppdateringer fra mappe", @@ -757,7 +757,7 @@ "es_ES": "", "fr_FR": "Scanner un Amiibo (à partir d'un .bin)", "he_IL": "", - "it_IT": "", + "it_IT": "Scansiona un Amiibo (da file .bin)", "ja_JP": "", "ko_KR": "Amiibo 스캔(빈에서)", "no_NO": "Skann en Amiibo (fra bin fil)", @@ -767,38 +767,13 @@ "sv_SE": "Skanna en Amiibo (från bin-fil)", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Сканувати Amiibo (з теки Bin)", "zh_CN": "从bin文件扫描 Amiibo", - "zh_TW": "" + "zh_TW": "掃瞄 Amiibo (從 Bin 檔案)" } }, { - "ID": "MenuBarTools", - "Translations": { - "ar_SA": "_الأدوات", - "de_DE": "", - "el_GR": "_Εργαλεία", - "en_US": "_Tools", - "es_ES": "_Herramientas", - "fr_FR": "_Outils", - "he_IL": "_כלים", - "it_IT": "_Strumenti", - "ja_JP": "ツール(_T)", - "ko_KR": "도구(_T)", - "no_NO": "_Verktøy", - "pl_PL": "_Narzędzia", - "pt_BR": "_Ferramentas", - "ru_RU": "_Инструменты", - "sv_SE": "V_erktyg", - "th_TH": "_เครื่องมือ", - "tr_TR": "_Araçlar", - "uk_UA": "_Інструменти", - "zh_CN": "工具(_T)", - "zh_TW": "工具(_T)" - } - }, - { - "ID": "MenuBarToolsInstallFirmware", + "ID": "MenuBarActionsInstallFirmware", "Translations": { "ar_SA": "تثبيت البرنامج الثابت", "de_DE": "Firmware installieren", @@ -817,13 +792,13 @@ "sv_SE": "Installera firmware", "th_TH": "ติดตั้งเฟิร์มแวร์", "tr_TR": "Yazılım Yükle", - "uk_UA": "Установити прошивку", + "uk_UA": "Встановити прошивку (Firmware)", "zh_CN": "安装系统固件", "zh_TW": "安裝韌體" } }, { - "ID": "MenuBarFileToolsInstallFirmwareFromFile", + "ID": "MenuBarActionsInstallFirmwareFromFile", "Translations": { "ar_SA": "تثبيت برنامج ثابت من XCI أو ZIP", "de_DE": "Firmware von einer XCI- oder einer ZIP-Datei installieren", @@ -842,13 +817,13 @@ "sv_SE": "Installera en firmware från XCI eller ZIP", "th_TH": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP", "tr_TR": "XCI veya ZIP'ten Yazılım Yükle", - "uk_UA": "Установити прошивку з XCI або ZIP", + "uk_UA": "Встановити прошивку з XCI або ZIP", "zh_CN": "从 XCI 或 ZIP 文件中安装系统固件", "zh_TW": "從 XCI 或 ZIP 安裝韌體" } }, { - "ID": "MenuBarFileToolsInstallFirmwareFromDirectory", + "ID": "MenuBarActionsInstallFirmwareFromDirectory", "Translations": { "ar_SA": "تثبيت برنامج ثابت من مجلد", "de_DE": "Firmware aus einem Verzeichnis installieren", @@ -857,7 +832,7 @@ "es_ES": "Instalar firmware desde una carpeta", "fr_FR": "Installer un firmware depuis un dossier", "he_IL": "התקן קושחה מתוך תקייה", - "it_IT": "Installa un firmare da una cartella", + "it_IT": "Installa un firmware da una cartella", "ja_JP": "ディレクトリからファームウェアをインストール", "ko_KR": "디렉터리에서 펌웨어 설치", "no_NO": "Installer en fastvare fra en mappe", @@ -867,13 +842,13 @@ "sv_SE": "Installera en firmware från en katalog", "th_TH": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี", "tr_TR": "Bir Dizin Üzerinden Yazılım Yükle", - "uk_UA": "Установити прошивку з теки", + "uk_UA": "Встановити прошивку з теки", "zh_CN": "从文件夹中安装系统固件", "zh_TW": "從資料夾安裝韌體" } }, { - "ID": "MenuBarToolsInstallKeys", + "ID": "MenuBarActionsInstallKeys", "Translations": { "ar_SA": "", "de_DE": "", @@ -882,7 +857,7 @@ "es_ES": "", "fr_FR": "Installer des clés", "he_IL": "", - "it_IT": "Installa Chiavi", + "it_IT": "Installa chiavi", "ja_JP": "", "ko_KR": "설치 키", "no_NO": "Installere nøkler", @@ -892,13 +867,13 @@ "sv_SE": "Installera nycklar", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Встановити ключі", "zh_CN": "安装密匙", - "zh_TW": "" + "zh_TW": "安裝金鑰" } }, { - "ID": "MenuBarFileToolsInstallKeysFromFile", + "ID": "MenuBarFileActionsInstallKeysFromFile", "Translations": { "ar_SA": "", "de_DE": "", @@ -907,7 +882,7 @@ "es_ES": "Instalar keys de KEYS o ZIP", "fr_FR": "Installer des clés à partir de .KEYS or .ZIP", "he_IL": "", - "it_IT": "Installa Chiavi da file KEYS o ZIP", + "it_IT": "Installa chiavi da file KEYS o ZIP", "ja_JP": "", "ko_KR": "키나 ZIP에서 키 설치", "no_NO": "Installer nøkler fra KEYS eller ZIP", @@ -917,13 +892,13 @@ "sv_SE": "Installera nycklar från KEYS eller ZIP", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Встановити ключі з файлу .KEYS або .ZIP", "zh_CN": "从.KEYS文件或ZIP压缩包安装密匙", - "zh_TW": "" + "zh_TW": "從 .KEYS 或 .ZIP 安裝金鑰" } }, { - "ID": "MenuBarFileToolsInstallKeysFromFolder", + "ID": "MenuBarFileActionsInstallKeysFromFolder", "Translations": { "ar_SA": "", "de_DE": "", @@ -932,7 +907,7 @@ "es_ES": "Instalar keys de un directorio", "fr_FR": "Installer des clés à partir d'un dossier", "he_IL": "", - "it_IT": "Installa Chiavi da una Cartella", + "it_IT": "Installa chiavi da una cartella", "ja_JP": "", "ko_KR": "디렉터리에서 키 설치", "no_NO": "Installer nøkler fra en mappe", @@ -942,13 +917,13 @@ "sv_SE": "Installera nycklar från en katalog", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Встановити ключі з теки", "zh_CN": "从一个文件夹安装密匙", - "zh_TW": "" + "zh_TW": "從資料夾安裝金鑰" } }, { - "ID": "MenuBarToolsManageFileTypes", + "ID": "MenuBarActionsManageFileTypes", "Translations": { "ar_SA": "إدارة أنواع الملفات", "de_DE": "Dateitypen verwalten", @@ -973,7 +948,7 @@ } }, { - "ID": "MenuBarToolsInstallFileTypes", + "ID": "MenuBarActionsInstallFileTypes", "Translations": { "ar_SA": "تثبيت أنواع الملفات", "de_DE": "Dateitypen installieren", @@ -992,13 +967,13 @@ "sv_SE": "Installera filtyper", "th_TH": "ติดตั้งประเภทไฟล์", "tr_TR": "Dosya uzantılarını yükle", - "uk_UA": "Установити типи файлів", + "uk_UA": "Встановити типи файлів", "zh_CN": "关联文件扩展名", "zh_TW": "安裝檔案類型" } }, { - "ID": "MenuBarToolsUninstallFileTypes", + "ID": "MenuBarActionsUninstallFileTypes", "Translations": { "ar_SA": "إزالة أنواع الملفات", "de_DE": "Dateitypen deinstallieren", @@ -1023,7 +998,7 @@ } }, { - "ID": "MenuBarToolsXCITrimmer", + "ID": "MenuBarActionsXCITrimmer", "Translations": { "ar_SA": "", "de_DE": "", @@ -1032,7 +1007,7 @@ "es_ES": "Recortar archivos XCI", "fr_FR": "Réduire les fichiers XCI", "he_IL": "", - "it_IT": "", + "it_IT": "Riduci dimensioni dei file XCI", "ja_JP": "", "ko_KR": "XCI 파일 트리머", "no_NO": "Trim XCI-filer", @@ -1044,7 +1019,7 @@ "tr_TR": "", "uk_UA": "Обрізати XCI файли", "zh_CN": "XCI文件瘦身", - "zh_TW": "" + "zh_TW": "修剪 XCI 檔案" } }, { @@ -1082,7 +1057,7 @@ "es_ES": "Tamaño Ventana", "fr_FR": "Taille de la fenêtre", "he_IL": "", - "it_IT": "Dimensione Finestra", + "it_IT": "Dimensione finestra", "ja_JP": "", "ko_KR": "윈도 창", "no_NO": "Vindu størrelse", @@ -1257,7 +1232,7 @@ "es_ES": "", "fr_FR": "", "he_IL": "", - "it_IT": "", + "it_IT": "Guide e domande frequenti", "ja_JP": "", "ko_KR": "자주 묻는 질문(FAQ) 및 안내", "no_NO": "Vanlige spørsmål og veiledninger", @@ -1267,9 +1242,9 @@ "sv_SE": "Frågor, svar och guider", "th_TH": "", "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "uk_UA": "FAQ та посібники", + "zh_CN": "问答与指南", + "zh_TW": "常見問題 (FAQ) 和指南" } }, { @@ -1282,7 +1257,7 @@ "es_ES": "", "fr_FR": "Page de FAQ et de dépannage", "he_IL": "", - "it_IT": "", + "it_IT": "Domande frequenti e risoluzione dei problemi", "ja_JP": "", "ko_KR": "자주 묻는 질문(FAQ) 및 문제해결 페이지", "no_NO": "FAQ- og feilsøkingsside", @@ -1292,9 +1267,9 @@ "sv_SE": "Frågor, svar och felsökningssida", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "FAQ та усунення несправностей (eng)", "zh_CN": "常见问题和问题排除页面", - "zh_TW": "" + "zh_TW": "常見問題 (FAQ) 和疑難排解頁面" } }, { @@ -1307,7 +1282,7 @@ "es_ES": "", "fr_FR": "Ouvre la page de FAQ et de dépannage sur le wiki officiel de Ryujinx", "he_IL": "", - "it_IT": "", + "it_IT": "Apre la pagina della wiki ufficiale di Ryujinx relativa alle domande frequenti e alla risoluzione dei problemi", "ja_JP": "", "ko_KR": "공식 Ryujinx 위키에서 자주 묻는 질문(FAQ) 및 문제 해결 페이지 열기", "no_NO": "Åpner FAQ- og feilsøkingssiden på den offisielle Ryujinx-wikien", @@ -1317,9 +1292,9 @@ "sv_SE": "Öppnar Frågor, svar och felsökningssidan på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Відкриває сторінку з Посібником по усуненню помилок та несправностей на офіційній вікі-сторінці Ryujinx (англійською)", "zh_CN": "打开Ryujinx官方wiki的常见问题和问题排除页面", - "zh_TW": "" + "zh_TW": "開啟官方 Ryujinx Wiki 常見問題 (FAQ) 和疑難排解頁面" } }, { @@ -1332,7 +1307,7 @@ "es_ES": "", "fr_FR": "Guide d'Installation et de Configuration", "he_IL": "", - "it_IT": "", + "it_IT": "Guida all'installazione e alla configurazione", "ja_JP": "", "ko_KR": "설치 및 구성 안내", "no_NO": "Oppsett- og konfigurasjonsveiledning", @@ -1342,9 +1317,9 @@ "sv_SE": "Konfigurationsguide", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Посібник зі встановлення та налаштування (eng)", "zh_CN": "安装与配置指南", - "zh_TW": "" + "zh_TW": "設定和配置指南" } }, { @@ -1357,7 +1332,7 @@ "es_ES": "", "fr_FR": "Ouvre le guide d'installation et de configuration sur le wiki officiel de Ryujinx", "he_IL": "", - "it_IT": "", + "it_IT": "Apre la guida all'installazione e alla configurazione presente nella wiki ufficiale di Ryujinx", "ja_JP": "", "ko_KR": "공식 Ryujinx 위키에서 설정 및 구성 안내 열기", "no_NO": "Åpner oppsett- og konfigurasjonsveiledningen på den offisielle Ryujinx-wikien", @@ -1367,9 +1342,9 @@ "sv_SE": "Öppnar konfigurationsguiden på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Відкриває посібник з Налаштування та конфігурації на офіційній вікі-сторінці Ryujinx (англійською)", "zh_CN": "打开Ryujinx官方wiki的安装与配置指南", - "zh_TW": "" + "zh_TW": "開啟官方 Ryujinx Wiki 設定和配置指南" } }, { @@ -1382,7 +1357,7 @@ "es_ES": "", "fr_FR": "Guide Multijoueur (LDN/LAN)", "he_IL": "", - "it_IT": "", + "it_IT": "Guida alla modalità multigiocatore (LDN/LAN)", "ja_JP": "", "ko_KR": "멀티플레이어(LDN/LAN) 안내", "no_NO": "Flerspillerveiledning (LDN/LAN)", @@ -1392,9 +1367,9 @@ "sv_SE": "Flerspelarguide (LDN/LAN)", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Посібник з мультиплеєру (LDN/LAN) (eng)", "zh_CN": "多人游戏(LDN/LAN)指南", - "zh_TW": "" + "zh_TW": "多人遊戲 (LDN/LAN) 指南" } }, { @@ -1407,7 +1382,7 @@ "es_ES": "", "fr_FR": "Ouvre le guide de Multijoueur sur le wiki officiel de Ryujinx", "he_IL": "", - "it_IT": "", + "it_IT": "Apre la guida alla modalità multigiocatore presente nella wiki ufficiale di Ryujinx", "ja_JP": "", "ko_KR": "공식 Ryujinx 위키에서 멀티플레이어 안내 열기", "no_NO": "Åpner flerspillerveiledningen på den offisielle Ryujinx-wikien", @@ -1417,9 +1392,9 @@ "sv_SE": "Öppnar flerspelarguiden på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Відкриває посібник з налаштування Мультиплеєру на офіційній вікі-сторінці Ryujinx (англійською)", "zh_CN": "打开Ryujinx官方wiki的多人游戏指南", - "zh_TW": "" + "zh_TW": "開啟官方 Ryujinx Wiki 多人遊戲 (LDN/LAN) 指南" } }, { @@ -1742,7 +1717,7 @@ "sv_SE": "Öppna användarkatalog för sparningar", "th_TH": "เปิดไดเร็กทอรี่บันทึกของผู้ใช้", "tr_TR": "Kullanıcı Kayıt Dosyası Dizinini Aç", - "uk_UA": "Відкрити теку збереження користувача", + "uk_UA": "Відкрити теку збережень користувача", "zh_CN": "打开用户存档目录", "zh_TW": "開啟使用者存檔資料夾" } @@ -1767,7 +1742,7 @@ "sv_SE": "Öppnar katalogen som innehåller applikationens användarsparade spel", "th_TH": "เปิดไดเร็กทอรี่ซึ่งมีการบันทึกข้อมูลของผู้ใช้แอปพลิเคชัน", "tr_TR": "Uygulamanın Kullanıcı Kaydı'nın bulunduğu dizini açar", - "uk_UA": "Відкриває каталог, який містить збереження користувача програми", + "uk_UA": "Відкриває теку, яка містить збереження користувача", "zh_CN": "打开储存游戏用户存档的目录", "zh_TW": "開啟此應用程式的使用者存檔資料夾" } @@ -1792,7 +1767,7 @@ "sv_SE": "Öppna enhetens katalog för sparade spel", "th_TH": "เปิดไดเร็กทอรี่บันทึกของอุปกรณ์", "tr_TR": "Kullanıcı Cihaz Dizinini Aç", - "uk_UA": "Відкрити каталог пристроїв користувача", + "uk_UA": "Відкрити теку пристроїв користувача", "zh_CN": "打开系统数据目录", "zh_TW": "開啟裝置存檔資料夾" } @@ -1817,7 +1792,7 @@ "sv_SE": "Öppnar katalogen som innehåller applikationens sparade spel på enheten", "th_TH": "เปิดไดเรกทอรี่ซึ่งมีบันทึกข้อมูลของอุปกรณ์ในแอปพลิเคชัน", "tr_TR": "Uygulamanın Kullanıcı Cihaz Kaydı'nın bulunduğu dizini açar", - "uk_UA": "Відкриває каталог, який містить збереження пристрою програми", + "uk_UA": "Відкриває теку, яка містить збережені пристрої", "zh_CN": "打开储存游戏系统数据的目录", "zh_TW": "開啟此應用程式的裝置存檔資料夾" } @@ -1842,7 +1817,7 @@ "sv_SE": "Öppna katalog för BCAT-sparningar", "th_TH": "เปิดไดเรกทอรี่บันทึกของ BCAT", "tr_TR": "Kullanıcı BCAT Dizinini Aç", - "uk_UA": "Відкрити каталог користувача BCAT", + "uk_UA": "Відкрити теку збережень BCAT", "zh_CN": "打开 BCAT 数据目录", "zh_TW": "開啟 BCAT 存檔資料夾" } @@ -1867,7 +1842,7 @@ "sv_SE": "Öppnar katalogen som innehåller applikationens BCAT-sparningar", "th_TH": "เปิดไดเรกทอรี่ซึ่งมีการบันทึกข้อมูลของ BCAT ในแอปพลิเคชัน", "tr_TR": "Uygulamanın Kullanıcı BCAT Kaydı'nın bulunduğu dizini açar", - "uk_UA": "Відкриває каталог, який містить BCAT-збереження програми", + "uk_UA": "Відкриває теку, яка містить BCAT-збереження програми", "zh_CN": "打开储存游戏 BCAT 数据的目录", "zh_TW": "開啟此應用程式的 BCAT 存檔資料夾" } @@ -1892,7 +1867,7 @@ "sv_SE": "Hantera speluppdateringar", "th_TH": "จัดการเวอร์ชั่นอัปเดต", "tr_TR": "Oyun Güncellemelerini Yönet", - "uk_UA": "Керування оновленнями заголовків", + "uk_UA": "Керування оновленнями", "zh_CN": "管理游戏更新", "zh_TW": "管理遊戲更新" } @@ -1917,7 +1892,7 @@ "sv_SE": "Öppnar spelets hanteringsfönster för uppdateringar", "th_TH": "เปิดหน้าต่างการจัดการเวอร์ชั่นการอัพเดต", "tr_TR": "Oyun Güncelleme Yönetim Penceresini Açar", - "uk_UA": "Відкриває вікно керування оновленням заголовка", + "uk_UA": "Відкриває меню керування оновленнями до гри (застосунку)", "zh_CN": "打开游戏更新管理窗口", "zh_TW": "開啟遊戲更新管理視窗" } @@ -1967,7 +1942,7 @@ "sv_SE": "Öppnar DLC-hanteringsfönstret", "th_TH": "เปิดหน้าต่างจัดการ DLC", "tr_TR": "DLC yönetim penceresini açar", - "uk_UA": "Відкриває вікно керування DLC", + "uk_UA": "Відкриває меню керування DLC", "zh_CN": "打开 DLC 管理窗口", "zh_TW": "開啟 DLC 管理視窗" } @@ -2017,7 +1992,7 @@ "sv_SE": "Kölägg PPTC Rebuild", "th_TH": "เพิ่มคิวการสร้าง PPTC ใหม่", "tr_TR": "PPTC Yeniden Yapılandırmasını Başlat", - "uk_UA": "Очистити кеш PPTC", + "uk_UA": "Додати до черги перекомпіляцію PPTC", "zh_CN": "清除 PPTC 缓存文件", "zh_TW": "佇列 PPTC 重建" } @@ -2042,7 +2017,7 @@ "sv_SE": "Gör så att PPTC bygger om vid uppstart när nästa spel startas", "th_TH": "ให้ PPTC สร้างใหม่ในเวลาบูตเมื่อเปิดเกมครั้งถัดไป", "tr_TR": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır", - "uk_UA": "Видаляє кеш PPTC програми", + "uk_UA": "Видаляє кеш PPTC застосунку (гри)", "zh_CN": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件", "zh_TW": "下一次啟動遊戲時,觸發 PPTC 進行重建" } @@ -2092,7 +2067,7 @@ "sv_SE": "Tar bort applikationens shader cache", "th_TH": "ลบแคช แสงเงา ของแอปพลิเคชัน", "tr_TR": "Uygulamanın shader önbelleğini temizler", - "uk_UA": "Видаляє кеш шейдерів програми", + "uk_UA": "Видаляє кеш шейдерів застосунку (гри)", "zh_CN": "删除游戏的着色器缓存文件,下次启动游戏时重新生成着色器缓存文件", "zh_TW": "刪除應用程式的著色器快取" } @@ -2117,7 +2092,7 @@ "sv_SE": "Öppna PPTC-katalog", "th_TH": "เปิดไดเรกทอรี่ PPTC", "tr_TR": "PPTC Dizinini Aç", - "uk_UA": "Відкрити каталог PPTC", + "uk_UA": "Відкрити теку PPTC", "zh_CN": "打开 PPTC 缓存目录", "zh_TW": "開啟 PPTC 資料夾" } @@ -2142,7 +2117,7 @@ "sv_SE": "Öppnar katalogen som innehåller applikationens PPTC-cache", "th_TH": "เปิดไดเร็กทอรี่ของ แคช PPTC ในแอปพลิเคชัน", "tr_TR": "Uygulamanın PPTC Önbelleğinin bulunduğu dizini açar", - "uk_UA": "Відкриває каталог, який містить кеш PPTC програми", + "uk_UA": "Відкриває теку, яка містить PPTC кеш застосунку (гри)", "zh_CN": "打开储存游戏 PPTC 缓存文件的目录", "zh_TW": "開啟此應用程式的 PPTC 快取資料夾" } @@ -2167,7 +2142,7 @@ "sv_SE": "Öppna katalog för shader cache", "th_TH": "เปิดไดเรกทอรี่ แคช แสงเงา", "tr_TR": "Shader Önbelleği Dizinini Aç", - "uk_UA": "Відкрити каталог кешу шейдерів", + "uk_UA": "Відкрити теку з кешем шейдерів", "zh_CN": "打开着色器缓存目录", "zh_TW": "開啟著色器快取資料夾" } @@ -2192,7 +2167,7 @@ "sv_SE": "Öppnar katalogen som innehåller applikationens shader cache", "th_TH": "เปิดไดเรกทอรี่ของ แคช แสงเงา ในแอปพลิเคชัน", "tr_TR": "Uygulamanın shader önbelleğinin bulunduğu dizini açar", - "uk_UA": "Відкриває каталог, який містить кеш шейдерів програми", + "uk_UA": "Відкриває теку, яка містить кеш шейдерів застосунку (гри)", "zh_CN": "打开储存游戏着色器缓存文件的目录", "zh_TW": "開啟此應用程式的著色器快取資料夾" } @@ -2257,7 +2232,7 @@ "es_ES": "Extraer la sección ExeFS de la configuración actual de la aplicación (incluyendo actualizaciones)", "fr_FR": "Extrait la section ExeFS du jeu (mise à jour incluse)", "he_IL": "חלץ את קטע ה-ExeFS מתצורת היישום הנוכחית (כולל עדכונים)", - "it_IT": "Estrae la sezione ExeFS dall'attuale configurazione dell'applicazione (includendo aggiornamenti)", + "it_IT": "Estrae la sezione ExeFS dall'attuale configurazione dell'applicazione (inclusi gli aggiornamenti)", "ja_JP": "現在のアプリケーション設定(アップデート含む)から ExeFS セクションを展開します", "ko_KR": "앱의 현재 구성에서 ExeFS 추출(업데이트 포함)", "no_NO": "Pakk ut ExeFS seksjonen fra Programmets gjeldende konfigurasjon (inkludert oppdateringer)", @@ -2307,7 +2282,7 @@ "es_ES": "Extraer la sección RomFS de la configuración actual de la aplicación (incluyendo actualizaciones)", "fr_FR": "Extrait la section RomFS du jeu (mise à jour incluse)", "he_IL": "חלץ את קטע ה-RomFS מתצורת היישום הנוכחית (כולל עדכונים)", - "it_IT": "Estrae la sezione RomFS dall'attuale configurazione dell'applicazione (includendo aggiornamenti)", + "it_IT": "Estrae la sezione RomFS dall'attuale configurazione dell'applicazione (inclusi gli aggiornamenti)", "ja_JP": "現在のアプリケーション設定(アップデート含む)から RomFS セクションを展開します", "ko_KR": "앱의 현재 구성에서 RomFS 추출(업데이트 포함)", "no_NO": "Pakk ut RomFS seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)", @@ -2317,11 +2292,61 @@ "sv_SE": "Extrahera RomFS-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", "th_TH": "แยกส่วน RomFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัพเดต)", "tr_TR": "Uygulamanın geçerli yapılandırmasından RomFS kısmını ayıkla (Güncellemeler dahil)", - "uk_UA": "Видобуває розділ RomFS із поточної конфігурації програми (включаючи оновлення)", + "uk_UA": "Видобуває розділ RomFS із поточної конфігурації застосунку (включно з оновленнями)", "zh_CN": "从游戏的当前状态中提取 RomFS 分区 (包括更新)", "zh_TW": "從應用程式的目前配置中提取 RomFS 分區 (包含更新)" } }, + { + "ID": "GameListContextMenuExtractDataAocRomFS", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "DLC RomFS", + "es_ES": "", + "fr_FR": "RomFS de DLC", + "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": "" + } + }, + { + "ID": "GameListContextMenuExtractDataAocRomFSToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Extract the RomFS from a selected DLC file", + "es_ES": "", + "fr_FR": "Extraire les RomFS d'un fichier DLC choisi", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Pakk ut RomFS filene fra valgt DLC fil", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "GameListContextMenuExtractDataLogo", "Translations": { @@ -2344,7 +2369,7 @@ "tr_TR": "Simge", "uk_UA": "Логотип", "zh_CN": "图标", - "zh_TW": "" + "zh_TW": "圖示" } }, { @@ -2357,7 +2382,7 @@ "es_ES": "Extraer la sección Logo de la configuración actual de la aplicación (incluyendo actualizaciones)", "fr_FR": "Extrait la section Logo du jeu (mise à jour incluse)", "he_IL": "חלץ את קטע ה-Logo מתצורת היישום הנוכחית (כולל עדכונים)", - "it_IT": "Estrae la sezione Logo dall'attuale configurazione dell'applicazione (includendo aggiornamenti)", + "it_IT": "Estrae la sezione Logo dall'attuale configurazione dell'applicazione (inclusi gli aggiornamenti)", "ja_JP": "現在のアプリケーション設定(アップデート含む)からロゴセクションを展開します", "ko_KR": "앱의 현재 구성에서 로고 섹션 추출 (업데이트 포함)", "no_NO": "Pakk ut Logo-seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)", @@ -2417,7 +2442,7 @@ "sv_SE": "Skapa en skrivbordsgenväg som startar vald applikation", "th_TH": "สร้างทางลัดบนเดสก์ท็อปสำหรับใช้แอปพลิเคชันที่เลือก", "tr_TR": "Seçilmiş uygulamayı çalıştıracak bir masaüstü kısayolu oluştur", - "uk_UA": "Створити ярлик на робочому столі, який запускає вибраний застосунок", + "uk_UA": "Створити ярлик на робочому столі, який запускатиме вибраний застосунок (гру)", "zh_CN": "创建一个直接启动此游戏的桌面快捷方式", "zh_TW": "建立桌面捷徑,啟動選取的應用程式" } @@ -2442,7 +2467,7 @@ "sv_SE": "Skapa en genväg i macOS-programmapp som startar vald applikation", "th_TH": "สร้างทางลัดในโฟลเดอร์ Applications ของ macOS สำหรับใช้แอปพลิเคชันที่เลือก", "tr_TR": "", - "uk_UA": "Створити ярлик у каталозі macOS програм, що запускає обраний Додаток", + "uk_UA": "Створити ярлик у каталозі програм macOS, що запускатиме обраний застосунок (гру)", "zh_CN": "在 macOS 的应用程序目录中创建一个直接启动此游戏的快捷方式", "zh_TW": "在 macOS 的應用程式資料夾中建立捷徑,啟動選取的應用程式" } @@ -2492,7 +2517,7 @@ "sv_SE": "Öppnar katalogen som innehåller applikationens Mods", "th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน", "tr_TR": "", - "uk_UA": "Відкриває каталог, який містить модифікації Додатків", + "uk_UA": "Відкриває теку, яка містить модифікації застосунків (ігор)", "zh_CN": "打开存放游戏 MOD 的目录", "zh_TW": "開啟此應用程式模組的資料夾" } @@ -2517,7 +2542,7 @@ "sv_SE": "Öppna Atmosphere Mods-katalogen", "th_TH": "เปิดไดเร็กทอรี่ Mods Atmosphere", "tr_TR": "", - "uk_UA": "Відкрити каталог модифікацій Atmosphere", + "uk_UA": "Відкрити теку модифікацій Atmosphere", "zh_CN": "打开大气层系统 MOD 目录", "zh_TW": "開啟 Atmosphere 模組資料夾" } @@ -2542,7 +2567,7 @@ "sv_SE": "Öppnar den alternativa Atmosphere-katalogen på SD-kort som innehåller applikationens Mods. Användbart för Mods som är paketerade för riktig hårdvara.", "th_TH": "เปิดไดเร็กทอรี่ Atmosphere ของการ์ด SD สำรองซึ่งมี Mods ของแอปพลิเคชัน ซึ่งมีประโยชน์สำหรับ Mods ที่บรรจุมากับฮาร์ดแวร์จริง", "tr_TR": "", - "uk_UA": "Відкриває альтернативний каталог SD-карти Atmosphere, що містить модифікації Додатків. Корисно для модифікацій, зроблених для реального обладнання.", + "uk_UA": "Відкриває альтернативну теку SD-карти Atmosphere, що містить модифікації до застосунків або ігор. Корисно для модифікацій, зроблених для реального обладнання.", "zh_CN": "打开存放适用于大气层系统的游戏 MOD 的目录,对于为真实硬件打包的 MOD 非常有用", "zh_TW": "開啟此應用程式模組的另一個 SD 卡 Atmosphere 資料夾。適用於為真實硬體封裝的模組。" } @@ -2557,7 +2582,7 @@ "es_ES": "Verificar y recortar archivo XCI", "fr_FR": "Vérifier et réduire les fichiers XCI", "he_IL": "", - "it_IT": "Controlla e Trimma i file XCI", + "it_IT": "Controlla e riduci la dimensione del file XCI", "ja_JP": "", "ko_KR": "XCI 파일 확인 및 트림", "no_NO": "Kontroller og trim XCI-filen", @@ -2567,9 +2592,9 @@ "sv_SE": "Kontrollera och optimera XCI-fil", "th_TH": "", "tr_TR": "", - "uk_UA": "Перевірка та Нарізка XCI Файлів", + "uk_UA": "Перевірка та нарізка XCI Файлу", "zh_CN": "检查并瘦身XCI文件", - "zh_TW": "" + "zh_TW": "檢查及修剪 XCI 檔案" } }, { @@ -2582,7 +2607,7 @@ "es_ES": "Verificar y recortar archivo XCI para ahorrar espacio en disco", "fr_FR": "Vérifier et réduire les fichiers XCI pour économiser de l'espace", "he_IL": "", - "it_IT": "Controlla e Trimma i file XCI da Salvare Sullo Spazio del Disco", + "it_IT": "Controlla e riduci la dimensione del file XCI per risparmiare spazio su disco", "ja_JP": "", "ko_KR": "디스크 공간을 절약하기 위해 XCI 파일 확인 및 트림", "no_NO": "Kontroller og trimm XCI-filen for å spare diskplass", @@ -2592,9 +2617,9 @@ "sv_SE": "Kontrollera och optimera XCI-fil för att spara diskutrymme", "th_TH": "", "tr_TR": "", - "uk_UA": "Перевірка та Нарізка XCI Файлів для збереження місця на диску", + "uk_UA": "Перевірити та обрізати XCI Файл задля збереження місця на диску", "zh_CN": "检查并瘦身XCI文件以节约磁盘空间", - "zh_TW": "" + "zh_TW": "檢查及修剪 XCI 檔案以節省儲存空間" } }, { @@ -2607,7 +2632,7 @@ "es_ES": "{0}/{1} juegos cargados", "fr_FR": "{0}/{1} Jeux chargés", "he_IL": "{1}/{0} משחקים נטענו", - "it_IT": "{0}/{1} Giochi Caricati", + "it_IT": "{0}/{1} giochi caricati", "ja_JP": "{0}/{1} ゲーム", "ko_KR": "{0}/{1}개의 게임 불러옴", "no_NO": "{0}/{1} Spill Lastet", @@ -2632,7 +2657,7 @@ "es_ES": "", "fr_FR": "Version du Firmware: {0}", "he_IL": "", - "it_IT": "", + "it_IT": "Versione firmware: {0}", "ja_JP": "", "ko_KR": "펌웨어 버전 : {0}", "no_NO": "Fastvareversjon: {0}", @@ -2642,9 +2667,9 @@ "sv_SE": "Firmware-version: {0}", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Версія прошивки: {0}", "zh_CN": "系统固件版本:{0}", - "zh_TW": "" + "zh_TW": "系統韌體版本: {0}" } }, { @@ -2657,7 +2682,7 @@ "es_ES": "Recortando el siguiente archivo XCI: '{0}'", "fr_FR": "Réduction du fichier XCI '{0}'", "he_IL": "", - "it_IT": "Trimmando i file XCI '{0}'", + "it_IT": "Riduzione della dimensione del file XCI '{0}'", "ja_JP": "", "ko_KR": "XCI 파일 '{0}' 트리밍", "no_NO": "Trimming av XCI-filen '{0}'", @@ -2667,9 +2692,9 @@ "sv_SE": "Optimerar XCI-filen '{0}'", "th_TH": "", "tr_TR": "", - "uk_UA": "Обрізано XCI Файлів '{0}'", + "uk_UA": "Обрізається XCI Файлів '{0}'", "zh_CN": "XCI文件瘦身中'{0}'", - "zh_TW": "" + "zh_TW": "正在修剪 XCI 檔案 '{0}'" } }, { @@ -2717,7 +2742,7 @@ "sv_SE": "Vill du öka värdet för vm.max_map_count till {0}", "th_TH": "คุณต้องเพิ่มค่า vm.max_map_count ไปยัง {0}", "tr_TR": "vm.max_map_count değerini {0} sayısına yükseltmek ister misiniz", - "uk_UA": "Бажаєте збільшити значення vm.max_map_count на {0}", + "uk_UA": "Бажаєте збільшити значення vm.max_map_count до {0}", "zh_CN": "你想要将操作系统 vm.max_map_count 的值增加到 {0} 吗", "zh_TW": "您是否要將 vm.max_map_count 的數值增至 {0}?" } @@ -2742,7 +2767,7 @@ "sv_SE": "Vissa spel kan försöka att skapa fler minnesmappningar än vad som tillåts. Ryujinx kommer att krascha så snart som denna gräns överstigs.", "th_TH": "บางเกมอาจพยายามใช้งานหน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้", "tr_TR": "Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.", - "uk_UA": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.", + "uk_UA": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж це дозволено зараз. Ryujinx закриється (крашнеться), щойно цей ліміт буде перевищено.", "zh_CN": "有些游戏可能会尝试创建超过当前系统允许的内存映射最大数量,若超过当前最大数量,Ryujinx 模拟器将会闪退。", "zh_TW": "某些遊戲可能會嘗試建立超過目前允許的記憶體映射。一旦超過此限制,Ryujinx 就會崩潰。" } @@ -2792,7 +2817,7 @@ "sv_SE": "Ja, permanent", "th_TH": "ใช่, อย่างถาวร", "tr_TR": "Evet, kalıcı olarak", - "uk_UA": "Так, назавжди", + "uk_UA": "Так, постійно", "zh_CN": "确定,永久保存", "zh_TW": "是的,永久設定" } @@ -2817,7 +2842,7 @@ "sv_SE": "Maximal mängd minnesmappningar är lägre än rekommenderat.", "th_TH": "จำนวนสูงสุดของการจัดการหน่วยความจำ ต่ำกว่าที่แนะนำ", "tr_TR": "İzin verilen maksimum bellek haritası değeri tavsiye edildiğinden daha düşük. ", - "uk_UA": "Максимальна кількість відображення памʼяті менша, ніж рекомендовано.", + "uk_UA": "Максимальний обсяг виділеної пам'яті менший за рекомендований.", "zh_CN": "内存映射的最大数量低于推荐值。", "zh_TW": "記憶體映射的最大值低於建議值。" } @@ -2842,7 +2867,7 @@ "sv_SE": "Det aktuella värdet för vm.max_map_count ({0}) är lägre än {1}. Vissa spel kan försöka att skapa fler minnesmappningar än vad som tillåts. Ryujinx kommer att krascha så snart som denna gräns överstigs.\n\nDu kanske vill manuellt öka gränsen eller installera pkexec, vilket tillåter att Ryujinx hjälper till med det.", "th_TH": "ค่าปัจจุบันของ vm.max_map_count ({0}) มีค่าต่ำกว่า {1} บางเกมอาจพยายามใช้หน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้\n\nคุณอาจต้องการตั้งค่าเพิ่มขีดจำกัดด้วยตนเองหรือติดตั้ง pkexec ซึ่งอนุญาตให้ Ryujinx ช่วยเหลือคุณได้", "tr_TR": "Şu anki vm.max_map_count değeri {0}, bu {1} değerinden daha az. Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.\n\nManuel olarak bu limiti arttırmayı deneyebilir ya da pkexec'i yükleyebilirsiniz, bu da Ryujinx'in yardımcı olmasına izin verir.", - "uk_UA": "Поточне значення vm.max_map_count ({0}) менше за {1}. Деякі ігри можуть спробувати створити більше відображень пам’яті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.\n\nВи можете збільшити ліміт вручну або встановити pkexec, який дозволяє Ryujinx допомогти з цим.", + "uk_UA": "Поточне значення vm.max_map_count ({0}) менше за {1}. Деякі ігри можуть спробувати створити більше відображень пам’яті, ніж дозволено наразі. Ryujinx закриється (крашнеться), щойно цей ліміт буде перевищено.\n\nВи можете збільшити ліміт власноруч або встановити pkexec, який допоможе Ryujinx впоратися з перевищенням ліміту.", "zh_CN": "vm.max_map_count ({0}) 的当前值小于 {1}。 有些游戏可能会尝试创建超过当前系统允许的内存映射最大数量,若超过当前最大数量,Ryujinx 模拟器将会闪退。\n\n你可以手动增加内存映射最大数量,或者安装 pkexec,它可以辅助 Ryujinx 完成内存映射最大数量的修改操作。", "zh_TW": "目前 vm.max_map_count ({0}) 的數值小於 {1}。某些遊戲可能會嘗試建立比目前允許值更多的記憶體映射。一旦超過此限制,Ryujinx 就會崩潰。\n\n您可能需要手動提高上限,或者安裝 pkexec,讓 Ryujinx 協助提高上限。" } @@ -3007,7 +3032,7 @@ "es_ES": "Recordar Tamaño/Posición de la Ventana", "fr_FR": "Mémoriser la taille/position de la fenêtre", "he_IL": "", - "it_IT": "Ricorda Dimensione/Posizione Finestra", + "it_IT": "Ricorda la dimensione e la posizione della finestra", "ja_JP": "", "ko_KR": "창 크기/위치 기억", "no_NO": "Husk vinduets størrelse/posisjon", @@ -3182,7 +3207,7 @@ "es_ES": "Carpetas de DLC/Actualizaciones para Carga Automática", "fr_FR": "Dossiers des mises à jour/DLC", "he_IL": "", - "it_IT": "Directory di Caricamento Automatico per DLC/Aggiornamenti", + "it_IT": "Cartelle di caricamento automatico di DLC/aggiornamenti", "ja_JP": "", "ko_KR": "DLC/업데이트 디렉터리 자동 불러오기", "no_NO": "Autoload DLC/Updates-mapper", @@ -3192,7 +3217,7 @@ "sv_SE": "Läs automatisk in DLC/speluppdateringar", "th_TH": "โหลดไดเรกทอรี DLC/ไฟล์อัปเดต อัตโนมัติ", "tr_TR": "", - "uk_UA": "Автозавантаження каталогів DLC/Оновлень", + "uk_UA": "Автозавантаження теки DLC/Оновлень", "zh_CN": "自动加载DLC/游戏更新目录", "zh_TW": "自動載入 DLC/遊戲更新資料夾" } @@ -3207,7 +3232,7 @@ "es_ES": "DLC y Actualizaciones que hacen referencia a archivos ausentes serán desactivado automáticamente", "fr_FR": "Les DLC et les mises à jour faisant référence aux fichiers manquants seront automatiquement déchargés.", "he_IL": "", - "it_IT": "Aggiornamenti e DLC che collegano a file mancanti verranno disabilitati automaticamente", + "it_IT": "Aggiornamenti e DLC che fanno riferimento a file mancanti verranno disabilitati automaticamente", "ja_JP": "", "ko_KR": "누락된 파일을 참조하는 DLC 및 업데이트가 자동으로 언로드", "no_NO": "DLC og oppdateringer som henviser til manglende filer, vil bli lastet ned automatisk", @@ -3972,6 +3997,56 @@ "zh_TW": "正體中文 (建議)" } }, + { + "ID": "SettingsTabSystemSystemLanguageSwedish", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Swedish", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Svenska", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageNorwegian", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Norwegian", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Norsk", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Norska", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "SettingsTabSystemSystemTimeZone", "Translations": { @@ -4032,7 +4107,7 @@ "es_ES": "", "fr_FR": "Resynchronier la Date à celle du PC", "he_IL": "", - "it_IT": "", + "it_IT": "Sincronizza data e ora con il PC", "ja_JP": "", "ko_KR": "PC 날짜와 시간에 동기화", "no_NO": "Resynkroniser til PC-dato og -klokkeslett", @@ -4042,9 +4117,9 @@ "sv_SE": "Återsynka till datorns datum och tid", "th_TH": "", "tr_TR": "", - "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "uk_UA": "Синхронізувати з датою та часом ПК", + "zh_CN": "与 PC 日期和时间重新同步", + "zh_TW": "重新同步至 PC 的日期和時間" } }, { @@ -4082,7 +4157,7 @@ "es_ES": "Cache PPTC de bajo consumo", "fr_FR": "PPTC à faible puissance", "he_IL": "Low-power PPTC", - "it_IT": "Low-power PPTC", + "it_IT": "Caricamento PPTC a basso consumo energetico", "ja_JP": "Low-power PPTC", "ko_KR": "저전력 PPTC 캐시", "no_NO": "PPTC med lavt strømforbruk", @@ -4119,7 +4194,7 @@ "tr_TR": "FS Bütünlük Kontrolleri", "uk_UA": "Перевірка цілісності FS", "zh_CN": "启用文件系统完整性检查", - "zh_TW": "檔案系統完整性檢查" + "zh_TW": "啟用檔案系統完整性檢查" } }, { @@ -4167,7 +4242,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "Yapay", - "uk_UA": "", + "uk_UA": "Вимкнено", "zh_CN": "无", "zh_TW": "虛設 (Dummy)" } @@ -4307,7 +4382,7 @@ "es_ES": "Tamaño DRAM:", "fr_FR": "Taille de la DRAM :", "he_IL": "השתמש בפריסת זיכרון חלופית (נועד למפתחים)", - "it_IT": "Usa layout di memoria alternativo (per sviluppatori)", + "it_IT": "Dimensione memoria DRAM:", "ja_JP": "DRAMサイズ:", "ko_KR": "DRAM 크기 :", "no_NO": "DRAM Mengde", @@ -4582,7 +4657,7 @@ "es_ES": "Automático", "fr_FR": "", "he_IL": "אוטומטי", - "it_IT": "", + "it_IT": "Automatico", "ja_JP": "自動", "ko_KR": "자동", "no_NO": "Automatisk", @@ -5144,7 +5219,7 @@ "tr_TR": "Logları Dosyaya Kaydetmeyi Etkinleştir", "uk_UA": "Увімкнути налагодження у файл", "zh_CN": "将日志写入文件", - "zh_TW": "啟用日誌到檔案" + "zh_TW": "啟用日誌寫入到檔案" } }, { @@ -5382,7 +5457,7 @@ "es_ES": "ADVERTENCIA: Reducirá el rendimiento", "fr_FR": "ATTENTION : Réduira les performances", "he_IL": "אזהרה: יפחית ביצועים", - "it_IT": "ATTENZIONE: ridurrà le prestazioni", + "it_IT": "ATTENZIONE: ridurranno le prestazioni", "ja_JP": "警告: パフォーマンスを低下させます", "ko_KR": "경고 : 성능이 감소합니다.", "no_NO": "Advarsel: Vil redusere ytelsen", @@ -5392,7 +5467,7 @@ "sv_SE": "VARNING: Kommer att reducera prestandan", "th_TH": "คำเตือน: จะทำให้ประสิทธิภาพลดลง", "tr_TR": "UYARI: Oyun performansı azalacak", - "uk_UA": "УВАГА: Зміна параметрів нижче негативно впливає на продуктивність", + "uk_UA": "УВАГА: Зміна параметрів нижче має негативний вплив на продуктивність", "zh_CN": "警告:会降低模拟器性能", "zh_TW": "警告: 會降低效能" } @@ -5417,7 +5492,7 @@ "sv_SE": "Loggnivå för grafikbakände:", "th_TH": "ระดับการบันทึกประวัติ กราฟิกเบื้องหลัง:", "tr_TR": "Grafik Arka Uç Günlük Düzeyi", - "uk_UA": "Рівень журналу графічного сервера:", + "uk_UA": "Рівень журналу графічного бекенда:", "zh_CN": "图形引擎日志级别:", "zh_TW": "圖形後端日誌等級:" } @@ -5557,7 +5632,7 @@ "es_ES": "Entrada", "fr_FR": "Contrôles", "he_IL": "קלט", - "it_IT": "", + "it_IT": "Comandi", "ja_JP": "入力", "ko_KR": "입력", "no_NO": "Inndata", @@ -5692,7 +5767,7 @@ "sv_SE": "", "th_TH": "ตกลง", "tr_TR": "Tamam", - "uk_UA": "Гаразд", + "uk_UA": "", "zh_CN": "确定", "zh_TW": "確定" } @@ -6142,7 +6217,7 @@ "sv_SE": "", "th_TH": "โปรคอนโทรลเลอร์", "tr_TR": "Profesyonel Kumanda", - "uk_UA": "Контролер Pro", + "uk_UA": "Геймпад Nintendo Switch Pro", "zh_CN": "Pro 手柄", "zh_TW": "Pro 控制器" } @@ -6669,7 +6744,7 @@ "tr_TR": "Tuş", "uk_UA": "Кнопка", "zh_CN": "按下摇杆", - "zh_TW": "按鍵" + "zh_TW": "搖桿按鍵" } }, { @@ -7992,9 +8067,9 @@ "sv_SE": "Meny", "th_TH": "", "tr_TR": "Menü", - "uk_UA": "", + "uk_UA": "Меню", "zh_CN": "菜单键", - "zh_TW": "功能表" + "zh_TW": "功能表鍵" } }, { @@ -8017,7 +8092,7 @@ "sv_SE": "Upp", "th_TH": "", "tr_TR": "Yukarı", - "uk_UA": "", + "uk_UA": "Вгору ↑", "zh_CN": "上", "zh_TW": "上" } @@ -8042,7 +8117,7 @@ "sv_SE": "Ner", "th_TH": "", "tr_TR": "Aşağı", - "uk_UA": "", + "uk_UA": "Вниз ↓", "zh_CN": "下", "zh_TW": "下" } @@ -8067,7 +8142,7 @@ "sv_SE": "Vänster", "th_TH": "", "tr_TR": "Sol", - "uk_UA": "Вліво", + "uk_UA": "Вліво ←", "zh_CN": "左", "zh_TW": "左" } @@ -8092,7 +8167,7 @@ "sv_SE": "Höger", "th_TH": "", "tr_TR": "Sağ", - "uk_UA": "Вправо", + "uk_UA": "Вправо →", "zh_CN": "右", "zh_TW": "右" } @@ -8538,11 +8613,11 @@ "no_NO": "Numerisk 0", "pl_PL": "", "pt_BR": "", - "ru_RU": "Блок цифр 0", + "ru_RU": "0 (цифровий блок)", "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Блок цифр 0", "zh_CN": "小键盘0", "zh_TW": "數字鍵 0" } @@ -8563,11 +8638,11 @@ "no_NO": "Numerisk 1", "pl_PL": "", "pt_BR": "", - "ru_RU": "Блок цифр 1", + "ru_RU": "1 (цифровий блок)", "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Блок цифр 1", "zh_CN": "小键盘1", "zh_TW": "數字鍵 1" } @@ -8592,7 +8667,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "2 (цифровий блок)", "zh_CN": "小键盘2", "zh_TW": "數字鍵 2" } @@ -8617,7 +8692,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "3 (цифровий блок)", "zh_CN": "小键盘3", "zh_TW": "數字鍵 3" } @@ -8642,7 +8717,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "4 (цифровий блок)", "zh_CN": "小键盘4", "zh_TW": "數字鍵 4" } @@ -8667,7 +8742,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "5 (цифровий блок)", "zh_CN": "小键盘5", "zh_TW": "數字鍵 5" } @@ -8692,7 +8767,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "6 (цифровий блок)", "zh_CN": "小键盘6", "zh_TW": "數字鍵 6" } @@ -8717,7 +8792,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "7 (цифровий блок)", "zh_CN": "小键盘7", "zh_TW": "數字鍵 7" } @@ -8742,7 +8817,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "8 (цифровий блок)", "zh_CN": "小键盘8", "zh_TW": "數字鍵 8" } @@ -8767,7 +8842,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "9 (цифровий блок)", "zh_CN": "小键盘9", "zh_TW": "數字鍵 9" } @@ -8792,7 +8867,7 @@ "sv_SE": "Keypad /", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "/ (цифровий блок)", "zh_CN": "小键盘/", "zh_TW": "數字鍵除號" } @@ -8817,7 +8892,7 @@ "sv_SE": "Keypad *", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "* (цифровий блок)", "zh_CN": "小键盘*", "zh_TW": "數字鍵乘號" } @@ -8842,7 +8917,7 @@ "sv_SE": "Keypad -", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "- (цифровий блок)", "zh_CN": "小键盘-", "zh_TW": "數字鍵減號" } @@ -8867,7 +8942,7 @@ "sv_SE": "Keypad +", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "+ (цифровий блок)", "zh_CN": "小键盘+", "zh_TW": "數字鍵加號" } @@ -8892,7 +8967,7 @@ "sv_SE": "Keypad ,", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": ". (цифровий блок)", "zh_CN": "小键盘.", "zh_TW": "數字鍵小數點" } @@ -8917,7 +8992,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Enter (цифровий блок)", "zh_CN": "小键盘回车键", "zh_TW": "數字鍵 Enter" } @@ -9807,7 +9882,7 @@ "es_ES": "", "fr_FR": "", "he_IL": "", - "it_IT": "", + "it_IT": "Guida", "ja_JP": "", "ko_KR": "가이드", "no_NO": "Veiledning", @@ -9832,7 +9907,7 @@ "es_ES": "", "fr_FR": "Autre", "he_IL": "", - "it_IT": "", + "it_IT": "Altro", "ja_JP": "", "ko_KR": "기타", "no_NO": "Diverse", @@ -9857,7 +9932,7 @@ "es_ES": "", "fr_FR": "Palette 1", "he_IL": "", - "it_IT": "", + "it_IT": "Tasto extra 1", "ja_JP": "", "ko_KR": "패들 1", "no_NO": "", @@ -9867,7 +9942,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 1", - "uk_UA": "", + "uk_UA": "Додаткова кнопка 1", "zh_CN": "其他按键1", "zh_TW": "其他按鍵 1" } @@ -9882,7 +9957,7 @@ "es_ES": "", "fr_FR": "Palette 2", "he_IL": "", - "it_IT": "", + "it_IT": "Tasto extra 2", "ja_JP": "", "ko_KR": "패들 2", "no_NO": "", @@ -9892,7 +9967,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 2", - "uk_UA": "", + "uk_UA": "Додаткова кнопка 2", "zh_CN": "其他按键2", "zh_TW": "其他按鍵 2" } @@ -9907,7 +9982,7 @@ "es_ES": "", "fr_FR": "Palette 3", "he_IL": "", - "it_IT": "", + "it_IT": "Tasto extra 3", "ja_JP": "", "ko_KR": "패들 3", "no_NO": "", @@ -9917,7 +9992,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 3", - "uk_UA": "", + "uk_UA": "Додаткова кнопка 3", "zh_CN": "其他按键3", "zh_TW": "其他按鍵 3" } @@ -9932,7 +10007,7 @@ "es_ES": "", "fr_FR": "Palette 4", "he_IL": "", - "it_IT": "", + "it_IT": "Tasto extra 4", "ja_JP": "", "ko_KR": "패들 4", "no_NO": "", @@ -9942,7 +10017,7 @@ "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 4", - "uk_UA": "", + "uk_UA": "Додаткова кнопка 4", "zh_CN": "其他按键4", "zh_TW": "其他按鍵 4" } @@ -10460,7 +10535,7 @@ "it_IT": "Finestra di input", "ja_JP": "入力ダイアログ", "ko_KR": "대화 상자 입력", - "no_NO": "", + "no_NO": "Dialogboksen Inndata", "pl_PL": "Okno Dialogowe Wprowadzania", "pt_BR": "Diálogo de texto", "ru_RU": "Диалоговое окно ввода", @@ -10492,7 +10567,7 @@ "sv_SE": "Ok", "th_TH": "ตกลง", "tr_TR": "Tamam", - "uk_UA": "Гаразд", + "uk_UA": "", "zh_CN": "完成", "zh_TW": "確定" } @@ -10532,7 +10607,7 @@ "es_ES": "", "fr_FR": "Annulation en cours", "he_IL": "", - "it_IT": "Cancellando", + "it_IT": "Annullamento in corso", "ja_JP": "", "ko_KR": "취소하기", "no_NO": "Kansellerer", @@ -10544,7 +10619,7 @@ "tr_TR": "", "uk_UA": "Скасування", "zh_CN": "正在取消", - "zh_TW": "" + "zh_TW": "正在取消" } }, { @@ -10569,7 +10644,7 @@ "tr_TR": "", "uk_UA": "Закрити", "zh_CN": "关闭", - "zh_TW": "" + "zh_TW": "關閉" } }, { @@ -10769,7 +10844,7 @@ "tr_TR": "", "uk_UA": "Показати профіль", "zh_CN": "预览配置文件", - "zh_TW": "" + "zh_TW": "檢視設定檔" } }, { @@ -10917,7 +10992,7 @@ "sv_SE": "Kör applikation", "th_TH": "เปิดใช้งานแอปพลิเคชัน", "tr_TR": "Uygulamayı Çalıştır", - "uk_UA": "Запустити додаток", + "uk_UA": "Запустити", "zh_CN": "启动游戏", "zh_TW": "執行應用程式" } @@ -10942,7 +11017,7 @@ "sv_SE": "Växla som favorit", "th_TH": "สลับรายการโปรด", "tr_TR": "Favori Ayarla", - "uk_UA": "Перемкнути вибране", + "uk_UA": "Додати в обрані", "zh_CN": "收藏", "zh_TW": "加入/移除為我的最愛" } @@ -10967,7 +11042,7 @@ "sv_SE": "Växla favoritstatus för spelet", "th_TH": "สลับสถานะเกมที่ชื่นชอบ", "tr_TR": "Oyunu Favorilere Ekle/Çıkar", - "uk_UA": "Перемкнути улюблений статус гри", + "uk_UA": "Додати або вилучити гру з обраних", "zh_CN": "切换游戏的收藏状态", "zh_TW": "切換遊戲的我的最愛狀態" } @@ -11807,7 +11882,7 @@ "es_ES": "Renombrando actualización...", "fr_FR": "Renommage de la mise à jour...", "he_IL": "משנה את שם העדכון...", - "it_IT": "Rinominazione dell'aggiornamento...", + "it_IT": "Ridenominazione dell'aggiornamento...", "ja_JP": "アップデートをリネーム中...", "ko_KR": "이름 변경 업데이트...", "no_NO": "Endrer navn på oppdatering...", @@ -11857,7 +11932,7 @@ "es_ES": "", "fr_FR": "Afficher Changelog", "he_IL": "", - "it_IT": "", + "it_IT": "Mostra il changelog", "ja_JP": "", "ko_KR": "변경 로그 보기", "no_NO": "Vis endringslogg", @@ -11869,7 +11944,7 @@ "tr_TR": "", "uk_UA": "Показати список змін", "zh_CN": "显示更新日志", - "zh_TW": "" + "zh_TW": "顯示更新日誌" } }, { @@ -12107,7 +12182,7 @@ "es_ES": "¿Quieres instalar el firmware incluido en este juego? (Firmware versión {0})", "fr_FR": "Voulez-vous installer le firmware intégré dans ce jeu ? (Firmware {0})", "he_IL": "האם תרצו להתקין את הקושחה המוטמעת במשחק הזה? (קושחה {0})", - "it_IT": "Vuoi installare il firmware incorporato in questo gioco? (Firmware {0})", + "it_IT": "Vuoi installare il firmware incluso in questo gioco? (Firmware {0})", "ja_JP": "このゲームに含まれるファームウェアをインストールしてよろしいですか? (ファームウェア {0})", "ko_KR": "이 게임에 포함된 펌웨어를 설치하시겠습니까?(Firmware {0})", "no_NO": "Ønsker du å installere fastvaren innebygd i dette spillet? (Firmware {0})", @@ -12332,7 +12407,7 @@ "es_ES": "Ventana recortador XCI", "fr_FR": "Fenêtre de réduction de fichiers XCI", "he_IL": "", - "it_IT": "Finestra XCI Trimmer", + "it_IT": "Riduci dimensioni dei file XCI", "ja_JP": "", "ko_KR": "XCI 트리머 창", "no_NO": "XCI Trimmervindu", @@ -12342,9 +12417,9 @@ "sv_SE": "XCI-optimerare", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Вікно XCI Тримера", "zh_CN": "XCI文件瘦身窗口", - "zh_TW": "" + "zh_TW": "XCI 修剪器視窗" } }, { @@ -12382,7 +12457,7 @@ "es_ES": "Error al mostrar cuadro de diálogo: {0}", "fr_FR": "Erreur lors de l'affichage de la boîte de dialogue : {0}", "he_IL": "שגיאה בהצגת דיאלוג ההודעה: {0}", - "it_IT": "Errore nella visualizzazione del Message Dialog: {0}", + "it_IT": "Errore nella visualizzazione della finestra di dialogo: {0}", "ja_JP": "メッセージダイアログ表示エラー: {0}", "ko_KR": "메시지 대화 상자 표시 오류 : {0}", "no_NO": "Feil ved visning av meldings-dialog: {0}", @@ -12432,7 +12507,7 @@ "es_ES": "Error al mostrar díalogo ErrorApplet: {0}", "fr_FR": "Erreur lors de l'affichage de la boîte de dialogue ErrorApplet: {0}", "he_IL": "שגיאה בהצגת דיאלוג ErrorApplet: {0}", - "it_IT": "Errore nella visualizzazione dell'ErrorApplet Dialog: {0}", + "it_IT": "Errore nella visualizzazione della finestra dell'ErrorApplet: {0}", "ja_JP": "エラーアプレットダイアログ表示エラー: {0}", "ko_KR": "애플릿 오류류 대화 상자 표시 오류 : {0}", "no_NO": "Feil ved visning av Feilmeldingsdialog: {0}", @@ -12532,7 +12607,7 @@ "es_ES": "", "fr_FR": "API Amiibo", "he_IL": "ממשק תכנות אמיבו", - "it_IT": "", + "it_IT": "API Amiibo", "ja_JP": "", "ko_KR": "", "no_NO": "", @@ -12582,7 +12657,7 @@ "es_ES": "No se pudo conectar al servidor de la API Amiibo. El servicio puede estar caído o tu conexión a internet puede haberse desconectado.", "fr_FR": "Impossible de se connecter au serveur API Amiibo. Le service est peut-être hors service ou vous devriez peut-être vérifier que votre connexion internet est connectée.", "he_IL": "לא ניתן להתחבר לממשק שרת האמיבו. ייתכן שהשירות מושבת או שתצטרך לוודא שהחיבור לאינטרנט שלך מקוון.", - "it_IT": "Impossibile connettersi al server Amiibo API. Il servizio potrebbe essere fuori uso o potresti dover verificare che la tua connessione internet sia online.", + "it_IT": "Impossibile connettersi al server dell'API Amiibo. Il servizio potrebbe non essere disponibile o potresti non essere connesso a Internet.", "ja_JP": "Amiibo API サーバに接続できませんでした. サーバがダウンしているか, インターネット接続に問題があるかもしれません.", "ko_KR": "Amiibo API 서버에 연결할 수 없습니다. 서비스가 다운되었거나 인터넷 연결이 온라인 상태인지 확인이 필요합니다.", "no_NO": "Kan ikke koble til Amiibo API server. Tjenesten kan være nede, eller du må kanskje verifisere at din internettforbindelse er tilkoblet.", @@ -12607,7 +12682,7 @@ "es_ES": "El perfil {0} no es compatible con el sistema actual de configuración de entrada.", "fr_FR": "Le profil {0} est incompatible avec le système de configuration de manette actuel.", "he_IL": "הפרופיל {0} אינו תואם למערכת תצורת הקלט הנוכחית.", - "it_IT": "Il profilo {0} è incompatibile con l'attuale sistema di configurazione input.", + "it_IT": "Il profilo {0} non è compatibile con l'attuale sistema di configurazione input.", "ja_JP": "プロファイル {0} は現在の入力設定システムと互換性がありません.", "ko_KR": "프로필 {0}은(는) 현재 입력 구성 시스템과 호환되지 않습니다.", "no_NO": "Profil {0} er ikke kompatibel med den gjeldende inndata konfigurasjonen", @@ -12944,7 +13019,7 @@ "tr_TR": "Sistem sürümü {0} yüklenecek.", "uk_UA": "Буде встановлено версію системи {0}.", "zh_CN": "即将安装系统固件版本 {0} 。", - "zh_TW": "將安裝系統版本 {0}。" + "zh_TW": "即將安裝系統韌體版本 {0}。" } }, { @@ -12957,7 +13032,7 @@ "es_ES": "\n\nEsto reemplazará la versión de sistema actual, {0}.", "fr_FR": "\n\nCela remplacera la version actuelle du système {0}.", "he_IL": "\n\nזה יחליף את גרסת המערכת הנוכחית {0}.", - "it_IT": "\n\nQuesta sostituirà l'attuale versione di sistema {0}.", + "it_IT": "\n\nQuesta sostituirà l'attuale versione del sistema ({0}).", "ja_JP": "\n\n現在のシステムバージョン {0} を置き換えます.", "ko_KR": "\n\n현재 시스템 버전 {0}을(를) 대체합니다.", "no_NO": "\n\nDette erstatter den gjeldende systemversjonen {0}.", @@ -12969,7 +13044,7 @@ "tr_TR": "\n\nBu şimdiki sistem sürümünün yerini alacak {0}.", "uk_UA": "\n\nЦе замінить поточну версію системи {0}.", "zh_CN": "\n\n替换当前系统固件版本 {0} 。", - "zh_TW": "\n\n這將取代目前的系統版本 {0}。" + "zh_TW": "\n\n這將取代目前的系統韌體版本 {0}。" } }, { @@ -13044,7 +13119,7 @@ "tr_TR": "Sistem sürümü {0} başarıyla yüklendi.", "uk_UA": "Версію системи {0} успішно встановлено.", "zh_CN": "成功安装系统固件版本 {0} 。", - "zh_TW": "成功安裝系統版本 {0}。" + "zh_TW": "成功安裝系統韌體版本 {0}。" } }, { @@ -13057,7 +13132,7 @@ "es_ES": "Se halló un archivo Keys inválido en {0}", "fr_FR": "Un fichier de clés invalide a été trouvé dans {0}", "he_IL": "", - "it_IT": "E' stato trovato un file di chiavi invalido ' {0}", + "it_IT": "È stato trovato un file di chiavi non valido in {0}", "ja_JP": "", "ko_KR": "{0}에서 잘못된 키 파일이 발견", "no_NO": "En ugyldig Keys-fil ble funnet i {0}.", @@ -13069,7 +13144,7 @@ "tr_TR": "", "uk_UA": "", "zh_CN": "在{0}发现了一个无效的密匙文件", - "zh_TW": "" + "zh_TW": "找到無效的金鑰檔案 {0}" } }, { @@ -13082,7 +13157,7 @@ "es_ES": "Instalar Keys", "fr_FR": "Installer des clés", "he_IL": "", - "it_IT": "Installa Chavi", + "it_IT": "Installa chiavi", "ja_JP": "", "ko_KR": "설치 키", "no_NO": "Installere nøkler", @@ -13094,7 +13169,7 @@ "tr_TR": "", "uk_UA": "Встановлення Ключів", "zh_CN": "安装密匙", - "zh_TW": "" + "zh_TW": "安裝金鑰" } }, { @@ -13107,7 +13182,7 @@ "es_ES": "Un nuevo archivo Keys será instalado.", "fr_FR": "Nouveau fichier de clés sera installé.", "he_IL": "", - "it_IT": "Un nuovo file di Chiavi sarà intallato.", + "it_IT": "Un nuovo file di chiavi sarà installato.", "ja_JP": "", "ko_KR": "새로운 키 파일이 설치됩니다.", "no_NO": "Ny Keys-fil vil bli installert.", @@ -13119,7 +13194,7 @@ "tr_TR": "", "uk_UA": "Новий файл Ключів буде встановлено", "zh_CN": "将会安装新密匙文件", - "zh_TW": "" + "zh_TW": "將會安裝新增的金鑰檔案。" } }, { @@ -13132,7 +13207,7 @@ "es_ES": "\n\nEsto puede reemplazar algunas de las Keys actualmente instaladas.", "fr_FR": "\n\nCela pourrait remplacer les clés qui sont installés.", "he_IL": "", - "it_IT": "\n\nQuesto potrebbe sovrascrivere alcune delle Chiavi già installate.", + "it_IT": "\n\nAlcune delle chiavi già installate potrebbero essere sovrascritte.", "ja_JP": "", "ko_KR": "\n\n이로 인해 현재 설치된 키 중 일부가 대체될 수 있습니다.", "no_NO": "\n\nDette kan erstatte noen av de nåværende installerte nøklene.", @@ -13144,7 +13219,7 @@ "tr_TR": "", "uk_UA": "\n\nЦе замінить собою поточні файли Ключів.", "zh_CN": "\n\n这也许会替换掉一些当前已安装的密匙", - "zh_TW": "" + "zh_TW": "\n\n這將取代部分已安裝的金鑰。" } }, { @@ -13169,7 +13244,7 @@ "tr_TR": "", "uk_UA": "\n\nВи хочете продовжити?", "zh_CN": "\n\n你想要继续吗?", - "zh_TW": "" + "zh_TW": "\n\n是否繼續?" } }, { @@ -13182,7 +13257,7 @@ "es_ES": "Instalando Keys...", "fr_FR": "Installation des clés...", "he_IL": "", - "it_IT": "Installando le chiavi...", + "it_IT": "Installazione delle chiavi...", "ja_JP": "", "ko_KR": "키 설치 중...", "no_NO": "Installere nøkler...", @@ -13194,7 +13269,7 @@ "tr_TR": "", "uk_UA": "Встановлення Ключів...", "zh_CN": "安装密匙中。。。", - "zh_TW": "" + "zh_TW": "正在安裝金鑰..." } }, { @@ -13219,7 +13294,7 @@ "tr_TR": "", "uk_UA": "Нові ключі встановлено.", "zh_CN": "已成功安装新密匙文件", - "zh_TW": "" + "zh_TW": "成功安裝新增的金鑰檔案。" } }, { @@ -13232,7 +13307,7 @@ "es_ES": "Si eliminas el perfil seleccionado no quedará ningún otro perfil", "fr_FR": "Il n'y aurait aucun autre profil à ouvrir si le profil sélectionné est supprimé", "he_IL": "לא יהיו פרופילים אחרים שייפתחו אם הפרופיל שנבחר יימחק", - "it_IT": "Non ci sarebbero altri profili da aprire se il profilo selezionato viene cancellato", + "it_IT": "Non ci sarebbero altri profili da aprire se il profilo selezionato venisse cancellato", "ja_JP": "選択されたプロファイルを削除すると,プロファイルがひとつも存在しなくなります", "ko_KR": "선택한 프로필을 삭제하면 다른 프로필을 열 수 없음", "no_NO": "Det vil ikke være noen profiler å åpnes hvis valgt profil blir slettet", @@ -13282,7 +13357,7 @@ "es_ES": "Advertencia - Cambios sin guardar", "fr_FR": "Avertissement - Modifications non enregistrées", "he_IL": "אזהרה - שינויים לא שמורים", - "it_IT": "Attenzione - Modifiche Non Salvate", + "it_IT": "Attenzione - Modifiche non salvate", "ja_JP": "警告 - 保存されていない変更", "ko_KR": "경고 - 저장되지 않은 변경 사항", "no_NO": "Advarsel - Ulagrede endringer", @@ -13407,7 +13482,7 @@ "es_ES": "{0}. Archivo con error: {1}", "fr_FR": "{0}. Fichier erroné : {1}", "he_IL": "{0}. קובץ שגוי: {1}", - "it_IT": "{0}. Errore File: {1}", + "it_IT": "{0}. Errore file: {1}", "ja_JP": "{0}. エラー発生ファイル: {1}", "ko_KR": "{0}. 오류 파일 : {1}", "no_NO": "{0}. Feilet fil: {1}", @@ -13467,7 +13542,7 @@ "sv_SE": "Den angivna katalogen innehåller inte en modd!", "th_TH": "ไดเร็กทอรีที่ระบุไม่มี ม็อดอยู่!", "tr_TR": "", - "uk_UA": "Вказаний каталог не містить модифікації!", + "uk_UA": "Вказана тека не містить модифікації!", "zh_CN": "指定的目录找不到 MOD 文件!", "zh_TW": "指定資料夾不包含模組!" } @@ -13492,7 +13567,7 @@ "sv_SE": "Misslyckades med att ta bort: Kunde inte hitta föräldrakatalogen för modden \"{0}\"!", "th_TH": "ไม่สามารถลบ: ไม่พบไดเร็กทอรีหลักสำหรับ ม็อด \"{0}\"!", "tr_TR": "Silme Başarısız: \"{0}\" Modu için üst dizin bulunamadı! ", - "uk_UA": "Не видалено: Не знайдено батьківський каталог для модифікації \"{0}\"!", + "uk_UA": "Не видалено: Не знайдено батьківський каталог (теку) для модифікації \"{0}\"!", "zh_CN": "删除失败:找不到 MOD 的父目录“{0}”!", "zh_TW": "刪除失敗: 無法找到模組「{0}」的父資料夾!" } @@ -13517,7 +13592,7 @@ "sv_SE": "Den angivna filen innehåller inte en DLC för angivet spel!", "th_TH": "ไฟล์ที่ระบุไม่มี DLC สำหรับชื่อที่เลือก!", "tr_TR": "Belirtilen dosya seçilen oyun için DLC içermiyor!", - "uk_UA": "Зазначений файл не містить DLC для вибраного заголовку!", + "uk_UA": "Зазначений файл не містить DLC для обраної гри!", "zh_CN": "选择的文件不是当前游戏的 DLC!", "zh_TW": "指定檔案不包含所選遊戲的 DLC!" } @@ -14142,7 +14217,7 @@ "sv_SE": "Klicka för att öppna Ryujinx GitHub-sida i din webbläsare.", "th_TH": "คลิกเพื่อเปิดหน้า Github ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Ryujinx'in GitHub sayfasını varsayılan tarayıcınızda açmak için tıklayın.", - "uk_UA": "Натисніть, щоб відкрити сторінку GitHub Ryujinx у браузері за замовчуванням.", + "uk_UA": "Натисніть, щоб відкрити сторінку GitHub Ryujinx у браузері.", "zh_CN": "在浏览器中打开 Ryujinx 的 GitHub 代码库。", "zh_TW": "在預設瀏覽器中開啟 Ryujinx 的 GitHub 網頁。" } @@ -14167,7 +14242,7 @@ "sv_SE": "Klicka för att öppna en inbjudan till Ryujinx Discord-server i din webbläsare.", "th_TH": "คลิกเพื่อเปิดคำเชิญเข้าสู่เซิร์ฟเวอร์ Discord ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Varsayılan tarayıcınızda Ryujinx'in Discord'una bir davet açmak için tıklayın.", - "uk_UA": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері за замовчуванням.", + "uk_UA": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері.", "zh_CN": "在浏览器中打开 Ryujinx 的 Discord 邀请链接。", "zh_TW": "在預設瀏覽器中開啟 Ryujinx 的 Discord 邀請連結。" } @@ -14207,7 +14282,7 @@ "es_ES": "", "fr_FR": "Ryujinx est un émulateur pour la Nintendo Switch™.\nObtenez le dernières nouvelles sur le Discord.\nLes développeurs qui veulent contribuer peuvent en savoir plus sur notre GitHub ou Discord.", "he_IL": "", - "it_IT": "", + "it_IT": "Ryujinx è un emulatore della console Nintendo Switch™.\nRimani aggiornato sulle ultime novità nel nostro server Discord.\nGli sviluppatori interessati a contribuire possono trovare maggiori informazioni su Discord o sulla nostra pagina GitHub.", "ja_JP": "", "ko_KR": "Ryujinx는 Nintendo Switch™용 에뮬레이터입니다.\n모든 최신 소식을 Discord에서 확인하세요.\n기여에 관심이 있는 개발자는 GitHub 또는 Discord에서 자세한 내용을 확인할 수 있습니다.", "no_NO": "Ryujinx er en emulator for Nintendo SwitchTM.\nVennligst støtt oss på Patreon.\nFå alle de siste nyhetene på vår Twitter eller Discord.\nUtviklere som er interessert i å bidra kan finne ut mer på GitHub eller Discord.", @@ -14217,9 +14292,9 @@ "sv_SE": "Ryujinx är en emulator för Nintendo Switch™.\nFå de senaste nyheterna via vår Discord.\nUtvecklare som är intresserade att bidra kan hitta mer info på vår GitHub eller Discord.", "th_TH": "", "tr_TR": "", - "uk_UA": "Ryujinx — це емулятор для Nintendo Switch™.\nОтримуйте всі останні новини в нашому Discord.\nРозробники, які хочуть зробити внесок, можуть дізнатися більше на нашому GitHub або в Discord.", - "zh_CN": "", - "zh_TW": "" + "uk_UA": "Ryujinx — це емулятор для Nintendo Switch™.\nОстанні новини можна отримати в нашому Discord.\nРозробники, що бажають долучитись до розробки та зробити свій внесок, можуть отримати більше інформації на нашому GitHub або в Discord.", + "zh_CN": "Ryujinx 是一个 Nintendo Switch™ 模拟器。\n有兴趣做出贡献的开发者可以在我们的 GitHub 或 Discord 上了解更多信息。\n", + "zh_TW": "Ryujinx 是一款 Nintendo Switch™ 模擬器。\n關注我們的 Discord 取得所有最新消息。\n對於有興趣貢獻的開發者,可以在我們的 GitHub 或 Discord 上了解更多資訊。" } }, { @@ -14257,7 +14332,7 @@ "es_ES": "", "fr_FR": "Anciennement Maintenu par :", "he_IL": "", - "it_IT": "", + "it_IT": "Mantenuto in precedenza da:", "ja_JP": "", "ko_KR": "이전 관리자 :", "no_NO": "Tidligere vedlikeholdt av:", @@ -14269,7 +14344,7 @@ "tr_TR": "", "uk_UA": "Минулі розробники:", "zh_CN": "曾经的维护者:", - "zh_TW": "" + "zh_TW": "過往的維護者:" } }, { @@ -14892,7 +14967,7 @@ "sv_SE": "Ange en spelkatalog att lägga till i listan", "th_TH": "ป้อนไดเรกทอรี่เกมที่จะทำการเพิ่มลงในรายการ", "tr_TR": "Listeye eklemek için oyun dizini seçin", - "uk_UA": "Введіть каталог ігор, щоб додати до списку", + "uk_UA": "Додайте теку з іграми, щоб додати їх до списку", "zh_CN": "输入要添加的游戏目录", "zh_TW": "輸入要新增到清單中的遊戲資料夾" } @@ -14917,7 +14992,7 @@ "sv_SE": "Lägg till en spelkatalog till listan", "th_TH": "เพิ่มไดเรกทอรี่เกมลงในรายการ", "tr_TR": "Listeye oyun dizini ekle", - "uk_UA": "Додати каталог гри до списку", + "uk_UA": "Додати теку з іграми до списку", "zh_CN": "添加游戏目录到列表中", "zh_TW": "新增遊戲資料夾到清單中" } @@ -14942,7 +15017,7 @@ "sv_SE": "Ta bort vald spelkatalog", "th_TH": "ลบไดเรกทอรี่เกมที่เลือก", "tr_TR": "Seçili oyun dizinini kaldır", - "uk_UA": "Видалити вибраний каталог гри", + "uk_UA": "Видалити вибрану теку гри", "zh_CN": "移除选中的目录", "zh_TW": "移除選取的遊戲資料夾" } @@ -14957,7 +15032,7 @@ "es_ES": "Elige un directorio de carga automática para agregar a la lista", "fr_FR": "Entrez un répertoire de mises à jour/DLC à ajouter à la liste", "he_IL": "", - "it_IT": "Inserisci una directory di \"autoload\" da aggiungere alla lista", + "it_IT": "Inserisci una cartella di caricamento automatico da aggiungere alla lista", "ja_JP": "", "ko_KR": "목록에 추가할 자동 불러오기 디렉터리를 입력", "no_NO": "Angi en autoload-mappe som skal legges til i listen", @@ -14982,7 +15057,7 @@ "es_ES": "Agregar un directorio de carga automática a la lista", "fr_FR": "Ajouter un répertoire de mises à jour/DLC à la liste", "he_IL": "", - "it_IT": "Aggiungi una directory di \"autoload\" alla lista", + "it_IT": "Aggiungi una cartella di caricamento automatico alla lista", "ja_JP": "", "ko_KR": "목록에 자동 불러오기 디렉터리 추가", "no_NO": "Legg til en autoload-mappe i listen", @@ -15007,7 +15082,7 @@ "es_ES": "Eliminar el directorio de carga automática seleccionado", "fr_FR": "Supprimer le répertoire de mises à jour/DLC sélectionné", "he_IL": "", - "it_IT": "Rimuovi la directory di autoload selezionata", + "it_IT": "Rimuovi la cartella di caricamento automatico selezionata", "ja_JP": "", "ko_KR": "선택한 자동 불러오기 디렉터리 제거", "no_NO": "Fjern valgt autoload-mappe", @@ -15017,7 +15092,7 @@ "sv_SE": "Ta bort markerad katalog för automatisk inläsning", "th_TH": "ลบไดเรกทอรีสำหรับโหลดอัตโนมัติที่เลือก", "tr_TR": "", - "uk_UA": "Видалити вибраний каталог автозавантаження", + "uk_UA": "Видалити вибрану теку автозавантаження", "zh_CN": "移除被选中的自动加载目录", "zh_TW": "移除選取的「自動載入 DLC/遊戲更新資料夾」" } @@ -15032,7 +15107,7 @@ "es_ES": "Activa o desactiva los temas personalizados para la interfaz", "fr_FR": "Utilisez un thème personnalisé Avalonia pour modifier l'apparence des menus de l'émulateur", "he_IL": "השתמש בעיצוב מותאם אישית של אבלוניה עבור ה-ממשק הגראפי כדי לשנות את המראה של תפריטי האמולטור", - "it_IT": "Attiva o disattiva temi personalizzati nella GUI", + "it_IT": "Utilizza un tema di Avalonia personalizzato per cambiare l'aspetto dei menù dell'emulatore", "ja_JP": "エミュレータのメニュー外観を変更するためカスタム Avalonia テーマを使用します", "ko_KR": "GUI용 사용자 정의 Avalonia 테마를 사용하여 에뮬레이터 메뉴의 모양 변경", "no_NO": "Bruk et egendefinert Avalonia tema for GUI for å endre utseende til emulatormenyene", @@ -15057,7 +15132,7 @@ "es_ES": "Carpeta que contiene los temas personalizados para la interfaz", "fr_FR": "Chemin vers le thème personnalisé de l'interface utilisateur", "he_IL": "נתיב לערכת נושא לממשק גראפי מותאם אישית", - "it_IT": "Percorso al tema GUI personalizzato", + "it_IT": "Percorso al tema dell'interfaccia personalizzato", "ja_JP": "カスタム GUI テーマのパスです", "ko_KR": "사용자 정의 GUI 테마 경로", "no_NO": "Bane til egendefinert GUI-tema", @@ -15082,7 +15157,7 @@ "es_ES": "Busca un tema personalizado para la interfaz", "fr_FR": "Parcourir vers un thème personnalisé pour l'interface utilisateur", "he_IL": "חפש עיצוב ממשק גראפי מותאם אישית", - "it_IT": "Sfoglia per cercare un tema GUI personalizzato", + "it_IT": "Scegli un tema dell'interfaccia personalizzato", "ja_JP": "カスタム GUI テーマを参照します", "ko_KR": "사용자 정의 GUI 테마 찾아보기", "no_NO": "Søk etter et egendefinert GUI-tema", @@ -15167,7 +15242,7 @@ "sv_SE": "Stöd för direkt musåtkomst (HID). Ger spel åtkomst till din mus som pekdon.\n\nFungerar endast med spel som har inbyggt stöd för muskontroller på Switch-hårdvara, som är endast ett fåtal.\n\nViss pekskärmsfunktionalitet kanske inte fungerar när aktiverat.\n\nLämna AV om du är osäker.", "th_TH": "รองรับการเข้าถึงเมาส์โดยตรง (HID) ให้เกมเข้าถึงเมาส์ของคุณเป็นอุปกรณ์ชี้ตำแหน่ง\n\nใช้งานได้เฉพาะกับเกมที่รองรับการควบคุมเมาส์บนฮาร์ดแวร์ของ Switch เท่านั้น ซึ่งมีอยู่ไม่มากนัก\n\nเมื่อเปิดใช้งาน ฟังก์ชั่นหน้าจอสัมผัสอาจไม่ทำงาน\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", "tr_TR": "", - "uk_UA": "Підтримка прямого доступу до миші (HID). Надає іграм доступ до миші, як пристрій вказування.\n\nПрацює тільки з іграми, які підтримують мишу на обладнанні Switch, їх небагато.\n\nФункціонал сенсорного екрана може не працювати, якщо функція ввімкнена.\n\nЗалиште вимкненим, якщо не впевнені.", + "uk_UA": "Підтримка прямого доступу до миші (HID). Надає іграм доступ до миші, як пристрій вказування.\n\nПрацює тільки з іграми, які підтримують мишу на обладнанні Switch (таких небагато).\n\nФункціонал сенсорного екрану може не працювати, якщо ця функція ввімкнена.\n\nЗалиште вимкненим, якщо не впевнені.", "zh_CN": "直接鼠标访问(HID)支持,游戏可以直接访问鼠标作为指针输入设备。\n\n只适用于在 Switch 硬件上原生支持鼠标控制的游戏,这种游戏很少。\n\n启用后,触屏功能可能无法正常工作。\n\n如果不确定,请保持关闭状态。", "zh_TW": "支援滑鼠直接存取 (HID)。遊戲可將滑鼠作為指向裝置使用。\n\n僅適用於在 Switch 硬體上原生支援滑鼠控制的遊戲,這類遊戲很少。\n\n啟用後,觸控螢幕功能可能無法使用。\n\n如果不確定,請保持關閉狀態。" } @@ -15267,7 +15342,7 @@ "sv_SE": "Ändra systemtid", "th_TH": "เปลี่ยนเวลาของระบบ", "tr_TR": "Sistem Saatini Değiştir", - "uk_UA": "Змінити час системи", + "uk_UA": "Змінити системний час", "zh_CN": "更改系统时间", "zh_TW": "變更系統時鐘" } @@ -15282,7 +15357,7 @@ "es_ES": "", "fr_FR": "Resynchronise la Date du Système pour qu'elle soit la même que celle du PC.\n\nCeci n'est pas un paramètrage automatique, la date peut se désynchroniser; dans ce cas là, rappuyer sur le boutton.", "he_IL": "", - "it_IT": "", + "it_IT": "Sincronizza data e ora del sistema con quelle del PC.\n\nQuesta non è un'opzione attiva, perciò data e ora potrebbero tornare a non essere sincronizzate: in tal caso basterà cliccare nuovamente questo pulsante.", "ja_JP": "", "ko_KR": "시스템 시간을 PC의 현재 날짜 및 시간과 일치하도록 다시 동기화합니다.\n\n이 설정은 활성 설정이 아니므로 여전히 동기화되지 않을 수 있으며, 이 경우 이 버튼을 다시 클릭하면 됩니다.", "no_NO": "Resynkroniser systemtiden slik at den samsvarer med PC-ens gjeldende dato og klokkeslett. \\Dette er ikke en aktiv innstilling, men den kan likevel komme ut av synkronisering; i så fall er det bare å klikke på denne knappen igjen.", @@ -15292,9 +15367,9 @@ "sv_SE": "Återsynkronisera systemtiden för att matcha din dators aktuella datum och tid.\n\nDetta är inte en aktiv inställning och den kan tappa synken och om det händer så kan du klicka på denna knapp igen.", "th_TH": "", "tr_TR": "", - "uk_UA": "", + "uk_UA": "Синхронізувати системний час, щоб він відповідав поточній даті та часу вашого ПК.\n\nЦе не активне налаштування, тому синхронізація може збитися; у такому разі просто натискайте цю кнопку знову.", "zh_CN": "重新同步系统时间以匹配您电脑的当前日期和时间。\n\n这个操作不会实时同步系统时间与电脑时间,时间仍然可能不同步;在这种情况下,只需再次单击此按钮即可。", - "zh_TW": "" + "zh_TW": "重新同步系統韌體時間至 PC 目前的日期和時間。\n\n這不是一個主動設定,它仍然可能會失去同步;在這種情況下,只需再次點擊此按鈕。" } }, { @@ -15307,7 +15382,7 @@ "es_ES": "Sincronización vertical de la consola emulada. En práctica un limitador del framerate para la mayoría de los juegos; desactivando puede causar que juegos corran a mayor velocidad o que las pantallas de carga tarden más o queden atascados.\n\nSe puede alternar en juego utilizando una tecla de acceso rápido configurable (F1 by default). Recomendamos hacer esto en caso de querer desactivar sincroniziación vertical.\n\nDesactívalo si no sabes qué hacer.", "fr_FR": "La synchronisation verticale de la console émulée. Essentiellement un limiteur de trame pour la majorité des jeux ; le désactiver peut entraîner un fonctionnement plus rapide des jeux ou prolonger ou bloquer les écrans de chargement.\n\nPeut être activé ou désactivé en jeu avec un raccourci clavier de votre choix (F1 par défaut). Nous recommandons de le faire si vous envisagez de le désactiver.\n\nLaissez activé si vous n'êtes pas sûr.", "he_IL": "", - "it_IT": "Sincronizzazione verticale della console Emulata. Essenzialmente un limitatore di frame per la maggior parte dei giochi; disabilitarlo può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata in gioco con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarlo.\n\nLascia ON se non sei sicuro.", + "it_IT": "Sincronizzazione verticale della console emulata. Funziona essenzialmente come un limitatore del framerate per la maggior parte dei giochi; disabilitarla può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata mentre giochi con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarla.\n\nNel dubbio, lascia l'opzione attiva.", "ja_JP": "エミュレートされたゲーム機の垂直同期です. 多くのゲームにおいて, フレームリミッタとして機能します. 無効にすると, ゲームが高速で実行されたり, ロード中に時間がかかったり, 止まったりすることがあります.\n\n設定したホットキー(デフォルトではF1)で, ゲーム内で切り替え可能です. 無効にする場合は, この操作を行うことをおすすめします.\n\nよくわからない場合はオンのままにしてください.", "ko_KR": "에뮬레이트된 콘솔의 수직 동기화입니다. 기본적으로 대부분의 게임에서 프레임 제한 기능으로, 비활성화하면 게임이 더 빠른 속도로 실행되거나 로딩 화면이 더 오래 걸리거나 멈출 수 있습니다.\n\n게임 내에서 원하는 단축키(기본값은 F1)로 전환할 수 있습니다. 비활성화하려면 이 작업을 수행하는 것이 좋습니다.\n\n모르면 켬으로 두세요.", "no_NO": "Emuler konsollens loddrett synkronisering. på ett vis en bildefrekvens begrensning for de fleste spill; deaktivering kan få spill til å kjøre med høyere hastighet, eller til å laste skjermene tar lengre tid eller sitter fast.\n\nkan byttes inn i spillet med en hurtigtast for preferansen (F1 som standard). Vi anbefaler å gjøre dette hvis du planlegger å deaktivere dette.\n\nLa være PÅ hvis du er usikker.", @@ -15317,7 +15392,7 @@ "sv_SE": "Emulerade konsollens vertikala synk. I grund och botten en begränsare för bitrutor för de flesta spel; inaktivera den kan orsaka att spel kör på en högre hastighet eller gör att skärmar tar längre tid att läsa eller fastnar i dem.\n\nKan växlas inne i spelet med en snabbtangent som du väljer (F1 som standard). Vi rekommenderar att göra detta om du planerar att inaktivera den.\n\nLämna PÅ om du är osäker.", "th_TH": "Vertical Sync ของคอนโซลจำลอง โดยพื้นฐานแล้วเป็นตัวจำกัดเฟรมสำหรับเกมส่วนใหญ่ การปิดใช้งานอาจทำให้เกมทำงานด้วยความเร็วสูงขึ้น หรือทำให้หน้าจอการโหลดใช้เวลานานขึ้นหรือค้าง\n\nสามารถสลับได้ในเกมด้วยปุ่มลัดตามที่คุณต้องการ (F1 เป็นค่าเริ่มต้น) เราขอแนะนำให้ทำเช่นนี้หากคุณวางแผนที่จะปิดการใช้งาน\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "", - "uk_UA": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.", + "uk_UA": "Емуляція Вертикальної Синхронізації консолі. По суті, це обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.", "zh_CN": "模拟控制台的垂直同步,开启后会降低大部分游戏的帧率。关闭后,可以获得更高的帧率,但也可能导致游戏画面加载耗时更长或卡住。\n\n在游戏中可以使用热键进行切换(默认为 F1 键)。\n\n如果不确定,请保持开启状态。", "zh_TW": "模擬遊戲機的垂直同步。對大多數遊戲來說,它本質上是一個幀率限制器;停用它可能會導致遊戲以更高的速度執行,或使載入畫面耗時更長或卡住。\n\n可以在遊戲中使用快速鍵進行切換 (預設為 F1)。如果您打算停用,我們建議您這樣做。\n\n如果不確定,請保持開啟狀態。" } @@ -15342,7 +15417,7 @@ "sv_SE": "Sparar översatta JIT-funktioner så att de inte behöver översättas varje gång som spelet läses in.\n\nMinskar stuttering och snabbare på uppstartstiden väsentligt efter första uppstarten av ett spel.\n\nLämna PÅ om du är osäker.", "th_TH": "บันทึกฟังก์ชั่น JIT ที่แปลแล้ว ดังนั้นจึงไม่จำเป็นต้องแปลทุกครั้งที่โหลดเกม\n\nลดอาการกระตุกและเร่งความเร็วการบูตได้อย่างมากหลังจากการบูตครั้งแรกของเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "Çevrilen JIT fonksiyonlarını oyun her açıldığında çevrilmek zorunda kalmaması için kaydeder.\n\nTeklemeyi azaltır ve ilk açılıştan sonra oyunların ilk açılış süresini ciddi biçimde hızlandırır.\n\nEmin değilseniz aktif halde bırakın.", - "uk_UA": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання та значно прискорює час завантаження після першого завантаження гри.\n\nЗалиште увімкненим, якщо не впевнені.", + "uk_UA": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання (stuttering) та значно прискорює наступні завантаження гри (після першого завантаження).\n\nЗалиште увімкненим, якщо не впевнені.", "zh_CN": "缓存已编译的游戏指令,这样每次游戏加载时就无需重新编译。\n\n可以减少卡顿和启动时间,提高游戏响应速度。\n\n如果不确定,请保持开启状态。", "zh_TW": "儲存已轉譯的 JIT 函數,這樣每次載入遊戲時就無需再轉譯這些函數。\n\n減少遊戲首次啟動後的卡頓現象,並大大加快啟動時間。\n\n如果不確定,請保持開啟狀態。" } @@ -15357,7 +15432,7 @@ "es_ES": "Cargue el PPTC utilizando un tercio de la cantidad de núcleos.", "fr_FR": "Charger le PPTC en utilisant un tiers des coeurs.", "he_IL": "", - "it_IT": "Carica il PPTC usando un terzo dei core.", + "it_IT": "Carica la cache PPTC usando un terzo dei core del processore.", "ja_JP": "", "ko_KR": "코어의 3분의 1을 사용하여 PPTC를 불러옵니다.", "no_NO": "Last inn PPTC med en tredjedel av antall kjerner.", @@ -15632,7 +15707,7 @@ "es_ES": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.", "fr_FR": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.", "he_IL": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.", - "it_IT": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Auto.", + "it_IT": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Automatico.", "ja_JP": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.", "ko_KR": "2번째 스레드에서 그래픽 후단부 명령을 실행합니다.\n\n셰이더 컴파일 속도를 높이고, 끊김 현상을 줄이며, 자체 다중 스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 다중 스레딩이 있는 드라이버에서 성능이 좀 더 좋습니다.\n\n모르면 자동으로 설정합니다.", "no_NO": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten å spre støtten fra sine egne. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.", @@ -15657,7 +15732,7 @@ "es_ES": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.", "fr_FR": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.", "he_IL": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.", - "it_IT": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Auto.", + "it_IT": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Automatico.", "ja_JP": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.", "ko_KR": "2번째 스레드에서 그래픽 후단부 명령을 실행합니다.\n\n셰이더 컴파일 속도를 높이고 끊김 현상을 줄이며 자체 다중 스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 다중 스레딩이 있는 드라이버에서 성능이 좀 더 좋습니다.\n\n모르면 자동으로 설정합니다.", "no_NO": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten flertråd støtte. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.", @@ -15707,7 +15782,7 @@ "es_ES": "Multiplica la resolución de rendereo del juego.\n\nAlgunos juegos podrían no funcionar con esto y verse pixelado al aumentar la resolución; en esos casos, quizás sería necesario buscar mods que de anti-aliasing o que aumenten la resolución interna. Para usar este último, probablemente necesitarás seleccionar Nativa.\n\nEsta opción puede ser modificada mientras que un juego este corriendo haciendo click en \"Aplicar\" más abajo; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nTener en cuenta que 4x es excesivo para prácticamente cualquier configuración.", "fr_FR": "Multiplie la résolution de rendu du jeu.\n\nQuelques jeux peuvent ne pas fonctionner avec cette fonctionnalité et sembler pixelisés même lorsque la résolution est augmentée ; pour ces jeux, vous devrez peut-être trouver des mods qui suppriment l'anti-aliasing ou qui augmentent leur résolution de rendu interne. Pour utiliser cette dernière option, vous voudrez probablement sélectionner \"Natif\".\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres sur le côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nGardez à l'esprit que 4x est excessif pour pratiquement n'importe quelle configuration.", "he_IL": "", - "it_IT": "Moltiplica la risoluzione di rendering del gioco.\n\nAlcuni giochi potrebbero non funzionare con questa opzione e sembrare pixelati anche quando la risoluzione è aumentata; per quei giochi, potrebbe essere necessario trovare mod che rimuovono l'anti-aliasing o che aumentano la risoluzione di rendering interna. Per quest'ultimo caso, probabilmente dovrai selezionare Nativo (1x).\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nTenete a mente che 4x è troppo per praticamente qualsiasi configurazione.", + "it_IT": "Moltiplica la risoluzione di rendering del gioco.\n\nAlcuni giochi potrebbero non funzionare con questa opzione e sembrare pixelati anche quando la risoluzione è aumentata; per quei giochi, potrebbe essere necessario trovare mod che rimuovono l'anti-aliasing o che aumentano la risoluzione di rendering interna. Per quest'ultimo caso, probabilmente dovrai selezionare Nativo (1x).\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito.\n\nTieni presente che \"4x\" è eccessivo per praticamente qualsiasi configurazione.", "ja_JP": "ゲームのレンダリング解像度倍率を設定します.\n\n解像度を上げてもピクセルのように見えるゲームもあります. そのようなゲームでは, アンチエイリアスを削除するか, 内部レンダリング解像度を上げる mod を見つける必要があるかもしれません. その場合, ようなゲームでは、ネイティブを選択してください.\n\nこのオプションはゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動して, ゲームが好みの表示になるよう試してみてください.\n\nどのような設定でも, \"4x\" はやり過ぎであることを覚えておいてください.", "ko_KR": "게임의 렌더링 해상도를 배가시킵니다.\n\n일부 게임에서는 이 기능이 작동하지 않고 해상도가 높아져도 픽셀화되어 보일 수 있습니다. 해당 게임의 경우 앤티 앨리어싱을 제거하거나 내부 렌더링 해상도를 높이는 모드를 찾아야 할 수 있습니다. 후자를 사용하려면 기본을 선택하는 것이 좋습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임이 실행되는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮기고 원하는 게임 모양을 찾을 때까지 실험해 보세요.\n\n4배는 거의 모든 설정에서 과하다는 점을 명심하세요.", "no_NO": "Dobler spillets gjengivelse.\n\nNoen få spill fungerer kanskje ikke med dette aktivert og kan se veldig pikselert ut selv når gjengivelsen er økt; for de spillene, så kan det hende du må bruke modifikasjoner som fjerner anti-aliasing eller som øker den interne gjengivelsen. For og bruke sistnenvte, så vil du helst bruke \"Native\".\n\nHa til tanke at 4x er unødig for virituelt alle maskiner.", @@ -15732,7 +15807,7 @@ "es_ES": "Escalado de resolución de coma flotante, como por ejemplo 1,5. Los valores no íntegros pueden causar errores gráficos o crashes.", "fr_FR": "Échelle de résolution à virgule, telle que : 1.5. Les échelles non intégrales sont plus susceptibles de causer des problèmes ou des crashs.", "he_IL": "שיפור רזולוציית נקודה צפה, כגון 1.5. הוא שיפור לא אינטגרלי הנוטה לגרום יותר בעיות או להקריס.", - "it_IT": "Scala della risoluzione in virgola mobile, come 1,5. Le scale non integrali hanno maggiori probabilità di causare problemi o crash.", + "it_IT": "Scala della risoluzione in virgola mobile, come 1,5. I valori non interi hanno maggiori probabilità di causare problemi o arresti anomali.", "ja_JP": "1.5 のような整数でない倍率を指定すると,問題が発生したりクラッシュしたりする場合があります.", "ko_KR": "부동 소수점 해상도 스케일(예: 1.5)입니다. 적분이 아닌 스케일은 문제나 충돌을 일으킬 가능성이 높습니다.", "no_NO": "Det er mer sannsynlig at flytende punktoppløsning skalaer som 1.5. Ikke-integrerte skalaer forårsaker problemer eller krasj.", @@ -15757,7 +15832,7 @@ "es_ES": "Nivel de filtrado anisotrópico. Setear en Auto para utilizar el valor solicitado por el juego.", "fr_FR": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.", "he_IL": "", - "it_IT": "Livello del filtro anisotropico. Imposta su Auto per usare il valore richiesto dal gioco.", + "it_IT": "Livello del filtro anisotropico. Imposta su Automatico per usare il valore richiesto dal gioco.", "ja_JP": "異方性フィルタリングのレベルです. ゲームが要求する値を使用する場合は「自動」を設定してください.", "ko_KR": "이방성 필터링 수준입니다. 게임에서 요청한 값을 사용하려면 자동으로 설정하세요.", "no_NO": "Nivå av Anisotropisk filtrering. Sett til Auto for å bruke verdien som kreves av spillet.", @@ -15767,7 +15842,7 @@ "sv_SE": "Nivå av anisotropisk filtrering. Ställ in till Automatiskt för att använda det värde som begärts av spelet.", "th_TH": "ระดับของ Anisotropic ตั้งค่าเป็นอัตโนมัติเพื่อใช้ค่าพื้นฐานของเกม", "tr_TR": "", - "uk_UA": "Рівень анізотропної фільтрації. Встановіть на «Авто», щоб використовувати значення, яке вимагає гра.", + "uk_UA": "Рівень анізотропної фільтрації. Встановіть «Авто», щоб використовувати значення яке вимагає гра.", "zh_CN": "各向异性过滤等级,可以提高倾斜视角纹理的清晰度。\n当设置为“自动”时,使用游戏自身设定的等级。", "zh_TW": "各向異性過濾等級。設定為自動可使用遊戲要求的值。" } @@ -15792,7 +15867,7 @@ "sv_SE": "Bildförhållande att appliceras på renderarfönstret.\n\nÄndra endast detta om du använder en modd för bildförhållande till ditt spel, annars kommer grafiken att sträckas ut.\n\nLämna den till 16:9 om du är osäker.", "th_TH": "อัตราส่วนภาพที่ใช้กับหน้าต่างตัวแสดงภาพ\n\nเปลี่ยนสิ่งนี้หากคุณใช้ตัวดัดแปลงอัตราส่วนกว้างยาวสำหรับเกมของคุณ ไม่เช่นนั้นกราฟิกจะถูกยืดออก\n\nทิ้งไว้ที่ 16:9 หากไม่แน่ใจ", "tr_TR": "", - "uk_UA": "Співвідношення сторін застосовано до вікна рендера.\n\nМіняйте тільки, якщо використовуєте модифікацію співвідношення сторін для гри, інакше графіка буде розтягнута.\n\nЗалиште на \"16:9\", якщо не впевнені.", + "uk_UA": "Співвідношення сторін застосовано до вікна рендера.\n\nМіняйте тільки, якщо використовуєте модифікацію співвідношення сторін для гри, інакше зображення буде розтягнутим.\n\nЗалиште на \"16:9\", якщо не впевнені.", "zh_CN": "游戏渲染窗口的宽高比。\n\n只有当游戏使用了修改宽高比的 MOD 时才需要修改这个设置,否则图像会被拉伸。\n\n如果不确定,请保持为“16:9”。", "zh_TW": "套用於繪製器視窗的長寬比。\n\n只有在遊戲中使用長寬比模組時才可變更,否則圖形會被拉伸。\n\n如果不確定,請保持 16:9 狀態。" } @@ -15817,7 +15892,7 @@ "sv_SE": "Sökväg för Graphics Shaders Dump", "th_TH": "ที่เก็บ ดัมพ์ไฟล์เชเดอร์", "tr_TR": "Grafik Shader Döküm Yolu", - "uk_UA": "Шлях скидання графічних шейдерів", + "uk_UA": "Шлях до дампу графічних шейдерів", "zh_CN": "转储图形着色器的路径", "zh_TW": "圖形著色器傾印路徑" } @@ -15842,7 +15917,7 @@ "sv_SE": "Sparar konsolloggning till en loggfil på disk. Påverkar inte prestandan.", "th_TH": "บันทึกประวัติคอนโซลลงในไฟล์บันทึก จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Konsol loglarını diskte bir log dosyasına kaydeder. Performansı etkilemez.", - "uk_UA": "Зберігає журнал консолі у файл журналу на диску. Не впливає на продуктивність.", + "uk_UA": "Зберігає консольне ведення журналу у файл на диску. Не впливає на продуктивність.", "zh_CN": "将控制台日志保存到硬盘文件,不影响性能。", "zh_TW": "將控制台日誌儲存到磁碟上的日誌檔案中。不會影響效能。" } @@ -15867,7 +15942,7 @@ "sv_SE": "Skriver ut stubbloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Stub log mesajlarını konsola yazdırır. Performansı etkilemez.", - "uk_UA": "Друкує повідомлення журналу-заглушки на консолі. Не впливає на продуктивність.", + "uk_UA": "Відображає повідомлення журналу-заглушки (tub log) в консолі. Не впливає на продуктивність.", "zh_CN": "在控制台中显示存根日志,不影响性能。", "zh_TW": "在控制台中輸出日誌訊息。不會影響效能。" } @@ -15892,7 +15967,7 @@ "sv_SE": "Skriver ut informationsloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความบันทึกข้อมูลในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Bilgi log mesajlarını konsola yazdırır. Performansı etkilemez.", - "uk_UA": "Друкує повідомлення інформаційного журналу на консолі. Не впливає на продуктивність.", + "uk_UA": "Виводить повідомлення журналу інформації (info log) в консоль. Не впливає на продуктивність.", "zh_CN": "在控制台中显示信息日志,不影响性能。", "zh_TW": "在控制台中輸出資訊日誌訊息。不會影響效能。" } @@ -15917,7 +15992,7 @@ "sv_SE": "Skriver ut varningsloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติการเตือนในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Uyarı log mesajlarını konsola yazdırır. Performansı etkilemez.", - "uk_UA": "Друкує повідомлення журналу попереджень у консолі. Не впливає на продуктивність.", + "uk_UA": "Додає повідомлення журналу попереджень (warning log) до консолі. Не впливає на продуктивність.", "zh_CN": "在控制台中显示警告日志,不影响性能。", "zh_TW": "在控制台中輸出警告日誌訊息。不會影響效能。" } @@ -15942,7 +16017,7 @@ "sv_SE": "Skriver ut felloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความบันทึกข้อผิดพลาดในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Hata log mesajlarını konsola yazdırır. Performansı etkilemez.", - "uk_UA": "Друкує повідомлення журналу помилок у консолі. Не впливає на продуктивність.", + "uk_UA": "Додає повідомлення журналу помилок (error log) до консолі. Не впливає на продуктивність.", "zh_CN": "在控制台中显示错误日志,不影响性能。", "zh_TW": "在控制台中輸出錯誤日誌訊息。不會影響效能。" } @@ -15967,7 +16042,7 @@ "sv_SE": "Skriver ut spårloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติการติดตามในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Trace log mesajlarını konsola yazdırır. Performansı etkilemez.", - "uk_UA": "Друкує повідомлення журналу трасування на консолі. Не впливає на продуктивність.", + "uk_UA": "Додає повідомлення журналу трасування (trace log) до консолі. Не впливає на продуктивність.", "zh_CN": "在控制台中显示跟踪日志。", "zh_TW": "在控制台中輸出追蹤日誌訊息。不會影響效能。" } @@ -15992,7 +16067,7 @@ "sv_SE": "Skriver ut gästloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติของผู้เยี่ยมชมในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Guest log mesajlarını konsola yazdırır. Performansı etkilemez.", - "uk_UA": "Друкує повідомлення журналу гостей у консолі. Не впливає на продуктивність.", + "uk_UA": "Додає повідомлення журналу гостей (guest log) до консолі. Не впливає на продуктивність.", "zh_CN": "在控制台中显示访客日志,不影响性能。", "zh_TW": "在控制台中輸出客體日誌訊息。不會影響效能。" } @@ -16017,7 +16092,7 @@ "sv_SE": "Skriver ut loggmeddelanden för filåtkomst i konsollen.", "th_TH": "พิมพ์ข้อความบันทึกการเข้าถึงไฟล์ในคอนโซล", "tr_TR": "Dosya sistemi erişim log mesajlarını konsola yazdırır.", - "uk_UA": "Друкує повідомлення журналу доступу до файлів у консолі.", + "uk_UA": "Виводить повідомлення журналу доступу (access log) до файлів в консоль.", "zh_CN": "在控制台中显示文件访问日志。", "zh_TW": "在控制台中輸出檔案存取日誌訊息。" } @@ -16042,7 +16117,7 @@ "sv_SE": "Aktiverar loggutdata för filsystemsåtkomst i konsollen. Möjliga lägen är 0-3", "th_TH": "เปิดใช้งาน เอาต์พุตประวัติการเข้าถึง FS ไปยังคอนโซล โหมดที่เป็นไปได้คือ 0-3", "tr_TR": "Konsola FS erişim loglarının yazılmasını etkinleştirir. Kullanılabilir modlar 0-3'tür", - "uk_UA": "Вмикає виведення журналу доступу до FS на консоль. Можливі режими 0-3", + "uk_UA": "Вмикає виведення журналу доступу (access log) до FS на консоль. Можливі режими 0-3", "zh_CN": "在控制台中显示文件系统访问日志,可选模式为 0-3。", "zh_TW": "啟用檔案系統存取日誌輸出到控制台中。可能的模式為 0 到 3" } @@ -16057,7 +16132,7 @@ "es_ES": "Usar con cuidado", "fr_FR": "À utiliser avec précaution", "he_IL": "השתמש בזהירות", - "it_IT": "Usa con attenzione", + "it_IT": "Usa con cautela", "ja_JP": "使用上の注意", "ko_KR": "주의해서 사용", "no_NO": "Bruk med forsiktighet", @@ -16067,7 +16142,7 @@ "sv_SE": "Använd med försiktighet", "th_TH": "โปรดใช้ด้วยความระมัดระวัง", "tr_TR": "Dikkatli kullanın", - "uk_UA": "Використовуйте з обережністю", + "uk_UA": "Використовувати обережно", "zh_CN": "请谨慎使用", "zh_TW": "謹慎使用" } @@ -16092,7 +16167,7 @@ "sv_SE": "Kräver att lämpliga loggnivåer aktiveras", "th_TH": "จำเป็นต้องเปิดใช้งานระดับบันทึกที่เหมาะสม", "tr_TR": "Uygun log seviyesinin aktif olmasını gerektirir", - "uk_UA": "Потрібно увімкнути відповідні рівні журналу", + "uk_UA": "Потрібно увімкнути відповідні рівні журналу (log)", "zh_CN": "需要启用适当的日志级别", "zh_TW": "需要啟用適當的日誌等級" } @@ -16117,7 +16192,7 @@ "sv_SE": "Skriver ut felsökningsloggmeddelanden i konsolen.\n\nAnvänd endast detta om det är specifikt instruerat av en medarbetare, eftersom det kommer att göra loggar svåra att läsa och försämra emulatorprestanda.", "th_TH": "พิมพ์ข้อความประวัติการแก้ไขข้อบกพร่องในคอนโซล\n\nใช้สิ่งนี้เฉพาะเมื่อได้รับคำแนะนำจากผู้ดูแลเท่านั้น เนื่องจากจะทำให้บันทึกอ่านยากและทำให้ประสิทธิภาพของโปรแกรมจำลองแย่ลง", "tr_TR": "Debug log mesajlarını konsola yazdırır.\n\nBu seçeneği yalnızca geliştirici üyemiz belirtirse aktifleştirin, çünkü bu seçenek log dosyasını okumayı zorlaştırır ve emülatörün performansını düşürür.", - "uk_UA": "Друкує повідомлення журналу налагодження на консолі.\n\nВикористовуйте це лише за спеціальною вказівкою співробітника, оскільки це ускладнить читання журналів і погіршить роботу емулятора.", + "uk_UA": "Виводить повідомлення журналу налагодження в консолі.\n\nВикористовуйте лише за спеціальною вказівкою розробника, оскільки увімкнення цього параметру ускладнить читання журналів (logs) і погіршить роботу емулятора.", "zh_CN": "在控制台中显示调试日志。\n\n仅在特别需要时使用此功能,因为它会导致日志信息难以阅读,并降低模拟器性能。", "zh_TW": "在控制台中輸出偵錯日誌訊息。\n\n只有在人員特別指示的情況下才能使用,因為這會導致日誌難以閱讀,並降低模擬器效能。" } @@ -16132,7 +16207,7 @@ "es_ES": "Abre el explorador de archivos para elegir un archivo compatible con Switch para cargar", "fr_FR": "Ouvre l'explorateur de fichiers pour choisir un fichier compatible Switch à charger", "he_IL": "פתח סייר קבצים כדי לבחור קובץ תואם סוויץ' לטעינה", - "it_IT": "Apri un file explorer per scegliere un file compatibile Switch da caricare", + "it_IT": "Apri un selettore file per scegliere un file compatibile con Switch da caricare", "ja_JP": "ロードする Switch 互換のファイルを選択するためファイルエクスプローラを開きます", "ko_KR": "파일 탐색기를 열어 불러올 Switch 호환 파일을 선택", "no_NO": "Åpne filutforsker for å velge en Switch kompatibel fil å laste", @@ -16142,7 +16217,7 @@ "sv_SE": "Öppna en filutforskare för att välja en Switch-kompatibel fil att läsa in", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", "tr_TR": "Switch ile uyumlu bir dosya yüklemek için dosya tarayıcısını açar", - "uk_UA": "Відкриває файловий провідник, щоб вибрати для завантаження сумісний файл Switch", + "uk_UA": "Відкриває Файловий провідник, щоб обрати для завантаження сумісний зі Switch файл", "zh_CN": "选择 Switch 游戏文件并加载", "zh_TW": "開啟檔案總管,選擇與 Switch 相容的檔案來載入" } @@ -16157,7 +16232,7 @@ "es_ES": "Abre el explorador de archivos para elegir un archivo desempaquetado y compatible con Switch para cargar", "fr_FR": "Ouvre l'explorateur de fichiers pour choisir une application Switch compatible et décompressée à charger", "he_IL": "פתח סייר קבצים כדי לבחור יישום תואם סוויץ', לא ארוז לטעינה.", - "it_IT": "Apri un file explorer per scegliere un file compatibile Switch, applicazione sfusa da caricare", + "it_IT": "Apri un selettore file per scegliere un'applicazione estratta compatibile con Switch da caricare", "ja_JP": "ロードする Switch 互換の展開済みアプリケーションを選択するためファイルエクスプローラを開きます", "ko_KR": "Switch와 호환되는 압축 해제된 앱을 선택하여 불러오려면 파일 탐색기를 엽니다.", "no_NO": "Åpne en filutforsker for å velge en Switch kompatibel, upakket applikasjon for å laste", @@ -16167,7 +16242,7 @@ "sv_SE": "Öppna en filutforskare för att välja en Switch-kompatibel, uppackad applikation att läsa in", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", "tr_TR": "Switch ile uyumlu ayrıştırılmamış bir uygulama yüklemek için dosya tarayıcısını açar", - "uk_UA": "Відкриває файловий провідник, щоб вибрати сумісну з комутатором розпаковану програму для завантаження", + "uk_UA": "Відкриває Файловий провідник, щоб обрати сумісну зі Switch розпаковану програму для завантаження", "zh_CN": "选择解包后的 Switch 游戏目录并加载", "zh_TW": "開啟檔案總管,選擇與 Switch 相容且未封裝的應用程式來載入" } @@ -16182,7 +16257,7 @@ "es_ES": "Abrir un explorador de archivos para seleccionar una o más carpetas para cargar DLC de forma masiva", "fr_FR": "Ouvre l'explorateur de fichier pour choisir un ou plusieurs dossiers duquel charger les DLC", "he_IL": "", - "it_IT": "Apri un esploratore file per scegliere una o più cartelle dalle quali caricare DLC in massa", + "it_IT": "Apri un selettore file per scegliere una o più cartelle dalle quali caricare DLC in blocco", "ja_JP": "", "ko_KR": "파일 탐색기를 열어 DLC를 일괄 불러오기할 폴더를 하나 이상 선택", "no_NO": "Åpne en filutforsker for å velge en eller flere mapper å laste inn DLC fra", @@ -16192,7 +16267,7 @@ "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla DLC från", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลด DLC จำนวนมาก", "tr_TR": "", - "uk_UA": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження DLC", + "uk_UA": "Відкриває Файловий провідник для обрання однієї або декількох тек для масового завантаження DLC", "zh_CN": "打开文件资源管理器以选择一个或多个文件夹来批量加载DLC。", "zh_TW": "開啟檔案總管,選擇一個或多個資料夾來大量載入 DLC" } @@ -16207,7 +16282,7 @@ "es_ES": "Abrir un explorador de archivos para seleccionar una o más carpetas para cargar actualizaciones de título de forma masiva", "fr_FR": "Ouvre l'explorateur de fichier pour choisir un ou plusieurs dossiers duquel charger les mises à jour", "he_IL": "", - "it_IT": "Apri un esploratore file per scegliere una o più cartelle dalle quali caricare aggiornamenti in massa", + "it_IT": "Apri un selettore file per scegliere una o più cartelle dalle quali caricare aggiornamenti in blocco", "ja_JP": "", "ko_KR": "파일 탐색기를 열어 하나 이상의 폴더를 선택하여 대량으로 타이틀 업데이트 불러오기", "no_NO": "Åpne en filutforsker for å velge en eller flere mapper som du vil laste inn titteloppdateringer fra", @@ -16217,7 +16292,7 @@ "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla titeluppdateringar från", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลดไฟล์อัปเดตจำนวนมาก", "tr_TR": "", - "uk_UA": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження оновлень заголовків", + "uk_UA": "Відкриває Файловий провідник для обрання однієї або декількох тек для масового завантаження оновлень", "zh_CN": "打开文件资源管理器以选择一个或多个文件夹来批量加载游戏更新。", "zh_TW": "開啟檔案總管,選擇一個或多個資料夾來大量載入遊戲更新" } @@ -16242,7 +16317,7 @@ "sv_SE": "Öppna Ryujinx-filsystemsmappen", "th_TH": "เปิดโฟลเดอร์ระบบไฟล์ Ryujinx", "tr_TR": "Ryujinx dosya sistem klasörünü açar", - "uk_UA": "Відкриває теку файлової системи Ryujinx", + "uk_UA": "Відкриває теку з файлами Ryujinx", "zh_CN": "打开 Ryujinx 模拟器系统目录", "zh_TW": "開啟 Ryujinx 檔案系統資料夾" } @@ -16267,7 +16342,7 @@ "sv_SE": "Öppnar mappen där loggarna har skrivits till", "th_TH": "เปิดโฟลเดอร์ ที่เก็บไฟล์ประวัติ", "tr_TR": "Log dosyalarının bulunduğu klasörü açar", - "uk_UA": "Відкриває теку, куди записуються журнали", + "uk_UA": "Відкриває теку, куди записуються журнали (logs)", "zh_CN": "打开日志存放的目录", "zh_TW": "開啟日誌被寫入的資料夾" } @@ -16642,7 +16717,7 @@ "sv_SE": "Hantera fusk", "th_TH": "ฟังก์ชั่นจัดการสูตรโกง", "tr_TR": "Hileleri yönetmeyi sağlar", - "uk_UA": "Керування читами", + "uk_UA": "Відкриває меню керування чит-кодами (cheats)", "zh_CN": "管理当前游戏的金手指", "zh_TW": "管理密技" } @@ -16692,7 +16767,7 @@ "sv_SE": "Hantera moddar", "th_TH": "ฟังก์ชั่นจัดการม็อด", "tr_TR": "Modları Yönet", - "uk_UA": "Керування модами", + "uk_UA": "Відкриває меню керування модифікаціями (mods)", "zh_CN": "管理当前游戏的 MOD", "zh_TW": "管理模組" } @@ -16917,7 +16992,7 @@ "sv_SE": "CPU-cache", "th_TH": "แคชซีพียู", "tr_TR": "İşlemci Belleği", - "uk_UA": "Кеш ЦП", + "uk_UA": "Кеш CPU", "zh_CN": "CPU 缓存", "zh_TW": "CPU 快取" } @@ -16942,7 +17017,7 @@ "sv_SE": "CPU-läge", "th_TH": "โหมดซีพียู", "tr_TR": "CPU Hafızası", - "uk_UA": "Пам'ять ЦП", + "uk_UA": "Режим CPU", "zh_CN": "CPU 模式", "zh_TW": "CPU 模式" } @@ -17017,7 +17092,7 @@ "sv_SE": "Ikonstorlek", "th_TH": "ขนาดไอคอน", "tr_TR": "Ikon Boyutu", - "uk_UA": "Розмір значка", + "uk_UA": "Розмір обкладинки", "zh_CN": "图标尺寸", "zh_TW": "圖示大小" } @@ -17042,7 +17117,7 @@ "sv_SE": "Ändra storleken för spelikonerna", "th_TH": "เปลี่ยนขนาดของไอคอนเกม", "tr_TR": "Oyun ikonlarının boyutunu değiştirmeyi sağlar", - "uk_UA": "Змінити розмір значків гри", + "uk_UA": "Змінити розмір обкладинок (значків) ігор", "zh_CN": "更改游戏图标的显示尺寸", "zh_TW": "變更遊戲圖示的大小" } @@ -17157,7 +17232,7 @@ "es_ES": "Error al analizar el firmware", "fr_FR": "Erreur d'analyse du firmware", "he_IL": "שגיאת ניתוח קושחה", - "it_IT": "Errori di analisi del firmware", + "it_IT": "Errore di analisi del firmware", "ja_JP": "ファームウェアのパーズエラー", "ko_KR": "펌웨어 구문 분석 오류", "no_NO": "Fastvare analysefeil", @@ -17192,7 +17267,7 @@ "sv_SE": "Applikationen hittades inte", "th_TH": "ไม่พบ แอปพลิเคชัน", "tr_TR": "Uygulama bulunamadı", - "uk_UA": "Додаток не знайдено", + "uk_UA": "Застосунок не знайдено", "zh_CN": "找不到游戏程序", "zh_TW": "找不到應用程式" } @@ -17342,7 +17417,7 @@ "sv_SE": "Ryujinx kunde inte hitta en giltig applikation i angiven sökväg.", "th_TH": "Ryujinx ไม่พบแอปพลิเคชันที่ถูกต้องในที่เก็บไฟล์ที่กำหนด", "tr_TR": "Ryujinx belirtilen yolda geçerli bir uygulama bulamadı.", - "uk_UA": "Ryujinx не вдалося знайти дійсний додаток за вказаним шляхом", + "uk_UA": "Ryujinx не вдалося знайти дійсний застосунок (гру) за вказаним шляхом", "zh_CN": "Ryujinx 模拟器在所选路径中找不到有效的游戏程序。", "zh_TW": "Ryujinx 無法在指定路徑下找到有效的應用程式。" } @@ -17392,7 +17467,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": "發生未定義錯誤! 這種情況不應該發生,請聯絡開發人員!" } @@ -17442,7 +17517,7 @@ "sv_SE": "Ingen uppdatering", "th_TH": "ไม่มีการอัปเดต", "tr_TR": "Güncelleme Yok", - "uk_UA": "Немає оновлень", + "uk_UA": "НБез оновлень", "zh_CN": "无更新(默认版本)", "zh_TW": "沒有更新" } @@ -17482,7 +17557,7 @@ "es_ES": "Incorporado: Versión {0}", "fr_FR": "Inclus avec le jeu: Version {0}", "he_IL": "", - "it_IT": "In bundle: Versione {0}", + "it_IT": "Incluso: Versione {0}", "ja_JP": "", "ko_KR": "번들 : 버전 {0}", "no_NO": "Pakket: Versjon {0}", @@ -17507,7 +17582,7 @@ "es_ES": "Incorporado:", "fr_FR": "Inclus avec le jeu :", "he_IL": "", - "it_IT": "In bundle:", + "it_IT": "Incluso:", "ja_JP": "", "ko_KR": "번들 :", "no_NO": "Pakket:", @@ -17544,7 +17619,7 @@ "tr_TR": "", "uk_UA": "Часткові", "zh_CN": "分区", - "zh_TW": "" + "zh_TW": "部分" } }, { @@ -17557,7 +17632,7 @@ "es_ES": "Sin recortar", "fr_FR": "Non réduit", "he_IL": "", - "it_IT": "Non Trimmato", + "it_IT": "Dim. originale", "ja_JP": "", "ko_KR": "트리밍되지 않음", "no_NO": "Ikke trimmet", @@ -17569,7 +17644,7 @@ "tr_TR": "", "uk_UA": "Необрізані", "zh_CN": "没有瘦身的", - "zh_TW": "" + "zh_TW": "未修剪" } }, { @@ -17582,7 +17657,7 @@ "es_ES": "Recortado", "fr_FR": "Réduit", "he_IL": "", - "it_IT": "Trimmato", + "it_IT": "Dim. ridotta", "ja_JP": "", "ko_KR": "트리밍됨", "no_NO": "Trimmet", @@ -17594,7 +17669,7 @@ "tr_TR": "", "uk_UA": "Обрізані", "zh_CN": "经过瘦身的", - "zh_TW": "" + "zh_TW": "已修剪" } }, { @@ -17619,7 +17694,7 @@ "tr_TR": "", "uk_UA": "(Невдача)", "zh_CN": "(失败)", - "zh_TW": "" + "zh_TW": "(失敗)" } }, { @@ -17632,7 +17707,7 @@ "es_ES": "Ahorra {0:n0} Mb", "fr_FR": "Sauvegarde de {0:n0} Mo", "he_IL": "", - "it_IT": "Salva {0:n0} Mb", + "it_IT": "Risparmia {0:n0} MB", "ja_JP": "", "ko_KR": "{0:n0} Mb 저장", "no_NO": "Spare {0:n0} Mb", @@ -17644,7 +17719,7 @@ "tr_TR": "", "uk_UA": "Зберегти {0:n0} Мб", "zh_CN": "能节约 {0:n0} Mb", - "zh_TW": "" + "zh_TW": "可節省 {0:n0} Mb" } }, { @@ -17657,7 +17732,7 @@ "es_ES": "{0:n0} Mb ahorrado(s)", "fr_FR": "Sauvegardé {0:n0} Mo", "he_IL": "", - "it_IT": "Salva {0:n0} Mb", + "it_IT": "Risparmiati {0:n0} MB", "ja_JP": "", "ko_KR": "{0:n0}Mb 저장됨", "no_NO": "Spart {0:n0} Mb", @@ -17669,7 +17744,7 @@ "tr_TR": "", "uk_UA": "Збережено {0:n0} Мб", "zh_CN": "节约了 {0:n0} Mb", - "zh_TW": "" + "zh_TW": "已節省 {0:n0} Mb" } }, { @@ -17843,8 +17918,8 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", - "zh_TW": "" + "zh_CN": "档案对话框", + "zh_TW": "Cabinet 對話方塊" } }, { @@ -17857,7 +17932,7 @@ "es_ES": "Ingresa el nuevo nombre de tu Amiibo", "fr_FR": "Entrer le nouveau nom de votre Amiibo", "he_IL": "", - "it_IT": "", + "it_IT": "Inserisci il nuovo nome del tuo Amiibo", "ja_JP": "", "ko_KR": "Amiibo의 새 이름 입력하기", "no_NO": "Skriv inn Amiiboens nye navn", @@ -17869,7 +17944,7 @@ "tr_TR": "", "uk_UA": "Вкажіть Ваше нове ім'я Amiibo", "zh_CN": "输入你的 Amiibo 的新名字", - "zh_TW": "" + "zh_TW": "輸入 Amiibo 的新名稱" } }, { @@ -17882,7 +17957,7 @@ "es_ES": "Escanea tu Amiibo ahora.", "fr_FR": "Veuillez scannez votre Amiibo.", "he_IL": "", - "it_IT": "", + "it_IT": "Scansiona ora il tuo Amiibo.", "ja_JP": "", "ko_KR": "지금 Amiibo를 스캔하세요.", "no_NO": "Vennligst skann Amiiboene dine nå.", @@ -17894,7 +17969,7 @@ "tr_TR": "", "uk_UA": "Будь ласка, проскануйте Ваш Amiibo.", "zh_CN": "请现在扫描你的 Amiibo", - "zh_TW": "" + "zh_TW": "請掃描你的 Amiibo。" } }, { @@ -17932,7 +18007,7 @@ "es_ES": "Debe ser sólo 0-9 o '.'", "fr_FR": "Doit être 0-9 ou '.' uniquement", "he_IL": "חייב להיות בין 0-9 או '.' בלבד", - "it_IT": "Deve essere solo 0-9 o '.'", + "it_IT": "Può contenere solo numeri o '.'", "ja_JP": "0-9 または '.' のみでなければなりません", "ko_KR": "0-9 또는 '.'만 가능", "no_NO": "Må kun være 0-9 eller '.'", @@ -17957,7 +18032,7 @@ "es_ES": "Solo deben ser caracteres no CJK", "fr_FR": "Doit être uniquement des caractères non CJK", "he_IL": "מחויב להיות ללא אותיות CJK", - "it_IT": "Deve essere solo caratteri non CJK", + "it_IT": "Può contenere solo caratteri non CJK", "ja_JP": "CJK文字以外のみ", "ko_KR": "CJK 문자가 아닌 문자만 가능", "no_NO": "Må kun være uten CJK-tegn", @@ -17982,7 +18057,7 @@ "es_ES": "Solo deben ser texto ASCII", "fr_FR": "Doit être uniquement du texte ASCII", "he_IL": "מחויב להיות טקסט אסקיי", - "it_IT": "Deve essere solo testo ASCII", + "it_IT": "Può contenere solo testo ASCII", "ja_JP": "ASCII文字列のみ", "ko_KR": "ASCII 텍스트만 가능", "no_NO": "Må være kun ASCII-tekst", @@ -18107,7 +18182,7 @@ "es_ES": "Renombrando archivos viejos...", "fr_FR": "Renommage des anciens fichiers...", "he_IL": "משנה שמות של קבצים ישנים...", - "it_IT": "Rinominazione dei vecchi files...", + "it_IT": "Ridenominazione dei vecchi file...", "ja_JP": "古いファイルをリネーム中...", "ko_KR": "오래된 파일 이름 바꾸기...", "no_NO": "Omdøper gamle filer...", @@ -18782,7 +18857,7 @@ "es_ES": "Archivo de tema Xaml", "fr_FR": "Fichier thème Xaml", "he_IL": "קובץ ערכת נושא Xaml", - "it_IT": "File del tema xaml", + "it_IT": "File del tema XAML", "ja_JP": "Xaml テーマファイル", "ko_KR": "Xaml 테마 파일", "no_NO": "Xaml tema-fil", @@ -19007,7 +19082,7 @@ "es_ES": "Verificar y recortar archivo XCI", "fr_FR": "Vérifier et Réduire le fichier XCI", "he_IL": "", - "it_IT": "Controlla e Trimma i file XCI ", + "it_IT": "Controlla e riduci la dimensione del file XCI", "ja_JP": "", "ko_KR": "XCI 파일 확인 및 정리", "no_NO": "Kontroller og trim XCI-filen", @@ -19019,7 +19094,7 @@ "tr_TR": "", "uk_UA": "Перевірити та Обрізати XCI файл", "zh_CN": "检查并瘦身XCI文件", - "zh_TW": "" + "zh_TW": "檢查及修剪 XCI 檔案" } }, { @@ -19032,7 +19107,7 @@ "es_ES": "Esta función verificará el espacio vacío y después recortará el archivo XCI para ahorrar espacio en disco", "fr_FR": "Cette fonction va vérifier l'espace vide, puis réduire le fichier XCI pour économiser de l'espace de disque dur.", "he_IL": "", - "it_IT": "Questa funzionalita controllerà prima lo spazio libero e poi trimmerà il file XCI per liberare dello spazio.", + "it_IT": "Questa funzionalità controllerà prima lo spazio libero e poi ridurrà la dimensione del file XCI per risparmiare spazio su disco.", "ja_JP": "", "ko_KR": "이 기능은 먼저 충분한 공간을 확보한 다음 XCI 파일을 트리밍하여 디스크 공간을 절약합니다.", "no_NO": "Denne funksjonen kontrollerer først hvor mye plass som er ledig, og trimmer deretter XCI-filen for å spare diskplass.", @@ -19042,9 +19117,9 @@ "sv_SE": "Denna funktion kommer först att kontrollera ledigt utrymme och sedan optimera XCI-filen för att spara diskutrymme.", "th_TH": "", "tr_TR": "", - "uk_UA": "Ця функція спочатку перевірить вільний простір, а потім обрізатиме файл XCI для економії місця на диску.", + "uk_UA": "Ця функція спочатку перевірить наявність порожнього місця, після чого обріже файл XCI для економії місця на диску.", "zh_CN": "这个功能将会先检查XCI文件,再对其执行瘦身操作以节约磁盘空间。", - "zh_TW": "" + "zh_TW": "此功能首先檢查 XCI 檔案是否有可修剪的字元,然後修剪檔案以節省儲存空間。" } }, { @@ -19057,7 +19132,7 @@ "es_ES": "Tamaño de archivo actual: {0:n} MB\nTamaño de datos de juego: {1:n} MB\nAhorro de espacio en disco: {2:n} MB", "fr_FR": "Taille actuelle du fichier: {0:n} MB\nTaille des données de jeux: {1:n} MB\nÉconomie d'espaces sur le disque: {2:n} MB", "he_IL": "", - "it_IT": "Dimensioni Attuali File: {0:n} MB\nDimensioni Dati Gioco: {1:n} MB\nRisparimio Spazio Disco: {2:n} MB", + "it_IT": "Dimensione attuale del file: {0:n} MB\nDimensione dei dati del gioco: {1:n} MB\nRisparmio spazio su disco: {2:n} MB", "ja_JP": "", "ko_KR": "현재 파일 크기 : {0:n}MB\n게임 데이터 크기 : {1:n}MB\n디스크 공간 절약 : {2:n}MB", "no_NO": "Nåværende filstørrelse: 0:n MB\nSpilldatastørrelse: {1:n} MB\nDiskplassbesparelse: {2:n} MB", @@ -19069,7 +19144,7 @@ "tr_TR": "", "uk_UA": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB", "zh_CN": "当前文件大小: {0:n} MB\n游戏数据大小: {1:n} MB\n节约的磁盘空间: {2:n} MB", - "zh_TW": "" + "zh_TW": "現在的檔案大小: {0:n} MB\n遊戲資料大小: {1:n} MB\n節省的儲存空間: {2:n} MB" } }, { @@ -19082,7 +19157,7 @@ "es_ES": "El archivo XCI no necesita ser recortado. Verifica los logs para más detalles.", "fr_FR": "Fichier XCI n'a pas besoin d'être réduit. Regarder les journaux pour plus de détails", "he_IL": "", - "it_IT": "Il file XCI non deve essere trimmato. Controlla i log per ulteriori dettagli", + "it_IT": "Non è necessario ridurre la dimensione del file XCI. Controlla i log per ulteriori dettagli", "ja_JP": "", "ko_KR": "XCI 파일은 트리밍할 필요가 없습니다. 자세한 내용은 로그를 확인", "no_NO": "XCI-filen trenger ikke å trimmes. Sjekk loggene for mer informasjon", @@ -19092,9 +19167,9 @@ "sv_SE": "XCI-filen behöver inte optimeras. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", - "uk_UA": "XCI файл не потребує обрізання. Перевірте журнали для додаткової інформації", + "uk_UA": "XCI файл не потребує обрізання. Перевірте журнали (logs) для отримання додаткової інформації", "zh_CN": "XCI文件不需要被瘦身。查看日志以获得更多细节。", - "zh_TW": "" + "zh_TW": "XCI 檔案不需要修剪。檢查日誌以取得更多資訊" } }, { @@ -19107,7 +19182,7 @@ "es_ES": "El recorte del archivo XCI no puede ser deshecho. Verifica los registros para más detalles.", "fr_FR": "Fichier XCI ne peut pas être dé-réduit. Regarder les journaux pour plus de détails", "he_IL": "", - "it_IT": "Il file XCI non può essere untrimmato. Controlla i log per ulteriori dettagli", + "it_IT": "Il file XCI non può essere riportato alla sua dimensione originale. Controlla i log per ulteriori dettagli", "ja_JP": "", "ko_KR": "XCI 파일은 트리밍을 해제할 수 없습니다. 자세한 내용은 로그를 확인", "no_NO": "XCI-filen kan ikke trimmes. Sjekk loggene for mer informasjon", @@ -19117,9 +19192,9 @@ "sv_SE": "XCI-filen kan inte avoptimeras. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", - "uk_UA": "XCI файл не може бути обрізаний. Перевірте журнали для додаткової інформації", + "uk_UA": "XCI файл не може бути обрізаний. Перевірте журнали (logs) для отримання додаткової інформації", "zh_CN": "XCI文件不能被瘦身。查看日志以获得更多细节。", - "zh_TW": "" + "zh_TW": "XCI 檔案不能被修剪。檢查日誌以取得更多資訊" } }, { @@ -19132,7 +19207,7 @@ "es_ES": "El archivo XCI es de solo Lectura y no se le puede escribir. Lee el registro para más información.", "fr_FR": "Fichier XCI est en Lecture Seule et n'a pas pu être rendu accessible en écriture. Regarder les journaux pour plus de détails", "he_IL": "", - "it_IT": "Il file XCI è in sola lettura e non può essere reso Scrivibile. Controlla i log per ulteriori dettagli", + "it_IT": "Il file XCI è in sola lettura e non può essere reso accessibile in scrittura. Controlla i log per ulteriori dettagli", "ja_JP": "", "ko_KR": "XCI 파일은 읽기 전용이므로 쓰기 가능하게 만들 수 없습니다. 자세한 내용은 로그를 확인", "no_NO": "XCI-filen er skrivebeskyttet og kunne ikke gjøres skrivbar. Sjekk loggene for mer informasjon", @@ -19142,9 +19217,9 @@ "sv_SE": "XCI-filen är skrivskyddad och kunde inte göras skrivbar. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", - "uk_UA": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали додаткової інформації", + "uk_UA": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали (logs) для отримання додаткової інформації", "zh_CN": "XCI文件是只读的,且不可以被标记为可读取的。查看日志以获得更多细节。", - "zh_TW": "" + "zh_TW": "XCI 檔案是唯讀,並且無法改成可寫入。檢查日誌以取得更多資訊" } }, { @@ -19157,7 +19232,7 @@ "es_ES": "El archivo XCI ha cambiado de tamaño desde que fue escaneado. Verifica que no se esté escribiendo al archivo y vuelve a intentarlo.", "fr_FR": "Fichier XCI a changé en taille depuis qu'il a été scanné. Vérifier que le fichier n'est pas en cours d'écriture et réessayer.", "he_IL": "", - "it_IT": "Il file XCI ha cambiato dimensioni da quando è stato scansionato. Controlla che il file non stia venendo scritto da qualche altro programma e poi riprova.", + "it_IT": "La dimensione del file XCI è cambiata da quando è stato scansionato. Controlla che il file non stia venendo scritto da qualche altro programma e poi riprova.", "ja_JP": "", "ko_KR": "XCI 파일이 스캔된 후 크기가 변경되었습니다. 파일이 쓰여지고 있지 않은지 확인하고 다시 시도하세요.", "no_NO": "XCI File har endret størrelse siden den ble skannet. Kontroller at det ikke skrives til filen, og prøv på nytt.", @@ -19169,7 +19244,7 @@ "tr_TR": "", "uk_UA": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову", "zh_CN": "XCI文件在扫描后大小发生了变化。请检查文件是否未被写入,然后重试。", - "zh_TW": "" + "zh_TW": "XCI 檔案大小比較上次的掃瞄已經改變。請檢查檔案是否未被寫入,然後再嘗試。" } }, { @@ -19182,7 +19257,7 @@ "es_ES": "El archivo XCI tiene datos en el área de espacio libre, no es seguro recortar.", "fr_FR": "Fichier XCI a des données dans la zone d'espace libre, ce n'est pas sûr de réduire", "he_IL": "", - "it_IT": "Il file XCI ha dati nello spazio libero, non è sicuro effettuare il trimming", + "it_IT": "Il file XCI contiene dei dati nello spazio libero, non è sicuro ridurne la dimensione", "ja_JP": "", "ko_KR": "XCI 파일에 여유 공간 영역에 데이터가 있으므로 트리밍하는 것이 안전하지 않음", "no_NO": "XCI-filen har data i ledig plass, og det er ikke trygt å trimme den", @@ -19194,7 +19269,7 @@ "tr_TR": "", "uk_UA": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна", "zh_CN": "XCI文件的空闲区域内有数据,不能安全瘦身。", - "zh_TW": "" + "zh_TW": "XCI 檔案有數據儲存於可節省儲存空間的區域,所以試圖修剪並不安全" } }, { @@ -19207,7 +19282,7 @@ "es_ES": "El archivo XCI contiene datos inválidos. Lee el registro para más información.", "fr_FR": "Fichier XCI contient des données invalides. Regarder les journaux pour plus de détails", "he_IL": "", - "it_IT": "Il file XCI contiene dati invlidi. Controlla i log per ulteriori dettagli", + "it_IT": "Il file XCI contiene dei dati non validi. Controlla i log per ulteriori dettagli", "ja_JP": "", "ko_KR": "XCI 파일에 유효하지 않은 데이터가 포함되어 있습니다. 자세한 내용은 로그를 확인", "no_NO": "XCI-filen inneholder ugyldige data. Sjekk loggene for ytterligere detaljer", @@ -19217,9 +19292,9 @@ "sv_SE": "XCI-filen innehåller ogiltig data. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", - "uk_UA": "XCI Файл містить недійсні дані. Перевірте журнали для додаткової інформації", + "uk_UA": "XCI Файл містить недійсні дані. Перевірте журнали (logs) для отримання додаткової інформації", "zh_CN": "XCI文件含有无效数据。查看日志以获得更多细节。", - "zh_TW": "" + "zh_TW": "XCI 檔案帶有無效的數據。檢查日誌以取得更多資訊" } }, { @@ -19232,7 +19307,7 @@ "es_ES": "El archivo XCI no se puede abrir para escribirlo. Lee el registro para más información.", "fr_FR": "Fichier XCI n'a pas pu été ouvert pour écriture. Regarder les journaux pour plus de détails", "he_IL": "", - "it_IT": "Il file XCI non può essere aperto per essere scritto. Controlla i log per ulteriori dettagli", + "it_IT": "Il file XCI non può essere aperto in scrittura. Controlla i log per ulteriori dettagli", "ja_JP": "", "ko_KR": "XCI 파일을 쓰기 위해 열 수 없습니다. 자세한 내용은 로그를 확인", "no_NO": "XCI-filen kunne ikke åpnes for skriving. Sjekk loggene for ytterligere detaljer", @@ -19244,7 +19319,7 @@ "tr_TR": "", "uk_UA": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації", "zh_CN": "XCI文件不能被读写。查看日志以获得更多细节。", - "zh_TW": "" + "zh_TW": "XCI 檔案不能被寫入。檢查日誌以取得更多資訊" } }, { @@ -19257,7 +19332,7 @@ "es_ES": "El recorte del archivo XCI falló", "fr_FR": "Réduction du fichier XCI a échoué", "he_IL": "", - "it_IT": "Trimming del file XCI fallito", + "it_IT": "Riduzione della dimensione del file XCI fallita", "ja_JP": "", "ko_KR": "XCI 파일 트리밍에 실패", "no_NO": "Trimming av XCI-filen mislyktes", @@ -19269,7 +19344,7 @@ "tr_TR": "", "uk_UA": "Не вдалося обрізати файл XCI", "zh_CN": "XCI文件瘦身失败", - "zh_TW": "" + "zh_TW": "修剪 XCI 檔案失敗" } }, { @@ -19282,7 +19357,7 @@ "es_ES": "La operación fue cancelada", "fr_FR": "L'opération a été annulée", "he_IL": "", - "it_IT": "Operazione Cancellata", + "it_IT": "L'operazione è stata annullata", "ja_JP": "", "ko_KR": "작업이 취소됨", "no_NO": "Operasjonen ble avlyst", @@ -19294,7 +19369,7 @@ "tr_TR": "", "uk_UA": "Операція перервана", "zh_CN": "操作已取消", - "zh_TW": "" + "zh_TW": "修剪已取消" } }, { @@ -19307,7 +19382,7 @@ "es_ES": "No se realizó ninguna operación", "fr_FR": "Aucune opération a été faite", "he_IL": "", - "it_IT": "Nessuna operazione è stata effettuata", + "it_IT": "Non è stata effettuata alcuna operazione", "ja_JP": "", "ko_KR": "작업이 수행되지 않음", "no_NO": "Ingen operasjon ble utført", @@ -19319,7 +19394,7 @@ "tr_TR": "", "uk_UA": "Операція не проводилася", "zh_CN": "未执行操作", - "zh_TW": "" + "zh_TW": "沒有修剪" } }, { @@ -19457,7 +19532,7 @@ "es_ES": "Recortador de archivos XCI", "fr_FR": "Rogneur de fichier XCI", "he_IL": "", - "it_IT": "", + "it_IT": "Riduci dimensioni dei file XCI", "ja_JP": "", "ko_KR": "XCI 파일 트리머", "no_NO": "", @@ -19469,7 +19544,7 @@ "tr_TR": "", "uk_UA": "Обрізка XCI Файлів", "zh_CN": "XCI文件瘦身器", - "zh_TW": "" + "zh_TW": "XCI 檔案修剪器" } }, { @@ -19482,7 +19557,7 @@ "es_ES": "{0} de {1} Título(s) seleccionado(s)", "fr_FR": "{0} sur {1} Fichier(s) Sélectionnés", "he_IL": "", - "it_IT": "{0} di {1} Titolo(i) Selezionati", + "it_IT": "{0} di {1} titoli selezionati", "ja_JP": "", "ko_KR": "{1}개 타이틀 중 {0}개 선택됨", "no_NO": "{0} av {1} Valgte tittel(er)", @@ -19494,7 +19569,7 @@ "tr_TR": "", "uk_UA": "{0} з {1} тайтл(ів) обрано", "zh_CN": "在 {1} 中选中了 {0} 个游戏 ", - "zh_TW": "" + "zh_TW": "已選擇 {1} 之 {0} 的遊戲" } }, { @@ -19507,7 +19582,7 @@ "es_ES": "{0} de {1} Título(s) seleccionado(s) ({2} mostrado(s))", "fr_FR": "{0} sur {1} Fichier(s) Sélectionnés ({2} affiché(s)", "he_IL": "", - "it_IT": "{0} of {1} Titolo(i) Selezionati ({2} visualizzato)", + "it_IT": "{0} di {1} titoli selezionati ({2} visualizzati)", "ja_JP": "", "ko_KR": "{1}개 타이틀 중 {0}개 선택됨({2}개 표시됨)", "no_NO": "{0} av {1} Tittel(er) valgt ({2} vises)", @@ -19519,7 +19594,7 @@ "tr_TR": "", "uk_UA": "{0} з {1} тайтл(ів) обрано ({2} відображається)", "zh_CN": "在 {1} 中选中了 {0} 个游戏 (显示了 {2} 个)", - "zh_TW": "" + "zh_TW": "已選擇 {1} 之 {0} 的遊戲 (已顯示 {2} 個)" } }, { @@ -19532,7 +19607,7 @@ "es_ES": "Recortando {0} Título(s)...", "fr_FR": "Réduction de {0} Fichier(s)...", "he_IL": "", - "it_IT": "Trimming {0} Titolo(i)...", + "it_IT": "Riduzione delle dimensioni di {0} titolo/i...", "ja_JP": "", "ko_KR": "{0}개의 타이틀을 트리밍 중...", "no_NO": "Trimming av {0} tittel(er)...", @@ -19544,7 +19619,7 @@ "tr_TR": "", "uk_UA": "Обрізка {0} тайтл(ів)...", "zh_CN": "{0} 个游戏瘦身中。。。", - "zh_TW": "" + "zh_TW": "正在修剪 {0} 個遊戲..." } }, { @@ -19557,7 +19632,7 @@ "es_ES": "Deshaciendo recorte de {0} Título(s)...", "fr_FR": "Dé-Réduction de {0} Fichier(s)...", "he_IL": "", - "it_IT": "Untrimming {0} Titolo(i)...", + "it_IT": "Ripristino alle dimensioni originali di {0} titolo/i...", "ja_JP": "", "ko_KR": "{0}개의 타이틀을 트리밍 해제 중...", "no_NO": "Untrimming {0} Tittel(er)...", @@ -19568,8 +19643,8 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Необрізаних {0} тайтл(ів)...", - "zh_CN": "", - "zh_TW": "" + "zh_CN": "正在精简 {0} 个游戏", + "zh_TW": "正在反修剪 {0} 個遊戲..." } }, { @@ -19594,7 +19669,7 @@ "tr_TR": "", "uk_UA": "Невдача", "zh_CN": "失败", - "zh_TW": "" + "zh_TW": "失敗" } }, { @@ -19607,7 +19682,7 @@ "es_ES": "Ahorro potencial", "fr_FR": "Économies potentielles d'espace de disque dur", "he_IL": "", - "it_IT": "Potenziali Salvataggi", + "it_IT": "Risparmio potenziale", "ja_JP": "", "ko_KR": "잠재적 비용 절감", "no_NO": "Potensielle besparelser", @@ -19619,7 +19694,7 @@ "tr_TR": "", "uk_UA": "Потенційна економія", "zh_CN": "潜在的储存空间节省", - "zh_TW": "" + "zh_TW": "潛在節省的儲存空間" } }, { @@ -19632,7 +19707,7 @@ "es_ES": "Ahorro real", "fr_FR": "Économies actualles d'espace de disque dur", "he_IL": "", - "it_IT": "Effettivi Salvataggi", + "it_IT": "Risparmio effettivo", "ja_JP": "", "ko_KR": "실제 비용 절감", "no_NO": "Faktiske besparelser", @@ -19644,7 +19719,7 @@ "tr_TR": "", "uk_UA": "Зекономлено", "zh_CN": "实际的储存空间节省", - "zh_TW": "" + "zh_TW": "實際節省的儲存空間" } }, { @@ -19657,7 +19732,7 @@ "es_ES": "", "fr_FR": "{0:n0} Mo", "he_IL": "", - "it_IT": "", + "it_IT": "{0:n0} MB", "ja_JP": "", "ko_KR": "{0:n0}MB", "no_NO": "", @@ -19682,7 +19757,7 @@ "es_ES": "Seleccionar mostrado(s)", "fr_FR": "Sélectionner Affiché", "he_IL": "", - "it_IT": "Seleziona Visualizzati", + "it_IT": "Seleziona visualizzati", "ja_JP": "", "ko_KR": "표시됨 선택", "no_NO": "Velg vist", @@ -19694,7 +19769,7 @@ "tr_TR": "", "uk_UA": "Вибрати показане", "zh_CN": "选定显示的", - "zh_TW": "" + "zh_TW": "選擇已顯示" } }, { @@ -19707,7 +19782,7 @@ "es_ES": "Deseleccionar mostrado(s)", "fr_FR": "Désélectionner Affiché", "he_IL": "", - "it_IT": "Deselziona Visualizzati", + "it_IT": "Deseleziona visualizzati", "ja_JP": "", "ko_KR": "표시됨 선택 취소", "no_NO": "Opphev valg av Vist", @@ -19719,7 +19794,7 @@ "tr_TR": "", "uk_UA": "Скасувати вибір показаного", "zh_CN": "反选显示的", - "zh_TW": "" + "zh_TW": "取消選擇已顯示" } }, { @@ -19742,9 +19817,9 @@ "sv_SE": "Titel", "th_TH": "", "tr_TR": "", - "uk_UA": "Заголовок", - "zh_CN": "", - "zh_TW": "" + "uk_UA": "Назва", + "zh_CN": "标题", + "zh_TW": "名稱" } }, { @@ -19757,7 +19832,7 @@ "es_ES": "Ahorro de espacio", "fr_FR": "Économies de disque dur", "he_IL": "", - "it_IT": "Salvataggio Spazio", + "it_IT": "Spazio risparmiato", "ja_JP": "", "ko_KR": "공간 절약s", "no_NO": "Plassbesparelser", @@ -19768,8 +19843,8 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Економія місця", - "zh_CN": "", - "zh_TW": "" + "zh_CN": "节省空间", + "zh_TW": "節省的儲存空間" } }, { @@ -19782,7 +19857,7 @@ "es_ES": "Recortar", "fr_FR": "Réduire", "he_IL": "", - "it_IT": "", + "it_IT": "Riduci dimensioni", "ja_JP": "", "ko_KR": "트림", "no_NO": "", @@ -19794,7 +19869,7 @@ "tr_TR": "", "uk_UA": "Обрізка", "zh_CN": "瘦身", - "zh_TW": "" + "zh_TW": "修剪" } }, { @@ -19807,7 +19882,7 @@ "es_ES": "Deshacer recorte", "fr_FR": "Dé-Réduire", "he_IL": "", - "it_IT": "", + "it_IT": "Riporta alle dimensioni originali", "ja_JP": "", "ko_KR": "언트림", "no_NO": "Utrim", @@ -19818,8 +19893,8 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Зшивання", - "zh_CN": "", - "zh_TW": "" + "zh_CN": "取消精简", + "zh_TW": "反修剪" } }, { @@ -19832,7 +19907,7 @@ "es_ES": "{0} nueva(s) actualización(es) agregada(s)", "fr_FR": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", "he_IL": "", - "it_IT": "{0} aggiornamento/i aggiunto/i", + "it_IT": "{0} nuovo/i aggiornamento/i aggiunto/i", "ja_JP": "", "ko_KR": "{0}개의 새 업데이트가 추가됨", "no_NO": "{0} ny(e) oppdatering(er) lagt til", @@ -19842,7 +19917,7 @@ "sv_SE": "{0} nya uppdatering(ar) lades till", "th_TH": "{0} อัพเดตที่เพิ่มมาใหม่", "tr_TR": "", - "uk_UA": "{0} нове оновлення додано", + "uk_UA": "{0} нових оновлень додано", "zh_CN": "{0} 个更新被添加", "zh_TW": "已加入 {0} 個遊戲更新" } @@ -19857,7 +19932,7 @@ "es_ES": "Las actualizaciones agrupadas no pueden ser eliminadas, solamente deshabilitadas.", "fr_FR": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.", "he_IL": "", - "it_IT": "Gli aggiornamenti inclusi non possono essere eliminati, ma solo disattivati", + "it_IT": "Gli aggiornamenti inclusi non possono essere rimossi, ma solo disabilitati.", "ja_JP": "", "ko_KR": "번들 업데이트는 제거할 수 없으며, 비활성화만 가능합니다.", "no_NO": "Medfølgende oppdateringer kan ikke fjernes, bare deaktiveres.", @@ -19892,7 +19967,7 @@ "sv_SE": "Fusk tillgängliga för {0} [{1}]", "th_TH": "สูตรโกงมีให้สำหรับ {0} [{1}]", "tr_TR": "{0} için Hile mevcut [{1}]", - "uk_UA": "Коди доступні для {0} [{1}]", + "uk_UA": "Чит-коди доступні для {0} [{1}]", "zh_CN": "适用于 {0} [{1}] 的金手指", "zh_TW": "可用於 {0} [{1}] 的密技" } @@ -19932,7 +20007,7 @@ "es_ES": "", "fr_FR": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.", "he_IL": "", - "it_IT": "i DLC \"impacchettati\" non possono essere rimossi, ma solo disabilitati.", + "it_IT": "I DLC inclusi non possono essere rimossi, ma solo disabilitati.", "ja_JP": "", "ko_KR": "번들 DLC는 제거할 수 없으며 비활성화만 가능합니다.", "no_NO": "Medfølgende DLC kan ikke fjernes, bare deaktiveres.", @@ -19942,7 +20017,7 @@ "sv_SE": "Bundlade DLC kan inte tas bort, endast inaktiveras.", "th_TH": "แพ็ค DLC ไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", "tr_TR": "", - "uk_UA": "Вбудований DLC не може бути видаленим, лише вимкненим.", + "uk_UA": "Комплектні DLC (бандли) не можуть бути видаленими, лише вимкненими.", "zh_CN": "游戏整合的DLC无法移除,可尝试禁用。", "zh_TW": "附帶的 DLC 只能被停用而無法被刪除。" } @@ -19957,7 +20032,7 @@ "es_ES": "", "fr_FR": "{0} DLC(s) disponibles", "he_IL": "{0} הרחבות משחק", - "it_IT": "", + "it_IT": "{0} DLC disponibile/i", "ja_JP": "", "ko_KR": "{0} DLC 사용 가능", "no_NO": "{0} Nedlastbare innhold(er)", @@ -19969,7 +20044,7 @@ "tr_TR": "", "uk_UA": "{0} DLC доступно", "zh_CN": "{0} 个 DLC", - "zh_TW": "" + "zh_TW": "{0} 個可下載內容" } }, { @@ -19982,7 +20057,7 @@ "es_ES": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)", "fr_FR": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", "he_IL": "", - "it_IT": "{0} nuovo/i contenuto/i scaricabile/i aggiunto/i", + "it_IT": "{0} nuovo/i DLC aggiunto/i", "ja_JP": "", "ko_KR": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨", "no_NO": "{0} nytt nedlastbart innhold lagt til", @@ -20007,7 +20082,7 @@ "es_ES": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)", "fr_FR": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", "he_IL": "", - "it_IT": "{0} contenuto/i scaricabile/i aggiunto/i", + "it_IT": "{0} nuovo/i DLC aggiunto/i", "ja_JP": "", "ko_KR": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨", "no_NO": "{0} nytt nedlastbart innhold lagt til", @@ -20032,7 +20107,7 @@ "es_ES": "Se eliminaron {0} contenido(s) descargable(s) faltantes", "fr_FR": "{0} contenu(s) téléchargeable(s) manquant(s) supprimé(s)", "he_IL": "", - "it_IT": "{0} contenuto/i scaricabile/i mancante/i rimosso/i", + "it_IT": "{0} DLC mancante/i rimosso/i", "ja_JP": "", "ko_KR": "{0}개의 내려받기 가능한 콘텐츠가 제거됨", "no_NO": "{0} manglende nedlastbart innhold fjernet", @@ -20057,7 +20132,7 @@ "es_ES": "Se agregaron {0} nueva(s) actualización(es)", "fr_FR": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", "he_IL": "", - "it_IT": "{0} aggiornamento/i aggiunto/i", + "it_IT": "{0} nuovo/i aggiornamento/i aggiunto/i", "ja_JP": "", "ko_KR": "{0}개의 새 업데이트가 추가됨", "no_NO": "{0} ny(e) oppdatering(er) lagt til", @@ -20169,7 +20244,7 @@ "tr_TR": "", "uk_UA": "Продовжити", "zh_CN": "继续", - "zh_TW": "" + "zh_TW": "繼續" } }, { @@ -20367,7 +20442,7 @@ "sv_SE": "Hantera uppdateringar för {0} ({1})", "th_TH": "จัดการอัพเดตสำหรับ {0} ({1})", "tr_TR": "{0} için güncellemeler mevcut [{1}]", - "uk_UA": "{0} Доступні оновлення для {1} ({2})", + "uk_UA": "Доступні оновлення для {0} ({1})", "zh_CN": "管理 {0} ({1}) 的更新", "zh_TW": "管理 {0} 的更新 ({1})" } @@ -20532,7 +20607,7 @@ "es_ES": "", "fr_FR": "", "he_IL": "", - "it_IT": "", + "it_IT": "Automatico", "ja_JP": "", "ko_KR": "자동", "no_NO": "", @@ -20544,7 +20619,7 @@ "tr_TR": "", "uk_UA": "", "zh_CN": "自动", - "zh_TW": "" + "zh_TW": "自動" } }, { @@ -20557,7 +20632,7 @@ "es_ES": "", "fr_FR": "", "he_IL": "", - "it_IT": "", + "it_IT": "Utilizza Vulkan.\nSu un Mac con processore ARM, utilizza il backend Metal nei giochi che funzionano bene con quest'ultimo.", "ja_JP": "", "ko_KR": "Vulkan을 사용합니다.\nARM 맥에서 해당 플랫폼에서 잘 실행되는 게임을 플레이하는 경우 Metal 후단부를 사용합니다.", "no_NO": "Bruker Vulkan \nPå en ARM Mac, og når du spiller et spill som kjører bra under den, bruker du Metal-backend.", @@ -20569,7 +20644,7 @@ "tr_TR": "", "uk_UA": "", "zh_CN": "使用Vulkan。\n在ARM Mac上,当玩在其下运行良好的游戏时,使用Metal后端。", - "zh_TW": "" + "zh_TW": "使用Vulkan。\n在 ARM Mac 上,如果遊戲執行性能良好時,則將使用 Metal 後端。" } }, { @@ -20657,7 +20732,7 @@ "es_ES": "Selecciona la tarjeta gráfica que se utilizará con los back-end de gráficos Vulkan.\n\nNo afecta la GPU que utilizará OpenGL.\n\nFije a la GPU marcada como \"dGUP\" ante dudas. Si no hay una, no haga modificaciones.", "fr_FR": "Sélectionnez la carte graphique qui sera utilisée avec l'interface graphique Vulkan.\n\nCela ne change pas le GPU qu'OpenGL utilisera.\n\nChoisissez le GPU noté \"dGPU\" si vous n'êtes pas sûr. S'il n'y en a pas, ne pas modifier.", "he_IL": "בחר את הכרטיס הגראפי שישומש עם הגראפיקה של וולקאן.\n\nדבר זה לא משפיע על הכרטיס הגראפי שישומש עם OpenGL.\n\nמוטב לבחור את ה-GPU המסומן כ-\"dGPU\" אם אינכם בטוחים, אם זו לא אופצייה, אל תשנו דבר.", - "it_IT": "Seleziona la scheda grafica che verrà usata con la backend grafica Vulkan.\n\nNon influenza la GPU che userà OpenGL.\n\nImposta la GPU contrassegnata come \"dGPU\" se non sei sicuro. Se non ce n'è una, lascia intatta quest'impostazione.", + "it_IT": "Seleziona la scheda grafica che verrà usata con il backend grafico Vulkan.\n\nL'opzione non modifica la GPU usata da OpenGL.\n\nNel dubbio, seleziona la GPU contrassegnata come \"dGPU\". Se non ce n'è una, lascia intatta questa opzione.", "ja_JP": "Vulkanグラフィックスバックエンドで使用されるグラフィックスカードを選択します.\n\nOpenGLが使用するGPUには影響しません.\n\n不明な場合は, \"dGPU\" としてフラグが立っているGPUに設定します. ない場合はそのままにします.", "ko_KR": "Vulkan 그래픽 후단부와 함께 사용할 그래픽 카드를 선택하세요.\n\nOpenGL에서 사용할 GPU에는 영향을 미치지 않습니다.\n\n모르면 \"dGPU\"로 플래그가 지정된 GPU로 설정하세요. 없으면 그대로 두세요.", "no_NO": "Velg grafikkkortet som skal brukes sammen med Vulkan grafikkbackenden\n\nPåvirker ikke GPU-er som OpenGL skal bruke.\n\nSett til GPU-merket som \"dGPU\" hvis usikker. Hvis det ikke det er en, la være uberørt.", @@ -20707,7 +20782,7 @@ "es_ES": "La configuración de la GPU o del back-end de los gráficos fue modificada. Es necesario reiniciar para que se aplique.", "fr_FR": "Les paramètres de l'interface graphique ou du GPU ont été modifiés. Cela nécessitera un redémarrage pour être appliqué", "he_IL": "הגדרות אחראי גרפיקה או כרטיס גראפי שונו. זה ידרוש הפעלה מחדש כדי להחיל שינויים", - "it_IT": "Le impostazioni della backend grafica o della GPU sono state modificate. Questo richiederà un riavvio perché le modifiche siano applicate", + "it_IT": "Le impostazioni del backend grafico o della GPU sono state modificate. È necessario un riavvio per applicare le modifiche", "ja_JP": "グラフィックスバックエンドまたはGPUの設定が変更されました. 変更を適用するには再起動する必要があります", "ko_KR": "그래픽 후단부 또는 GPU 설정이 수정되었습니다. 이를 적용하려면 다시 시작이 필요", "no_NO": "Grafikk Backend eller GPU-innstillinger er endret. Dette krever en omstart for å aktiveres", @@ -21257,7 +21332,7 @@ "es_ES": "Aplica antia-aliasing al rendereo del juego.\n\nFXAA desenfocará la mayor parte del la iamgen, mientras que SMAA intentará encontrar bordes irregulares y suavizarlos.\n\nNo se recomienda usar en conjunto con filtro de escala FSR.\n\nEsta opción puede ser modificada mientras que esté corriendo el juego haciendo click en \"Aplicar\" más abajo; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nDejar en NADA si no está seguro.", "fr_FR": "FXAA floute la plupart de l'image, tandis que SMAA tente de détecter les contours dentelés et de les lisser.\n\nIl n'est pas recommandé de l'utiliser en conjonction avec le filtre de mise à l'échelle FSR.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres sur le côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nLaissez sur AUCUN si vous n'êtes pas sûr.", "he_IL": "", - "it_IT": "Applica anti-aliasing al rendering del gioco.\n\nFXAA sfocerà la maggior parte dell'immagine, mentre SMAA tenterà di trovare bordi frastagliati e lisciarli.\n\nNon si consiglia di usarlo in combinazione con il filtro di scala FSR.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nLasciare su Nessuno se incerto.", + "it_IT": "Applica l'anti-aliasing al rendering del gioco.\n\nFXAA rende la maggior parte dell'immagine sfocata, mentre SMAA tenta di rilevare e smussare i bordi frastagliati.\n\nSi consiglia di non usarlo in combinazione con il filtro di scaling FSR.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nNel dubbio, lascia su Nessuno.", "ja_JP": "ゲームレンダリングにアンチエイリアスを適用します.\n\nFXAAは画像の大部分をぼかし, SMAAはギザギザのエッジを見つけて滑らかにします.\n\nFSRスケーリングフィルタとの併用は推奨しません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックして変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合は「なし」のままにしておいてください.", "ko_KR": "게임 렌더에 앤티 앨리어싱을 적용합니다.\n\nFXAA는 이미지 대부분을 흐리게 처리하지만 SMAA는 들쭉날쭉한 가장자리를 찾아 부드럽게 처리합니다.\n\nFSR 스케일링 필터와 함께 사용하지 않는 것이 좋습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임을 실행하는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮겨 원하는 게임의 모습을 찾을 때까지 실험해 볼 수 있습니다.\n\n모르면 없음으로 두세요.", "no_NO": "Aktiverer anti-aliasing til spill render.\n\nFXAA vil gjøre det meste av bildet, mens SMAA vil forsøke å finne berørte kanter og glatte dem ut.\n\nAnbefales ikke til bruk i forbindelse med FSR-skaleringsfilteret.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nForlat på NONE hvis usikker.", @@ -21282,7 +21357,7 @@ "es_ES": "Suavizado de bordes:", "fr_FR": "Anticrénelage :", "he_IL": "החלקת-עקומות:", - "it_IT": "", + "it_IT": "Anti-aliasing:", "ja_JP": "アンチエイリアス:", "ko_KR": "앤티 앨리어싱 :", "no_NO": "Kantutjevning:", @@ -21307,7 +21382,7 @@ "es_ES": "Filtro de escalado:", "fr_FR": "Filtre de mise à l'échelle :", "he_IL": "מסנן מידת איכות:", - "it_IT": "Filtro di scala:", + "it_IT": "Filtro di scaling:", "ja_JP": "スケーリングフィルタ:", "ko_KR": "크기 조정 필터 :", "no_NO": "Skaleringsfilter:", @@ -21332,7 +21407,7 @@ "es_ES": "Elija el filtro de escala que se aplicará al utilizar la escala de resolución.\n\nBilinear funciona bien para juegos 3D y es una opción predeterminada segura.\n\nSe recomienda el bilinear para juegos de pixel art.\n\nFSR 1.0 es simplemente un filtro de afilado, no se recomienda su uso con FXAA o SMAA.\n\nEsta opción se puede cambiar mientras se ejecuta un juego haciendo clic en \"Aplicar\" a continuación; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nDéjelo en BILINEAR si no está seguro.", "fr_FR": "Choisissez le filtre de mise à l'échelle qui sera appliqué lors de l'utilisation de la mise à l'échelle de la résolution.\n\nLe filtre bilinéaire fonctionne bien pour les jeux en 3D et constitue une option par défaut sûre.\n\nLe filtre le plus proche est recommandé pour les jeux de pixel art.\n\nFSR 1.0 est simplement un filtre de netteté, non recommandé pour une utilisation avec FXAA ou SMAA.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres de côté et expérimenter jusqu'à ce que vous trouviez l'aspect souhaité pour un jeu.\n\nLaissez sur BILINÉAIRE si vous n'êtes pas sûr.", "he_IL": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "it_IT": "Scegli il filtro di scaling che verrà applicato quando si utilizza o scaling di risoluzione.\n\nBilineare funziona bene per i giochi 3D ed è un'opzione predefinita affidabile.\n\nNearest è consigliato per i giochi in pixel art.\n\nFSR 1.0 è solo un filtro di nitidezza, non raccomandato per l'uso con FXAA o SMAA.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nLasciare su Bilineare se incerto.", + "it_IT": "Scegli il filtro di scaling che verrà applicato quando si utilizza lo scaling della risoluzione.\n\nBilineare funziona bene per i giochi 3D ed è un'opzione predefinita affidabile.\n\nNearest è consigliato per i giochi in pixel art.\n\nFSR 1.0 è solo un filtro di nitidezza, sconsigliato per l'uso con FXAA o SMAA.\n\nLo scaling ad area è consigliato quando si riducono delle risoluzioni che sono più grandi della finestra di output. Può essere usato per ottenere un effetto di anti-aliasing supercampionato quando si riduce di più di 2x.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nNel dubbio, lascia su Bilineare.", "ja_JP": "解像度変更時に適用されるスケーリングフィルタを選択します.\n\nBilinearは3Dゲームに適しており, 安全なデフォルトオプションです.\n\nピクセルアートゲームにはNearestを推奨します.\n\nFSR 1.0は単なるシャープニングフィルタであり, FXAAやSMAAとの併用は推奨されません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合はBilinearのままにしておいてください.", "ko_KR": "해상도 스케일을 사용할 때 적용될 스케일링 필터를 선택합니다.\n\n쌍선형은 3D 게임에 적합하며 안전한 기본 옵션입니다.\n\nNearest는 픽셀 아트 게임에 권장됩니다.\n\nFSR 1.0은 단순히 선명도 필터일 뿐이며 FXAA 또는 SMAA와 함께 사용하는 것은 권장되지 않습니다.\n\nArea 스케일링은 출력 창보다 큰 해상도를 다운스케일링할 때 권장됩니다. 2배 이상 다운스케일링할 때 슈퍼샘플링된 앤티앨리어싱 효과를 얻는 데 사용할 수 있습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임을 실행하는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮겨 원하는 게임 모양을 찾을 때까지 실험하면 됩니다.\n\n모르면 쌍선형을 그대로 두세요.", "no_NO": "Velg det skaleringsfilteret som skal brukes når du bruker oppløsningsskalaen.\n\nBilinear fungerer godt for 3D-spill og er et trygt standardalternativ.\n\nNærmeste anbefales for pixel kunst-spill.\n\nFSR 1.0 er bare et skarpere filter, ikke anbefalt for bruk med FXAA eller SMAA.\n\nOmrådeskalering anbefales når nedskalering er større enn utgangsvinduet. Den kan brukes til å oppnå en superprøvetaket anti-aliasingseffekt når en nedskalerer med mer enn 2x.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nLa være på BILINEAR hvis usikker.", @@ -21342,7 +21417,7 @@ "sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.", "th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม", "tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - це просто фільтр різкості, не рекомендується використовувати разом з FXAA або SMAA.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Білінійний\", якщо не впевнені.", + "uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - фільтр різкості. Не варто використовувати разом з FXAA або SMAA.\n\nЦю опцію можна змінювати під час гри кліком на \"Застосувати\" нижче; ви можете відсунути вікно налаштувань і поекспериментувати з тим, як відображатиметься гра.\n\nЗалиште на \"Білінійний\", якщо не впевнені.", "zh_CN": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear(双线性过滤)对于3D游戏效果较好,是一个安全的默认选项。\n\nNearest(最近邻过滤)推荐用于像素艺术游戏。\n\nFSR(超级分辨率锐画)只是一个锐化过滤器,不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea(局部过滤),当渲染分辨率大于窗口实际分辨率,推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“Bilinear(双线性过滤)”。", "zh_TW": "選擇使用解析度縮放時套用的縮放過濾器。\n\n雙線性 (Bilinear) 濾鏡適用於 3D 遊戲,是一個安全的預設選項。\n\n建議像素美術遊戲使用近鄰性 (Nearest) 濾鏡。\n\nFSR 1.0 只是一個銳化濾鏡,不建議與 FXAA 或 SMAA 一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請保持雙線性 (Bilinear) 狀態。" } @@ -21444,7 +21519,7 @@ "tr_TR": "", "uk_UA": "", "zh_CN": "Area(区域过滤)", - "zh_TW": "" + "zh_TW": "區域" } }, { @@ -21492,7 +21567,7 @@ "sv_SE": "Ställ in nivå för FSR 1.0 sharpening. Högre är skarpare.", "th_TH": "ตั้งค่าระดับความคมชัด FSR 1.0 ยิ่งสูงกว่าจะยิ่งคมชัดกว่า", "tr_TR": "", - "uk_UA": "Встановити рівень різкості в FSR 1.0. Чим вище - тим різкіше.", + "uk_UA": "Встановити рівень різкості FSR 1.0. Чим вище - тим різкіше.", "zh_CN": "设置 FSR 1.0 的锐化等级,数值越高,图像越锐利。", "zh_TW": "設定 FSR 1.0 銳化等級。越高越清晰。" } @@ -21607,7 +21682,7 @@ "es_ES": "Editar usuario", "fr_FR": "Modifier Utilisateur", "he_IL": "ערוך משתמש", - "it_IT": "Modificare L'Utente", + "it_IT": "Modifica utente", "ja_JP": "ユーザを編集", "ko_KR": "사용자 편집", "no_NO": "Rediger bruker", @@ -21632,7 +21707,7 @@ "es_ES": "Crear Usuario", "fr_FR": "Créer Utilisateur", "he_IL": "צור משתמש", - "it_IT": "Crea Un Utente", + "it_IT": "Crea utente", "ja_JP": "ユーザを作成", "ko_KR": "사용자 만들기", "no_NO": "Opprett bruker", @@ -21782,7 +21857,7 @@ "es_ES": "Haga clic para abrir el registro de cambios para esta versión en su navegador predeterminado.", "fr_FR": "Cliquez pour ouvrir le changelog de cette version dans votre navigateur par défaut.", "he_IL": "לחץ כדי לפתוח את יומן השינויים עבור גרסה זו בדפדפן ברירת המחדל שלך.", - "it_IT": "Clicca per aprire il changelog per questa versione nel tuo browser predefinito.", + "it_IT": "Clicca per aprire il changelog di questa versione nel tuo browser predefinito.", "ja_JP": "クリックして, このバージョンの更新履歴をデフォルトのブラウザで開きます.", "ko_KR": "기본 브라우저에서 이 버전의 변경 내역을 열람하려면 클릭하세요.", "no_NO": "Klikk for å åpne endringsloggen for denne versjonen i din nettleser.", @@ -21969,7 +22044,7 @@ "tr_TR": "", "uk_UA": "Вимкнути хостинг P2P мережі (може збільшити затримку)", "zh_CN": "禁用P2P网络连接 (也许会增加延迟)", - "zh_TW": "" + "zh_TW": "停用對等網路代管 (P2P Network Hosting) (可能增加網路延遲)" } }, { @@ -21994,7 +22069,7 @@ "tr_TR": "", "uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.", "zh_CN": "禁用P2P网络连接,对方将通过主服务器进行连接,而不是直接连接到您。", - "zh_TW": "" + "zh_TW": "停用對等網路代管 (P2P Network Hosting), 用戶群會經過代理何服器而非直接連線至你的主機。" } }, { @@ -22019,7 +22094,7 @@ "tr_TR": "", "uk_UA": "Мережевий пароль:", "zh_CN": "网络密码:", - "zh_TW": "" + "zh_TW": "網路密碼片語 (passphrase):" } }, { @@ -22044,7 +22119,7 @@ "tr_TR": "", "uk_UA": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", "zh_CN": "您只能看到与您使用相同密码的游戏房间。", - "zh_TW": "" + "zh_TW": "你只會看到與你的密碼片語 (passphrase) 相同的遊戲房間。" } }, { @@ -22069,7 +22144,7 @@ "tr_TR": "", "uk_UA": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", "zh_CN": "以Ryujinx-<8个十六进制字符>的格式输入密码。您只能看到与您使用相同密码的游戏房间。", - "zh_TW": "" + "zh_TW": "以「Ryujinx-<8 個十六進制數字>」的格式輸入密碼片語 (passphrase)。你只會看到與你的密碼片語 (passphrase) 相同的遊戲房間。" } }, { @@ -22094,7 +22169,7 @@ "tr_TR": "", "uk_UA": "(публічний)", "zh_CN": "(公开的)", - "zh_TW": "" + "zh_TW": "(公開模式)" } }, { @@ -22119,7 +22194,7 @@ "tr_TR": "", "uk_UA": "Згенерувати випадкову", "zh_CN": "随机生成", - "zh_TW": "" + "zh_TW": "隨機產生" } }, { @@ -22144,7 +22219,7 @@ "tr_TR": "", "uk_UA": "Генерує новий пароль, яким можна поділитися з іншими гравцями.", "zh_CN": "生成一个新的密码,可以与其他玩家共享。", - "zh_TW": "" + "zh_TW": "產生一組新的密碼片語 (passphrase), 以供分享給其他玩家。" } }, { @@ -22169,7 +22244,7 @@ "tr_TR": "", "uk_UA": "Очистити", "zh_CN": "清除", - "zh_TW": "" + "zh_TW": "清除" } }, { @@ -22194,7 +22269,7 @@ "tr_TR": "", "uk_UA": "Очищає поточну пароль, повертаючись до публічної мережі.", "zh_CN": "清除当前密码,返回公共网络。", - "zh_TW": "" + "zh_TW": "清除現有的密碼片語 (passphrase), 藉此公開網路連線。" } }, { @@ -22219,7 +22294,7 @@ "tr_TR": "", "uk_UA": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\"", "zh_CN": "无效密码!密码的格式必须是\"Ryujinx-<8个十六进制字符>\"", - "zh_TW": "" + "zh_TW": "無效的密碼片語 (passphrase)! 密碼片語必須是以「Ryujinx-<8 個十六進制數字>」的格式輸入" } }, { @@ -22244,7 +22319,7 @@ "tr_TR": "", "uk_UA": "Вертикальна синхронізація (VSync):", "zh_CN": "垂直同步(VSync)", - "zh_TW": "" + "zh_TW": "垂直同步:" } }, { @@ -22257,7 +22332,7 @@ "es_ES": "", "fr_FR": "Activer le taux de rafraîchissement customisé (Expérimental)", "he_IL": "", - "it_IT": "", + "it_IT": "Attiva la frequenza di aggiornamento personalizzata (sperimentale)", "ja_JP": "", "ko_KR": "사용자 정의 주사율 활성화(실험적)", "no_NO": "Aktiver egendefinert oppdateringsfrekvens (eksperimentell)", @@ -22269,7 +22344,7 @@ "tr_TR": "", "uk_UA": "Увімкнути користувацьку частоту оновлення (Експериментально)", "zh_CN": "启动自定义刷新率(实验性功能)", - "zh_TW": "" + "zh_TW": "啟用自訂的重新整理頻率 (實驗性功能)" } }, { @@ -22307,7 +22382,7 @@ "es_ES": "", "fr_FR": "Sans Limite", "he_IL": "", - "it_IT": "", + "it_IT": "Nessun limite", "ja_JP": "", "ko_KR": "무제한", "no_NO": "Ubegrenset", @@ -22319,7 +22394,7 @@ "tr_TR": "", "uk_UA": "Безмежна", "zh_CN": "无限制", - "zh_TW": "" + "zh_TW": "沒有限制" } }, { @@ -22332,7 +22407,7 @@ "es_ES": "", "fr_FR": "Taux de Rafraîchissement Customisé", "he_IL": "", - "it_IT": "", + "it_IT": "Frequenza di aggiornamento personalizzata", "ja_JP": "", "ko_KR": "사용자 정의 주사율", "no_NO": "Egendefinert oppdateringsfrekvens", @@ -22344,7 +22419,7 @@ "tr_TR": "", "uk_UA": "Користувацька", "zh_CN": "自定义刷新率", - "zh_TW": "" + "zh_TW": "自訂的重新整理頻率" } }, { @@ -22357,7 +22432,7 @@ "es_ES": "", "fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité.", "he_IL": "", - "it_IT": "", + "it_IT": "Sincronizzazione verticale emulata. \"Switch\" emula la frequenza di aggiornamento di Nintendo Switch (60Hz). \"Nessun limite\" non impone alcun limite alla frequenza di aggiornamento.", "ja_JP": "", "ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다.", "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens.", @@ -22367,9 +22442,9 @@ "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens.", "th_TH": "", "tr_TR": "", - "uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень.", + "uk_UA": "Емульована вертикальна синхронізація кадрів. 'Switch' емулює частоту оновлення консолі Nintendo Switch (60 Гц). 'Необмежена' — частота оновлення не матиме обмежень.", "zh_CN": "模拟垂直同步。“Switch”模拟了Switch的60Hz刷新率。“无限制”没有刷新率限制。", - "zh_TW": "" + "zh_TW": "模擬垂直同步。「Switch」 模擬 Nintendo Switch 的 60Hz 重新整理頻率。「沒有限制」是沒有限制的重新整理頻率。" } }, { @@ -22382,7 +22457,7 @@ "es_ES": "", "fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité. 'Taux de Rafraîchissement Customisé' émule le taux de rafraîchissement spécifié.", "he_IL": "", - "it_IT": "", + "it_IT": "Sincronizzazione verticale emulata. \"Switch\" emula la frequenza di aggiornamento di Nintendo Switch (60Hz). \"Nessun limite\" non impone alcun limite alla frequenza di aggiornamento. \"Frequenza di aggiornamento personalizzata\" emula la frequenza di aggiornamento specificata.", "ja_JP": "", "ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다. '사용자 지정'은 지정된 사용자 지정 주사율을 에뮬레이트합니다.", "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens. «Egendefinert» emulerer den angitte egendefinerte oppdateringsfrekvensen.", @@ -22392,9 +22467,9 @@ "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens. 'Anpassad uppdateringsfrekvens' emulerar den angivna anpassade uppdateringsfrekvensen.", "th_TH": "", "tr_TR": "", - "uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.", + "uk_UA": "Емульована вертикальна синхронізація кадрів. 'Switch' емулює частоту оновлення консолі Nintendo Switch (60 Гц). 'Необмежена' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.", "zh_CN": "模拟垂直同步。“Switch”模拟了Switch的60Hz刷新率。“无限制”没有刷新率限制。“自定义刷新率”模拟指定的自定义刷新率。", - "zh_TW": "" + "zh_TW": "模擬垂直同步。「Switch」 模擬 Nintendo Switch 的 60Hz 重新整理頻率。「沒有限制」是沒有限制的重新整理頻率。「自訂的重新整理頻率」模擬所自訂的重新整理頻率。" } }, { @@ -22407,7 +22482,7 @@ "es_ES": "", "fr_FR": "Permet à l'utilisateur de spécifier un taux de rafraîchissement émulé. Dans certains jeux, ceci pourrait accélérer ou ralentir le taux de logique du gameplay. Dans d'autre titres, cela permettrait limiter le FPS à un multiple du taux de rafraîchissement, ou conduire à un comportement imprévisible. Ceci est une fonctionnalité expérimentale, avec aucune garanties pour comment le gameplay sera affecté. \n\nLaisser désactiver en cas de doute.", "he_IL": "", - "it_IT": "", + "it_IT": "Consente all'utente di specificare una frequenza di aggiornamento emulata. In alcuni titoli potrebbe aumentare o diminuire la velocità del gameplay, mentre in altri potrebbe consentire di limitare il framerate a un multiplo della frequenza di aggiornamento, o causare comportamenti imprevedibili. Questa funzionalità è sperimentale, e non ci sono certezze sul modo in cui influenzerà il gameplay.\n\nNel dubbio, lascia l'opzione disattivata.", "ja_JP": "", "ko_KR": "사용자가 에뮬레이트된 화면 주사율을 지정할 수 있습니다. 일부 타이틀에서는 게임플레이 로직 속도가 빨라지거나 느려질 수 있습니다. 다른 타이틀에서는 주사율의 배수로 FPS를 제한하거나 예측할 수 없는 동작으로 이어질 수 있습니다. 이는 실험적 기능으로 게임 플레이에 어떤 영향을 미칠지 보장할 수 없습니다. \n\n모르면 끔으로 두세요.", "no_NO": "Gjør det mulig for brukeren å angi en emulert oppdateringsfrekvens. I noen titler kan dette øke eller senke hastigheten på spillogikken. I andre titler kan det gjøre det mulig å begrense FPS til et multiplum av oppdateringsfrekvensen, eller føre til uforutsigbar oppførsel. Dette er en eksperimentell funksjon, og det gis ingen garantier for hvordan spillingen påvirkes. \n\nLa AV stå hvis du er usikker.", @@ -22417,9 +22492,9 @@ "sv_SE": "Låter användaren ange en emulerad uppdateringsfrekvens. För vissa spel så kan detta snabba upp eller ner frekvensen för spellogiken. I andra spel så kan detta tillåta att bildfrekvensen kapas för delar av uppdateringsfrekvensen eller leda till oväntat beteende. Detta är en experimentell funktion utan några garantier för hur spelet påverkas. \n\nLämna AV om du är osäker.", "th_TH": "", "tr_TR": "", - "uk_UA": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. У інших іграх це може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як це вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.", + "uk_UA": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. Натомість в інших іграх ця функція може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як вона вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.", "zh_CN": "允许用户指定模拟刷新率。在某些游戏中,这可能会加快或减慢游戏逻辑的速度。在其他游戏中,它可能允许将FPS限制在刷新率的某个倍数,或者导致不可预测的行为。这是一个实验性功能,无法保证游戏会受到怎样的影响。\n\n如果不确定,请关闭。", - "zh_TW": "" + "zh_TW": "容許使用者自訂模擬的重新整理頻率。你可能會在某些遊戲裡感受到加快或減慢的遊戲速度;其他遊戲裡則可能會容許限制最高的 FPS 至重新整理頻率的倍數,或引起未知遊戲行為。這是實驗性功能,且沒有保證遊戲會穩定執行。\n\n如果不確定,請保持關閉狀態。" } }, { @@ -22432,7 +22507,7 @@ "es_ES": "", "fr_FR": "La valeur cible du taux de rafraîchissement customisé.", "he_IL": "", - "it_IT": "", + "it_IT": "Il valore desiderato della frequenza di aggiornamento personalizzata.", "ja_JP": "", "ko_KR": "사용자 정의 주사율 목표 값입니다.", "no_NO": "Den egendefinerte målverdien for oppdateringsfrekvens.", @@ -22444,7 +22519,7 @@ "tr_TR": "", "uk_UA": "Цільове значення користувацької частоти оновлення.", "zh_CN": "目标自定义刷新率值。", - "zh_TW": "" + "zh_TW": "自訂的重新整理頻率數值。" } }, { @@ -22457,7 +22532,7 @@ "es_ES": "", "fr_FR": "Le taux de rafraîchissement customisé, comme un pourcentage du taux de rafraîchissement normal de la Switch.", "he_IL": "", - "it_IT": "", + "it_IT": "La frequenza di aggiornamento personalizzata, espressa in percentuale della normale frequenza di aggiornamento di Switch.", "ja_JP": "", "ko_KR": "일반 스위치 주사율의 백분율로 나타낸 사용자 지정 주사율입니다.", "no_NO": "Den egendefinerte oppdateringsfrekvensen, i prosent av den normale oppdateringsfrekvensen for Switch-konsollen.", @@ -22469,7 +22544,7 @@ "tr_TR": "", "uk_UA": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.", "zh_CN": "自定义刷新率,占正常SWitch刷新率的百分比值。", - "zh_TW": "" + "zh_TW": "以 Nintendo Switch 重新整理頻率的百分比自訂重新整理頻率。" } }, { @@ -22482,7 +22557,7 @@ "es_ES": "", "fr_FR": "Pourcentage du Taux de Rafraîchissement Customisé :", "he_IL": "", - "it_IT": "", + "it_IT": "Frequenza di aggiornamento personalizzata (%):", "ja_JP": "", "ko_KR": "사용자 정의 주사율 % :", "no_NO": "Egendefinert oppdateringsfrekvens %:", @@ -22494,7 +22569,7 @@ "tr_TR": "", "uk_UA": "Користувацька частота оновлення %:", "zh_CN": "自定义刷新率值 %:", - "zh_TW": "" + "zh_TW": "自訂重新整理頻率 %:" } }, { @@ -22507,7 +22582,7 @@ "es_ES": "", "fr_FR": "Valeur du Taux de Rafraîchissement Customisé :", "he_IL": "", - "it_IT": "", + "it_IT": "Valore della frequenza di aggiornamento personalizzata:", "ja_JP": "", "ko_KR": "사용자 정의 주사율 값 :", "no_NO": "Egendefinert verdi for oppdateringsfrekvens:", @@ -22517,9 +22592,9 @@ "sv_SE": "Värde för anpassad uppdateringsfrekvens:", "th_TH": "", "tr_TR": "", - "uk_UA": "Значення користувацька частота оновлення:", + "uk_UA": "Значення користувацької частоти оновлення:", "zh_CN": "自定义刷新率值:", - "zh_TW": "" + "zh_TW": "自訂重新整理頻率數值:" } }, { @@ -22532,7 +22607,7 @@ "es_ES": "", "fr_FR": "Intervalle", "he_IL": "", - "it_IT": "", + "it_IT": "Intervallo", "ja_JP": "", "ko_KR": "간격", "no_NO": "Intervall", @@ -22544,7 +22619,7 @@ "tr_TR": "", "uk_UA": "", "zh_CN": "间隔", - "zh_TW": "" + "zh_TW": "間隔" } }, { @@ -22557,7 +22632,7 @@ "es_ES": "", "fr_FR": "Activer/Désactiver mode VSync :", "he_IL": "", - "it_IT": "", + "it_IT": "Cambia modalità VSync:", "ja_JP": "", "ko_KR": "수직 동기화 모드 전환 :", "no_NO": "Veksle mellom VSync-modus:", @@ -22569,7 +22644,7 @@ "tr_TR": "", "uk_UA": "Перемкнути VSync режим:", "zh_CN": "设置 VSync 模式:", - "zh_TW": "" + "zh_TW": "切換 VSync 模式:" } }, { @@ -22582,7 +22657,7 @@ "es_ES": "", "fr_FR": "Augmenter le taux de rafraîchissement customisé :", "he_IL": "", - "it_IT": "", + "it_IT": "Aumenta la frequenza di aggiornamento personalizzata:", "ja_JP": "", "ko_KR": "사용자 정의 주사율 증가", "no_NO": "Øk den egendefinerte oppdateringsfrekvensen", @@ -22594,7 +22669,7 @@ "tr_TR": "", "uk_UA": "Підвищити користувацьку частоту оновлення", "zh_CN": "提高自定义刷新率:", - "zh_TW": "" + "zh_TW": "提高自訂的重新整理頻率" } }, { @@ -22607,7 +22682,7 @@ "es_ES": "", "fr_FR": "Baisser le taux de rafraîchissement customisé :", "he_IL": "", - "it_IT": "", + "it_IT": "Riduci la frequenza di aggiornamento personalizzata:", "ja_JP": "", "ko_KR": "사용자 정의 주사율 감소", "no_NO": "Lavere tilpasset oppdateringsfrekvens", @@ -22619,6 +22694,281 @@ "tr_TR": "", "uk_UA": "Понизити користувацьку частоту оновлення", "zh_CN": "降低自定义刷新率:", + "zh_TW": "降低自訂的重新整理頻率" + } + }, + { + "ID": "CompatibilityListLastUpdated", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Last updated: {0}", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Sist oppdatert: {0}", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Senast uppdaterad: {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "最后更新于: {0}", + "zh_TW": "上次更新時間: {0}" + } + }, + { + "ID": "CompatibilityListWarning", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "This compatibility list might contain out of date entries.\nDo not be opposed to testing games in the \"Ingame\" status.", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "이 호환성 목록에는 오래된 항목이 포함되어 있을 수 있습니다.\n\"게임 내\" 상태에서 게임을 테스트하는 것을 반대하지 마십시오.", + "no_NO": "Denne kompatibilitetslisten kan inneholde oppføringer som er tomme for data.\nVær ikke imot å teste spill i statusen «Ingame».", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Denna kompatibilitetslista kan innehålla utdaterade poster.\nTesta gärna spelen som listas med \"Spelproblem\"-status.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "此兼容性列表可能包含过时的条目。\n不要只测试 \"进入游戏\" 状态的游戏。", + "zh_TW": "這個相容性列表可能含有已過時的紀錄。\n敬請繼續測試「大致可遊玩 (Ingame)」狀態的遊戲並回報以更新紀錄。" + } + }, + { + "ID": "CompatibilityListSearchBoxWatermark", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Search compatibility entries...", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 항목 검색...", + "no_NO": "Søk i kompatibilitetsoppføringer...", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Sök i kompatibilitetsposter...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "正在搜索兼容性条目...", + "zh_TW": "搜尋相容性列表紀錄..." + } + }, + { + "ID": "CompatibilityListOpen", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Open Compatibility List", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 목록 열기", + "no_NO": "Åpne kompatibilitetslisten", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Öppna kompatibilitetslistan", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "打开兼容性列表", + "zh_TW": "開啟相容性列表" + } + }, + { + "ID": "CompatibilityListOnlyShowOwnedGames", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Only show owned games", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "보유 게임만 표시", + "no_NO": "Vis bare eide spill", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Visa endast ägda spel", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "仅显示拥有的游戏", + "zh_TW": "只顯示已擁有的遊戲" + } + }, + { + "ID": "CompatibilityListPlayable", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Playable", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "플레이 가능", + "no_NO": "Spillbar", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Spelbart", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "可游玩", + "zh_TW": "可暢順遊玩 (Playable)" + } + }, + { + "ID": "CompatibilityListIngame", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Ingame", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "게임 내", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Spelproblem", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "进入游戏", + "zh_TW": "大致可遊玩 (Ingame)" + } + }, + { + "ID": "CompatibilityListMenus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Menus", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "메뉴", + "no_NO": "Menyer", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Menyer", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "菜单", + "zh_TW": "只開啟至遊戲開始功能表 (Menus)" + } + }, + { + "ID": "CompatibilityListBoots", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Boots", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "부츠", + "no_NO": "Starter", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Startar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "启动", + "zh_TW": "只能啟動 (Boots)" + } + }, + { + "ID": "CompatibilityListNothing", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Nothing", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "없음", + "no_NO": "Ingenting", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Ingenting", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "什么都没有", + "zh_TW": "無法啟動 (Nothing)" + } + }, + { + "ID": "ExtractAocListHeader", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Select a DLC to Extract", + "es_ES": "", + "fr_FR": "Choisissez un DLC à extraire", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Velg en DLC og hente ut", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", "zh_TW": "" } } diff --git a/src/Ryujinx/Common/ApplicationHelper.cs b/src/Ryujinx/Common/ApplicationHelper.cs index 7db933ed6..61c5cfe00 100644 --- a/src/Ryujinx/Common/ApplicationHelper.cs +++ b/src/Ryujinx/Common/ApplicationHelper.cs @@ -295,6 +295,142 @@ namespace Ryujinx.Ava.Common }; extractorThread.Start(); } + + public static void ExtractAoc(string destination, string updateFilePath, string updateName) + { + var cancellationToken = new CancellationTokenSource(); + + UpdateWaitWindow waitingDialog = new( + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, NcaSectionType.Data, Path.GetFileName(updateFilePath)), + cancellationToken); + + Thread extractorThread = new(() => + { + Dispatcher.UIThread.Post(waitingDialog.Show); + + using FileStream file = new(updateFilePath, FileMode.Open, FileAccess.Read); + + Nca publicDataNca = null; + + string extension = Path.GetExtension(updateFilePath).ToLower(); + if (extension is ".nsp") + { + var pfsTemp = new PartitionFileSystem(); + pfsTemp.Initialize(file.AsStorage()).ThrowIfFailure(); + IFileSystem pfs = pfsTemp; + + foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca")) + { + using var ncaFile = new UniqueRef(); + + pfs.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); + + Nca nca = new(_virtualFileSystem.KeySet, ncaFile.Get.AsStorage()); + if (nca.Header.ContentType is NcaContentType.PublicData && nca.SectionExists(NcaSectionType.Data)) + { + publicDataNca = nca; + } + } + } + + if (publicDataNca is null) + { + Logger.Error?.Print(LogClass.Application, "Extraction failure. The NCA was not present in the selected file"); + + Dispatcher.UIThread.InvokeAsync(async () => + { + waitingDialog.Close(); + + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionMainNcaNotFoundErrorMessage]); + }); + + return; + } + + IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks + ? IntegrityCheckLevel.ErrorOnInvalid + : IntegrityCheckLevel.None; + + int index = Nca.GetSectionIndexFromType(NcaSectionType.Data, publicDataNca.Header.ContentType); + + try + { + IFileSystem ncaFileSystem = publicDataNca.OpenFileSystem(index, IntegrityCheckLevel.ErrorOnInvalid); + + FileSystemClient fsClient = _horizonClient.Fs; + + string source = DateTime.Now.ToFileTime().ToString()[10..]; + string output = DateTime.Now.ToFileTime().ToString()[10..]; + + using var uniqueSourceFs = new UniqueRef(ncaFileSystem); + using var uniqueOutputFs = new UniqueRef(new LocalFileSystem(destination)); + + fsClient.Register(source.ToU8Span(), ref uniqueSourceFs.Ref); + fsClient.Register(output.ToU8Span(), ref uniqueOutputFs.Ref); + + (Result? resultCode, bool canceled) = CopyDirectory(fsClient, $"{source}:/", $"{output}:/", cancellationToken.Token); + + if (!canceled) + { + if (resultCode.Value.IsFailure()) + { + Logger.Error?.Print(LogClass.Application, $"LibHac returned error code: {resultCode.Value.ErrorCode}"); + + Dispatcher.UIThread.InvokeAsync(async () => + { + waitingDialog.Close(); + + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionCheckLogErrorMessage]); + }); + } + else if (resultCode.Value.IsSuccess()) + { + Dispatcher.UIThread.Post(waitingDialog.Close); + + NotificationHelper.ShowInformation( + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + $"{updateName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}"); + } + } + + fsClient.Unmount(source.ToU8Span()); + fsClient.Unmount(output.ToU8Span()); + } + catch (ArgumentException ex) + { + Logger.Error?.Print(LogClass.Application, $"{ex.Message}"); + + Dispatcher.UIThread.InvokeAsync(async () => + { + waitingDialog.Close(); + + await ContentDialogHelper.CreateErrorDialog(ex.Message); + }); + } + }) + { + Name = "GUI.AocExtractorThread", + IsBackground = true, + }; + extractorThread.Start(); + } + + public static async Task ExtractAoc(IStorageProvider storageProvider, string updateFilePath, string updateName) + { + var result = await storageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + { + Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle], + AllowMultiple = false, + }); + + if (result.Count == 0) + { + return; + } + + ExtractAoc(result[0].Path.LocalPath, updateFilePath, updateName); + } public static async Task ExtractSection(IStorageProvider storageProvider, NcaSectionType ncaSectionType, string titleFilePath, string titleName, int programIndex = 0) diff --git a/src/Ryujinx/Common/Models/DownloadableContentModel.cs b/src/Ryujinx/Common/Models/DownloadableContentModel.cs index ad9934bd2..de7a334ee 100644 --- a/src/Ryujinx/Common/Models/DownloadableContentModel.cs +++ b/src/Ryujinx/Common/Models/DownloadableContentModel.cs @@ -6,7 +6,7 @@ namespace Ryujinx.Ava.Common.Models public bool IsBundled { get; } = System.IO.Path.GetExtension(ContainerPath)?.ToLower() == ".xci"; public string FileName => System.IO.Path.GetFileName(ContainerPath); - public string TitleIdStr => TitleId.ToString("x16"); + public string TitleIdStr => TitleId.ToString("x16").ToUpper(); public ulong TitleIdBase => TitleId & ~0x1FFFUL; } } diff --git a/src/Ryujinx/Common/ThemeManager.cs b/src/Ryujinx/Common/ThemeManager.cs index 8c52c2a66..6da01bfa7 100644 --- a/src/Ryujinx/Common/ThemeManager.cs +++ b/src/Ryujinx/Common/ThemeManager.cs @@ -4,11 +4,11 @@ namespace Ryujinx.Ava.Common { public static class ThemeManager { - public static event EventHandler ThemeChanged; + public static event Action ThemeChanged; public static void OnThemeChanged() { - ThemeChanged?.Invoke(null, EventArgs.Empty); + ThemeChanged?.Invoke(); } } } diff --git a/src/Ryujinx/DiscordIntegrationModule.cs b/src/Ryujinx/DiscordIntegrationModule.cs index ee00f2c0d..18bdfaf17 100644 --- a/src/Ryujinx/DiscordIntegrationModule.cs +++ b/src/Ryujinx/DiscordIntegrationModule.cs @@ -1,6 +1,8 @@ using DiscordRPC; +using Gommon; using Humanizer; using Humanizer.Localisation; +using Ryujinx.Ava.Utilities; using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; @@ -45,16 +47,7 @@ namespace Ryujinx.Ava }; ConfigurationState.Instance.EnableDiscordIntegration.Event += Update; - TitleIDs.CurrentApplication.Event += (_, e) => - { - if (e.NewValue) - SwitchToPlayingState( - ApplicationLibrary.LoadAndSaveMetaData(e.NewValue), - Switch.Shared.Processes.ActiveApplication - ); - else - SwitchToMainState(); - }; + TitleIDs.CurrentApplication.Event += (_, e) => Use(e.NewValue); } private static void Update(object sender, ReactiveEventArgs evnt) @@ -75,11 +68,23 @@ namespace Ryujinx.Ava _discordClient = new DiscordRpcClient(ApplicationId); _discordClient.Initialize(); - _discordClient.SetPresence(_discordPresenceMain); + + Use(TitleIDs.CurrentApplication); } } } + public static void Use(Optional titleId) + { + if (titleId.TryGet(out string tid)) + SwitchToPlayingState( + ApplicationLibrary.LoadAndSaveMetaData(tid), + Switch.Shared.Processes.ActiveApplication + ); + else + SwitchToMainState(); + } + private static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes) { _discordClient?.SetPresence(new RichPresence @@ -93,7 +98,7 @@ namespace Ryujinx.Ava }, Details = TruncateToByteLength($"Playing {appMeta.Title}"), State = appMeta.LastPlayed.HasValue && appMeta.TimePlayed.TotalSeconds > 5 - ? $"Total play time: {appMeta.TimePlayed.Humanize(2, false, maxUnit: TimeUnit.Hour)}" + ? $"Total play time: {ValueFormatUtils.FormatTimeSpan(appMeta.TimePlayed)}" : "Never played", Timestamps = Timestamps.Now }); diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs index 19d2fb94e..7d75ac7c1 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs @@ -1,4 +1,4 @@ -using DiscordRPC; +using DiscordRPC; using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.SDL2; using Ryujinx.Ava; diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs index 5730254f7..787aaca62 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -228,8 +228,6 @@ namespace Ryujinx.Headless _inputConfiguration ??= []; _enableKeyboard = option.EnableKeyboard; _enableMouse = option.EnableMouse; - - LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1); LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2); @@ -301,7 +299,10 @@ namespace Ryujinx.Headless _userChannelPersistence.ShouldRestart = false; } - _inputManager.Dispose(); + try + { + _inputManager.Dispose(); + } catch {} return; @@ -338,12 +339,12 @@ namespace Ryujinx.Headless { string label = state switch { - LoadState => $"PTC : {current}/{total}", - ShaderCacheState => $"Shaders : {current}/{total}", - _ => throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}"), + LoadState => "PTC", + ShaderCacheState => "Shaders", + _ => throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}") }; - Logger.Info?.Print(LogClass.Application, label); + Logger.Info?.Print(LogClass.Application, $"{label} : {current}/{total}"); } private static WindowBase CreateWindow(Options options) diff --git a/src/Ryujinx/Headless/Ryujinx.bmp b/src/Ryujinx/Headless/Ryujinx.bmp deleted file mode 100644 index 36bf2f8ac..000000000 Binary files a/src/Ryujinx/Headless/Ryujinx.bmp and /dev/null differ diff --git a/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs deleted file mode 100644 index 6c76a43a1..000000000 --- a/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace Ryujinx.Headless -{ - class StatusUpdatedEventArgs( - string vSyncMode, - string dockedMode, - string aspectRatio, - string gameStatus, - string fifoStatus, - string gpuName) - : EventArgs - { - public string VSyncMode = vSyncMode; - public string DockedMode = dockedMode; - public string AspectRatio = aspectRatio; - public string GameStatus = gameStatus; - public string FifoStatus = fifoStatus; - public string GpuName = gpuName; - } -} diff --git a/src/Ryujinx/Headless/Metal/MetalWindow.cs b/src/Ryujinx/Headless/Windows/MetalWindow.cs similarity index 93% rename from src/Ryujinx/Headless/Metal/MetalWindow.cs rename to src/Ryujinx/Headless/Windows/MetalWindow.cs index a2693c69d..d79bd7938 100644 --- a/src/Ryujinx/Headless/Metal/MetalWindow.cs +++ b/src/Ryujinx/Headless/Windows/MetalWindow.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Headless bool ignoreControllerApplet) : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { } - public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_METAL; + public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_METAL; protected override void InitializeWindowRenderer() { diff --git a/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs b/src/Ryujinx/Headless/Windows/OpenGLWindow.cs similarity index 96% rename from src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs rename to src/Ryujinx/Headless/Windows/OpenGLWindow.cs index c00a0648f..117fe5780 100644 --- a/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs +++ b/src/Ryujinx/Headless/Windows/OpenGLWindow.cs @@ -108,8 +108,7 @@ namespace Ryujinx.Headless } } } - - private readonly GraphicsDebugLevel _glLogLevel; + private SDL2OpenGLContext _openGLContext; public OpenGLWindow( @@ -121,15 +120,14 @@ namespace Ryujinx.Headless bool ignoreControllerApplet) : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { - _glLogLevel = glLogLevel; } - public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_OPENGL; + public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_OPENGL; protected override void InitializeWindowRenderer() { // Ensure to not share this context with other contexts before this point. - SetupOpenGLAttributes(false, _glLogLevel); + SetupOpenGLAttributes(false, GlLogLevel); nint context = SDL_GL_CreateContext(WindowHandle); CheckResult(SDL_GL_SetSwapInterval(1)); diff --git a/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs b/src/Ryujinx/Headless/Windows/VulkanWindow.cs similarity index 94% rename from src/Ryujinx/Headless/Vulkan/VulkanWindow.cs rename to src/Ryujinx/Headless/Windows/VulkanWindow.cs index 92caad34e..2abbbd1e9 100644 --- a/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs +++ b/src/Ryujinx/Headless/Windows/VulkanWindow.cs @@ -10,8 +10,6 @@ namespace Ryujinx.Headless { class VulkanWindow : WindowBase { - private readonly GraphicsDebugLevel _glLogLevel; - public VulkanWindow( InputManager inputManager, GraphicsDebugLevel glLogLevel, @@ -21,10 +19,9 @@ namespace Ryujinx.Headless bool ignoreControllerApplet) : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { - _glLogLevel = glLogLevel; } - public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_VULKAN; + public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_VULKAN; protected override void InitializeWindowRenderer() { } diff --git a/src/Ryujinx/Headless/WindowBase.cs b/src/Ryujinx/Headless/Windows/WindowBase.cs similarity index 93% rename from src/Ryujinx/Headless/WindowBase.cs rename to src/Ryujinx/Headless/Windows/WindowBase.cs index d89638cc1..068c32062 100644 --- a/src/Ryujinx/Headless/WindowBase.cs +++ b/src/Ryujinx/Headless/Windows/WindowBase.cs @@ -1,14 +1,15 @@ using Humanizer; -using LibHac.Tools.Fs; using Ryujinx.Ava; +using Ryujinx.Ava.UI.Models; +using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; -using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.OpenGL; using Ryujinx.HLE.HOS.Applets; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.UI; using Ryujinx.Input; @@ -26,6 +27,7 @@ using static SDL2.SDL; using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing; using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter; using Switch = Ryujinx.HLE.Switch; +using UserProfile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; namespace Ryujinx.Headless { @@ -53,8 +55,6 @@ namespace Ryujinx.Headless public Switch Device { get; private set; } public IRenderer Renderer { get; private set; } - public event EventHandler StatusUpdatedEvent; - protected nint WindowHandle { get; set; } public IHostUITheme HostUITheme { get; } @@ -72,7 +72,7 @@ namespace Ryujinx.Headless protected SDL2MouseDriver MouseDriver; private readonly InputManager _inputManager; private readonly IKeyboard _keyboardInterface; - private readonly GraphicsDebugLevel _glLogLevel; + protected readonly GraphicsDebugLevel GlLogLevel; private readonly Stopwatch _chrono; private readonly long _ticksPerFrame; private readonly CancellationTokenSource _gpuCancellationTokenSource; @@ -104,7 +104,7 @@ namespace Ryujinx.Headless NpadManager = _inputManager.CreateNpadManager(); TouchScreenManager = _inputManager.CreateTouchScreenManager(); _keyboardInterface = (IKeyboard)_inputManager.KeyboardDriver.GetGamepad("0"); - _glLogLevel = glLogLevel; + GlLogLevel = glLogLevel; _chrono = new Stopwatch(); _ticksPerFrame = Stopwatch.Frequency / TargetFps; _gpuCancellationTokenSource = new CancellationTokenSource(); @@ -137,7 +137,7 @@ namespace Ryujinx.Headless private void SetWindowIcon() { - Stream iconStream = typeof(Program).Assembly.GetManifestResourceStream("HeadlessLogo"); + Stream iconStream = EmbeddedResources.GetStream("Ryujinx/Assets/UIImages/Logo_Ryujinx.png"); byte[] iconBytes = new byte[iconStream!.Length]; if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length) @@ -191,7 +191,7 @@ namespace Ryujinx.Headless FullscreenFlag = SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP; } - WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), Width, Height, DefaultFlags | FullscreenFlag | GetWindowFlags()); + WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), Width, Height, DefaultFlags | FullscreenFlag | WindowFlags); if (WindowHandle == nint.Zero) { @@ -246,7 +246,7 @@ namespace Ryujinx.Headless protected abstract void SwapBuffers(); - public abstract SDL_WindowFlags GetWindowFlags(); + public abstract SDL_WindowFlags WindowFlags { get; } private string GetGpuDriverName() { @@ -268,7 +268,7 @@ namespace Ryujinx.Headless { InitializeWindowRenderer(); - Device.Gpu.Renderer.Initialize(_glLogLevel); + Device.Gpu.Renderer.Initialize(GlLogLevel); InitializeRenderer(); @@ -308,21 +308,6 @@ namespace Ryujinx.Headless if (_ticks >= _ticksPerFrame) { - string dockedMode = Device.System.State.DockedMode ? "Docked" : "Handheld"; - float scale = GraphicsConfig.ResScale; - if (scale != 1) - { - dockedMode += $" ({scale}x)"; - } - - StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs( - Device.VSyncMode.ToString(), - dockedMode, - Device.Configuration.AspectRatio.ToText(), - $"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", - $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", - $"GPU: {_gpuDriverName}")); - _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame); } } @@ -572,5 +557,10 @@ namespace Ryujinx.Headless SDL2Driver.Instance.Dispose(); } } + + public UserProfile ShowPlayerSelectDialog() + { + return AccountSaveDataManager.GetLastUsedUser(); + } } } diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 6f0f3e12e..52b2d655d 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -21,6 +21,7 @@ using Ryujinx.Graphics.Vulkan.MoltenVK; using Ryujinx.Headless; using Ryujinx.SDL2.Common; using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -229,6 +230,7 @@ namespace Ryujinx.Ava internal static void PrintSystemInfo() { Logger.Notice.Print(LogClass.Application, $"{RyujinxApp.FullAppName} Version: {Version}"); + Logger.Notice.Print(LogClass.Application, $".NET Runtime: {RuntimeInformation.FrameworkDescription}"); SystemInfo.Gather().Print(); var enabledLogLevels = Logger.GetEnabledLevels().ToArray(); @@ -243,16 +245,33 @@ namespace Ryujinx.Ava : $"Launch Mode: {AppDataManager.Mode}"); } - internal static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating) + internal static void ProcessUnhandledException(object sender, Exception initialException, bool isTerminating) { Logger.Log log = Logger.Error ?? Logger.Notice; - string message = $"Unhandled exception caught: {ex}"; - // ReSharper disable once ConstantConditionalAccessQualifier - if (sender?.GetType()?.AsPrettyString() is { } senderName) - log.Print(LogClass.Application, message, senderName); + List exceptions = []; + + if (initialException is AggregateException ae) + { + exceptions.AddRange(ae.InnerExceptions); + } else - log.PrintMsg(LogClass.Application, message); + { + exceptions.Add(initialException); + } + + foreach (var e in exceptions) + { + string message = $"Unhandled exception caught: {e}"; + // ReSharper disable once ConstantConditionalAccessQualifier + if (sender?.GetType()?.AsPrettyString() is { } senderName) + log.Print(LogClass.Application, message, senderName); + else + log.PrintMsg(LogClass.Application, message); + } + + + if (isTerminating) Exit(); diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 0991cf9ce..7d342812f 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -61,6 +61,7 @@ + @@ -113,6 +114,10 @@ Designer + + + + MSBuild:Compile @@ -140,6 +145,9 @@ Assets\ShortcutFiles\shortcut-template.plist + + Assets\RyujinxGameCompatibility.csv + @@ -158,9 +166,12 @@ - + + + + diff --git a/src/Ryujinx/RyujinxApp.axaml b/src/Ryujinx/RyujinxApp.axaml index e07d7ff26..aca69645a 100644 --- a/src/Ryujinx/RyujinxApp.axaml +++ b/src/Ryujinx/RyujinxApp.axaml @@ -6,6 +6,9 @@ + + avares://Ryujinx/Assets/Fonts/Mono/#JetBrains Mono + diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index 65f4c7795..a2cac35c7 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -1,17 +1,24 @@ using Avalonia.Controls; using Avalonia.Threading; using FluentAvalonia.UI.Controls; +using Gommon; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.ViewModels.Input; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Common; using Ryujinx.HLE; using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.UI; using System; +using System.Collections.ObjectModel; +using System.Linq; using System.Threading; namespace Ryujinx.Ava.UI.Applet @@ -253,5 +260,59 @@ namespace Ryujinx.Ava.UI.Applet } public IDynamicTextInputHandler CreateDynamicTextInputHandler() => new AvaloniaDynamicTextInputHandler(_parent); + + public UserProfile ShowPlayerSelectDialog() + { + UserId selected = UserId.Null; + byte[] defaultGuestImage = EmbeddedResources.Read("Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg"); + UserProfile guest = new UserProfile(new UserId("00000000000000000000000000000080"), "Guest", defaultGuestImage); + + ManualResetEvent dialogCloseEvent = new(false); + + Dispatcher.UIThread.InvokeAsync(async () => + { + ObservableCollection profiles = []; + NavigationDialogHost nav = new(); + + _parent.AccountManager.GetAllUsers() + .OrderBy(x => x.Name) + .ForEach(profile => profiles.Add(new Models.UserProfile(profile, nav))); + + profiles.Add(new Models.UserProfile(guest, nav)); + UserSelectorDialogViewModel viewModel = new() + { + Profiles = profiles, + SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId + }; + UserSelectorDialog content = new(viewModel); + (selected, _) = await UserSelectorDialog.ShowInputDialog(content); + + dialogCloseEvent.Set(); + }); + + dialogCloseEvent.WaitOne(); + + UserProfile profile = _parent.AccountManager.LastOpenedUser; + if (selected == guest.UserId) + { + profile = guest; + } + else if (selected == UserId.Null) + { + profile = null; + } + else + { + foreach (UserProfile p in _parent.AccountManager.GetAllUsers()) + { + if (p.UserId == selected) + { + profile = p; + break; + } + } + } + return profile; + } } } diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml new file mode 100644 index 000000000..ed22fb088 --- /dev/null +++ b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs new file mode 100644 index 000000000..6e25588ec --- /dev/null +++ b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs @@ -0,0 +1,123 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.ViewModels.Input; +using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Account.Acc; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using UserProfile = Ryujinx.Ava.UI.Models.UserProfile; +using UserProfileSft = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; + +namespace Ryujinx.Ava.UI.Applet +{ + public partial class UserSelectorDialog : UserControl, INotifyPropertyChanged + { + public UserSelectorDialogViewModel ViewModel { get; set; } + + public UserSelectorDialog(UserSelectorDialogViewModel viewModel) + { + InitializeComponent(); + ViewModel = viewModel; + DataContext = ViewModel; + } + + private void Grid_PointerEntered(object sender, PointerEventArgs e) + { + if (sender is Grid { DataContext: UserProfile profile }) + { + profile.IsPointerOver = true; + } + } + + private void Grid_OnPointerExited(object sender, PointerEventArgs e) + { + if (sender is Grid { DataContext: UserProfile profile }) + { + profile.IsPointerOver = false; + } + } + + private void ProfilesList_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender is ListBox listBox) + { + int selectedIndex = listBox.SelectedIndex; + + if (selectedIndex >= 0 && selectedIndex < ViewModel.Profiles.Count) + { + if (ViewModel.Profiles[selectedIndex] is UserProfile userProfile) + { + ViewModel.SelectedUserId = userProfile.UserId; + Logger.Info?.Print(LogClass.UI, $"Selected user: {userProfile.UserId}"); + + ObservableCollection newProfiles = []; + + foreach (var item in ViewModel.Profiles) + { + if (item is UserProfile originalItem) + { + var profile = new UserProfileSft(originalItem.UserId, originalItem.Name, originalItem.Image); + + if (profile.UserId == ViewModel.SelectedUserId) + { + profile.AccountState = AccountState.Open; + } + + newProfiles.Add(new UserProfile(profile, new NavigationDialogHost())); + } + } + + ViewModel.Profiles = newProfiles; + } + } + } + } + + public static async Task<(UserId Id, bool Result)> ShowInputDialog(UserSelectorDialog content) + { + ContentDialog contentDialog = new() + { + Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle], + PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue], + SecondaryButtonText = string.Empty, + CloseButtonText = LocaleManager.Instance[LocaleKeys.Cancel], + Content = content, + Padding = new Thickness(0) + }; + + UserId result = UserId.Null; + bool input = false; + + void Handler(ContentDialog sender, ContentDialogClosedEventArgs eventArgs) + { + if (eventArgs.Result == ContentDialogResult.Primary) + { + if (contentDialog.Content is UserSelectorDialog view) + { + result = view.ViewModel.SelectedUserId; + input = true; + } + } + else + { + result = UserId.Null; + input = false; + } + } + + contentDialog.Closed += Handler; + + await ContentDialogHelper.ShowAsync(contentDialog); + + return (result, input); + } + } +} diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml index 7708936ca..9fed95aa7 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml @@ -106,6 +106,10 @@ Click="ExtractApplicationRomFs_Click" Header="{ext:Locale GameListContextMenuExtractDataRomFS}" ToolTip.Tip="{ext:Locale GameListContextMenuExtractDataRomFSToolTip}" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs b/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs new file mode 100644 index 000000000..c011ca110 --- /dev/null +++ b/src/Ryujinx/UI/Controls/DlcSelectView.axaml.cs @@ -0,0 +1,51 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Avalonia.Styling; +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.Utilities.AppLibrary; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Controls +{ + public partial class DlcSelectView : UserControl + { + public DlcSelectView() + { + InitializeComponent(); + } + +#nullable enable + public static async Task Show(ulong selectedTitleId, ApplicationLibrary appLibrary) +#nullable disable + { + DlcSelectViewModel viewModel = new(selectedTitleId, appLibrary); + + ContentDialog contentDialog = new() + { + PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue], + SecondaryButtonText = string.Empty, + CloseButtonText = string.Empty, + Content = new DlcSelectView { DataContext = viewModel } + }; + + Style closeButton = new(x => x.Name("CloseButton")); + closeButton.Setters.Add(new Setter(WidthProperty, 80d)); + + Style closeButtonParent = new(x => x.Name("CommandSpace")); + closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty, + Avalonia.Layout.HorizontalAlignment.Right)); + + contentDialog.Styles.Add(closeButton); + contentDialog.Styles.Add(closeButtonParent); + + await ContentDialogHelper.ShowAsync(contentDialog); + + return viewModel.SelectedDlc; + } + } +} diff --git a/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs b/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs index c27a3ac9b..4d021655e 100644 --- a/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs +++ b/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs @@ -69,7 +69,7 @@ namespace Ryujinx.Ava.UI.Controls VirtualFileSystem ownerVirtualFileSystem, HorizonClient ownerHorizonClient) { - var content = new NavigationDialogHost(ownerAccountManager, ownerContentManager, ownerVirtualFileSystem, ownerHorizonClient); + NavigationDialogHost content = new(ownerAccountManager, ownerContentManager, ownerVirtualFileSystem, ownerHorizonClient); ContentDialog contentDialog = new() { Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle], diff --git a/src/Ryujinx/UI/Controls/UpdateWaitWindow.axaml b/src/Ryujinx/UI/Controls/UpdateWaitWindow.axaml index ba41ab6f0..a812cf70c 100644 --- a/src/Ryujinx/UI/Controls/UpdateWaitWindow.axaml +++ b/src/Ryujinx/UI/Controls/UpdateWaitWindow.axaml @@ -7,6 +7,7 @@ Title="Ryujinx - Waiting" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterOwner" + CanResize="False" mc:Ignorable="d" Focusable="True"> new(action); + public static RelayCommand CreateConditional(Action action, Func canExecute) + => new(action, canExecute); + + public static RelayCommand Create(Action action) + => new(action); + public static RelayCommand CreateConditional(Action action, Predicate canExecute) + => new(action, canExecute); + + public static AsyncRelayCommand Create(Func action) + => new(action, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrent(Func action) + => new(action, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFail(Func action) + => new(action, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + + public static AsyncRelayCommand Create(Func action) + => new(action, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrent(Func action) + => new(action, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFail(Func action) + => new(action, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + + public static AsyncRelayCommand CreateConditional(Func action, Func canExecute) + => new(action, canExecute, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrentConditional(Func action, Func canExecute) + => new(action, canExecute, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFailConditional(Func action, Func canExecute) + => new(action, canExecute, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + + public static AsyncRelayCommand CreateConditional(Func action, Predicate canExecute) + => new(action, canExecute, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrentConditional(Func action, Predicate canExecute) + => new(action, canExecute, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFailConditional(Func action, Predicate canExecute) + => new(action, canExecute, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + } +} diff --git a/src/Ryujinx/UI/Helpers/BitmapArrayValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/BitmapArrayValueConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/BitmapArrayValueConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/BitmapArrayValueConverter.cs diff --git a/src/Ryujinx/UI/Helpers/DownloadableContentLabelConverter.cs b/src/Ryujinx/UI/Helpers/Converters/DownloadableContentLabelConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/DownloadableContentLabelConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/DownloadableContentLabelConverter.cs diff --git a/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/GlyphValueConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/GlyphValueConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/GlyphValueConverter.cs diff --git a/src/Ryujinx/UI/Helpers/KeyValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/KeyValueConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs diff --git a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs diff --git a/src/Ryujinx/UI/Helpers/Converters/PlayabilityStatusConverter.cs b/src/Ryujinx/UI/Helpers/Converters/PlayabilityStatusConverter.cs new file mode 100644 index 000000000..99c6a0fce --- /dev/null +++ b/src/Ryujinx/UI/Helpers/Converters/PlayabilityStatusConverter.cs @@ -0,0 +1,28 @@ +using Avalonia.Data.Converters; +using Avalonia.Media; +using Gommon; +using Ryujinx.Ava.Common.Locale; +using System; +using System.Globalization; + +namespace Ryujinx.Ava.UI.Helpers +{ + public class PlayabilityStatusConverter : IValueConverter + { + private static readonly Lazy _shared = new(() => new()); + public static PlayabilityStatusConverter Shared => _shared.Value; + + public object Convert(object value, Type _, object __, CultureInfo ___) + => value.Cast() switch + { + LocaleKeys.CompatibilityListNothing or + LocaleKeys.CompatibilityListBoots or + LocaleKeys.CompatibilityListMenus => Brushes.Red, + LocaleKeys.CompatibilityListIngame => Brushes.Yellow, + _ => Brushes.ForestGreen + }; + + public object ConvertBack(object value, Type _, object __, CultureInfo ___) + => throw new NotSupportedException(); + } +} diff --git a/src/Ryujinx/UI/Helpers/TimeZoneConverter.cs b/src/Ryujinx/UI/Helpers/Converters/TimeZoneConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/TimeZoneConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/TimeZoneConverter.cs diff --git a/src/Ryujinx/UI/Helpers/TitleUpdateLabelConverter.cs b/src/Ryujinx/UI/Helpers/Converters/TitleUpdateLabelConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/TitleUpdateLabelConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/TitleUpdateLabelConverter.cs diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileSpaceSavingsConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileSpaceSavingsConverter.cs diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusDetailConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusDetailConverter.cs diff --git a/src/Ryujinx/UI/Helpers/MiniCommand.cs b/src/Ryujinx/UI/Helpers/MiniCommand.cs index 7e1bb9a68..9782aa69d 100644 --- a/src/Ryujinx/UI/Helpers/MiniCommand.cs +++ b/src/Ryujinx/UI/Helpers/MiniCommand.cs @@ -63,6 +63,7 @@ namespace Ryujinx.Ava.UI.Helpers public static MiniCommand Create(Action callback) => new MiniCommand(_ => callback()); public static MiniCommand Create(Action callback) => new MiniCommand(callback); public static MiniCommand CreateFromTask(Func callback) => new MiniCommand(_ => callback()); + public static MiniCommand CreateFromTask(Func callback) => new MiniCommand(callback); public abstract bool CanExecute(object parameter); public abstract void Execute(object parameter); diff --git a/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs b/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs index 4c7a6bd02..40f53c673 100644 --- a/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs +++ b/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs @@ -1,152 +1,53 @@ +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common.Configuration.Hid; namespace Ryujinx.Ava.UI.Models.Input { - public class HotkeyConfig : BaseModel + public partial class HotkeyConfig : BaseModel { - private Key _toggleVSyncMode; - public Key ToggleVSyncMode - { - get => _toggleVSyncMode; - set - { - _toggleVSyncMode = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _toggleVSyncMode; - private Key _screenshot; - public Key Screenshot - { - get => _screenshot; - set - { - _screenshot = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _screenshot; - private Key _showUI; - public Key ShowUI - { - get => _showUI; - set - { - _showUI = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _showUI; - private Key _pause; - public Key Pause - { - get => _pause; - set - { - _pause = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _pause; - private Key _toggleMute; - public Key ToggleMute - { - get => _toggleMute; - set - { - _toggleMute = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _toggleMute; - private Key _resScaleUp; - public Key ResScaleUp - { - get => _resScaleUp; - set - { - _resScaleUp = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _resScaleUp; - private Key _resScaleDown; - public Key ResScaleDown - { - get => _resScaleDown; - set - { - _resScaleDown = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _resScaleDown; - private Key _volumeUp; - public Key VolumeUp - { - get => _volumeUp; - set - { - _volumeUp = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _volumeUp; - private Key _volumeDown; - public Key VolumeDown - { - get => _volumeDown; - set - { - _volumeDown = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _volumeDown; - private Key _customVSyncIntervalIncrement; - public Key CustomVSyncIntervalIncrement - { - get => _customVSyncIntervalIncrement; - set - { - _customVSyncIntervalIncrement = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _customVSyncIntervalIncrement; - private Key _customVSyncIntervalDecrement; - public Key CustomVSyncIntervalDecrement - { - get => _customVSyncIntervalDecrement; - set - { - _customVSyncIntervalDecrement = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _customVSyncIntervalDecrement; public HotkeyConfig(KeyboardHotkeys config) { - if (config != null) - { - ToggleVSyncMode = config.ToggleVSyncMode; - Screenshot = config.Screenshot; - ShowUI = config.ShowUI; - Pause = config.Pause; - ToggleMute = config.ToggleMute; - ResScaleUp = config.ResScaleUp; - ResScaleDown = config.ResScaleDown; - VolumeUp = config.VolumeUp; - VolumeDown = config.VolumeDown; - CustomVSyncIntervalIncrement = config.CustomVSyncIntervalIncrement; - CustomVSyncIntervalDecrement = config.CustomVSyncIntervalDecrement; - } + if (config == null) + return; + + ToggleVSyncMode = config.ToggleVSyncMode; + Screenshot = config.Screenshot; + ShowUI = config.ShowUI; + Pause = config.Pause; + ToggleMute = config.ToggleMute; + ResScaleUp = config.ResScaleUp; + ResScaleDown = config.ResScaleDown; + VolumeUp = config.VolumeUp; + VolumeDown = config.VolumeDown; + CustomVSyncIntervalIncrement = config.CustomVSyncIntervalIncrement; + CustomVSyncIntervalDecrement = config.CustomVSyncIntervalDecrement; } - public KeyboardHotkeys GetConfig() - { - var config = new KeyboardHotkeys + public KeyboardHotkeys GetConfig() => + new() { ToggleVSyncMode = ToggleVSyncMode, Screenshot = Screenshot, @@ -160,8 +61,5 @@ namespace Ryujinx.Ava.UI.Models.Input CustomVSyncIntervalIncrement = CustomVSyncIntervalIncrement, CustomVSyncIntervalDecrement = CustomVSyncIntervalDecrement, }; - - return config; - } } } diff --git a/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs b/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs index 6f0f5ab5d..9755aad46 100644 --- a/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs +++ b/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs @@ -22,5 +22,22 @@ namespace Ryujinx.Ava.UI.Models FifoStatus = fifoStatus; ShaderCount = shaderCount; } + + + public override bool Equals(object obj) + { + if (obj is not StatusUpdatedEventArgs suea) return false; + return + VSyncMode == suea.VSyncMode && + VolumeStatus == suea.VolumeStatus && + DockedMode == suea.DockedMode && + AspectRatio == suea.AspectRatio && + GameStatus == suea.GameStatus && + FifoStatus == suea.FifoStatus && + ShaderCount == suea.ShaderCount; + } + + public override int GetHashCode() + => HashCode.Combine(VSyncMode, VolumeStatus, AspectRatio, DockedMode, FifoStatus, GameStatus, ShaderCount); } } diff --git a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs index 979ae8253..10256babe 100644 --- a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Ava.UI.ViewModels ThemeManager.ThemeChanged += ThemeManager_ThemeChanged; } - private void ThemeManager_ThemeChanged(object sender, EventArgs e) + private void ThemeManager_ThemeChanged() { Dispatcher.UIThread.Post(() => UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value)); } diff --git a/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs b/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs new file mode 100644 index 000000000..d50d8249a --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs @@ -0,0 +1,25 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Utilities.AppLibrary; +using System.Linq; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public partial class DlcSelectViewModel : BaseModel + { + [ObservableProperty] private DownloadableContentModel[] _dlcs; + #nullable enable + [ObservableProperty] private DownloadableContentModel? _selectedDlc; + #nullable disable + + public DlcSelectViewModel(ulong titleId, ApplicationLibrary appLibrary) + { + _dlcs = appLibrary.DownloadableContents.Items + .Where(x => x.Dlc.TitleIdBase == titleId) + .Select(x => x.Dlc) + .OrderBy(it => it.IsBundled ? 0 : 1) + .ThenBy(it => it.TitleId) + .ToArray(); + } + } +} diff --git a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs index 6ee79a371..482fe2981 100644 --- a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs @@ -1,21 +1,13 @@ using Avalonia.Svg.Skia; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Views.Input; namespace Ryujinx.Ava.UI.ViewModels.Input { - public class ControllerInputViewModel : BaseModel + public partial class ControllerInputViewModel : BaseModel { - private GamepadInputConfig _config; - public GamepadInputConfig Config - { - get => _config; - set - { - _config = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private GamepadInputConfig _config; private bool _isLeft; public bool IsLeft @@ -43,16 +35,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public bool HasSides => IsLeft ^ IsRight; - private SvgImage _image; - public SvgImage Image - { - get => _image; - set - { - _image = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private SvgImage _image; public readonly InputViewModel ParentModel; diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 16f8e46fa..05f479d9f 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -1,9 +1,8 @@ -using Avalonia; using Avalonia.Collections; using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Svg.Skia; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; using Ryujinx.Ava.UI.Helpers; @@ -32,7 +31,7 @@ using Key = Ryujinx.Common.Configuration.Hid.Key; namespace Ryujinx.Ava.UI.ViewModels.Input { - public class InputViewModel : BaseModel, IDisposable + public partial class InputViewModel : BaseModel, IDisposable { private const string Disabled = "disabled"; private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg"; @@ -48,8 +47,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input private int _controller; private string _controllerImage; private int _device; - private object _configViewModel; - private string _profileName; + [ObservableProperty] private object _configViewModel; + [ObservableProperty] private string _profileName; private bool _isLoaded; private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); @@ -73,17 +72,6 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public bool IsModified { get; set; } public event Action NotifyChangesEvent; - public object ConfigViewModel - { - get => _configViewModel; - set - { - _configViewModel = value; - - OnPropertyChanged(); - } - } - public PlayerIndex PlayerIdChoose { get => _playerIdChoose; @@ -200,16 +188,6 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } } - public string ProfileName - { - get => _profileName; set - { - _profileName = value; - - OnPropertyChanged(); - } - } - public int Device { get => _device; diff --git a/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs index 0b530eb09..5ff9bb578 100644 --- a/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs @@ -1,20 +1,12 @@ using Avalonia.Svg.Skia; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.Models.Input; namespace Ryujinx.Ava.UI.ViewModels.Input { - public class KeyboardInputViewModel : BaseModel + public partial class KeyboardInputViewModel : BaseModel { - private KeyboardInputConfig _config; - public KeyboardInputConfig Config - { - get => _config; - set - { - _config = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private KeyboardInputConfig _config; private bool _isLeft; public bool IsLeft @@ -42,16 +34,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public bool HasSides => IsLeft ^ IsRight; - private SvgImage _image; - public SvgImage Image - { - get => _image; - set - { - _image = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private SvgImage _image; public readonly InputViewModel ParentModel; diff --git a/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs index c9ed8f2d4..ba8686831 100644 --- a/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs @@ -1,93 +1,23 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace Ryujinx.Ava.UI.ViewModels.Input { - public class MotionInputViewModel : BaseModel + public partial class MotionInputViewModel : BaseModel { - private int _slot; - public int Slot - { - get => _slot; - set - { - _slot = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _slot; - private int _altSlot; - public int AltSlot - { - get => _altSlot; - set - { - _altSlot = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _altSlot; - private string _dsuServerHost; - public string DsuServerHost - { - get => _dsuServerHost; - set - { - _dsuServerHost = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private string _dsuServerHost; - private int _dsuServerPort; - public int DsuServerPort - { - get => _dsuServerPort; - set - { - _dsuServerPort = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _dsuServerPort; - private bool _mirrorInput; - public bool MirrorInput - { - get => _mirrorInput; - set - { - _mirrorInput = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private bool _mirrorInput; - private int _sensitivity; - public int Sensitivity - { - get => _sensitivity; - set - { - _sensitivity = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _sensitivity; - private double _gryoDeadzone; - public double GyroDeadzone - { - get => _gryoDeadzone; - set - { - _gryoDeadzone = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private double _gyroDeadzone; - private bool _enableCemuHookMotion; - public bool EnableCemuHookMotion - { - get => _enableCemuHookMotion; - set - { - _enableCemuHookMotion = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private bool _enableCemuHookMotion; } } diff --git a/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs index 8ad33cf4c..c4158fced 100644 --- a/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs @@ -1,27 +1,11 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace Ryujinx.Ava.UI.ViewModels.Input { - public class RumbleInputViewModel : BaseModel + public partial class RumbleInputViewModel : BaseModel { - private float _strongRumble; - public float StrongRumble - { - get => _strongRumble; - set - { - _strongRumble = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private float _strongRumble; - private float _weakRumble; - public float WeakRumble - { - get => _weakRumble; - set - { - _weakRumble = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private float _weakRumble; } } diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 45f51e0c1..f8562e7f3 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -38,7 +38,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using Ryujinx.HLE.UI; using Ryujinx.Input.HLE; -using Silk.NET.Vulkan; using SkiaSharp; using System; using System.Collections.Generic; @@ -80,7 +79,9 @@ namespace Ryujinx.Ava.UI.ViewModels [ObservableProperty] private Brush _progressBarForegroundColor; [ObservableProperty] private Brush _progressBarBackgroundColor; [ObservableProperty] private Brush _vSyncModeColor; - [ObservableProperty] private byte[] _selectedIcon; + #nullable enable + [ObservableProperty] private byte[]? _selectedIcon; + #nullable disable [ObservableProperty] private int _statusBarProgressMaximum; [ObservableProperty] private int _statusBarProgressValue; [ObservableProperty] private string _statusBarProgressStatusText; @@ -125,43 +126,6 @@ namespace Ryujinx.Ava.UI.ViewModels private ApplicationData _listSelectedApplication; private ApplicationData _gridSelectedApplication; - public ApplicationData ListSelectedApplication - { - get => _listSelectedApplication; - set - { - _listSelectedApplication = value; - -#pragma warning disable MVVMTK0034 - if (_listSelectedApplication != null && _listAppContextMenu == null) - - ListAppContextMenu = new ApplicationContextMenu(); - else if (_listSelectedApplication == null && _listAppContextMenu != null) - ListAppContextMenu = null!; -#pragma warning restore MVVMTK0034 - - OnPropertyChanged(); - } - } - - public ApplicationData GridSelectedApplication - { - get => _gridSelectedApplication; - set - { - _gridSelectedApplication = value; - -#pragma warning disable MVVMTK0034 - if (_gridSelectedApplication != null && _gridAppContextMenu == null) - GridAppContextMenu = new ApplicationContextMenu(); - else if (_gridSelectedApplication == null && _gridAppContextMenu != null) - GridAppContextMenu = null!; -#pragma warning restore MVVMTK0034 - - OnPropertyChanged(); - } - } - // Key is Title ID public SafeDictionary LdnData = []; @@ -185,9 +149,8 @@ namespace Ryujinx.Ava.UI.ViewModels .OnItemAdded(_ => OnPropertyChanged(nameof(AppsObservableList))) .OnItemRemoved(_ => OnPropertyChanged(nameof(AppsObservableList))) #pragma warning disable MVVMTK0034 // Event to update is fired below - .Bind(out _appsObservableList) + .Bind(out _appsObservableList); #pragma warning restore MVVMTK0034 - .AsObservableList(); _rendererWaitEvent = new AutoResetEvent(false); @@ -335,6 +298,43 @@ namespace Ryujinx.Ava.UI.ViewModels OnPropertyChanged(nameof(ShowFirmwareStatus)); } } + + public ApplicationData ListSelectedApplication + { + get => _listSelectedApplication; + set + { + _listSelectedApplication = value; + +#pragma warning disable MVVMTK0034 + if (_listSelectedApplication != null && _listAppContextMenu == null) + + ListAppContextMenu = new ApplicationContextMenu(); + else if (_listSelectedApplication == null && _listAppContextMenu != null) + ListAppContextMenu = null!; +#pragma warning restore MVVMTK0034 + + OnPropertyChanged(); + } + } + + public ApplicationData GridSelectedApplication + { + get => _gridSelectedApplication; + set + { + _gridSelectedApplication = value; + +#pragma warning disable MVVMTK0034 + if (_gridSelectedApplication != null && _gridAppContextMenu == null) + GridAppContextMenu = new ApplicationContextMenu(); + else if (_gridSelectedApplication == null && _gridAppContextMenu != null) + GridAppContextMenu = null!; +#pragma warning restore MVVMTK0034 + + OnPropertyChanged(); + } + } public ApplicationData SelectedApplication { @@ -753,7 +753,10 @@ namespace Ryujinx.Ava.UI.ViewModels Applications.ToObservableChangeSet() .Filter(Filter) .Sort(GetComparer()) - .Bind(out _appsObservableList).AsObservableList(); +#pragma warning disable MVVMTK0034 + .Bind(out _appsObservableList) +#pragma warning restore MVVMTK0034 + .AsObservableList(); OnPropertyChanged(nameof(AppsObservableList)); } @@ -1773,7 +1776,7 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public async void ProcessTrimResult(String filename, Ryujinx.Common.Utilities.XCIFileTrimmer.OperationOutcome operationOutcome) + public async void ProcessTrimResult(String filename, XCIFileTrimmer.OperationOutcome operationOutcome) { string notifyUser = operationOutcome.ToLocalisedText(); @@ -1788,12 +1791,8 @@ namespace Ryujinx.Ava.UI.ViewModels { switch (operationOutcome) { - case Ryujinx.Common.Utilities.XCIFileTrimmer.OperationOutcome.Successful: - if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - if (desktop.MainWindow is MainWindow mainWindow) - mainWindow.LoadApplications(); - } + case XCIFileTrimmer.OperationOutcome.Successful: + RyujinxApp.MainWindow.LoadApplications(); break; } } diff --git a/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs b/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs new file mode 100644 index 000000000..094aed5cf --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs @@ -0,0 +1,14 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Ryujinx.HLE.HOS.Services.Account.Acc; +using System.Collections.ObjectModel; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public partial class UserSelectorDialogViewModel : BaseModel + { + + [ObservableProperty] private UserId _selectedUserId; + + [ObservableProperty] private ObservableCollection _profiles = []; + } +} diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 09b83e033..aa37f3720 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -56,7 +56,7 @@ ToolTip.Tip="{ext:Locale LoadTitleUpdatesFromFolderTooltip}" /> @@ -72,7 +72,7 @@ ToolTip.Tip="{ext:Locale OpenRyujinxLogsTooltip}" /> @@ -190,7 +190,7 @@ Header="{ext:Locale MenuBarShowFileTypes}" /> + IsVisible="{Binding !EnableNonGameRunningControls}"> - - - - + + + + - - - + + + - - - + + + - + - - - - + + + + + diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index be444faa4..9a63c022d 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -1,13 +1,15 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Interactivity; +using Avalonia.Layout; using Avalonia.Threading; +using CommunityToolkit.Mvvm.Input; using Gommon; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Utilities.Compat; using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Helper; @@ -16,6 +18,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Views.Main { @@ -33,9 +36,37 @@ namespace Ryujinx.Ava.UI.Views.Main ToggleFileTypesMenuItem.ItemsSource = GenerateToggleFileTypeItems(); ChangeLanguageMenuItem.ItemsSource = GenerateLanguageMenuItems(); + + MiiAppletMenuItem.Command = Commands.Create(OpenMiiApplet); + CloseRyujinxMenuItem.Command = Commands.Create(CloseWindow); + OpenSettingsMenuItem.Command = Commands.Create(OpenSettings); + PauseEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Pause()); + ResumeEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Resume()); + StopEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted()); + CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp); + InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes); + UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes); + XciTrimmerMenuItem.Command = Commands.Create(XCITrimmerWindow.Show); + AboutWindowMenuItem.Command = Commands.Create(AboutWindow.Show); + CompatibilityListMenuItem.Command = Commands.Create(CompatibilityList.Show); + + UpdateMenuItem.Command = Commands.Create(async () => + { + if (Updater.CanUpdate(true)) + await Updater.BeginUpdateAsync(true); + }); + + FaqMenuItem.Command = + SetupGuideMenuItem.Command = + LdnGuideMenuItem.Command = Commands.Create(OpenHelper.OpenUrl); + + WindowSize720PMenuItem.Command = + WindowSize1080PMenuItem.Command = + WindowSize1440PMenuItem.Command = + WindowSize2160PMenuItem.Command = Commands.Create(ChangeWindowSize); } - private CheckBox[] GenerateToggleFileTypeItems() => + private IEnumerable GenerateToggleFileTypeItems() => Enum.GetValues() .Select(it => (FileName: Enum.GetName(it)!, FileType: it)) .Select(it => @@ -45,15 +76,13 @@ namespace Ryujinx.Ava.UI.Views.Main IsChecked = it.FileType.GetConfigValue(ConfigurationState.Instance.UI.ShownFileTypes), Command = MiniCommand.Create(() => Window.ToggleFileType(it.FileName)) } - ).ToArray(); + ); - private static MenuItem[] GenerateLanguageMenuItems() + private static IEnumerable GenerateLanguageMenuItems() { - List menuItems = new(); + const string LocalePath = "Ryujinx/Assets/locales.json"; - string localePath = "Ryujinx/Assets/locales.json"; - - string languageJson = EmbeddedResources.ReadAllText(localePath); + string languageJson = EmbeddedResources.ReadAllText(LocalePath); LocalesJson locales = JsonHelper.Deserialize(languageJson, LocalesJsonContext.Default.LocalesJson); @@ -68,20 +97,23 @@ namespace Ryujinx.Ava.UI.Views.Main } else { - languageName = locales.Locales[index].Translations[language] == "" ? language : locales.Locales[index].Translations[language]; + string tr = locales.Locales[index].Translations[language]; + languageName = string.IsNullOrEmpty(tr) + ? language + : tr; } MenuItem menuItem = new() { - Padding = new Thickness(10, 0, 0, 0), - Header = " " + languageName, + Padding = new Thickness(15, 0, 0, 0), + Margin = new Thickness(3, 0, 3, 0), + HorizontalAlignment = HorizontalAlignment.Stretch, + Header = languageName, Command = MiniCommand.Create(() => MainWindowViewModel.ChangeLanguage(language)) }; - menuItems.Add(menuItem); + yield return menuItem; } - - return menuItems.ToArray(); } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) @@ -95,22 +127,7 @@ namespace Ryujinx.Ava.UI.Views.Main } } - private async void StopEmulation_Click(object sender, RoutedEventArgs e) - { - await ViewModel.AppHost?.ShowExitPrompt().OrCompleted()!; - } - - private void PauseEmulation_Click(object sender, RoutedEventArgs e) - { - ViewModel.AppHost?.Pause(); - } - - private void ResumeEmulation_Click(object sender, RoutedEventArgs e) - { - ViewModel.AppHost?.Resume(); - } - - public async void OpenSettings(object sender, RoutedEventArgs e) + public async Task OpenSettings() { Window.SettingsWindow = new(Window.VirtualFileSystem, Window.ContentManager); @@ -121,23 +138,17 @@ namespace Ryujinx.Ava.UI.Views.Main ViewModel.LoadConfigurableHotKeys(); } - public static readonly AppletMetadata MiiApplet = new("miiEdit", 0x0100000000001009); - - public async void OpenMiiApplet(object sender, RoutedEventArgs e) + public AppletMetadata MiiApplet => new(ViewModel.ContentManager, "miiEdit", 0x0100000000001009); + + public async Task OpenMiiApplet() { - if (MiiApplet.CanStart(ViewModel.ContentManager, out var appData, out var nacpData)) - { - await ViewModel.LoadApplication(appData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData); - } + if (!MiiApplet.CanStart(out var appData, out var nacpData)) + return; + + await ViewModel.LoadApplication(appData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData); } - public async void OpenAmiiboWindow(object sender, RoutedEventArgs e) - => await ViewModel.OpenAmiiboWindow(); - - public async void OpenBinFile(object sender, RoutedEventArgs e) - => await ViewModel.OpenBinFile(); - - public async void OpenCheatManagerForCurrentApp(object sender, RoutedEventArgs e) + public async Task OpenCheatManagerForCurrentApp() { if (!ViewModel.IsGameRunning) return; @@ -165,7 +176,7 @@ namespace Ryujinx.Ava.UI.Views.Main ViewModel.IsAmiiboBinRequested = ViewModel.IsAmiiboRequested && AmiiboBinReader.HasAmiiboKeyFile; } - private async void InstallFileTypes_Click(object sender, RoutedEventArgs e) + private async Task InstallFileTypes() { ViewModel.AreMimeTypesRegistered = FileAssociationHelper.Install(); if (ViewModel.AreMimeTypesRegistered) @@ -174,7 +185,7 @@ namespace Ryujinx.Ava.UI.Views.Main await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesErrorMessage]); } - private async void UninstallFileTypes_Click(object sender, RoutedEventArgs e) + private async Task UninstallFileTypes() { ViewModel.AreMimeTypesRegistered = !FileAssociationHelper.Uninstall(); if (!ViewModel.AreMimeTypesRegistered) @@ -183,11 +194,8 @@ namespace Ryujinx.Ava.UI.Views.Main await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesErrorMessage]); } - private async void ChangeWindowSize_Click(object sender, RoutedEventArgs e) + private void ChangeWindowSize(string resolution) { - if (sender is not MenuItem { Tag: string resolution }) - return; - (int resolutionWidth, int resolutionHeight) = resolution.Split(' ', 2) .Into(parts => (int.Parse(parts[0]), int.Parse(parts[1])) @@ -200,7 +208,7 @@ namespace Ryujinx.Ava.UI.Views.Main double windowWidthScaled = (resolutionWidth * Program.WindowScaleFactor); double windowHeightScaled = ((resolutionHeight + barsHeight) * Program.WindowScaleFactor); - await Dispatcher.UIThread.InvokeAsync(() => + Dispatcher.UIThread.Post(() => { ViewModel.WindowState = WindowState.Normal; @@ -208,22 +216,7 @@ namespace Ryujinx.Ava.UI.Views.Main }); } - public async void CheckForUpdates(object sender, RoutedEventArgs e) - { - if (Updater.CanUpdate(true)) - await Updater.BeginUpdateAsync(true); - } - - private void MenuItem_OnClick(object sender, RoutedEventArgs e) - { - if (sender is MenuItem { Tag: string url }) - OpenHelper.OpenUrl(url); - } - - public async void OpenXCITrimmerWindow(object sender, RoutedEventArgs e) => await XCITrimmerWindow.Show(ViewModel); - - public async void OpenAboutWindow(object sender, RoutedEventArgs e) => await AboutWindow.Show(); - - public void CloseWindow(object sender, RoutedEventArgs e) => Window.Close(); + public void CloseWindow() => Window.Close(); + } } diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index 9295413ba..d7cf60787 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -136,6 +136,12 @@ + + + + + + - - - - + @@ -101,7 +98,7 @@ TextWrapping="Wrap" TextTrimming="CharacterEllipsis"> - + @@ -112,7 +109,7 @@ Margin="10 0" HorizontalAlignment="Left" VerticalAlignment="Center" - Text="{Binding TitleId}" /> + Text="{Binding TitleIdStr}" /> { @@ -408,13 +411,10 @@ namespace Ryujinx.Ava.UI.Windows { StatusBarView.VolumeStatus.Click += VolumeStatus_CheckedChanged; + ApplicationGrid.DataContext = ApplicationList.DataContext = ViewModel; + ApplicationGrid.ApplicationOpened += Application_Opened; - - ApplicationGrid.DataContext = ViewModel; - ApplicationList.ApplicationOpened += Application_Opened; - - ApplicationList.DataContext = ViewModel; } private void SetWindowSizePosition() @@ -734,5 +734,20 @@ namespace Ryujinx.Ava.UI.Windows (int)Symbol.Checkmark); }); } + + private static bool _intelMacWarningShown = !(OperatingSystem.IsMacOS() && + (RuntimeInformation.OSArchitecture == Architecture.X64 || + RuntimeInformation.OSArchitecture == Architecture.X86)); + + public static async Task ShowIntelMacWarningAsync() + { + if (_intelMacWarningShown) return; + + await Dispatcher.UIThread.InvokeAsync(async () => await ContentDialogHelper.CreateWarningDialog( + "Intel Mac Warning", + "Intel Macs are not supported and will not work properly.\nIf you continue, do not come to our Discord asking for support;\nand do not report bugs on the GitHub. They will be closed.")); + + _intelMacWarningShown = true; + } } } diff --git a/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs b/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs index 8caa4454a..db8e0f6bb 100644 --- a/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs @@ -1,4 +1,6 @@ +using Avalonia; using Avalonia.Controls; +using Avalonia.Input; using FluentAvalonia.Core; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; @@ -23,6 +25,11 @@ namespace Ryujinx.Ava.UI.Windows InitializeComponent(); Load(); + +#if DEBUG + this.AttachDevTools(new KeyGesture(Key.F12, KeyModifiers.Alt)); +#endif + } public SettingsWindow() diff --git a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs b/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs index bc53ec245..31036f47c 100644 --- a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs @@ -28,14 +28,14 @@ namespace Ryujinx.Ava.UI.Windows InitializeComponent(); } - public static async Task Show(MainWindowViewModel mainWindowViewModel) + public static async Task Show() { ContentDialog contentDialog = new() { PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new XCITrimmerWindow(mainWindowViewModel), + Content = new XCITrimmerWindow(RyujinxApp.MainWindow.ViewModel), Title = string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]), }; diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs b/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs index a6336c257..a9610d7b2 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs +++ b/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs @@ -37,6 +37,8 @@ namespace Ryujinx.Ava.Utilities.AppLibrary public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed); + public bool HasPlayedPreviously => TimePlayedString != string.Empty; + public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n"); public string FileSizeString => ValueFormatUtils.FormatFileSize(FileSize); diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs index 28b4262f1..41bcff129 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs +++ b/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs @@ -1,4 +1,5 @@ using DynamicData; +using DynamicData.Kernel; using Gommon; using LibHac; using LibHac.Common; @@ -44,7 +45,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary public const string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com"; public Language DesiredLanguage { get; set; } public event EventHandler ApplicationCountUpdated; - public event EventHandler LdnGameDataReceived; + public event Action LdnGameDataReceived; public readonly IObservableCache Applications; public readonly IObservableCache<(TitleUpdateModel TitleUpdate, bool IsSelected), TitleUpdateModel> TitleUpdates; @@ -778,7 +779,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary using HttpClient httpClient = new HttpClient(); string ldnGameDataArrayString = await httpClient.GetStringAsync($"https://{ldnWebHost}/api/public_games"); ldnGameDataArray = JsonHelper.Deserialize(ldnGameDataArrayString, _ldnDataSerializerContext.IEnumerableLdnGameData); - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs + LdnGameDataReceived?.Invoke(new LdnGameDataReceivedEventArgs { LdnData = ldnGameDataArray }); @@ -786,7 +787,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary catch (Exception ex) { Logger.Warning?.Print(LogClass.Application, $"Failed to fetch the public games JSON from the API. Player and game count in the game list will be unavailable.\n{ex.Message}"); - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs + LdnGameDataReceived?.Invoke(new LdnGameDataReceivedEventArgs { LdnData = Array.Empty() }); @@ -794,7 +795,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary } else { - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs + LdnGameDataReceived?.Invoke(new LdnGameDataReceivedEventArgs { LdnData = Array.Empty() }); @@ -1069,10 +1070,11 @@ namespace Ryujinx.Ava.Utilities.AppLibrary { if (update == null) return false; - var currentlySelected = TitleUpdates.Items.FindFirst(it => + var currentlySelected = TitleUpdates.Items.FirstOrOptional(it => it.TitleUpdate.TitleIdBase == update.TitleIdBase && it.IsSelected); - var shouldSelect = currentlySelected.Check(curr => curr.TitleUpdate?.Version < update.Version); + var shouldSelect = !currentlySelected.HasValue || + currentlySelected.Value.TitleUpdate.Version < update.Version; _titleUpdates.AddOrUpdate((update, shouldSelect)); @@ -1463,7 +1465,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary TitleUpdatesHelper.LoadTitleUpdatesJson(_virtualFileSystem, application.IdBase); it.AddOrUpdate(savedUpdates); - var selectedUpdate = savedUpdates.FindFirst(update => update.IsSelected); + var selectedUpdate = savedUpdates.FirstOrOptional(update => update.IsSelected); if (TryGetTitleUpdatesFromFile(application.Path, out var bundledUpdates)) { @@ -1475,10 +1477,11 @@ namespace Ryujinx.Ava.Utilities.AppLibrary if (!savedUpdateLookup.Contains(update)) { bool shouldSelect = false; - if (selectedUpdate.Check(su => su.Update?.Version < update.Version)) + if (!selectedUpdate.HasValue || selectedUpdate.Value.Item1.Version < update.Version) { shouldSelect = true; - _titleUpdates.AddOrUpdate((selectedUpdate.Value.Update, false)); + if (selectedUpdate.HasValue) + _titleUpdates.AddOrUpdate((selectedUpdate.Value.Update, false)); selectedUpdate = (update, true); } diff --git a/src/Ryujinx/Utilities/AppletMetadata.cs b/src/Ryujinx/Utilities/AppletMetadata.cs index 82baed7d3..a165487a3 100644 --- a/src/Ryujinx/Utilities/AppletMetadata.cs +++ b/src/Ryujinx/Utilities/AppletMetadata.cs @@ -32,29 +32,31 @@ namespace Ryujinx.Ava.Utilities public string GetContentPath(ContentManager contentManager) => (contentManager ?? _contentManager) - .GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program); + ?.GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program); public bool CanStart(ContentManager contentManager, out ApplicationData appData, out BlitStruct appControl) { contentManager ??= _contentManager; - if (contentManager == null) - { - appData = null; - appControl = new BlitStruct(0); - return false; - } + if (contentManager == null) + goto BadData; + + string contentPath = GetContentPath(contentManager); + if (string.IsNullOrEmpty(contentPath)) + goto BadData; appData = new() { Name = Name, Id = ProgramId, Path = GetContentPath(contentManager) }; - - if (string.IsNullOrEmpty(appData.Path)) - { - appControl = new BlitStruct(0); - return false; - } - appControl = StructHelpers.CreateCustomNacpData(Name, Version); return true; + + BadData: + appData = null; + appControl = new BlitStruct(0); + return false; } + + public bool CanStart(out ApplicationData appData, + out BlitStruct appControl) + => CanStart(null, out appData, out appControl); } } diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs b/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs new file mode 100644 index 000000000..7c8e6909c --- /dev/null +++ b/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs @@ -0,0 +1,187 @@ +using Gommon; +using Humanizer; +using nietras.SeparatedValues; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Common.Logging; +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Ryujinx.Ava.Utilities.Compat +{ + public struct ColumnIndices(Func, int> getIndex) + { + public const string TitleIdCol = "\"title_id\""; + public const string GameNameCol = "\"game_name\""; + public const string LabelsCol = "\"labels\""; + public const string StatusCol = "\"status\""; + public const string LastUpdatedCol = "\"last_updated\""; + + public readonly int TitleId = getIndex(TitleIdCol); + public readonly int GameName = getIndex(GameNameCol); + public readonly int Labels = getIndex(LabelsCol); + public readonly int Status = getIndex(StatusCol); + public readonly int LastUpdated = getIndex(LastUpdatedCol); + } + + public class CompatibilityCsv + { + static CompatibilityCsv() => Load(); + + public static void Load() + { + using Stream csvStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream("RyujinxGameCompatibilityList")!; + csvStream.Position = 0; + + using SepReader reader = Sep.Reader().From(csvStream); + ColumnIndices columnIndices = new(reader.Header.IndexOf); + + _entries = reader + .Enumerate(row => new CompatibilityEntry(ref columnIndices, row)) + .OrderBy(it => it.GameName) + .ToArray(); + + Logger.Debug?.Print(LogClass.UI, "Compatibility CSV loaded.", "LoadCompatibility"); + } + + public static void Unload() + { + _entries = null; + } + + private static CompatibilityEntry[] _entries; + + public static CompatibilityEntry[] Entries + { + get + { + if (_entries == null) + Load(); + + return _entries; + } + } + } + + public class CompatibilityEntry + { + public CompatibilityEntry(ref ColumnIndices indices, SepReader.Row row) + { + string titleIdRow = ColStr(row[indices.TitleId]); + TitleId = !string.IsNullOrEmpty(titleIdRow) + ? titleIdRow + : default(Optional); + + GameName = ColStr(row[indices.GameName]); + + Labels = ColStr(row[indices.Labels]).Split(';'); + Status = ColStr(row[indices.Status]).ToLower() switch + { + "playable" => LocaleKeys.CompatibilityListPlayable, + "ingame" => LocaleKeys.CompatibilityListIngame, + "menus" => LocaleKeys.CompatibilityListMenus, + "boots" => LocaleKeys.CompatibilityListBoots, + "nothing" => LocaleKeys.CompatibilityListNothing, + _ => null + }; + + if (DateTime.TryParse(ColStr(row[indices.LastUpdated]), out var dt)) + LastUpdated = dt; + + return; + + string ColStr(SepReader.Col col) => col.ToString().Trim('"'); + } + + public string GameName { get; } + public Optional TitleId { get; } + public string[] Labels { get; } + public LocaleKeys? Status { get; } + public DateTime LastUpdated { get; } + + public string LocalizedLastUpdated => + LocaleManager.FormatDynamicValue(LocaleKeys.CompatibilityListLastUpdated, LastUpdated.Humanize()); + + public string LocalizedStatus => LocaleManager.Instance[Status!.Value]; + public string FormattedTitleId => TitleId + .OrElse(new string(' ', 16)); + + public string FormattedIssueLabels => Labels + .Select(FormatLabelName) + .JoinToString(", "); + + public override string ToString() + { + StringBuilder sb = new("CompatibilityEntry: {"); + sb.Append($"{nameof(GameName)}=\"{GameName}\", "); + sb.Append($"{nameof(TitleId)}={TitleId}, "); + sb.Append($"{nameof(Labels)}={ + Labels.FormatCollection(it => $"\"{it}\"", separator: ", ", prefix: "[", suffix: "]") + }, "); + sb.Append($"{nameof(Status)}=\"{Status}\", "); + sb.Append($"{nameof(LastUpdated)}=\"{LastUpdated}\""); + sb.Append('}'); + + return sb.ToString(); + } + + public static string FormatLabelName(string labelName) => labelName.ToLower() switch + { + "audio" => "Audio", + "bug" => "Bug", + "cpu" => "CPU", + "gpu" => "GPU", + "gui" => "GUI", + "help wanted" => "Help Wanted", + "horizon" => "Horizon", + "infra" => "Project Infra", + "invalid" => "Invalid", + "kernel" => "Kernel", + "ldn" => "LDN", + "linux" => "Linux", + "macos" => "macOS", + "question" => "Question", + "windows" => "Windows", + "graphics-backend:opengl" => "Graphics: OpenGL", + "graphics-backend:vulkan" => "Graphics: Vulkan", + "ldn-works" => "LDN Works", + "ldn-untested" => "LDN Untested", + "ldn-broken" => "LDN Broken", + "ldn-partial" => "Partial LDN", + "nvdec" => "NVDEC", + "services" => "NX Services", + "services-horizon" => "Horizon OS Services", + "slow" => "Runs Slow", + "crash" => "Crashes", + "deadlock" => "Deadlock", + "regression" => "Regression", + "opengl" => "OpenGL", + "opengl-backend-bug" => "OpenGL Backend Bug", + "vulkan-backend-bug" => "Vulkan Backend Bug", + "mac-bug" => "Mac-specific Bug(s)", + "amd-vendor-bug" => "AMD GPU Bug", + "intel-vendor-bug" => "Intel GPU Bug", + "loader-allocator" => "Loader Allocator", + "audout" => "AudOut", + "32-bit" => "32-bit Game", + "UE4" => "Unreal Engine 4", + "homebrew" => "Homebrew Content", + "online-broken" => "Online Broken", + _ => Capitalize(labelName) + }; + + public static string Capitalize(string value) + { + if (value == string.Empty) + return string.Empty; + + char firstChar = value[0]; + string rest = value[1..]; + + return $"{char.ToUpper(firstChar)}{rest}"; + } + } +} diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityList.axaml b/src/Ryujinx/Utilities/Compat/CompatibilityList.axaml new file mode 100644 index 000000000..73ec84c53 --- /dev/null +++ b/src/Ryujinx/Utilities/Compat/CompatibilityList.axaml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityList.axaml.cs b/src/Ryujinx/Utilities/Compat/CompatibilityList.axaml.cs new file mode 100644 index 000000000..7fc48b187 --- /dev/null +++ b/src/Ryujinx/Utilities/Compat/CompatibilityList.axaml.cs @@ -0,0 +1,55 @@ +using Avalonia.Controls; +using Avalonia.Styling; +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.UI.Helpers; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.Utilities.Compat +{ + public partial class CompatibilityList : UserControl + { + public static async Task Show() + { + ContentDialog contentDialog = new() + { + PrimaryButtonText = string.Empty, + SecondaryButtonText = string.Empty, + CloseButtonText = LocaleManager.Instance[LocaleKeys.SettingsButtonClose], + Content = new CompatibilityList + { + DataContext = new CompatibilityViewModel(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary) + } + }; + + Style closeButton = new(x => x.Name("CloseButton")); + closeButton.Setters.Add(new Setter(WidthProperty, 80d)); + + Style closeButtonParent = new(x => x.Name("CommandSpace")); + closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty, Avalonia.Layout.HorizontalAlignment.Right)); + + contentDialog.Styles.Add(closeButton); + contentDialog.Styles.Add(closeButtonParent); + + await ContentDialogHelper.ShowAsync(contentDialog); + + CompatibilityCsv.Unload(); + } + + public CompatibilityList() + { + InitializeComponent(); + } + + private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e) + { + if (DataContext is not CompatibilityViewModel cvm) + return; + + if (sender is not TextBox searchBox) + return; + + cvm.Search(searchBox.Text); + } + } +} diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityViewModel.cs b/src/Ryujinx/Utilities/Compat/CompatibilityViewModel.cs new file mode 100644 index 000000000..76f1457a8 --- /dev/null +++ b/src/Ryujinx/Utilities/Compat/CompatibilityViewModel.cs @@ -0,0 +1,66 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Gommon; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.Utilities.AppLibrary; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.Ava.Utilities.Compat +{ + public class CompatibilityViewModel : BaseModel + { + private bool _onlyShowOwnedGames = true; + + private IEnumerable _currentEntries = CompatibilityCsv.Entries; + private string[] _ownedGameTitleIds = []; + + public IEnumerable CurrentEntries => OnlyShowOwnedGames + ? _currentEntries.Where(x => + x.TitleId.Check(tid => _ownedGameTitleIds.ContainsIgnoreCase(tid))) + : _currentEntries; + + public CompatibilityViewModel() {} + + public CompatibilityViewModel(ApplicationLibrary appLibrary) + { + appLibrary.ApplicationCountUpdated += (_, _) + => _ownedGameTitleIds = appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray(); + + _ownedGameTitleIds = appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray(); + } + + public bool OnlyShowOwnedGames + { + get => _onlyShowOwnedGames; + set + { + OnPropertyChanging(); + OnPropertyChanging(nameof(CurrentEntries)); + _onlyShowOwnedGames = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(CurrentEntries)); + } + } + + public void Search(string searchTerm) + { + if (string.IsNullOrEmpty(searchTerm)) + { + SetEntries(CompatibilityCsv.Entries); + return; + } + + SetEntries(CompatibilityCsv.Entries.Where(x => + x.GameName.ContainsIgnoreCase(searchTerm) + || x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm)))); + } + + private void SetEntries(IEnumerable entries) + { +#pragma warning disable MVVMTK0034 + _currentEntries = entries.ToList(); +#pragma warning restore MVVMTK0034 + OnPropertyChanged(nameof(CurrentEntries)); + } + } +} diff --git a/src/Ryujinx/Utilities/TitleHelper.cs b/src/Ryujinx/Utilities/TitleHelper.cs index be7a87f82..d255838b8 100644 --- a/src/Ryujinx/Utilities/TitleHelper.cs +++ b/src/Ryujinx/Utilities/TitleHelper.cs @@ -4,7 +4,7 @@ namespace Ryujinx.Ava.Utilities { public static class TitleHelper { - public static string ActiveApplicationTitle(ProcessResult activeProcess, string applicationVersion, string pauseString = "") + public static string ActiveApplicationTitle(ProcessResult activeProcess, string applicationVersion, bool customTitlebar, string pauseString = "") { if (activeProcess == null) return string.Empty; @@ -14,7 +14,9 @@ namespace Ryujinx.Ava.Utilities string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})"; string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)"; - string appTitle = $"Ryujinx {applicationVersion} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; + string appTitle = customTitlebar + ? $"Ryujinx {applicationVersion}\n{titleNameSection.Trim()}\n{titleVersionSection.Trim()}\n{titleIdSection.Trim()}{titleArchSection}" + : $"Ryujinx {applicationVersion} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; return !string.IsNullOrEmpty(pauseString) ? appTitle + $" ({pauseString})" diff --git a/src/Ryujinx/Utilities/ValueFormatUtils.cs b/src/Ryujinx/Utilities/ValueFormatUtils.cs index 944cfbf8a..f5cdb4125 100644 --- a/src/Ryujinx/Utilities/ValueFormatUtils.cs +++ b/src/Ryujinx/Utilities/ValueFormatUtils.cs @@ -1,3 +1,5 @@ +using Humanizer; +using Humanizer.Localisation; using Ryujinx.Ava.Common.Locale; using System; using System.Globalization; @@ -31,7 +33,7 @@ namespace Ryujinx.Ava.Utilities Gigabytes = 9, Terabytes = 10, Petabytes = 11, - Exabytes = 12, + Exabytes = 12 } private const double SizeBase10 = 1000; @@ -48,22 +50,24 @@ namespace Ryujinx.Ava.Utilities public static string FormatTimeSpan(TimeSpan? timeSpan) { if (!timeSpan.HasValue || timeSpan.Value.TotalSeconds < 1) - { - // Game was never played - return TimeSpan.Zero.ToString("c", CultureInfo.InvariantCulture); - } + return string.Empty; + + if (timeSpan.Value.TotalSeconds < 60) + return timeSpan.Value.Humanize(1, + countEmptyUnits: false, + maxUnit: TimeUnit.Second, + minUnit: TimeUnit.Second); - if (timeSpan.Value.TotalDays < 1) - { - // Game was played for less than a day - return timeSpan.Value.ToString("c", CultureInfo.InvariantCulture); - } - - // Game was played for more than a day - TimeSpan onlyTime = timeSpan.Value.Subtract(TimeSpan.FromDays(timeSpan.Value.Days)); - string onlyTimeString = onlyTime.ToString("c", CultureInfo.InvariantCulture); - - return $"{timeSpan.Value.Days}d, {onlyTimeString}"; + if (timeSpan.Value.TotalMinutes < 60) + return timeSpan.Value.Humanize(1, + countEmptyUnits: false, + maxUnit: TimeUnit.Minute, + minUnit: TimeUnit.Minute); + + return timeSpan.Value.Humanize(1, + countEmptyUnits: false, + maxUnit: TimeUnit.Hour, + minUnit: TimeUnit.Hour); } ///