mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-09-14 05:55:43 +00:00
Compare commits
58 Commits
1.2.56
...
Canary-1.2
Author | SHA1 | Date | |
---|---|---|---|
|
285ee276b6 | ||
|
617b81e209 | ||
|
eb6ce7bcb3 | ||
|
69f75f2df1 | ||
|
10c8d73b60 | ||
|
e01a30016e | ||
|
e26625dfd5 | ||
|
9c82d98ec4 | ||
|
4aae82bad1 | ||
|
299be822c4 | ||
|
b17e4f79fb | ||
|
a7b58df3fe | ||
|
8c2d6192ba | ||
|
2a23000fed | ||
|
ab7d0a2e6d | ||
|
bd2681b2f9 | ||
|
640d7f9e77 | ||
|
02e8278438 | ||
|
6acd86c890 | ||
|
708256ce96 | ||
|
5bf50836e1 | ||
|
730ba44043 | ||
|
36c374cc7a | ||
|
75f714488e | ||
|
4831965404 | ||
|
47b8145809 | ||
|
20cc21add6 | ||
|
683baec1af | ||
|
f4957d2a09 | ||
|
3e1182af22 | ||
|
6664ed1b11 | ||
|
0c88b9eff7 | ||
|
8a064bcd7e | ||
|
5ff962be37 | ||
|
d9c8b7d937 | ||
|
feeeafe8fe | ||
|
04f014c777 | ||
|
4a677deb50 | ||
|
1c07bf3dd0 | ||
|
4c83794254 | ||
|
6911e288bc | ||
|
67ab54e2bb | ||
|
139c195eb7 | ||
|
9305d171e7 | ||
|
fb4ab5ea08 | ||
|
d7e17abade | ||
|
bdb92224f9 | ||
|
b21740c931 | ||
|
4f06c343a4 | ||
|
6c6f18509b | ||
|
70b7c4c1c3 | ||
|
7764a74a6d | ||
|
5de2c4f292 | ||
|
5845787325 | ||
|
9c94db1130 | ||
|
1c3347c95a | ||
|
b70580bc9f | ||
|
4926df42a4 |
64
.github/workflows/build.yml
vendored
64
.github/workflows/build.yml
vendored
@@ -61,11 +61,11 @@ jobs:
|
|||||||
if: matrix.platform.name != 'linux-arm64'
|
if: matrix.platform.name != 'linux-arm64'
|
||||||
|
|
||||||
- name: Publish Ryujinx
|
- name: Publish Ryujinx
|
||||||
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained true
|
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Publish Ryujinx.Headless.SDL2
|
- name: Publish Ryujinx.Headless.SDL2
|
||||||
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained true
|
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Set executable bit
|
- name: Set executable bit
|
||||||
@@ -74,36 +74,36 @@ jobs:
|
|||||||
chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh
|
chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
|
||||||
|
|
||||||
#- name: Build AppImage
|
- name: Build AppImage
|
||||||
# if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
|
||||||
# run: |
|
run: |
|
||||||
# PLATFORM_NAME="${{ matrix.platform.name }}"
|
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
|
mkdir -p tools
|
||||||
# export PATH="$PATH:$(readlink -f tools)"
|
export PATH="$PATH:$(readlink -f tools)"
|
||||||
|
|
||||||
# # Setup appimagetool
|
# Setup appimagetool
|
||||||
# wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||||
# chmod +x tools/appimagetool
|
chmod +x tools/appimagetool
|
||||||
# chmod +x distribution/linux/appimage/build-appimage.sh
|
chmod +x distribution/linux/appimage/build-appimage.sh
|
||||||
|
|
||||||
# Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
|
# Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
|
||||||
# if [ "$PLATFORM_NAME" = "linux-x64" ]; then
|
if [ "$PLATFORM_NAME" = "linux-x64" ]; then
|
||||||
# ARCH_NAME=x64
|
ARCH_NAME=x64
|
||||||
# export ARCH=x86_64
|
export ARCH=x86_64
|
||||||
# elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
|
elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
|
||||||
# ARCH_NAME=arm64
|
ARCH_NAME=arm64
|
||||||
# export ARCH=aarch64
|
export ARCH=aarch64
|
||||||
# else
|
else
|
||||||
# echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
|
echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
|
||||||
# exit 1
|
exit 1
|
||||||
# fi
|
fi
|
||||||
|
|
||||||
# export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
|
export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
|
||||||
# BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh
|
BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh
|
||||||
# shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Upload Ryujinx artifact
|
- name: Upload Ryujinx artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -112,12 +112,12 @@ jobs:
|
|||||||
path: publish
|
path: publish
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
#- name: Upload Ryujinx (AppImage) artifact
|
- name: Upload Ryujinx (AppImage) artifact
|
||||||
# uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
# if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
|
||||||
# with:
|
with:
|
||||||
# name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage
|
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage
|
||||||
# path: publish_appimage
|
path: publish_appimage
|
||||||
|
|
||||||
- name: Upload Ryujinx.Headless.SDL2 artifact
|
- name: Upload Ryujinx.Headless.SDL2 artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
254
.github/workflows/canary.yml
vendored
Normal file
254
.github/workflows/canary.yml
vendored
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
name: Canary release job
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs: {}
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
paths-ignore:
|
||||||
|
- '.github/**'
|
||||||
|
- 'docs/**'
|
||||||
|
- 'assets/**'
|
||||||
|
- '*.yml'
|
||||||
|
- '*.json'
|
||||||
|
- '*.config'
|
||||||
|
- '*.md'
|
||||||
|
|
||||||
|
concurrency: release
|
||||||
|
|
||||||
|
env:
|
||||||
|
POWERSHELL_TELEMETRY_OPTOUT: 1
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
|
RYUJINX_BASE_VERSION: "1.2"
|
||||||
|
RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "canary"
|
||||||
|
RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev"
|
||||||
|
RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx-Canary"
|
||||||
|
RELEASE: 1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tag:
|
||||||
|
name: Create tag
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Get version info
|
||||||
|
id: version_info
|
||||||
|
run: |
|
||||||
|
echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Create tag
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.git.createRef({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
ref: 'refs/tags/Canary-${{ steps.version_info.outputs.build_version }}',
|
||||||
|
sha: context.sha
|
||||||
|
})
|
||||||
|
|
||||||
|
- name: Create release
|
||||||
|
uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
name: "Canary ${{ steps.version_info.outputs.build_version }}"
|
||||||
|
tag: ${{ steps.version_info.outputs.build_version }}
|
||||||
|
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||||
|
omitBodyDuringUpdate: true
|
||||||
|
owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}
|
||||||
|
repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}
|
||||||
|
token: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
release:
|
||||||
|
name: Release for ${{ matrix.platform.name }}
|
||||||
|
runs-on: ${{ matrix.platform.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
platform:
|
||||||
|
- { name: win-x64, os: windows-latest, zip_os_name: win_x64 }
|
||||||
|
- { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 }
|
||||||
|
- { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 }
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
global-json-file: global.json
|
||||||
|
|
||||||
|
- name: Overwrite csc problem matcher
|
||||||
|
run: echo "::add-matcher::.github/csc.json"
|
||||||
|
|
||||||
|
- name: Get version info
|
||||||
|
id: version_info
|
||||||
|
run: |
|
||||||
|
echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT
|
||||||
|
echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Configure for release
|
||||||
|
run: |
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
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_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Create output dir
|
||||||
|
run: "mkdir release_output"
|
||||||
|
|
||||||
|
- 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 -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
|
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
|
|
||||||
|
- name: Packing Windows builds
|
||||||
|
if: matrix.platform.os == 'windows-latest'
|
||||||
|
run: |
|
||||||
|
pushd publish_ava
|
||||||
|
rm publish/libarmeilleure-jitsupport.dylib
|
||||||
|
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
|
||||||
|
popd
|
||||||
|
|
||||||
|
pushd publish_sdl2_headless
|
||||||
|
rm publish/libarmeilleure-jitsupport.dylib
|
||||||
|
7z a ../release_output/sdl2-ryujinx-headless-${{ 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-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
|
||||||
|
popd
|
||||||
|
|
||||||
|
pushd publish_sdl2_headless
|
||||||
|
rm publish/libarmeilleure-jitsupport.dylib
|
||||||
|
chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2
|
||||||
|
tar -czvf ../release_output/sdl2-ryujinx-headless-${{ 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 }}"
|
||||||
|
|
||||||
|
# sudo apt install -y zsync desktop-file-utils appstream
|
||||||
|
|
||||||
|
# mkdir -p tools
|
||||||
|
# export PATH="$PATH:$(readlink -f tools)"
|
||||||
|
|
||||||
|
# Setup appimagetool
|
||||||
|
# wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||||
|
# chmod +x tools/appimagetool
|
||||||
|
# chmod +x distribution/linux/appimage/build-appimage.sh
|
||||||
|
|
||||||
|
# Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
|
||||||
|
# if [ "$PLATFORM_NAME" = "linux-x64" ]; then
|
||||||
|
# ARCH_NAME=x64
|
||||||
|
# export ARCH=x86_64
|
||||||
|
# elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
|
||||||
|
# ARCH_NAME=arm64
|
||||||
|
# export ARCH=aarch64
|
||||||
|
# else
|
||||||
|
# echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
|
||||||
|
# BUILDDIR=publish_ava OUTDIR=publish_ava_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
|
||||||
|
|
||||||
|
- 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/*AppImage*"
|
||||||
|
tag: ${{ steps.version_info.outputs.build_version }}
|
||||||
|
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||||
|
omitBodyDuringUpdate: true
|
||||||
|
allowUpdates: true
|
||||||
|
replacesArtifacts: true
|
||||||
|
owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}
|
||||||
|
repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}
|
||||||
|
token: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
macos_release:
|
||||||
|
name: Release MacOS universal
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
global-json-file: global.json
|
||||||
|
|
||||||
|
- name: Setup LLVM 15
|
||||||
|
run: |
|
||||||
|
wget https://apt.llvm.org/llvm.sh
|
||||||
|
chmod +x llvm.sh
|
||||||
|
sudo ./llvm.sh 15
|
||||||
|
|
||||||
|
- name: Install rcodesign
|
||||||
|
run: |
|
||||||
|
mkdir -p $HOME/.bin
|
||||||
|
gh release download -R indygreg/apple-platform-rs -O apple-codesign.tar.gz -p 'apple-codesign-*-x86_64-unknown-linux-musl.tar.gz'
|
||||||
|
tar -xzvf apple-codesign.tar.gz --wildcards '*/rcodesign' --strip-components=1
|
||||||
|
rm apple-codesign.tar.gz
|
||||||
|
mv rcodesign $HOME/.bin/
|
||||||
|
echo "$HOME/.bin" >> $GITHUB_PATH
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Get version info
|
||||||
|
id: version_info
|
||||||
|
run: |
|
||||||
|
echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT
|
||||||
|
echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Configure for release
|
||||||
|
run: |
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
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_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Publish macOS Ryujinx
|
||||||
|
run: |
|
||||||
|
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release
|
||||||
|
|
||||||
|
- name: Publish macOS Ryujinx.Headless.SDL2
|
||||||
|
run: |
|
||||||
|
./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release
|
||||||
|
|
||||||
|
- name: Pushing new release
|
||||||
|
uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
name: "Canary ${{ steps.version_info.outputs.build_version }}"
|
||||||
|
artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz"
|
||||||
|
tag: ${{ steps.version_info.outputs.build_version }}
|
||||||
|
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||||
|
omitBodyDuringUpdate: true
|
||||||
|
allowUpdates: true
|
||||||
|
replacesArtifacts: true
|
||||||
|
owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}
|
||||||
|
repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}
|
||||||
|
token: ${{ secrets.RELEASE_TOKEN }}
|
108
.github/workflows/release.yml
vendored
108
.github/workflows/release.yml
vendored
@@ -4,7 +4,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs: {}
|
inputs: {}
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches: [ release ]
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
@@ -20,7 +20,7 @@ env:
|
|||||||
POWERSHELL_TELEMETRY_OPTOUT: 1
|
POWERSHELL_TELEMETRY_OPTOUT: 1
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
RYUJINX_BASE_VERSION: "1.2"
|
RYUJINX_BASE_VERSION: "1.2"
|
||||||
RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "master"
|
RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release"
|
||||||
RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev"
|
RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev"
|
||||||
RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx"
|
RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx"
|
||||||
RELEASE: 1
|
RELEASE: 1
|
||||||
@@ -101,79 +101,79 @@ jobs:
|
|||||||
|
|
||||||
- name: Publish
|
- name: Publish
|
||||||
run: |
|
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 true
|
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 -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained true
|
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
|
|
||||||
- name: Packing Windows builds
|
- name: Packing Windows builds
|
||||||
if: matrix.platform.os == 'windows-latest'
|
if: matrix.platform.os == 'windows-latest'
|
||||||
run: |
|
run: |
|
||||||
pushd publish_ava
|
pushd publish
|
||||||
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
|
rm libarmeilleure-jitsupport.dylib
|
||||||
|
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
|
||||||
popd
|
popd
|
||||||
|
|
||||||
pushd publish_sdl2_headless
|
pushd publish_sdl2_headless
|
||||||
7z a ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
|
rm libarmeilleure-jitsupport.dylib
|
||||||
|
7z a ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
|
||||||
popd
|
popd
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
|
- name: Build AppImage (Linux)
|
||||||
|
if: matrix.platform.os == 'ubuntu-latest'
|
||||||
|
run: |
|
||||||
|
BUILD_VERSION="${{ steps.version_info.outputs.build_version }}"
|
||||||
|
PLATFORM_NAME="${{ matrix.platform.name }}"
|
||||||
|
|
||||||
|
sudo apt install -y zsync desktop-file-utils appstream
|
||||||
|
|
||||||
|
mkdir -p tools
|
||||||
|
export PATH="$PATH:$(readlink -f tools)"
|
||||||
|
|
||||||
|
# Setup appimagetool
|
||||||
|
wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||||
|
chmod +x tools/appimagetool
|
||||||
|
chmod +x distribution/linux/appimage/build-appimage.sh
|
||||||
|
|
||||||
|
# Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
|
||||||
|
if [ "$PLATFORM_NAME" = "linux-x64" ]; then
|
||||||
|
ARCH_NAME=x64
|
||||||
|
export ARCH=x86_64
|
||||||
|
elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
|
||||||
|
ARCH_NAME=arm64
|
||||||
|
export ARCH=aarch64
|
||||||
|
else
|
||||||
|
echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync"
|
||||||
|
BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh
|
||||||
|
|
||||||
|
pushd publish_appimage
|
||||||
|
mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage
|
||||||
|
mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync
|
||||||
|
popd
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: Packing Linux builds
|
- name: Packing Linux builds
|
||||||
if: matrix.platform.os == 'ubuntu-latest'
|
if: matrix.platform.os == 'ubuntu-latest'
|
||||||
run: |
|
run: |
|
||||||
pushd publish_ava
|
pushd publish
|
||||||
chmod +x publish/Ryujinx.sh publish/Ryujinx
|
chmod +x Ryujinx.sh Ryujinx
|
||||||
tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
|
tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
|
||||||
popd
|
popd
|
||||||
|
|
||||||
pushd publish_sdl2_headless
|
pushd publish_sdl2_headless
|
||||||
chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2
|
chmod +x Ryujinx.sh Ryujinx.Headless.SDL2
|
||||||
tar -czvf ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
|
tar -czvf ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
|
||||||
popd
|
popd
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
#- name: Build AppImage (Linux)
|
|
||||||
# if: matrix.platform.os == 'ubuntu-latest'
|
|
||||||
# run: |
|
|
||||||
# BUILD_VERSION="${{ steps.version_info.outputs.build_version }}"
|
|
||||||
# PLATFORM_NAME="${{ matrix.platform.name }}"
|
|
||||||
|
|
||||||
# sudo apt install -y zsync desktop-file-utils appstream
|
|
||||||
|
|
||||||
# mkdir -p tools
|
|
||||||
# export PATH="$PATH:$(readlink -f tools)"
|
|
||||||
|
|
||||||
# Setup appimagetool
|
|
||||||
# wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
|
||||||
# chmod +x tools/appimagetool
|
|
||||||
# chmod +x distribution/linux/appimage/build-appimage.sh
|
|
||||||
|
|
||||||
# Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name)
|
|
||||||
# if [ "$PLATFORM_NAME" = "linux-x64" ]; then
|
|
||||||
# ARCH_NAME=x64
|
|
||||||
# export ARCH=x86_64
|
|
||||||
# elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then
|
|
||||||
# ARCH_NAME=arm64
|
|
||||||
# export ARCH=aarch64
|
|
||||||
# else
|
|
||||||
# echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME""
|
|
||||||
# exit 1
|
|
||||||
# fi
|
|
||||||
|
|
||||||
# export UFLAG="gh-releases-zsync|${{ 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
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
- name: Pushing new release
|
- name: Pushing new release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
name: ${{ steps.version_info.outputs.build_version }}
|
name: ${{ steps.version_info.outputs.build_version }}
|
||||||
artifacts: "release_output/*.tar.gz,release_output/*.zip"
|
artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*"
|
||||||
#artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*"
|
|
||||||
tag: ${{ steps.version_info.outputs.build_version }}
|
tag: ${{ steps.version_info.outputs.build_version }}
|
||||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||||
omitBodyDuringUpdate: true
|
omitBodyDuringUpdate: true
|
||||||
@@ -229,7 +229,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Publish macOS Ryujinx
|
- name: Publish macOS Ryujinx
|
||||||
run: |
|
run: |
|
||||||
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release
|
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release
|
||||||
|
|
||||||
- name: Publish macOS Ryujinx.Headless.SDL2
|
- name: Publish macOS Ryujinx.Headless.SDL2
|
||||||
run: |
|
run: |
|
||||||
@@ -239,7 +239,7 @@ jobs:
|
|||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
name: ${{ steps.version_info.outputs.build_version }}
|
name: ${{ steps.version_info.outputs.build_version }}
|
||||||
artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz"
|
artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz"
|
||||||
tag: ${{ steps.version_info.outputs.build_version }}
|
tag: ${{ steps.version_info.outputs.build_version }}
|
||||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||||
omitBodyDuringUpdate: true
|
omitBodyDuringUpdate: true
|
||||||
|
@@ -12,24 +12,15 @@ Please read the entire document before continuing as it can potentially save eve
|
|||||||
|
|
||||||
We always welcome bug reports, feature proposals and overall feedback. Here are a few tips on how you can make reporting your issue as effective as possible.
|
We always welcome bug reports, feature proposals and overall feedback. Here are a few tips on how you can make reporting your issue as effective as possible.
|
||||||
|
|
||||||
### Identify Where to Report
|
|
||||||
|
|
||||||
The Ryujinx codebase is distributed across multiple repositories in the [Ryujinx organization](https://github.com/Ryujinx). Depending on the feedback you might want to file the issue on a different repo. Here are a few common repos:
|
|
||||||
|
|
||||||
* [Ryujinx/Ryujinx](https://github.com/Ryujinx/Ryujinx) Ryujinx core project files.
|
|
||||||
* [Ryujinx/Ryujinx-Games-List](https://github.com/Ryujinx/Ryujinx-Games-List) Ryujinx game compatibility list.
|
|
||||||
* [Ryujinx/Ryujinx-Website](https://github.com/Ryujinx/Ryujinx-Website) Ryujinx website source code.
|
|
||||||
* [Ryujinx/Ryujinx-Ldn-Website](https://github.com/Ryujinx/Ryujinx-Ldn-Website) Ryujinx LDN website source code.
|
|
||||||
|
|
||||||
### Finding Existing Issues
|
### Finding Existing Issues
|
||||||
|
|
||||||
Before filing a new issue, please search our [open issues](https://github.com/Ryujinx/Ryujinx/issues) to check if it already exists.
|
Before filing a new issue, please search our [open issues](https://github.com/GreemDev/Ryujinx/issues) to check if it already exists.
|
||||||
|
|
||||||
If you do find an existing issue, please include your own feedback in the discussion. Do consider upvoting (👍 reaction) the original post, as this helps us prioritize popular issues in our backlog.
|
If you do find an existing issue, please include your own feedback in the discussion. Do consider upvoting (👍 reaction) the original post, as this helps us prioritize popular issues in our backlog.
|
||||||
|
|
||||||
### Writing a Good Feature Request
|
### Writing a Good Feature Request
|
||||||
|
|
||||||
Please review any feature requests already opened to both check it has not already been suggested, and to familiarize yourself with the format. When ready to submit a proposal, please use the [Feature Request issue template](https://github.com/Ryujinx/Ryujinx/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=%5BFeature+Request%5D).
|
Please review any feature requests already opened to both check it has not already been suggested, and to familiarize yourself with the format. When ready to submit a proposal, please use the [Feature Request issue template](https://github.com/GreemDev/Ryujinx/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=%5BFeature+Request%5D).
|
||||||
|
|
||||||
### Writing a Good Bug Report
|
### Writing a Good Bug Report
|
||||||
|
|
||||||
@@ -43,13 +34,13 @@ Ideally, a bug report should contain the following information:
|
|||||||
* A Ryujinx log file of the run instance where the issue occurred. Log files can be found in `[Executable Folder]/Logs` and are named chronologically.
|
* A Ryujinx log file of the run instance where the issue occurred. Log files can be found in `[Executable Folder]/Logs` and are named chronologically.
|
||||||
* Additional information, e.g. is it a regression from previous versions? Are there any known workarounds?
|
* Additional information, e.g. is it a regression from previous versions? Are there any known workarounds?
|
||||||
|
|
||||||
When ready to submit a bug report, please use the [Bug Report issue template](https://github.com/Ryujinx/Ryujinx/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D).
|
When ready to submit a bug report, please use the [Bug Report issue template](https://github.com/GreemDev/Ryujinx/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D).
|
||||||
|
|
||||||
## Contributing Changes
|
## Contributing Changes
|
||||||
|
|
||||||
Project maintainers will merge changes that both improve the project and meet our standards for code quality.
|
Project maintainers will merge changes that both improve the project and meet our standards for code quality.
|
||||||
|
|
||||||
The [Pull Request Guide](docs/workflow/pr-guide.md) and [License](https://github.com/Ryujinx/Ryujinx/blob/master/LICENSE.txt) docs define additional guidance.
|
The [Pull Request Guide](docs/workflow/pr-guide.md) and [License](https://github.com/GreemDev/Ryujinx/blob/master/LICENSE.txt) docs define additional guidance.
|
||||||
|
|
||||||
### DOs and DON'Ts
|
### DOs and DON'Ts
|
||||||
|
|
||||||
@@ -83,15 +74,15 @@ We use and recommend the following workflow:
|
|||||||
3. In your fork, create a branch off of main (`git checkout -b mybranch`).
|
3. In your fork, create a branch off of main (`git checkout -b mybranch`).
|
||||||
- Branches are useful since they isolate your changes from incoming changes from upstream. They also enable you to create multiple PRs from the same fork.
|
- Branches are useful since they isolate your changes from incoming changes from upstream. They also enable you to create multiple PRs from the same fork.
|
||||||
4. Make and commit your changes to your branch.
|
4. Make and commit your changes to your branch.
|
||||||
- [Build Instructions](https://github.com/Ryujinx/Ryujinx#building) explains how to build and test.
|
- [Build Instructions](https://github.com/GreemDev/Ryujinx#building) explains how to build and test.
|
||||||
- Commit messages should be clear statements of action and intent.
|
- Commit messages should be clear statements of action and intent.
|
||||||
6. Build the repository with your changes.
|
6. Build the repository with your changes.
|
||||||
- Make sure that the builds are clean.
|
- Make sure that the builds are clean.
|
||||||
- Make sure that `dotnet format` has been run and any corrections tested and committed.
|
- Make sure that `dotnet format` has been run and any corrections tested and committed.
|
||||||
7. Create a pull request (PR) against the Ryujinx/Ryujinx repository's **main** branch.
|
7. Create a pull request (PR) against the Ryujinx/Ryujinx repository's **main** branch.
|
||||||
- State in the description what issue or improvement your change is addressing.
|
- State in the description what issue or improvement your change is addressing.
|
||||||
- Check if all the Continuous Integration checks are passing. Refer to [Actions](https://github.com/Ryujinx/Ryujinx/actions) to check for outstanding errors.
|
- Check if all the Continuous Integration checks are passing. Refer to [Actions](https://github.com/GreemDev/Ryujinx/actions) to check for outstanding errors.
|
||||||
8. Wait for feedback or approval of your changes from the [core development team](https://github.com/orgs/Ryujinx/teams/developers)
|
8. Wait for feedback or approval of your changes from the core development team
|
||||||
- Details about the pull request [review procedure](docs/workflow/ci/pr-guide.md).
|
- Details about the pull request [review procedure](docs/workflow/ci/pr-guide.md).
|
||||||
9. When the team members have signed off, and all checks are green, your PR will be merged.
|
9. When the team members have signed off, and all checks are green, your PR will be merged.
|
||||||
- The next official build will automatically include your change.
|
- The next official build will automatically include your change.
|
||||||
@@ -99,7 +90,7 @@ We use and recommend the following workflow:
|
|||||||
|
|
||||||
### Good First Issues
|
### Good First Issues
|
||||||
|
|
||||||
The team marks the most straightforward issues as [good first issues](https://github.com/Ryujinx/Ryujinx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). This set of issues is the place to start if you are interested in contributing but new to the codebase.
|
The team marks the most straightforward issues as [good first issues](https://github.com/GreemDev/Ryujinx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). This set of issues is the place to start if you are interested in contributing but new to the codebase.
|
||||||
|
|
||||||
### Commit Messages
|
### Commit Messages
|
||||||
|
|
||||||
@@ -122,7 +113,7 @@ Also do your best to factor commits appropriately, not too large with unrelated
|
|||||||
|
|
||||||
### PR - CI Process
|
### PR - CI Process
|
||||||
|
|
||||||
The [Ryujinx continuous integration](https://github.com/Ryujinx/Ryujinx/actions) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean or have bugs properly filed against flaky/unexpected failures that are unrelated to your change.
|
The [Ryujinx continuous integration](https://github.com/GreemDev/Ryujinx/actions) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean or have bugs properly filed against flaky/unexpected failures that are unrelated to your change.
|
||||||
|
|
||||||
If the CI build fails for any reason, the PR actions tab should be consulted for further information on the failure. There are a few usual suspects for such a failure:
|
If the CI build fails for any reason, the PR actions tab should be consulted for further information on the failure. There are a few usual suspects for such a failure:
|
||||||
* `dotnet format` has not been run on the PR and has outstanding stylistic issues.
|
* `dotnet format` has not been run on the PR and has outstanding stylistic issues.
|
||||||
@@ -143,5 +134,5 @@ Ryujinx uses some implementations and frameworks from other projects. The follow
|
|||||||
|
|
||||||
- The license of the file is [permissive](https://en.wikipedia.org/wiki/Permissive_free_software_licence).
|
- The license of the file is [permissive](https://en.wikipedia.org/wiki/Permissive_free_software_licence).
|
||||||
- The license of the file is left in-tact.
|
- The license of the file is left in-tact.
|
||||||
- The contribution is correctly attributed in the [3rd party notices](https://github.com/Ryujinx/Ryujinx/blob/master/distribution/legal/THIRDPARTY.md) file in the repository, as needed.
|
- The contribution is correctly attributed in the [3rd party notices](https://github.com/GreemDev/Ryujinx/blob/master/distribution/legal/THIRDPARTY.md) file in the repository, as needed.
|
||||||
|
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
<PackageVersion Include="LibHac" Version="0.19.0" />
|
<PackageVersion Include="LibHac" Version="0.19.0" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
|
||||||
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.0.1" />
|
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.1.2" />
|
||||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||||
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
|
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
|
||||||
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
|
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
|
||||||
|
47
README.md
47
README.md
@@ -6,6 +6,23 @@
|
|||||||
<br>
|
<br>
|
||||||
<sub><sup><b>(REE-YOU-JINX)</b></sup></sub>
|
<sub><sup><b>(REE-YOU-JINX)</b></sup></sub>
|
||||||
<br>
|
<br>
|
||||||
|
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml">
|
||||||
|
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml/badge.svg"
|
||||||
|
alt="">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/GreemDev/Ryujinx/releases/latest">
|
||||||
|
<img src="https://img.shields.io/github/v/release/GreemDev/Ryujinx"
|
||||||
|
alt="Latest Release">
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/canary.yml">
|
||||||
|
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/canary.yml/badge.svg"
|
||||||
|
alt="">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/GreemDev/Ryujinx-Canary/releases/latest">
|
||||||
|
<img src="https://img.shields.io/github/v/release/GreemDev/Ryujinx-Canary?label=canary"
|
||||||
|
alt="Latest Canary Release">
|
||||||
|
</a>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -17,25 +34,22 @@
|
|||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
On October 1st 2024, Ryujinx was discontinued as the creator was forced to abandon the project.
|
On October 1st 2024, Ryujinx was discontinued as the creator was forced to abandon the project.
|
||||||
This fork is intended to be a direct continuation for existing Ryujinx users.
|
<br>
|
||||||
Guides and documentation will not be provided at this time, though you can find the old ones on the Internet Archive.
|
This fork is intended to be a QoL uplift for existing Ryujinx users.
|
||||||
|
<br>
|
||||||
|
This is not a Ryujinx revival project. This is not a Phoenix project.
|
||||||
|
<br>
|
||||||
|
Guides and documentation can be found on the <a href="https://github.com/GreemDev/Ryujinx/wiki">Wiki tab</a>.
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
If you would like a version more true to original Ryujinx, check out <a href="https://github.com/ryujinx-mirror/ryujinx">ryujinx-mirror</a>.
|
If you would like a version more preservative fork of Ryujinx, check out <a href="https://github.com/ryujinx-mirror/ryujinx">ryujinx-mirror</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml">
|
Click below to join the Discord:
|
||||||
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml/badge.svg"
|
<br>
|
||||||
alt="">
|
|
||||||
</a>
|
|
||||||
<a href="https://crwd.in/ryujinx">
|
|
||||||
<img src="https://badges.crowdin.net/ryujinx/localized.svg"
|
|
||||||
alt="">
|
|
||||||
</a>
|
|
||||||
<a href="https://discord.gg/dHPrkBkkyA">
|
<a href="https://discord.gg/dHPrkBkkyA">
|
||||||
<img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryujinx&logo=discord&logoColor=white"
|
<img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryubing&logo=discord&logoColor=white" alt="Discord">
|
||||||
alt="Discord">
|
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
@@ -56,17 +70,20 @@ Use the search function to see if a game has been tested already!
|
|||||||
To run this emulator, your PC must be equipped with at least 8GiB of RAM;
|
To run this emulator, your PC must be equipped with at least 8GiB of RAM;
|
||||||
failing to meet this requirement may result in a poor gameplay experience or unexpected crashes.
|
failing to meet this requirement may result in a poor gameplay experience or unexpected crashes.
|
||||||
|
|
||||||
## Latest build
|
## Latest release
|
||||||
|
|
||||||
These builds are compiled automatically for each commit on the master branch.
|
Releases are compiled automatically for each commit on the master branch.
|
||||||
While we strive to ensure optimal stability and performance prior to pushing an update, our automated builds **may be unstable or completely broken**.
|
While we strive to ensure optimal stability and performance prior to pushing an update, our automated builds **may be unstable or completely broken**.
|
||||||
|
|
||||||
|
You can find the latest release [here](https://github.com/GreemDev/Ryujinx/releases/latest).
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
If you are planning to contribute or just want to learn more about this project please read through our [documentation](docs/README.md).
|
If you are planning to contribute or just want to learn more about this project please read through our [documentation](docs/README.md).
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
|
Building the project is for advanced users.
|
||||||
If you wish to build the emulator yourself, follow these steps:
|
If you wish to build the emulator yourself, follow these steps:
|
||||||
|
|
||||||
### Step 1
|
### Step 1
|
||||||
|
15
Ryujinx.sln
15
Ryujinx.sln
@@ -29,12 +29,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec", "s
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio", "src\Ryujinx.Audio\Ryujinx.Audio.csproj", "{806ACF6D-90B0-45D0-A1AC-5F220F3B3985}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio", "src\Ryujinx.Audio\Ryujinx.Audio.csproj", "{806ACF6D-90B0-45D0-A1AC-5F220F3B3985}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}"
|
|
||||||
ProjectSection(SolutionItems) = preProject
|
|
||||||
.editorconfig = .editorconfig
|
|
||||||
Directory.Packages.props = Directory.Packages.props
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Memory", "src\Ryujinx.Memory\Ryujinx.Memory.csproj", "{A5E6C691-9E22-4263-8F40-42F002CE66BE}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Memory", "src\Ryujinx.Memory\Ryujinx.Memory.csproj", "{A5E6C691-9E22-4263-8F40-42F002CE66BE}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Tests.Memory", "src\Ryujinx.Tests.Memory\Ryujinx.Tests.Memory.csproj", "{D1CC5322-7325-4F6B-9625-194B30BE1296}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Tests.Memory", "src\Ryujinx.Tests.Memory\Ryujinx.Tests.Memory.csproj", "{D1CC5322-7325-4F6B-9625-194B30BE1296}"
|
||||||
@@ -87,6 +81,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Gene
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
.editorconfig = .editorconfig
|
||||||
|
Directory.Packages.props = Directory.Packages.props
|
||||||
|
.github/workflows/release.yml = .github/workflows/release.yml
|
||||||
|
.github/workflows/canary.yml = .github/workflows/canary.yml
|
||||||
|
.github/workflows/build.yml = .github/workflows/build.yml
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Binary file not shown.
@@ -46,5 +46,5 @@ then
|
|||||||
rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$APP_BUNDLE_DIRECTORY"
|
rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$APP_BUNDLE_DIRECTORY"
|
||||||
else
|
else
|
||||||
echo "Usign codesign for ad-hoc signing"
|
echo "Usign codesign for ad-hoc signing"
|
||||||
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$APP_BUNDLE_DIRECTORY"
|
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$APP_BUNDLE_DIRECTORY"
|
||||||
fi
|
fi
|
||||||
|
@@ -99,7 +99,7 @@ then
|
|||||||
rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$UNIVERSAL_APP_BUNDLE"
|
rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$UNIVERSAL_APP_BUNDLE"
|
||||||
else
|
else
|
||||||
echo "Using codesign for ad-hoc signing"
|
echo "Using codesign for ad-hoc signing"
|
||||||
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$UNIVERSAL_APP_BUNDLE"
|
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$UNIVERSAL_APP_BUNDLE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Creating archive"
|
echo "Creating archive"
|
||||||
@@ -111,4 +111,4 @@ rm "$RELEASE_TAR_FILE_NAME"
|
|||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
echo "Done"
|
echo "Done"
|
||||||
|
@@ -95,7 +95,7 @@ else
|
|||||||
echo "Using codesign for ad-hoc signing"
|
echo "Using codesign for ad-hoc signing"
|
||||||
for FILE in "$UNIVERSAL_OUTPUT"/*; do
|
for FILE in "$UNIVERSAL_OUTPUT"/*; do
|
||||||
if [[ $(file "$FILE") == *"Mach-O"* ]]; then
|
if [[ $(file "$FILE") == *"Mach-O"* ]]; then
|
||||||
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f --deep -s - "$FILE"
|
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$FILE"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
@@ -108,4 +108,4 @@ gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz"
|
|||||||
rm "$RELEASE_TAR_FILE_NAME"
|
rm "$RELEASE_TAR_FILE_NAME"
|
||||||
popd
|
popd
|
||||||
|
|
||||||
echo "Done"
|
echo "Done"
|
||||||
|
@@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 255.76 255.76"><defs><style>.cls-1{fill:#02c5e5;}.cls-2{fill:#ff5f55;}.cls-3{fill:none;}</style></defs><g id="Ebene_2" data-name="Ebene 2"><g id="Ebene_1-2" data-name="Ebene 1"><g id="Ebene_2-2" data-name="Ebene 2"><g id="Ebene_1-2-2" data-name="Ebene 1-2"><path class="cls-1" d="M80.63,0V220.39H44.37c-14,0-35.74-20.74-35.74-39.13V40.13C8.63,19.19,31.36,0,49.06,0Z"/><path class="cls-2" d="M175.13,35.37V255.76h36.26c14,0,35.74-20.74,35.74-39.13V75.5c0-20.94-22.73-40.13-40.43-40.13Z"/><polygon class="cls-1" points="124.34 137.96 122.58 145.57 90.64 145.57 92.89 137.96 124.34 137.96"/><polygon class="cls-2" points="160.29 137.96 157.84 145.57 122.58 145.57 124.34 137.96 160.29 137.96"/><polygon class="cls-1" points="130.39 111.86 128.62 119.47 95.14 119.47 97.39 111.86 130.39 111.86"/><polygon class="cls-2" points="164.79 111.86 162.34 119.47 128.62 119.47 130.39 111.86 164.79 111.86"/><polygon class="cls-1" points="104.24 167.99 122.83 87.77 129.78 87.77 111.19 167.99 104.24 167.99"/><polygon class="cls-2" points="128.18 167.99 146.77 87.77 153.89 87.77 135.3 167.99 128.18 167.99"/></g><rect class="cls-3" width="255.76" height="255.76"/></g></g></g></svg>
|
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M80.63 0V220.39H44.37C30.37 220.39 8.63 199.65 8.63 181.26V40.13C8.63 19.19 31.36 0 49.06 0H80.63Z" fill="url(#g)"/><path d="M175.13 35.37V255.76H211.39C225.39 255.76 247.13 235.02 247.13 216.63V75.5C247.13 54.56 224.4 35.37 206.7 35.37H175.13Z" fill="url(#g)"/><path fill-rule="evenodd" clip-rule="evenodd" d="M109.436 145.57L104.24 167.99H111.19L116.386 145.57H133.376L128.18 167.99H135.3L140.496 145.57H157.84L160.29 137.96H142.259L146.544 119.47H162.34L164.79 111.86H148.307L153.89 87.77H146.77L141.187 111.86H124.197L129.78 87.77H122.83L117.247 111.86H97.39L95.14 119.47H115.484L111.199 137.96H92.89L90.64 145.57H109.436ZM139.424 119.47L135.139 137.96H118.149L122.434 119.47H139.424Z" fill="url(#g)"/><defs><linearGradient id="g" x1="223.76" y1="32" x2="27" y2="228.76" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#686868"/><stop offset="0.14" stop-color="#686868"/><stop offset="0.14" stop-color="#AE9675"/><stop offset="0.28" stop-color="#AE9675"/><stop offset="0.28" stop-color="#FF635E"/><stop offset="0.42" stop-color="#FF635E"/><stop offset="0.42" stop-color="#FE8F63"/><stop offset="0.56" stop-color="#FE8F63"/><stop offset="0.56" stop-color="#FDEF68"/><stop offset="0.7" stop-color="#FDEF68"/><stop offset="0.7" stop-color="#71C56D"/><stop offset="0.84" stop-color="#71C56D"/><stop offset="0.84" stop-color="#32ADDD"/><stop offset="1" stop-color="#32ADDD"/></linearGradient></defs></svg>
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
docs/shell.png
BIN
docs/shell.png
Binary file not shown.
Before Width: | Height: | Size: 905 KiB After Width: | Height: | Size: 1.4 MiB |
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Contributing Rules
|
## Contributing Rules
|
||||||
|
|
||||||
All contributions to Ryujinx/Ryujinx repository are made via pull requests (PRs) rather than through direct commits. The pull requests are reviewed and merged by the maintainers after a review and at least two approvals from the core development team.
|
All contributions to GreemDev/Ryujinx repository are made via pull requests (PRs) rather than through direct commits. The pull requests are reviewed and merged by the maintainers after a review and at least two approvals from the core development team.
|
||||||
|
|
||||||
To merge pull requests, you must have write permissions in the repository.
|
To merge pull requests, you must have write permissions in the repository.
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ If during the code review process a merge conflict occurs, the PR author is resp
|
|||||||
|
|
||||||
## Pull Request Builds
|
## Pull Request Builds
|
||||||
|
|
||||||
When submitting a PR to the `Ryujinx/Ryujinx` repository, various builds will run validating many areas to ensure we keep developer productivity and product quality high. These various workflows can be tracked in the [Actions](https://github.com/Ryujinx/Ryujinx/actions) tab of the repository. If the job continues to completion, the build artifacts will be uploaded and posted as a comment in the PR discussion.
|
When submitting a PR to the `GreemDev/Ryujinx` repository, various builds will run validating many areas to ensure we keep developer productivity and product quality high. These various workflows can be tracked in the [Actions](https://github.com/GreemDev/Ryujinx/actions) tab of the repository. If the job continues to completion, the build artifacts will be uploaded and posted as a comment in the PR discussion.
|
||||||
|
|
||||||
## Review Turnaround Times
|
## Review Turnaround Times
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ Anyone with write access can merge a pull request manually when the following co
|
|||||||
|
|
||||||
* The PR has been approved by two reviewers and any other objections are addressed.
|
* The PR has been approved by two reviewers and any other objections are addressed.
|
||||||
* You can request follow up reviews from the original reviewers if they requested changes.
|
* You can request follow up reviews from the original reviewers if they requested changes.
|
||||||
* The PR successfully builds and passes all tests in the Continuous Integration (CI) system. In case of failures, refer to the [Actions](https://github.com/Ryujinx/Ryujinx/actions) tab of your PR.
|
* The PR successfully builds and passes all tests in the Continuous Integration (CI) system. In case of failures, refer to the [Actions](https://github.com/GreemDev/Ryujinx/actions) tab of your PR.
|
||||||
|
|
||||||
Typically, PRs are merged as one commit (squash merges). It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to dissect them.
|
Typically, PRs are merged as one commit (squash merges). It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to dissect them.
|
||||||
|
|
||||||
|
@@ -77,7 +77,7 @@ namespace ARMeilleure.Translation
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int pBlkIndex = 0; pBlkIndex < block.Predecessors.Count; pBlkIndex++)
|
for (int pBlkIndex = 0; pBlkIndex < block.Predecessors.Count; pBlkIndex++)
|
||||||
{
|
{
|
||||||
BasicBlock current = block.Predecessors[pBlkIndex];
|
BasicBlock current = block.Predecessors[pBlkIndex];
|
||||||
|
@@ -13,6 +13,7 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
|
using System.Linq;
|
||||||
using System.Runtime;
|
using System.Runtime;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
@@ -848,17 +849,15 @@ namespace ARMeilleure.Translation.PTC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Thread> threads = new();
|
|
||||||
|
|
||||||
for (int i = 0; i < degreeOfParallelism; i++)
|
List<Thread> threads = Enumerable.Range(0, degreeOfParallelism)
|
||||||
{
|
.Select(idx =>
|
||||||
Thread thread = new(TranslateFuncs)
|
new Thread(TranslateFuncs)
|
||||||
{
|
{
|
||||||
IsBackground = true,
|
IsBackground = true,
|
||||||
};
|
Name = "Ptc.TranslateThread." + idx
|
||||||
|
}
|
||||||
threads.Add(thread);
|
).ToList();
|
||||||
}
|
|
||||||
|
|
||||||
Stopwatch sw = Stopwatch.StartNew();
|
Stopwatch sw = Stopwatch.StartNew();
|
||||||
|
|
||||||
@@ -885,6 +884,7 @@ namespace ARMeilleure.Translation.PTC
|
|||||||
Thread preSaveThread = new(PreSave)
|
Thread preSaveThread = new(PreSave)
|
||||||
{
|
{
|
||||||
IsBackground = true,
|
IsBackground = true,
|
||||||
|
Name = "Ptc.DiskWriter"
|
||||||
};
|
};
|
||||||
preSaveThread.Start();
|
preSaveThread.Start();
|
||||||
}
|
}
|
||||||
|
@@ -41,7 +41,7 @@ namespace Ryujinx.Audio.Backends.OpenAL
|
|||||||
|
|
||||||
public OpenALHardwareDeviceDriver()
|
public OpenALHardwareDeviceDriver()
|
||||||
{
|
{
|
||||||
_device = ALC.OpenDevice("");
|
_device = ALC.OpenDevice(string.Empty);
|
||||||
_context = ALC.CreateContext(_device, new ALContextAttributes());
|
_context = ALC.CreateContext(_device, new ALContextAttributes());
|
||||||
_updateRequiredEvent = new ManualResetEvent(false);
|
_updateRequiredEvent = new ManualResetEvent(false);
|
||||||
_pauseEvent = new ManualResetEvent(true);
|
_pauseEvent = new ManualResetEvent(true);
|
||||||
|
@@ -81,7 +81,7 @@ namespace Ryujinx.Audio.Renderer.Dsp
|
|||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
private static short GetCoefficientAtIndex(ReadOnlySpan<short> coefficients, int index)
|
private static short GetCoefficientAtIndex(ReadOnlySpan<short> coefficients, int index)
|
||||||
{
|
{
|
||||||
if ((uint)index > (uint)coefficients.Length)
|
if ((uint)index >= (uint)coefficients.Length)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.AudioRenderer, $"Out of bound read for coefficient at index {index}");
|
Logger.Error?.Print(LogClass.AudioRenderer, $"Out of bound read for coefficient at index {index}");
|
||||||
|
|
||||||
|
@@ -119,7 +119,7 @@ namespace Ryujinx.Common.Configuration
|
|||||||
|
|
||||||
private static string SetUpLogsDir()
|
private static string SetUpLogsDir()
|
||||||
{
|
{
|
||||||
string logDir = "";
|
string logDir = string.Empty;
|
||||||
|
|
||||||
if (Mode == LaunchMode.Portable)
|
if (Mode == LaunchMode.Portable)
|
||||||
{
|
{
|
||||||
@@ -148,7 +148,7 @@ namespace Ryujinx.Common.Configuration
|
|||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'");
|
Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'");
|
||||||
logDir = "";
|
logDir = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(logDir))
|
if (string.IsNullOrEmpty(logDir))
|
||||||
@@ -179,7 +179,7 @@ namespace Ryujinx.Common.Configuration
|
|||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'");
|
Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'");
|
||||||
logDir = "";
|
logDir = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(logDir))
|
if (string.IsNullOrEmpty(logDir))
|
||||||
|
@@ -121,8 +121,8 @@ namespace Ryujinx.Common.GraphicsDriver
|
|||||||
};
|
};
|
||||||
application.AppName.Set("Ryujinx.exe");
|
application.AppName.Set("Ryujinx.exe");
|
||||||
application.UserFriendlyName.Set("Ryujinx");
|
application.UserFriendlyName.Set("Ryujinx");
|
||||||
application.Launcher.Set("");
|
application.Launcher.Set(string.Empty);
|
||||||
application.FileInFolder.Set("");
|
application.FileInFolder.Set(string.Empty);
|
||||||
|
|
||||||
Check(NvAPI_DRS_CreateApplication(handle, profileHandle, ref application));
|
Check(NvAPI_DRS_CreateApplication(handle, profileHandle, ref application));
|
||||||
}
|
}
|
||||||
|
@@ -72,5 +72,6 @@ namespace Ryujinx.Common.Logging
|
|||||||
TamperMachine,
|
TamperMachine,
|
||||||
UI,
|
UI,
|
||||||
Vic,
|
Vic,
|
||||||
|
XCIFileTrimmer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -38,7 +38,7 @@ namespace Ryujinx.Common.Logging
|
|||||||
{
|
{
|
||||||
if (_enabledClasses[(int)logClass])
|
if (_enabledClasses[(int)logClass])
|
||||||
{
|
{
|
||||||
Updated?.Invoke(null, new LogEventArgs(Level, _time.Elapsed, Thread.CurrentThread.Name, FormatMessage(logClass, "", message)));
|
Updated?.Invoke(null, new LogEventArgs(Level, _time.Elapsed, Thread.CurrentThread.Name, FormatMessage(logClass, string.Empty, message)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -30,10 +30,10 @@ namespace Ryujinx.Common.Logging.Targets
|
|||||||
string ILogTarget.Name { get => _target.Name; }
|
string ILogTarget.Name { get => _target.Name; }
|
||||||
|
|
||||||
public AsyncLogTargetWrapper(ILogTarget target)
|
public AsyncLogTargetWrapper(ILogTarget target)
|
||||||
: this(target, -1, AsyncLogTargetOverflowAction.Block)
|
: this(target, -1)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public AsyncLogTargetWrapper(ILogTarget target, int queueLimit, AsyncLogTargetOverflowAction overflowAction)
|
public AsyncLogTargetWrapper(ILogTarget target, int queueLimit = -1, AsyncLogTargetOverflowAction overflowAction = AsyncLogTargetOverflowAction.Block)
|
||||||
{
|
{
|
||||||
_target = target;
|
_target = target;
|
||||||
_messageQueue = new BlockingCollection<LogEventArgs>(queueLimit);
|
_messageQueue = new BlockingCollection<LogEventArgs>(queueLimit);
|
||||||
|
30
src/Ryujinx.Common/Logging/XCIFileTrimmerLog.cs
Normal file
30
src/Ryujinx.Common/Logging/XCIFileTrimmerLog.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using Ryujinx.Common.Utilities;
|
||||||
|
|
||||||
|
namespace Ryujinx.Common.Logging
|
||||||
|
{
|
||||||
|
public class XCIFileTrimmerLog : XCIFileTrimmer.ILog
|
||||||
|
{
|
||||||
|
public virtual void Progress(long current, long total, string text, bool complete)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write(XCIFileTrimmer.LogType logType, string text)
|
||||||
|
{
|
||||||
|
switch (logType)
|
||||||
|
{
|
||||||
|
case XCIFileTrimmer.LogType.Info:
|
||||||
|
Logger.Notice.Print(LogClass.XCIFileTrimmer, text);
|
||||||
|
break;
|
||||||
|
case XCIFileTrimmer.LogType.Warn:
|
||||||
|
Logger.Warning?.Print(LogClass.XCIFileTrimmer, text);
|
||||||
|
break;
|
||||||
|
case XCIFileTrimmer.LogType.Error:
|
||||||
|
Logger.Error?.Print(LogClass.XCIFileTrimmer, text);
|
||||||
|
break;
|
||||||
|
case XCIFileTrimmer.LogType.Progress:
|
||||||
|
Logger.Info?.Print(LogClass.XCIFileTrimmer, text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,11 +1,13 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace Ryujinx.Common
|
namespace Ryujinx.Common
|
||||||
{
|
{
|
||||||
public class ReactiveObject<T>
|
public class ReactiveObject<T>
|
||||||
{
|
{
|
||||||
private readonly ReaderWriterLockSlim _readerWriterLock = new();
|
private readonly ReaderWriterLockSlim _rwLock = new();
|
||||||
private bool _isInitialized;
|
private bool _isInitialized;
|
||||||
private T _value;
|
private T _value;
|
||||||
|
|
||||||
@@ -15,15 +17,15 @@ namespace Ryujinx.Common
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
_readerWriterLock.EnterReadLock();
|
_rwLock.EnterReadLock();
|
||||||
T value = _value;
|
T value = _value;
|
||||||
_readerWriterLock.ExitReadLock();
|
_rwLock.ExitReadLock();
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_readerWriterLock.EnterWriteLock();
|
_rwLock.EnterWriteLock();
|
||||||
|
|
||||||
T oldValue = _value;
|
T oldValue = _value;
|
||||||
|
|
||||||
@@ -32,7 +34,7 @@ namespace Ryujinx.Common
|
|||||||
_isInitialized = true;
|
_isInitialized = true;
|
||||||
_value = value;
|
_value = value;
|
||||||
|
|
||||||
_readerWriterLock.ExitWriteLock();
|
_rwLock.ExitWriteLock();
|
||||||
|
|
||||||
if (!oldIsInitialized || oldValue == null || !oldValue.Equals(_value))
|
if (!oldIsInitialized || oldValue == null || !oldValue.Equals(_value))
|
||||||
{
|
{
|
||||||
@@ -40,12 +42,22 @@ namespace Ryujinx.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void LogChangesToValue(string valueName, LogClass logClass = LogClass.Configuration)
|
||||||
|
=> Event += (_, e) => ReactiveObjectHelper.LogValueChange(logClass, e, valueName);
|
||||||
|
|
||||||
public static implicit operator T(ReactiveObject<T> obj) => obj.Value;
|
public static implicit operator T(ReactiveObject<T> obj) => obj.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ReactiveObjectHelper
|
public static class ReactiveObjectHelper
|
||||||
{
|
{
|
||||||
|
public static void LogValueChange<T>(LogClass logClass, ReactiveEventArgs<T> eventArgs, string valueName)
|
||||||
|
{
|
||||||
|
string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}");
|
||||||
|
|
||||||
|
Logger.Info?.Print(logClass, message);
|
||||||
|
}
|
||||||
|
|
||||||
public static void Toggle(this ReactiveObject<bool> rBoolean) => rBoolean.Value = !rBoolean.Value;
|
public static void Toggle(this ReactiveObject<bool> rBoolean) => rBoolean.Value = !rBoolean.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,7 +5,9 @@ namespace Ryujinx.Common
|
|||||||
// DO NOT EDIT, filled by CI
|
// DO NOT EDIT, filled by CI
|
||||||
public static class ReleaseInformation
|
public static class ReleaseInformation
|
||||||
{
|
{
|
||||||
private const string FlatHubChannelOwner = "flathub";
|
private const string FlatHubChannel = "flathub";
|
||||||
|
private const string CanaryChannel = "canary";
|
||||||
|
private const string ReleaseChannel = "release";
|
||||||
|
|
||||||
private const string BuildVersion = "%%RYUJINX_BUILD_VERSION%%";
|
private const string BuildVersion = "%%RYUJINX_BUILD_VERSION%%";
|
||||||
public const string BuildGitHash = "%%RYUJINX_BUILD_GIT_HASH%%";
|
public const string BuildGitHash = "%%RYUJINX_BUILD_GIT_HASH%%";
|
||||||
@@ -24,7 +26,11 @@ namespace Ryujinx.Common
|
|||||||
!ReleaseChannelRepo.StartsWith("%%") &&
|
!ReleaseChannelRepo.StartsWith("%%") &&
|
||||||
!ConfigFileName.StartsWith("%%");
|
!ConfigFileName.StartsWith("%%");
|
||||||
|
|
||||||
public static bool IsFlatHubBuild => IsValid && ReleaseChannelOwner.Equals(FlatHubChannelOwner);
|
public static bool IsFlatHubBuild => IsValid && ReleaseChannelOwner.Equals(FlatHubChannel);
|
||||||
|
|
||||||
|
public static bool IsCanaryBuild => IsValid && ReleaseChannelName.Equals(CanaryChannel);
|
||||||
|
|
||||||
|
public static bool IsReleaseBuild => IsValid && ReleaseChannelName.Equals(ReleaseChannel);
|
||||||
|
|
||||||
public static string Version => IsValid ? BuildVersion : Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
|
public static string Version => IsValid ? BuildVersion : Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" />
|
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" />
|
||||||
<PackageReference Include="MsgPack.Cli" />
|
<PackageReference Include="MsgPack.Cli" />
|
||||||
<PackageReference Include="System.Management" />
|
<PackageReference Include="System.Management" />
|
||||||
|
<PackageReference Include="Humanizer" />
|
||||||
<PackageReference Include="Gommon" />
|
<PackageReference Include="Gommon" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@@ -17,29 +17,19 @@ namespace Ryujinx.Common.Utilities
|
|||||||
/// It is REQUIRED for you to save returned options statically or as a part of static serializer context
|
/// It is REQUIRED for you to save returned options statically or as a part of static serializer context
|
||||||
/// in order to avoid performance issues. You can safely modify returned options for your case before storing.
|
/// in order to avoid performance issues. You can safely modify returned options for your case before storing.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public static JsonSerializerOptions GetDefaultSerializerOptions(bool indented = true)
|
public static JsonSerializerOptions GetDefaultSerializerOptions(bool indented = true) =>
|
||||||
{
|
new()
|
||||||
JsonSerializerOptions options = new()
|
|
||||||
{
|
{
|
||||||
DictionaryKeyPolicy = _snakeCasePolicy,
|
DictionaryKeyPolicy = _snakeCasePolicy,
|
||||||
PropertyNamingPolicy = _snakeCasePolicy,
|
PropertyNamingPolicy = _snakeCasePolicy,
|
||||||
WriteIndented = indented,
|
WriteIndented = indented,
|
||||||
AllowTrailingCommas = true,
|
AllowTrailingCommas = true,
|
||||||
ReadCommentHandling = JsonCommentHandling.Skip,
|
ReadCommentHandling = JsonCommentHandling.Skip
|
||||||
};
|
};
|
||||||
|
|
||||||
return options;
|
public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Serialize(value, typeInfo);
|
||||||
}
|
|
||||||
|
|
||||||
public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo)
|
public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Deserialize(value, typeInfo);
|
||||||
{
|
|
||||||
return JsonSerializer.Serialize(value, typeInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo)
|
|
||||||
{
|
|
||||||
return JsonSerializer.Deserialize(value, typeInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo)
|
public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo)
|
||||||
{
|
{
|
||||||
@@ -53,10 +43,7 @@ namespace Ryujinx.Common.Utilities
|
|||||||
return JsonSerializer.Deserialize(file, typeInfo);
|
return JsonSerializer.Deserialize(file, typeInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SerializeToStream<T>(Stream stream, T value, JsonTypeInfo<T> typeInfo)
|
public static void SerializeToStream<T>(Stream stream, T value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Serialize(stream, value, typeInfo);
|
||||||
{
|
|
||||||
JsonSerializer.Serialize(stream, value, typeInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class SnakeCaseNamingPolicy : JsonNamingPolicy
|
private class SnakeCaseNamingPolicy : JsonNamingPolicy
|
||||||
{
|
{
|
||||||
|
524
src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs
Normal file
524
src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs
Normal file
@@ -0,0 +1,524 @@
|
|||||||
|
// Uncomment the line below to ensure XCIFileTrimmer does not modify files
|
||||||
|
//#define XCI_TRIMMER_READ_ONLY_MODE
|
||||||
|
|
||||||
|
using Gommon;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Ryujinx.Common.Utilities
|
||||||
|
{
|
||||||
|
public sealed class XCIFileTrimmer
|
||||||
|
{
|
||||||
|
private const long BytesInAMegabyte = 1024 * 1024;
|
||||||
|
private const int BufferSize = 8 * (int)BytesInAMegabyte;
|
||||||
|
|
||||||
|
private const long CartSizeMBinFormattedGB = 952;
|
||||||
|
private const int CartKeyAreaSize = 0x1000;
|
||||||
|
private const byte PaddingByte = 0xFF;
|
||||||
|
private const int HeaderFilePos = 0x100;
|
||||||
|
private const int CartSizeFilePos = 0x10D;
|
||||||
|
private const int DataSizeFilePos = 0x118;
|
||||||
|
private const string HeaderMagicValue = "HEAD";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Cartridge Sizes (ByteIdentifier, SizeInGB)
|
||||||
|
/// </summary>
|
||||||
|
private static readonly Dictionary<byte, long> _cartSizesGB = new()
|
||||||
|
{
|
||||||
|
{ 0xFA, 1 },
|
||||||
|
{ 0xF8, 2 },
|
||||||
|
{ 0xF0, 4 },
|
||||||
|
{ 0xE0, 8 },
|
||||||
|
{ 0xE1, 16 },
|
||||||
|
{ 0xE2, 32 }
|
||||||
|
};
|
||||||
|
|
||||||
|
private static long RecordsToByte(long records)
|
||||||
|
{
|
||||||
|
return 512 + (records * 512);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool CanTrim(string filename, ILog log = null)
|
||||||
|
{
|
||||||
|
if (Path.GetExtension(filename).Equals(".XCI", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
var trimmer = new XCIFileTrimmer(filename, log);
|
||||||
|
return trimmer.CanBeTrimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool CanUntrim(string filename, ILog log = null)
|
||||||
|
{
|
||||||
|
if (Path.GetExtension(filename).Equals(".XCI", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
var trimmer = new XCIFileTrimmer(filename, log);
|
||||||
|
return trimmer.CanBeUntrimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ILog _log;
|
||||||
|
private string _filename;
|
||||||
|
private FileStream _fileStream;
|
||||||
|
private BinaryReader _binaryReader;
|
||||||
|
private long _offsetB, _dataSizeB, _cartSizeB, _fileSizeB;
|
||||||
|
private bool _fileOK = true;
|
||||||
|
private bool _freeSpaceChecked = false;
|
||||||
|
private bool _freeSpaceValid = false;
|
||||||
|
|
||||||
|
public enum OperationOutcome
|
||||||
|
{
|
||||||
|
Undetermined,
|
||||||
|
InvalidXCIFile,
|
||||||
|
NoTrimNecessary,
|
||||||
|
NoUntrimPossible,
|
||||||
|
FreeSpaceCheckFailed,
|
||||||
|
FileIOWriteError,
|
||||||
|
ReadOnlyFileCannotFix,
|
||||||
|
FileSizeChanged,
|
||||||
|
Successful,
|
||||||
|
Cancelled
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LogType
|
||||||
|
{
|
||||||
|
Info,
|
||||||
|
Warn,
|
||||||
|
Error,
|
||||||
|
Progress
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ILog
|
||||||
|
{
|
||||||
|
public void Write(LogType logType, string text);
|
||||||
|
public void Progress(long current, long total, string text, bool complete);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool FileOK => _fileOK;
|
||||||
|
public bool Trimmed => _fileOK && FileSizeB < UntrimmedFileSizeB;
|
||||||
|
public bool ContainsKeyArea => _offsetB != 0;
|
||||||
|
public bool CanBeTrimmed => _fileOK && FileSizeB > TrimmedFileSizeB;
|
||||||
|
public bool CanBeUntrimmed => _fileOK && FileSizeB < UntrimmedFileSizeB;
|
||||||
|
public bool FreeSpaceChecked => _fileOK && _freeSpaceChecked;
|
||||||
|
public bool FreeSpaceValid => _fileOK && _freeSpaceValid;
|
||||||
|
public long DataSizeB => _dataSizeB;
|
||||||
|
public long CartSizeB => _cartSizeB;
|
||||||
|
public long FileSizeB => _fileSizeB;
|
||||||
|
public long DiskSpaceSavedB => CartSizeB - FileSizeB;
|
||||||
|
public long DiskSpaceSavingsB => CartSizeB - DataSizeB;
|
||||||
|
public long TrimmedFileSizeB => _offsetB + _dataSizeB;
|
||||||
|
public long UntrimmedFileSizeB => _offsetB + _cartSizeB;
|
||||||
|
|
||||||
|
public ILog Log
|
||||||
|
{
|
||||||
|
get => _log;
|
||||||
|
set => _log = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Filename
|
||||||
|
{
|
||||||
|
get => _filename;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_filename = value;
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long Pos
|
||||||
|
{
|
||||||
|
get => _fileStream.Position;
|
||||||
|
set => _fileStream.Position = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XCIFileTrimmer(string path, ILog log = null)
|
||||||
|
{
|
||||||
|
Log = log;
|
||||||
|
Filename = path;
|
||||||
|
ReadHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckFreeSpace(CancellationToken? cancelToken = null)
|
||||||
|
{
|
||||||
|
if (FreeSpaceChecked)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (CanBeTrimmed)
|
||||||
|
{
|
||||||
|
_freeSpaceValid = false;
|
||||||
|
|
||||||
|
OpenReaders();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Pos = TrimmedFileSizeB;
|
||||||
|
bool freeSpaceValid = true;
|
||||||
|
long readSizeB = FileSizeB - TrimmedFileSizeB;
|
||||||
|
|
||||||
|
Stopwatch timedSw = Lambda.Timed(() =>
|
||||||
|
{
|
||||||
|
freeSpaceValid = CheckPadding(readSizeB, cancelToken);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (timedSw.Elapsed.TotalSeconds > 0)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Info, $"Checked at {readSizeB / (double)XCIFileTrimmer.BytesInAMegabyte / timedSw.Elapsed.TotalSeconds:N} Mb/sec");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (freeSpaceValid)
|
||||||
|
Log?.Write(LogType.Info, "Free space is valid");
|
||||||
|
|
||||||
|
_freeSpaceValid = freeSpaceValid;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CloseReaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Warn, "There is no free space to check.");
|
||||||
|
_freeSpaceValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_freeSpaceChecked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CheckPadding(long readSizeB, CancellationToken? cancelToken = null)
|
||||||
|
{
|
||||||
|
long maxReads = readSizeB / XCIFileTrimmer.BufferSize;
|
||||||
|
long read = 0;
|
||||||
|
var buffer = new byte[BufferSize];
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (cancelToken.HasValue && cancelToken.Value.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bytes = _fileStream.Read(buffer, 0, XCIFileTrimmer.BufferSize);
|
||||||
|
if (bytes == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Log?.Progress(read, maxReads, "Verifying file can be trimmed", false);
|
||||||
|
if (buffer.Take(bytes).AsParallel().Any(b => b != XCIFileTrimmer.PaddingByte))
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Warn, "Free space is NOT valid");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
read++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Reset()
|
||||||
|
{
|
||||||
|
_freeSpaceChecked = false;
|
||||||
|
_freeSpaceValid = false;
|
||||||
|
ReadHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationOutcome Trim(CancellationToken? cancelToken = null)
|
||||||
|
{
|
||||||
|
if (!FileOK)
|
||||||
|
{
|
||||||
|
return OperationOutcome.InvalidXCIFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CanBeTrimmed)
|
||||||
|
{
|
||||||
|
return OperationOutcome.NoTrimNecessary;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FreeSpaceChecked)
|
||||||
|
{
|
||||||
|
CheckFreeSpace(cancelToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FreeSpaceValid)
|
||||||
|
{
|
||||||
|
if (cancelToken.HasValue && cancelToken.Value.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return OperationOutcome.Cancelled;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return OperationOutcome.FreeSpaceCheckFailed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log?.Write(LogType.Info, "Trimming...");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var info = new FileInfo(Filename);
|
||||||
|
if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Info, "Attempting to remove ReadOnly attribute");
|
||||||
|
File.SetAttributes(Filename, info.Attributes & ~FileAttributes.ReadOnly);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, e.ToString());
|
||||||
|
return OperationOutcome.ReadOnlyFileCannotFix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.Length != FileSizeB)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, "File size has changed, cannot safely trim.");
|
||||||
|
return OperationOutcome.FileSizeChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
var outfileStream = new FileStream(_filename, FileMode.Open, FileAccess.Write, FileShare.Write);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
#if !XCI_TRIMMER_READ_ONLY_MODE
|
||||||
|
outfileStream.SetLength(TrimmedFileSizeB);
|
||||||
|
#endif
|
||||||
|
return OperationOutcome.Successful;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
outfileStream.Close();
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, e.ToString());
|
||||||
|
return OperationOutcome.FileIOWriteError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationOutcome Untrim(CancellationToken? cancelToken = null)
|
||||||
|
{
|
||||||
|
if (!FileOK)
|
||||||
|
{
|
||||||
|
return OperationOutcome.InvalidXCIFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CanBeUntrimmed)
|
||||||
|
{
|
||||||
|
return OperationOutcome.NoUntrimPossible;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Info, "Untrimming...");
|
||||||
|
|
||||||
|
var info = new FileInfo(Filename);
|
||||||
|
if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Info, "Attempting to remove ReadOnly attribute");
|
||||||
|
File.SetAttributes(Filename, info.Attributes & ~FileAttributes.ReadOnly);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, e.ToString());
|
||||||
|
return OperationOutcome.ReadOnlyFileCannotFix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.Length != FileSizeB)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, "File size has changed, cannot safely untrim.");
|
||||||
|
return OperationOutcome.FileSizeChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
var outfileStream = new FileStream(_filename, FileMode.Append, FileAccess.Write, FileShare.Write);
|
||||||
|
long bytesToWriteB = UntrimmedFileSizeB - FileSizeB;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Stopwatch timedSw = Lambda.Timed(() =>
|
||||||
|
{
|
||||||
|
WritePadding(outfileStream, bytesToWriteB, cancelToken);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (timedSw.Elapsed.TotalSeconds > 0)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Info, $"Wrote at {bytesToWriteB / (double)XCIFileTrimmer.BytesInAMegabyte / timedSw.Elapsed.TotalSeconds:N} Mb/sec");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancelToken.HasValue && cancelToken.Value.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return OperationOutcome.Cancelled;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return OperationOutcome.Successful;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
outfileStream.Close();
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, e.ToString());
|
||||||
|
return OperationOutcome.FileIOWriteError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WritePadding(FileStream outfileStream, long bytesToWriteB, CancellationToken? cancelToken = null)
|
||||||
|
{
|
||||||
|
long bytesLeftToWriteB = bytesToWriteB;
|
||||||
|
long writes = bytesLeftToWriteB / XCIFileTrimmer.BufferSize;
|
||||||
|
int write = 0;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var buffer = new byte[BufferSize];
|
||||||
|
Array.Fill<byte>(buffer, XCIFileTrimmer.PaddingByte);
|
||||||
|
|
||||||
|
while (bytesLeftToWriteB > 0)
|
||||||
|
{
|
||||||
|
if (cancelToken.HasValue && cancelToken.Value.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
long bytesToWrite = Math.Min(XCIFileTrimmer.BufferSize, bytesLeftToWriteB);
|
||||||
|
|
||||||
|
#if !XCI_TRIMMER_READ_ONLY_MODE
|
||||||
|
outfileStream.Write(buffer, 0, (int)bytesToWrite);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bytesLeftToWriteB -= bytesToWrite;
|
||||||
|
Log?.Progress(write, writes, "Writing padding data...", false);
|
||||||
|
write++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Log?.Progress(write, writes, "Writing padding data...", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenReaders()
|
||||||
|
{
|
||||||
|
if (_binaryReader == null)
|
||||||
|
{
|
||||||
|
_fileStream = new FileStream(_filename, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||||
|
_binaryReader = new BinaryReader(_fileStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CloseReaders()
|
||||||
|
{
|
||||||
|
if (_binaryReader != null && _binaryReader.BaseStream != null)
|
||||||
|
_binaryReader.Close();
|
||||||
|
_binaryReader = null;
|
||||||
|
_fileStream = null;
|
||||||
|
GC.Collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ReadHeader()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
OpenReaders();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Attempt without key area
|
||||||
|
bool success = CheckAndReadHeader(false);
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
// Attempt with key area
|
||||||
|
success = CheckAndReadHeader(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
_fileOK = success;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CloseReaders();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, ex.Message);
|
||||||
|
_fileOK = false;
|
||||||
|
_dataSizeB = 0;
|
||||||
|
_cartSizeB = 0;
|
||||||
|
_fileSizeB = 0;
|
||||||
|
_offsetB = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CheckAndReadHeader(bool assumeKeyArea)
|
||||||
|
{
|
||||||
|
// Read file size
|
||||||
|
_fileSizeB = _fileStream.Length;
|
||||||
|
if (_fileSizeB < 32 * 1024)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, "The source file doesn't look like an XCI file as the data size is too small");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup offset
|
||||||
|
_offsetB = (long)(assumeKeyArea ? XCIFileTrimmer.CartKeyAreaSize : 0);
|
||||||
|
|
||||||
|
// Check header
|
||||||
|
Pos = _offsetB + XCIFileTrimmer.HeaderFilePos;
|
||||||
|
string head = System.Text.Encoding.ASCII.GetString(_binaryReader.ReadBytes(4));
|
||||||
|
if (head != XCIFileTrimmer.HeaderMagicValue)
|
||||||
|
{
|
||||||
|
if (!assumeKeyArea)
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Warn, $"Incorrect header found, file mat contain a key area...");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, "The source file doesn't look like an XCI file as the header is corrupted");
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read Cart Size
|
||||||
|
Pos = _offsetB + XCIFileTrimmer.CartSizeFilePos;
|
||||||
|
byte cartSizeId = _binaryReader.ReadByte();
|
||||||
|
if (!_cartSizesGB.TryGetValue(cartSizeId, out long cartSizeNGB))
|
||||||
|
{
|
||||||
|
Log?.Write(LogType.Error, $"The source file doesn't look like an XCI file as the Cartridge Size is incorrect (0x{cartSizeId:X2})");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_cartSizeB = cartSizeNGB * XCIFileTrimmer.CartSizeMBinFormattedGB * XCIFileTrimmer.BytesInAMegabyte;
|
||||||
|
|
||||||
|
// Read data size
|
||||||
|
Pos = _offsetB + XCIFileTrimmer.DataSizeFilePos;
|
||||||
|
long records = (long)BitConverter.ToUInt32(_binaryReader.ReadBytes(4), 0);
|
||||||
|
_dataSizeB = RecordsToByte(records);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -152,16 +152,17 @@ namespace Ryujinx.Graphics.Gpu
|
|||||||
/// Creates a new GPU memory manager.
|
/// Creates a new GPU memory manager.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="pid">ID of the process that owns the memory manager</param>
|
/// <param name="pid">ID of the process that owns the memory manager</param>
|
||||||
|
/// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
|
||||||
/// <returns>The memory manager</returns>
|
/// <returns>The memory manager</returns>
|
||||||
/// <exception cref="ArgumentException">Thrown when <paramref name="pid"/> is invalid</exception>
|
/// <exception cref="ArgumentException">Thrown when <paramref name="pid"/> is invalid</exception>
|
||||||
public MemoryManager CreateMemoryManager(ulong pid)
|
public MemoryManager CreateMemoryManager(ulong pid, ulong cpuMemorySize)
|
||||||
{
|
{
|
||||||
if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory))
|
if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory))
|
||||||
{
|
{
|
||||||
throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid));
|
throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MemoryManager(physicalMemory);
|
return new MemoryManager(physicalMemory, cpuMemorySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -47,11 +48,17 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
private const int MinCountForDeletion = 32;
|
private const int MinCountForDeletion = 32;
|
||||||
private const int MaxCapacity = 2048;
|
private const int MaxCapacity = 2048;
|
||||||
|
private const ulong GiB = 1024 * 1024 * 1024;
|
||||||
|
private ulong MaxTextureSizeCapacity = 4UL * GiB;
|
||||||
private const ulong MinTextureSizeCapacity = 512 * 1024 * 1024;
|
private const ulong MinTextureSizeCapacity = 512 * 1024 * 1024;
|
||||||
private const ulong MaxTextureSizeCapacity = 4UL * 1024 * 1024 * 1024;
|
private const ulong DefaultTextureSizeCapacity = 1 * GiB;
|
||||||
private const ulong DefaultTextureSizeCapacity = 1UL * 1024 * 1024 * 1024;
|
private const ulong TextureSizeCapacity6GiB = 4 * GiB;
|
||||||
|
private const ulong TextureSizeCapacity8GiB = 6 * GiB;
|
||||||
|
private const ulong TextureSizeCapacity12GiB = 12 * GiB;
|
||||||
|
|
||||||
|
|
||||||
private const float MemoryScaleFactor = 0.50f;
|
private const float MemoryScaleFactor = 0.50f;
|
||||||
private ulong _maxCacheMemoryUsage = 0;
|
private ulong _maxCacheMemoryUsage = DefaultTextureSizeCapacity;
|
||||||
|
|
||||||
private readonly LinkedList<Texture> _textures;
|
private readonly LinkedList<Texture> _textures;
|
||||||
private ulong _totalSize;
|
private ulong _totalSize;
|
||||||
@@ -66,18 +73,38 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// If the backend GPU has 0 memory capacity, the cache size defaults to `DefaultTextureSizeCapacity`.
|
/// If the backend GPU has 0 memory capacity, the cache size defaults to `DefaultTextureSizeCapacity`.
|
||||||
|
///
|
||||||
|
/// Reads the current Device total CPU Memory, to determine the maximum amount of Vram available. Capped to 50% of Current GPU Memory.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="context">The GPU context that the cache belongs to</param>
|
/// <param name="context">The GPU context that the cache belongs to</param>
|
||||||
public void Initialize(GpuContext context)
|
/// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
|
||||||
|
public void Initialize(GpuContext context, ulong cpuMemorySize)
|
||||||
{
|
{
|
||||||
|
var cpuMemorySizeGiB = cpuMemorySize / GiB;
|
||||||
|
|
||||||
|
if (cpuMemorySizeGiB < 6 || context.Capabilities.MaximumGpuMemory == 0)
|
||||||
|
{
|
||||||
|
_maxCacheMemoryUsage = DefaultTextureSizeCapacity;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (cpuMemorySizeGiB == 6)
|
||||||
|
{
|
||||||
|
MaxTextureSizeCapacity = TextureSizeCapacity6GiB;
|
||||||
|
}
|
||||||
|
else if (cpuMemorySizeGiB == 8)
|
||||||
|
{
|
||||||
|
MaxTextureSizeCapacity = TextureSizeCapacity8GiB;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MaxTextureSizeCapacity = TextureSizeCapacity12GiB;
|
||||||
|
}
|
||||||
|
|
||||||
var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor);
|
var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor);
|
||||||
|
|
||||||
_maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity);
|
_maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity);
|
||||||
|
|
||||||
if (context.Capabilities.MaximumGpuMemory == 0)
|
Logger.Info?.Print(LogClass.Gpu, $"AutoDelete Cache Allocated VRAM : {_maxCacheMemoryUsage / GiB} GiB");
|
||||||
{
|
|
||||||
_maxCacheMemoryUsage = DefaultTextureSizeCapacity;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -71,9 +71,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes the cache, setting the maximum texture capacity for the specified GPU context.
|
/// Initializes the cache, setting the maximum texture capacity for the specified GPU context.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Initialize()
|
/// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
|
||||||
|
public void Initialize(ulong cpuMemorySize)
|
||||||
{
|
{
|
||||||
_cache.Initialize(_context);
|
_cache.Initialize(_context, cpuMemorySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -55,7 +55,8 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||||||
/// Creates a new instance of the GPU memory manager.
|
/// Creates a new instance of the GPU memory manager.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="physicalMemory">Physical memory that this memory manager will map into</param>
|
/// <param name="physicalMemory">Physical memory that this memory manager will map into</param>
|
||||||
internal MemoryManager(PhysicalMemory physicalMemory)
|
/// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
|
||||||
|
internal MemoryManager(PhysicalMemory physicalMemory, ulong cpuMemorySize)
|
||||||
{
|
{
|
||||||
Physical = physicalMemory;
|
Physical = physicalMemory;
|
||||||
VirtualRangeCache = new VirtualRangeCache(this);
|
VirtualRangeCache = new VirtualRangeCache(this);
|
||||||
@@ -65,7 +66,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||||||
MemoryUnmapped += Physical.BufferCache.MemoryUnmappedHandler;
|
MemoryUnmapped += Physical.BufferCache.MemoryUnmappedHandler;
|
||||||
MemoryUnmapped += VirtualRangeCache.MemoryUnmappedHandler;
|
MemoryUnmapped += VirtualRangeCache.MemoryUnmappedHandler;
|
||||||
MemoryUnmapped += CounterCache.MemoryUnmappedHandler;
|
MemoryUnmapped += CounterCache.MemoryUnmappedHandler;
|
||||||
Physical.TextureCache.Initialize();
|
Physical.TextureCache.Initialize(cpuMemorySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -432,7 +432,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||||||
|
|
||||||
bool colorIsVector = isGather || !isShadow;
|
bool colorIsVector = isGather || !isShadow;
|
||||||
|
|
||||||
texCall += ")" + (colorIsVector ? GetMaskMultiDest(texOp.Index) : "");
|
texCall += ")" + (colorIsVector ? GetMaskMultiDest(texOp.Index) : string.Empty);
|
||||||
|
|
||||||
return texCall;
|
return texCall;
|
||||||
}
|
}
|
||||||
|
@@ -830,12 +830,12 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||||||
|
|
||||||
if (use.Node != null)
|
if (use.Node != null)
|
||||||
{
|
{
|
||||||
Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index})");
|
Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index})");
|
||||||
PrintTreeNode(use.Node, indentation + (last ? " " : " | "));
|
PrintTreeNode(use.Node, indentation + (last ? " " : " | "));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index}) NULL");
|
Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index}) NULL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -852,12 +852,12 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||||||
|
|
||||||
if (use.Node != null)
|
if (use.Node != null)
|
||||||
{
|
{
|
||||||
Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index})");
|
Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index})");
|
||||||
PrintTreeNode(use.Node, indentation + (last ? " " : " | "));
|
PrintTreeNode(use.Node, indentation + (last ? " " : " | "));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index}) NULL");
|
Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index}) NULL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -104,25 +104,27 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
|
|
||||||
public event EventHandler<ScreenCaptureImageInfo> ScreenCaptured;
|
public event EventHandler<ScreenCaptureImageInfo> ScreenCaptured;
|
||||||
|
|
||||||
public VulkanRenderer(Vk api, Func<Instance, Vk, SurfaceKHR> surfaceFunc, Func<string[]> requiredExtensionsFunc, string preferredGpuId)
|
public VulkanRenderer(Vk api, Func<Instance, Vk, SurfaceKHR> getSurface, Func<string[]> requiredExtensionsFunc, string preferredGpuId)
|
||||||
{
|
{
|
||||||
_getSurface = surfaceFunc;
|
_getSurface = getSurface;
|
||||||
_getRequiredExtensions = requiredExtensionsFunc;
|
_getRequiredExtensions = requiredExtensionsFunc;
|
||||||
_preferredGpuId = preferredGpuId;
|
_preferredGpuId = preferredGpuId;
|
||||||
Api = api;
|
Api = api;
|
||||||
Shaders = new HashSet<ShaderCollection>();
|
Shaders = [];
|
||||||
Textures = new HashSet<ITexture>();
|
Textures = [];
|
||||||
Samplers = new HashSet<SamplerHolder>();
|
Samplers = [];
|
||||||
|
|
||||||
if (OperatingSystem.IsMacOS())
|
// Any device running on MacOS is using MoltenVK, even Intel and AMD vendors.
|
||||||
{
|
if (IsMoltenVk = OperatingSystem.IsMacOS())
|
||||||
MVKInitialization.Initialize();
|
MVKInitialization.Initialize();
|
||||||
|
|
||||||
// Any device running on MacOS is using MoltenVK, even Intel and AMD vendors.
|
|
||||||
IsMoltenVk = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static VulkanRenderer Create(
|
||||||
|
string preferredGpuId,
|
||||||
|
Func<Instance, Vk, SurfaceKHR> getSurface,
|
||||||
|
Func<string[]> getRequiredExtensions
|
||||||
|
) => new(Vk.GetApi(), getSurface, getRequiredExtensions, preferredGpuId);
|
||||||
|
|
||||||
private unsafe void LoadFeatures(uint maxQueueCount, uint queueFamilyIndex)
|
private unsafe void LoadFeatures(uint maxQueueCount, uint queueFamilyIndex)
|
||||||
{
|
{
|
||||||
FormatCapabilities = new FormatCapabilities(Api, _physicalDevice.PhysicalDevice);
|
FormatCapabilities = new FormatCapabilities(Api, _physicalDevice.PhysicalDevice);
|
||||||
|
@@ -13,6 +13,7 @@ namespace Ryujinx.HLE.Generators
|
|||||||
var syntaxReceiver = (ServiceSyntaxReceiver)context.SyntaxReceiver;
|
var syntaxReceiver = (ServiceSyntaxReceiver)context.SyntaxReceiver;
|
||||||
CodeGenerator generator = new CodeGenerator();
|
CodeGenerator generator = new CodeGenerator();
|
||||||
|
|
||||||
|
generator.AppendLine("#nullable enable");
|
||||||
generator.AppendLine("using System;");
|
generator.AppendLine("using System;");
|
||||||
generator.EnterScope($"namespace Ryujinx.HLE.HOS.Services.Sm");
|
generator.EnterScope($"namespace Ryujinx.HLE.HOS.Services.Sm");
|
||||||
generator.EnterScope($"partial class IUserInterface");
|
generator.EnterScope($"partial class IUserInterface");
|
||||||
@@ -22,7 +23,7 @@ namespace Ryujinx.HLE.Generators
|
|||||||
{
|
{
|
||||||
if (className.Modifiers.Any(SyntaxKind.AbstractKeyword) || className.Modifiers.Any(SyntaxKind.PrivateKeyword) || !className.AttributeLists.Any(x => x.Attributes.Any(y => y.ToString().StartsWith("Service"))))
|
if (className.Modifiers.Any(SyntaxKind.AbstractKeyword) || className.Modifiers.Any(SyntaxKind.PrivateKeyword) || !className.AttributeLists.Any(x => x.Attributes.Any(y => y.ToString().StartsWith("Service"))))
|
||||||
continue;
|
continue;
|
||||||
var name = GetFullName(className, context).Replace("global::", "");
|
var name = GetFullName(className, context).Replace("global::", string.Empty);
|
||||||
if (!name.StartsWith("Ryujinx.HLE.HOS.Services"))
|
if (!name.StartsWith("Ryujinx.HLE.HOS.Services"))
|
||||||
continue;
|
continue;
|
||||||
var constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray();
|
var constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray();
|
||||||
@@ -58,6 +59,7 @@ namespace Ryujinx.HLE.Generators
|
|||||||
|
|
||||||
generator.LeaveScope();
|
generator.LeaveScope();
|
||||||
generator.LeaveScope();
|
generator.LeaveScope();
|
||||||
|
generator.AppendLine("#nullable disable");
|
||||||
context.AddSource($"IUserInterface.g.cs", generator.ToString());
|
context.AddSource($"IUserInterface.g.cs", generator.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -523,7 +523,7 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
{
|
{
|
||||||
// Clean up the name and get the NcaId
|
// Clean up the name and get the NcaId
|
||||||
|
|
||||||
string[] pathComponents = entry.FullName.Replace(".cnmt", "").Split('/');
|
string[] pathComponents = entry.FullName.Replace(".cnmt", string.Empty).Split('/');
|
||||||
|
|
||||||
string ncaId = pathComponents[^1];
|
string ncaId = pathComponents[^1];
|
||||||
|
|
||||||
|
@@ -132,7 +132,7 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
|
|
||||||
if (systemPath.StartsWith(baseSystemPath))
|
if (systemPath.StartsWith(baseSystemPath))
|
||||||
{
|
{
|
||||||
string rawPath = systemPath.Replace(baseSystemPath, "");
|
string rawPath = systemPath.Replace(baseSystemPath, string.Empty);
|
||||||
int firstSeparatorOffset = rawPath.IndexOf(Path.DirectorySeparatorChar);
|
int firstSeparatorOffset = rawPath.IndexOf(Path.DirectorySeparatorChar);
|
||||||
|
|
||||||
if (firstSeparatorOffset == -1)
|
if (firstSeparatorOffset == -1)
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.HLE.HOS.Applets.Browser;
|
using Ryujinx.HLE.HOS.Applets.Browser;
|
||||||
|
using Ryujinx.HLE.HOS.Applets.Dummy;
|
||||||
using Ryujinx.HLE.HOS.Applets.Error;
|
using Ryujinx.HLE.HOS.Applets.Error;
|
||||||
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
||||||
using System;
|
using System;
|
||||||
@@ -26,9 +28,13 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
return new BrowserApplet(system);
|
return new BrowserApplet(system);
|
||||||
case AppletId.LibAppletOff:
|
case AppletId.LibAppletOff:
|
||||||
return new BrowserApplet(system);
|
return new BrowserApplet(system);
|
||||||
|
case AppletId.MiiEdit:
|
||||||
|
Logger.Warning?.Print(LogClass.Application, $"Please use the MiiEdit inside File/Open Applet");
|
||||||
|
return new DummyApplet(system);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotImplementedException($"{applet} applet is not implemented.");
|
Logger.Warning?.Print(LogClass.Application, $"Applet {applet} not implemented!");
|
||||||
|
return new DummyApplet(system);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
43
src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs
Normal file
43
src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
|
using Ryujinx.Common.Memory;
|
||||||
|
using Ryujinx.HLE.HOS.Applets;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
namespace Ryujinx.HLE.HOS.Applets.Dummy
|
||||||
|
{
|
||||||
|
internal class DummyApplet : IApplet
|
||||||
|
{
|
||||||
|
private readonly Horizon _system;
|
||||||
|
private AppletSession _normalSession;
|
||||||
|
public event EventHandler AppletStateChanged;
|
||||||
|
public DummyApplet(Horizon system)
|
||||||
|
{
|
||||||
|
_system = system;
|
||||||
|
}
|
||||||
|
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
||||||
|
{
|
||||||
|
_normalSession = normalSession;
|
||||||
|
_normalSession.Push(BuildResponse());
|
||||||
|
AppletStateChanged?.Invoke(this, null);
|
||||||
|
_system.ReturnFocus();
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
private static T ReadStruct<T>(byte[] data) where T : struct
|
||||||
|
{
|
||||||
|
return MemoryMarshal.Read<T>(data.AsSpan());
|
||||||
|
}
|
||||||
|
private static byte[] BuildResponse()
|
||||||
|
{
|
||||||
|
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
||||||
|
using BinaryWriter writer = new(stream);
|
||||||
|
writer.Write((ulong)ResultCode.Success);
|
||||||
|
return stream.ToArray();
|
||||||
|
}
|
||||||
|
public ResultCode GetResult()
|
||||||
|
{
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -107,7 +107,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
|
|||||||
|
|
||||||
private static string CleanText(string value)
|
private static string CleanText(string value)
|
||||||
{
|
{
|
||||||
return CleanTextRegex().Replace(value, "").Replace("\0", "");
|
return CleanTextRegex().Replace(value, string.Empty).Replace("\0", string.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetMessageText(uint module, uint description, string key)
|
private string GetMessageText(uint module, uint description, string key)
|
||||||
@@ -129,17 +129,15 @@ namespace Ryujinx.HLE.HOS.Applets.Error
|
|||||||
|
|
||||||
return CleanText(reader.ReadToEnd());
|
return CleanText(reader.ReadToEnd());
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
return string.Empty;
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string[] GetButtonsText(uint module, uint description, string key)
|
private string[] GetButtonsText(uint module, uint description, string key)
|
||||||
{
|
{
|
||||||
string buttonsText = GetMessageText(module, description, key);
|
string buttonsText = GetMessageText(module, description, key);
|
||||||
|
|
||||||
return (buttonsText == "") ? null : buttonsText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
|
return (buttonsText == string.Empty) ? null : buttonsText.Split(["\r\n", "\r", "\n"], StringSplitOptions.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ParseErrorCommonArg()
|
private void ParseErrorCommonArg()
|
||||||
@@ -156,7 +154,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
|
|||||||
|
|
||||||
string message = GetMessageText(module, description, "DlgMsg");
|
string message = GetMessageText(module, description, "DlgMsg");
|
||||||
|
|
||||||
if (message == "")
|
if (message == string.Empty)
|
||||||
{
|
{
|
||||||
message = "An error has occured.\n\nPlease try again later.";
|
message = "An error has occured.\n\nPlease try again later.";
|
||||||
}
|
}
|
||||||
@@ -190,7 +188,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
|
|||||||
|
|
||||||
// TODO: Handle the LanguageCode to return the translated "OK" and "Details".
|
// TODO: Handle the LanguageCode to return the translated "OK" and "Details".
|
||||||
|
|
||||||
if (detailsText.Trim() != "")
|
if (detailsText.Trim() != string.Empty)
|
||||||
{
|
{
|
||||||
buttons.Add("Details");
|
buttons.Add("Details");
|
||||||
}
|
}
|
||||||
|
@@ -51,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
|
|
||||||
private byte[] _transferMemory;
|
private byte[] _transferMemory;
|
||||||
|
|
||||||
private string _textValue = "";
|
private string _textValue = string.Empty;
|
||||||
private int _cursorBegin = 0;
|
private int _cursorBegin = 0;
|
||||||
private Encoding _encoding = Encoding.Unicode;
|
private Encoding _encoding = Encoding.Unicode;
|
||||||
private KeyboardResult _lastResult = KeyboardResult.NotSet;
|
private KeyboardResult _lastResult = KeyboardResult.NotSet;
|
||||||
|
@@ -305,7 +305,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||||||
{
|
{
|
||||||
SKRect bounds = SKRect.Empty;
|
SKRect bounds = SKRect.Empty;
|
||||||
|
|
||||||
if (text == "")
|
if (text == string.Empty)
|
||||||
{
|
{
|
||||||
paint.MeasureText(" ", ref bounds);
|
paint.MeasureText(" ", ref bounds);
|
||||||
}
|
}
|
||||||
@@ -321,7 +321,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||||||
{
|
{
|
||||||
SKRect bounds = SKRect.Empty;
|
SKRect bounds = SKRect.Empty;
|
||||||
|
|
||||||
if (text == "")
|
if (text == string.Empty)
|
||||||
{
|
{
|
||||||
paint.MeasureText(" ", ref bounds);
|
paint.MeasureText(" ", ref bounds);
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal class SoftwareKeyboardUIState
|
internal class SoftwareKeyboardUIState
|
||||||
{
|
{
|
||||||
public string InputText = "";
|
public string InputText = string.Empty;
|
||||||
public int CursorBegin = 0;
|
public int CursorBegin = 0;
|
||||||
public int CursorEnd = 0;
|
public int CursorEnd = 0;
|
||||||
public bool AcceptPressed = false;
|
public bool AcceptPressed = false;
|
||||||
|
@@ -2463,7 +2463,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler
|
|||||||
return ParseIntegerLiteral("unsigned short");
|
return ParseIntegerLiteral("unsigned short");
|
||||||
case 'i':
|
case 'i':
|
||||||
_position++;
|
_position++;
|
||||||
return ParseIntegerLiteral("");
|
return ParseIntegerLiteral(string.Empty);
|
||||||
case 'j':
|
case 'j':
|
||||||
_position++;
|
_position++;
|
||||||
return ParseIntegerLiteral("u");
|
return ParseIntegerLiteral("u");
|
||||||
|
@@ -238,7 +238,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
info.SubName = "";
|
info.SubName = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
info.ImageName = GetGuessedNsoNameFromIndex(imageIndex);
|
info.ImageName = GetGuessedNsoNameFromIndex(imageIndex);
|
||||||
|
@@ -116,18 +116,13 @@ namespace Ryujinx.HLE.HOS
|
|||||||
private readonly Dictionary<ulong, ModCache> _appMods; // key is ApplicationId
|
private readonly Dictionary<ulong, ModCache> _appMods; // key is ApplicationId
|
||||||
private PatchCache _patches;
|
private PatchCache _patches;
|
||||||
|
|
||||||
private static readonly EnumerationOptions _dirEnumOptions;
|
private static readonly EnumerationOptions _dirEnumOptions = new()
|
||||||
|
|
||||||
static ModLoader()
|
|
||||||
{
|
{
|
||||||
_dirEnumOptions = new EnumerationOptions
|
MatchCasing = MatchCasing.CaseInsensitive,
|
||||||
{
|
MatchType = MatchType.Simple,
|
||||||
MatchCasing = MatchCasing.CaseInsensitive,
|
RecurseSubdirectories = false,
|
||||||
MatchType = MatchType.Simple,
|
ReturnSpecialDirectories = false,
|
||||||
RecurseSubdirectories = false,
|
};
|
||||||
ReturnSpecialDirectories = false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public ModLoader()
|
public ModLoader()
|
||||||
{
|
{
|
||||||
@@ -169,7 +164,7 @@ namespace Ryujinx.HLE.HOS
|
|||||||
foreach (var modDir in dir.EnumerateDirectories())
|
foreach (var modDir in dir.EnumerateDirectories())
|
||||||
{
|
{
|
||||||
types.Clear();
|
types.Clear();
|
||||||
Mod<DirectoryInfo> mod = new("", null, true);
|
Mod<DirectoryInfo> mod = new(string.Empty, null, true);
|
||||||
|
|
||||||
if (StrEquals(RomfsDir, modDir.Name))
|
if (StrEquals(RomfsDir, modDir.Name))
|
||||||
{
|
{
|
||||||
|
@@ -64,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
|||||||
{
|
{
|
||||||
if (userId.IsNull)
|
if (userId.IsNull)
|
||||||
{
|
{
|
||||||
userId = new UserId(Guid.NewGuid().ToString().Replace("-", ""));
|
userId = new UserId(Guid.NewGuid().ToString().Replace("-", string.Empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
UserProfile profile = new(userId, name, image);
|
UserProfile profile = new(userId, name, image);
|
||||||
|
@@ -5,6 +5,7 @@ using Ryujinx.HLE.Exceptions;
|
|||||||
using Ryujinx.HLE.HOS.Kernel.Memory;
|
using Ryujinx.HLE.HOS.Kernel.Memory;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
|
||||||
@@ -28,6 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
|||||||
public DebugPadDevice DebugPad;
|
public DebugPadDevice DebugPad;
|
||||||
public TouchDevice Touchscreen;
|
public TouchDevice Touchscreen;
|
||||||
public MouseDevice Mouse;
|
public MouseDevice Mouse;
|
||||||
|
public DebugMouseDevice DebugMouse;
|
||||||
public KeyboardDevice Keyboard;
|
public KeyboardDevice Keyboard;
|
||||||
public NpadDevices Npads;
|
public NpadDevices Npads;
|
||||||
|
|
||||||
@@ -44,6 +46,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
|||||||
CheckTypeSizeOrThrow<RingLifo<DebugPadState>>(0x2c8);
|
CheckTypeSizeOrThrow<RingLifo<DebugPadState>>(0x2c8);
|
||||||
CheckTypeSizeOrThrow<RingLifo<TouchScreenState>>(0x2C38);
|
CheckTypeSizeOrThrow<RingLifo<TouchScreenState>>(0x2C38);
|
||||||
CheckTypeSizeOrThrow<RingLifo<MouseState>>(0x350);
|
CheckTypeSizeOrThrow<RingLifo<MouseState>>(0x350);
|
||||||
|
CheckTypeSizeOrThrow<RingLifo<DebugMouseState>>(0x350);
|
||||||
CheckTypeSizeOrThrow<RingLifo<KeyboardState>>(0x3D8);
|
CheckTypeSizeOrThrow<RingLifo<KeyboardState>>(0x3D8);
|
||||||
CheckTypeSizeOrThrow<Array10<NpadState>>(0x32000);
|
CheckTypeSizeOrThrow<Array10<NpadState>>(0x32000);
|
||||||
CheckTypeSizeOrThrow<SharedMemory>(Horizon.HidSize);
|
CheckTypeSizeOrThrow<SharedMemory>(Horizon.HidSize);
|
||||||
@@ -64,6 +67,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
|||||||
DebugPad = new DebugPadDevice(_device, true);
|
DebugPad = new DebugPadDevice(_device, true);
|
||||||
Touchscreen = new TouchDevice(_device, true);
|
Touchscreen = new TouchDevice(_device, true);
|
||||||
Mouse = new MouseDevice(_device, false);
|
Mouse = new MouseDevice(_device, false);
|
||||||
|
DebugMouse = new DebugMouseDevice(_device, false);
|
||||||
Keyboard = new KeyboardDevice(_device, false);
|
Keyboard = new KeyboardDevice(_device, false);
|
||||||
Npads = new NpadDevices(_device, true);
|
Npads = new NpadDevices(_device, true);
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,29 @@
|
|||||||
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
|
{
|
||||||
|
public class DebugMouseDevice : BaseDevice
|
||||||
|
{
|
||||||
|
public DebugMouseDevice(Switch device, bool active) : base(device, active) { }
|
||||||
|
|
||||||
|
public void Update()
|
||||||
|
{
|
||||||
|
ref RingLifo<DebugMouseState> lifo = ref _device.Hid.SharedMemory.DebugMouse;
|
||||||
|
|
||||||
|
ref DebugMouseState previousEntry = ref lifo.GetCurrentEntryRef();
|
||||||
|
|
||||||
|
DebugMouseState newState = new()
|
||||||
|
{
|
||||||
|
SamplingNumber = previousEntry.SamplingNumber + 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Active)
|
||||||
|
{
|
||||||
|
// TODO: This is a debug device only present in dev environment, do we want to support it?
|
||||||
|
}
|
||||||
|
|
||||||
|
lifo.Write(ref newState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -130,6 +130,26 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
|||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[CommandCmif(26)]
|
||||||
|
// ActivateDebugMouse(nn::applet::AppletResourceUserId)
|
||||||
|
public ResultCode ActivateDebugMouse(ServiceCtx context)
|
||||||
|
{
|
||||||
|
long appletResourceUserId = context.RequestData.ReadInt64();
|
||||||
|
|
||||||
|
context.Device.Hid.DebugMouse.Active = true;
|
||||||
|
|
||||||
|
// Initialize entries to avoid issues with some games.
|
||||||
|
|
||||||
|
for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++)
|
||||||
|
{
|
||||||
|
context.Device.Hid.DebugMouse.Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
[CommandCmif(31)]
|
[CommandCmif(31)]
|
||||||
// ActivateKeyboard(nn::applet::AppletResourceUserId)
|
// ActivateKeyboard(nn::applet::AppletResourceUserId)
|
||||||
|
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
enum DebugMouseAttribute : uint
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Transferable = 1 << 0,
|
||||||
|
IsConnected = 1 << 1,
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
enum DebugMouseButton : uint
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Left = 1 << 0,
|
||||||
|
Right = 1 << 1,
|
||||||
|
Middle = 1 << 2,
|
||||||
|
Forward = 1 << 3,
|
||||||
|
Back = 1 << 4,
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,19 @@
|
|||||||
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
struct DebugMouseState : ISampledDataStruct
|
||||||
|
{
|
||||||
|
public ulong SamplingNumber;
|
||||||
|
public int X;
|
||||||
|
public int Y;
|
||||||
|
public int DeltaX;
|
||||||
|
public int DeltaY;
|
||||||
|
public int WheelDeltaX;
|
||||||
|
public int WheelDeltaY;
|
||||||
|
public DebugMouseButton Buttons;
|
||||||
|
public DebugMouseAttribute Attributes;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,6 @@
|
|||||||
using Ryujinx.Common.Memory;
|
using Ryujinx.Common.Memory;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
|
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
|
||||||
@@ -44,6 +45,12 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[FieldOffset(0x9A00)]
|
[FieldOffset(0x9A00)]
|
||||||
public Array10<NpadState> Npads;
|
public Array10<NpadState> Npads;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Debug mouse.
|
||||||
|
/// </summary>
|
||||||
|
[FieldOffset(0x3DC00)]
|
||||||
|
public RingLifo<DebugMouseState> DebugMouse;
|
||||||
|
|
||||||
public static SharedMemory Create()
|
public static SharedMemory Create()
|
||||||
{
|
{
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
using Gommon;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Common.Memory;
|
using Ryujinx.Common.Memory;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
@@ -143,7 +144,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm
|
|||||||
if (decompressedLdnData.Length != header.DecompressLength)
|
if (decompressedLdnData.Length != header.DecompressLength)
|
||||||
{
|
{
|
||||||
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error: length does not match. ({decompressedLdnData.Length} != {header.DecompressLength})");
|
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error: length does not match. ({decompressedLdnData.Length} != {header.DecompressLength})");
|
||||||
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error data: '{string.Join("", decompressedLdnData.Select(x => (int)x).ToArray())}'");
|
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error data: '{decompressedLdnData.Select(x => (int)x).JoinToString(string.Empty)}'");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager
|
|||||||
public uint FileVersion { get; set; }
|
public uint FileVersion { get; set; }
|
||||||
public byte[] TagUuid { get; set; }
|
public byte[] TagUuid { get; set; }
|
||||||
public string AmiiboId { get; set; }
|
public string AmiiboId { get; set; }
|
||||||
|
public string NickName { get; set; }
|
||||||
public DateTime FirstWriteDate { get; set; }
|
public DateTime FirstWriteDate { get; set; }
|
||||||
public DateTime LastWriteDate { get; set; }
|
public DateTime LastWriteDate { get; set; }
|
||||||
public ushort WriteCounter { get; set; }
|
public ushort WriteCounter { get; set; }
|
||||||
|
@@ -64,16 +64,17 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RegisterInfo GetRegisterInfo(ITickSource tickSource, string amiiboId, string nickname)
|
public static RegisterInfo GetRegisterInfo(ITickSource tickSource, string amiiboId, string userName)
|
||||||
{
|
{
|
||||||
VirtualAmiiboFile amiiboFile = LoadAmiiboFile(amiiboId);
|
VirtualAmiiboFile amiiboFile = LoadAmiiboFile(amiiboId);
|
||||||
|
string nickname = amiiboFile.NickName ?? "Ryujinx";
|
||||||
UtilityImpl utilityImpl = new(tickSource);
|
UtilityImpl utilityImpl = new(tickSource);
|
||||||
CharInfo charInfo = new();
|
CharInfo charInfo = new();
|
||||||
|
|
||||||
charInfo.SetFromStoreData(StoreData.BuildDefault(utilityImpl, 0));
|
charInfo.SetFromStoreData(StoreData.BuildDefault(utilityImpl, 0));
|
||||||
|
|
||||||
charInfo.Nickname = Nickname.FromString(nickname);
|
// This is the player's name
|
||||||
|
charInfo.Nickname = Nickname.FromString(userName);
|
||||||
|
|
||||||
RegisterInfo registerInfo = new()
|
RegisterInfo registerInfo = new()
|
||||||
{
|
{
|
||||||
@@ -85,7 +86,9 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
|||||||
Reserved1 = new Array64<byte>(),
|
Reserved1 = new Array64<byte>(),
|
||||||
Reserved2 = new Array58<byte>(),
|
Reserved2 = new Array58<byte>(),
|
||||||
};
|
};
|
||||||
"Ryujinx"u8.CopyTo(registerInfo.Nickname.AsSpan());
|
// This is the amiibo's name
|
||||||
|
byte[] nicknameBytes = System.Text.Encoding.UTF8.GetBytes(nickname);
|
||||||
|
nicknameBytes.CopyTo(registerInfo.Nickname.AsSpan());
|
||||||
|
|
||||||
return registerInfo;
|
return registerInfo;
|
||||||
}
|
}
|
||||||
|
@@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
|||||||
ulong bufferSize = context.Request.PtrBuff[0].Size;
|
ulong bufferSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
bool isMatch = false;
|
bool isMatch = false;
|
||||||
string text = "";
|
string text = string.Empty;
|
||||||
|
|
||||||
if (bufferSize != 0)
|
if (bufferSize != 0)
|
||||||
{
|
{
|
||||||
@@ -57,8 +57,8 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
|||||||
|
|
||||||
ulong bufferFilteredPosition = context.Request.RecvListBuff[0].Position;
|
ulong bufferFilteredPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
string text = "";
|
string text = string.Empty;
|
||||||
string textFiltered = "";
|
string textFiltered = string.Empty;
|
||||||
|
|
||||||
if (bufferSize != 0)
|
if (bufferSize != 0)
|
||||||
{
|
{
|
||||||
|
@@ -42,7 +42,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu
|
|||||||
|
|
||||||
public NvHostAsGpuDeviceFile(ServiceCtx context, IVirtualMemoryManager memory, ulong owner) : base(context, owner)
|
public NvHostAsGpuDeviceFile(ServiceCtx context, IVirtualMemoryManager memory, ulong owner) : base(context, owner)
|
||||||
{
|
{
|
||||||
_asContext = new AddressSpaceContext(context.Device.Gpu.CreateMemoryManager(owner));
|
_asContext = new AddressSpaceContext(context.Device.Gpu.CreateMemoryManager(owner, context.Device.Memory.Size));
|
||||||
_memoryAllocator = new NvMemoryAllocator();
|
_memoryAllocator = new NvMemoryAllocator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -36,7 +36,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager
|
|||||||
// TODO: Load Environment from the savedata.
|
// TODO: Load Environment from the savedata.
|
||||||
address = address.Replace("%", IManager.NsdSettings.Environment);
|
address = address.Replace("%", IManager.NsdSettings.Environment);
|
||||||
|
|
||||||
resolvedAddress = "";
|
resolvedAddress = string.Empty;
|
||||||
|
|
||||||
if (IManager.NsdSettings == null)
|
if (IManager.NsdSettings == null)
|
||||||
{
|
{
|
||||||
|
@@ -63,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
|
|||||||
|
|
||||||
if (size < 0)
|
if (size < 0)
|
||||||
{
|
{
|
||||||
return "";
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadOnlySpan<byte> data = ReadInPlace((size + 1) * 2);
|
ReadOnlySpan<byte> data = ReadInPlace((size + 1) * 2);
|
||||||
|
@@ -166,7 +166,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
|||||||
|
|
||||||
private ResultCode OpenDisplayImpl(ServiceCtx context, string name)
|
private ResultCode OpenDisplayImpl(ServiceCtx context, string name)
|
||||||
{
|
{
|
||||||
if (name == "")
|
if (name == string.Empty)
|
||||||
{
|
{
|
||||||
return ResultCode.InvalidValue;
|
return ResultCode.InvalidValue;
|
||||||
}
|
}
|
||||||
|
@@ -102,7 +102,7 @@ namespace Ryujinx.HLE.Loaders.Executables
|
|||||||
Match fsSdkMatch = FsSdkRegex().Match(rawTextBuffer);
|
Match fsSdkMatch = FsSdkRegex().Match(rawTextBuffer);
|
||||||
if (fsSdkMatch.Success)
|
if (fsSdkMatch.Success)
|
||||||
{
|
{
|
||||||
stringBuilder.AppendLine($" FS SDK Version: {fsSdkMatch.Value.Replace("sdk_version: ", "")}");
|
stringBuilder.AppendLine($" FS SDK Version: {fsSdkMatch.Value.Replace("sdk_version: ", string.Empty)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
MatchCollection sdkMwMatches = SdkMwRegex().Matches(rawTextBuffer);
|
MatchCollection sdkMwMatches = SdkMwRegex().Matches(rawTextBuffer);
|
||||||
|
@@ -89,7 +89,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||||||
Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled.");
|
Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled.");
|
||||||
}
|
}
|
||||||
|
|
||||||
string programName = "";
|
string programName = string.Empty;
|
||||||
|
|
||||||
if (!isHomebrew && programId > 0x010000000000FFFF)
|
if (!isHomebrew && programId > 0x010000000000FFFF)
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
var nacpData = new BlitStruct<ApplicationControlProperty>(1);
|
var nacpData = new BlitStruct<ApplicationControlProperty>(1);
|
||||||
ulong programId = metaLoader.GetProgramId();
|
ulong programId = metaLoader.GetProgramId();
|
||||||
|
|
||||||
device.Configuration.VirtualFileSystem.ModLoader.CollectMods(new[] { programId });
|
device.Configuration.VirtualFileSystem.ModLoader.CollectMods([programId]);
|
||||||
|
|
||||||
if (programId != 0)
|
if (programId != 0)
|
||||||
{
|
{
|
||||||
|
@@ -145,7 +145,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
IFileSystem dummyExeFs = null;
|
IFileSystem dummyExeFs = null;
|
||||||
Stream romfsStream = null;
|
Stream romfsStream = null;
|
||||||
|
|
||||||
string programName = "";
|
string programName = string.Empty;
|
||||||
ulong programId = 0000000000000000;
|
ulong programId = 0000000000000000;
|
||||||
|
|
||||||
// Load executable.
|
// Load executable.
|
||||||
|
@@ -255,7 +255,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
{
|
{
|
||||||
NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()),
|
NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()),
|
||||||
NroExecutable nro => Convert.ToHexString(nro.Header.BuildId),
|
NroExecutable nro => Convert.ToHexString(nro.Header.BuildId),
|
||||||
_ => "",
|
_ => string.Empty
|
||||||
}).ToUpper());
|
}).ToUpper());
|
||||||
|
|
||||||
ulong[] nsoBase = new ulong[executables.Length];
|
ulong[] nsoBase = new ulong[executables.Length];
|
||||||
|
@@ -117,8 +117,9 @@ namespace Ryujinx.Headless.SDL2.OpenGL
|
|||||||
GraphicsDebugLevel glLogLevel,
|
GraphicsDebugLevel glLogLevel,
|
||||||
AspectRatio aspectRatio,
|
AspectRatio aspectRatio,
|
||||||
bool enableMouse,
|
bool enableMouse,
|
||||||
HideCursorMode hideCursorMode)
|
HideCursorMode hideCursorMode,
|
||||||
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode)
|
bool ignoreControllerApplet)
|
||||||
|
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet)
|
||||||
{
|
{
|
||||||
_glLogLevel = glLogLevel;
|
_glLogLevel = glLogLevel;
|
||||||
}
|
}
|
||||||
|
@@ -225,6 +225,9 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
|
|
||||||
[Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")]
|
[Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")]
|
||||||
public bool IgnoreMissingServices { get; set; }
|
public bool IgnoreMissingServices { get; set; }
|
||||||
|
|
||||||
|
[Option("ignore-controller-applet", Required = false, Default = false, HelpText = "Enable ignoring the controller applet when your game loses connection to your controller.")]
|
||||||
|
public bool IgnoreControllerApplet { get; set; }
|
||||||
|
|
||||||
// Values
|
// Values
|
||||||
|
|
||||||
|
@@ -444,8 +444,7 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
{
|
{
|
||||||
Logger.AddTarget(new AsyncLogTargetWrapper(
|
Logger.AddTarget(new AsyncLogTargetWrapper(
|
||||||
new FileLogTarget("file", logFile),
|
new FileLogTarget("file", logFile),
|
||||||
1000,
|
1000
|
||||||
AsyncLogTargetOverflowAction.Block
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -506,8 +505,8 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
private static WindowBase CreateWindow(Options options)
|
private static WindowBase CreateWindow(Options options)
|
||||||
{
|
{
|
||||||
return options.GraphicsBackend == GraphicsBackend.Vulkan
|
return options.GraphicsBackend == GraphicsBackend.Vulkan
|
||||||
? new VulkanWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode)
|
? new VulkanWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet)
|
||||||
: new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode);
|
: new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IRenderer CreateRenderer(Options options, WindowBase window)
|
private static IRenderer CreateRenderer(Options options, WindowBase window)
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$([MSBuild]::IsOSPlatform('OSX'))">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$([MSBuild]::IsOSPlatform('OSX'))">
|
||||||
<Exec Command="codesign --entitlements '$(ProjectDir)..\..\distribution\macos\entitlements.xml' -f --deep -s $(SigningCertificate) '$(TargetDir)$(TargetName)'" />
|
<Exec Command="codesign --entitlements '$(ProjectDir)..\..\distribution\macos\entitlements.xml' -f -s $(SigningCertificate) '$(TargetDir)$(TargetName)'" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -17,8 +17,9 @@ namespace Ryujinx.Headless.SDL2.Vulkan
|
|||||||
GraphicsDebugLevel glLogLevel,
|
GraphicsDebugLevel glLogLevel,
|
||||||
AspectRatio aspectRatio,
|
AspectRatio aspectRatio,
|
||||||
bool enableMouse,
|
bool enableMouse,
|
||||||
HideCursorMode hideCursorMode)
|
HideCursorMode hideCursorMode,
|
||||||
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode)
|
bool ignoreControllerApplet)
|
||||||
|
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet)
|
||||||
{
|
{
|
||||||
_glLogLevel = glLogLevel;
|
_glLogLevel = glLogLevel;
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
using Humanizer;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Configuration.Hid;
|
using Ryujinx.Common.Configuration.Hid;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
@@ -85,13 +86,15 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
|
|
||||||
private readonly AspectRatio _aspectRatio;
|
private readonly AspectRatio _aspectRatio;
|
||||||
private readonly bool _enableMouse;
|
private readonly bool _enableMouse;
|
||||||
|
private readonly bool _ignoreControllerApplet;
|
||||||
|
|
||||||
public WindowBase(
|
public WindowBase(
|
||||||
InputManager inputManager,
|
InputManager inputManager,
|
||||||
GraphicsDebugLevel glLogLevel,
|
GraphicsDebugLevel glLogLevel,
|
||||||
AspectRatio aspectRatio,
|
AspectRatio aspectRatio,
|
||||||
bool enableMouse,
|
bool enableMouse,
|
||||||
HideCursorMode hideCursorMode)
|
HideCursorMode hideCursorMode,
|
||||||
|
bool ignoreControllerApplet)
|
||||||
{
|
{
|
||||||
MouseDriver = new SDL2MouseDriver(hideCursorMode);
|
MouseDriver = new SDL2MouseDriver(hideCursorMode);
|
||||||
_inputManager = inputManager;
|
_inputManager = inputManager;
|
||||||
@@ -107,6 +110,7 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
_gpuDoneEvent = new ManualResetEvent(false);
|
_gpuDoneEvent = new ManualResetEvent(false);
|
||||||
_aspectRatio = aspectRatio;
|
_aspectRatio = aspectRatio;
|
||||||
_enableMouse = enableMouse;
|
_enableMouse = enableMouse;
|
||||||
|
_ignoreControllerApplet = ignoreControllerApplet;
|
||||||
HostUITheme = new HeadlessHostUiTheme();
|
HostUITheme = new HeadlessHostUiTheme();
|
||||||
|
|
||||||
SDL2Driver.Instance.Initialize();
|
SDL2Driver.Instance.Initialize();
|
||||||
@@ -483,12 +487,14 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
|
|
||||||
public bool DisplayMessageDialog(ControllerAppletUIArgs args)
|
public bool DisplayMessageDialog(ControllerAppletUIArgs args)
|
||||||
{
|
{
|
||||||
|
if (_ignoreControllerApplet) return false;
|
||||||
|
|
||||||
string playerCount = args.PlayerCountMin == args.PlayerCountMax ? $"exactly {args.PlayerCountMin}" : $"{args.PlayerCountMin}-{args.PlayerCountMax}";
|
string playerCount = args.PlayerCountMin == args.PlayerCountMax ? $"exactly {args.PlayerCountMin}" : $"{args.PlayerCountMin}-{args.PlayerCountMax}";
|
||||||
|
|
||||||
string message = $"Application requests {playerCount} player(s) with:\n\n"
|
string message = $"Application requests {playerCount} {"player".ToQuantity(args.PlayerCountMin + args.PlayerCountMax, ShowQuantityAs.None)} with:\n\n"
|
||||||
+ $"TYPES: {args.SupportedStyles}\n\n"
|
+ $"TYPES: {args.SupportedStyles}\n\n"
|
||||||
+ $"PLAYERS: {string.Join(", ", args.SupportedPlayers)}\n\n"
|
+ $"PLAYERS: {string.Join(", ", args.SupportedPlayers)}\n\n"
|
||||||
+ (args.IsDocked ? "Docked mode set. Handheld is also invalid.\n\n" : "")
|
+ (args.IsDocked ? "Docked mode set. Handheld is also invalid.\n\n" : string.Empty)
|
||||||
+ "Please reconfigure Input now and then press OK.";
|
+ "Please reconfigure Input now and then press OK.";
|
||||||
|
|
||||||
return DisplayMessageDialog("Controller Applet", message);
|
return DisplayMessageDialog("Controller Applet", message);
|
||||||
|
@@ -1235,14 +1235,14 @@ namespace Ryujinx.Horizon.Common
|
|||||||
{ 0x412, "NotFound" },
|
{ 0x412, "NotFound" },
|
||||||
{ 0x612, "NotEnoughBuffer" },
|
{ 0x612, "NotEnoughBuffer" },
|
||||||
{ 0xCA12, "Cancelled" },
|
{ 0xCA12, "Cancelled" },
|
||||||
{ 0x7FE12, "" },
|
{ 0x7FE12, string.Empty },
|
||||||
{ 0xFA212, "" },
|
{ 0xFA212, string.Empty },
|
||||||
{ 0xFA612, "InvalidTaskId" },
|
{ 0xFA612, "InvalidTaskId" },
|
||||||
{ 0xFB612, "InvalidSize" },
|
{ 0xFB612, "InvalidSize" },
|
||||||
{ 0xFCA12, "TaskCancelled" },
|
{ 0xFCA12, "TaskCancelled" },
|
||||||
{ 0xFCC12, "TaskNotCompleted" },
|
{ 0xFCC12, "TaskNotCompleted" },
|
||||||
{ 0xFCE12, "TaskQueueNotAvailable" },
|
{ 0xFCE12, "TaskQueueNotAvailable" },
|
||||||
{ 0x106A12, "" },
|
{ 0x106A12, string.Empty },
|
||||||
{ 0x106C12, "OutOfRpcTask" },
|
{ 0x106C12, "OutOfRpcTask" },
|
||||||
{ 0x109612, "InvalidCategory" },
|
{ 0x109612, "InvalidCategory" },
|
||||||
{ 0x214, "OutOfKeyResource" },
|
{ 0x214, "OutOfKeyResource" },
|
||||||
|
@@ -221,7 +221,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail
|
|||||||
if (includeMultiWord)
|
if (includeMultiWord)
|
||||||
{
|
{
|
||||||
int lastMultiWordIndex = 0;
|
int lastMultiWordIndex = 0;
|
||||||
string multiWord = "";
|
string multiWord = string.Empty;
|
||||||
|
|
||||||
while (_multiWordMap.Has(nodePlainIndex))
|
while (_multiWordMap.Has(nodePlainIndex))
|
||||||
{
|
{
|
||||||
|
@@ -115,7 +115,7 @@ namespace Ryujinx.Input.SDL2
|
|||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
_gamepadsIds.Add(id);
|
_gamepadsIds.Insert(joystickDeviceId, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
OnGamepadConnected?.Invoke(id);
|
OnGamepadConnected?.Invoke(id);
|
||||||
|
@@ -162,7 +162,7 @@ namespace Ryujinx.UI.App.Common
|
|||||||
NsoReader reader = new();
|
NsoReader reader = new();
|
||||||
reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure();
|
reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure();
|
||||||
|
|
||||||
return BitConverter.ToString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", "").ToUpper()[..16];
|
return BitConverter.ToString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", string.Empty).ToUpper()[..16];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The current version of the file format
|
/// The current version of the file format
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int CurrentVersion = 55;
|
public const int CurrentVersion = 56;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version of the configuration file format
|
/// Version of the configuration file format
|
||||||
@@ -173,6 +173,11 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool RememberWindowState { get; set; }
|
public bool RememberWindowState { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enables or disables the redesigned title bar
|
||||||
|
/// </summary>
|
||||||
|
public bool ShowTitleBar { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enables hardware-accelerated rendering for Avalonia
|
/// Enables hardware-accelerated rendering for Avalonia
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -293,16 +298,6 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string LanguageCode { get; set; }
|
public string LanguageCode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Enable or disable custom themes in the GUI
|
|
||||||
/// </summary>
|
|
||||||
public bool EnableCustomTheme { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Path to custom GUI theme
|
|
||||||
/// </summary>
|
|
||||||
public string CustomThemePath { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Chooses the base style // Not Used
|
/// Chooses the base style // Not Used
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@@ -13,8 +13,6 @@ using Ryujinx.UI.Common.Configuration.UI;
|
|||||||
using Ryujinx.UI.Common.Helper;
|
using Ryujinx.UI.Common.Helper;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
|
||||||
using System.Text.Json.Nodes;
|
|
||||||
|
|
||||||
namespace Ryujinx.UI.Common.Configuration
|
namespace Ryujinx.UI.Common.Configuration
|
||||||
{
|
{
|
||||||
@@ -144,16 +142,6 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ReactiveObject<string> LanguageCode { get; private set; }
|
public ReactiveObject<string> LanguageCode { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Enable or disable custom themes in the GUI
|
|
||||||
/// </summary>
|
|
||||||
public ReactiveObject<bool> EnableCustomTheme { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Path to custom GUI theme
|
|
||||||
/// </summary>
|
|
||||||
public ReactiveObject<string> CustomThemePath { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Selects the base style
|
/// Selects the base style
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -202,8 +190,6 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
AutoloadDirs = new ReactiveObject<List<string>>();
|
AutoloadDirs = new ReactiveObject<List<string>>();
|
||||||
ShownFileTypes = new ShownFileTypeSettings();
|
ShownFileTypes = new ShownFileTypeSettings();
|
||||||
WindowStartup = new WindowStartupSettings();
|
WindowStartup = new WindowStartupSettings();
|
||||||
EnableCustomTheme = new ReactiveObject<bool>();
|
|
||||||
CustomThemePath = new ReactiveObject<string>();
|
|
||||||
BaseStyle = new ReactiveObject<string>();
|
BaseStyle = new ReactiveObject<string>();
|
||||||
StartFullscreen = new ReactiveObject<bool>();
|
StartFullscreen = new ReactiveObject<bool>();
|
||||||
GameListViewMode = new ReactiveObject<int>();
|
GameListViewMode = new ReactiveObject<int>();
|
||||||
@@ -213,7 +199,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
IsAscendingOrder = new ReactiveObject<bool>();
|
IsAscendingOrder = new ReactiveObject<bool>();
|
||||||
LanguageCode = new ReactiveObject<string>();
|
LanguageCode = new ReactiveObject<string>();
|
||||||
ShowConsole = new ReactiveObject<bool>();
|
ShowConsole = new ReactiveObject<bool>();
|
||||||
ShowConsole.Event += static (s, e) => { ConsoleHelper.SetConsoleWindowState(e.NewValue); };
|
ShowConsole.Event += static (_, e) => ConsoleHelper.SetConsoleWindowState(e.NewValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,6 +266,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
public LoggerSection()
|
public LoggerSection()
|
||||||
{
|
{
|
||||||
EnableDebug = new ReactiveObject<bool>();
|
EnableDebug = new ReactiveObject<bool>();
|
||||||
|
EnableDebug.LogChangesToValue(nameof(EnableDebug));
|
||||||
EnableStub = new ReactiveObject<bool>();
|
EnableStub = new ReactiveObject<bool>();
|
||||||
EnableInfo = new ReactiveObject<bool>();
|
EnableInfo = new ReactiveObject<bool>();
|
||||||
EnableWarn = new ReactiveObject<bool>();
|
EnableWarn = new ReactiveObject<bool>();
|
||||||
@@ -289,7 +276,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
EnableFsAccessLog = new ReactiveObject<bool>();
|
EnableFsAccessLog = new ReactiveObject<bool>();
|
||||||
FilteredClasses = new ReactiveObject<LogClass[]>();
|
FilteredClasses = new ReactiveObject<LogClass[]>();
|
||||||
EnableFileLog = new ReactiveObject<bool>();
|
EnableFileLog = new ReactiveObject<bool>();
|
||||||
EnableFileLog.Event += static (sender, e) => LogValueChange(e, nameof(EnableFileLog));
|
EnableFileLog.LogChangesToValue(nameof(EnableFileLog));
|
||||||
GraphicsDebugLevel = new ReactiveObject<GraphicsDebugLevel>();
|
GraphicsDebugLevel = new ReactiveObject<GraphicsDebugLevel>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,33 +369,37 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
public SystemSection()
|
public SystemSection()
|
||||||
{
|
{
|
||||||
Language = new ReactiveObject<Language>();
|
Language = new ReactiveObject<Language>();
|
||||||
|
Language.LogChangesToValue(nameof(Language));
|
||||||
Region = new ReactiveObject<Region>();
|
Region = new ReactiveObject<Region>();
|
||||||
|
Region.LogChangesToValue(nameof(Region));
|
||||||
TimeZone = new ReactiveObject<string>();
|
TimeZone = new ReactiveObject<string>();
|
||||||
|
TimeZone.LogChangesToValue(nameof(TimeZone));
|
||||||
SystemTimeOffset = new ReactiveObject<long>();
|
SystemTimeOffset = new ReactiveObject<long>();
|
||||||
|
SystemTimeOffset.LogChangesToValue(nameof(SystemTimeOffset));
|
||||||
EnableDockedMode = new ReactiveObject<bool>();
|
EnableDockedMode = new ReactiveObject<bool>();
|
||||||
EnableDockedMode.Event += static (sender, e) => LogValueChange(e, nameof(EnableDockedMode));
|
EnableDockedMode.LogChangesToValue(nameof(EnableDockedMode));
|
||||||
EnablePtc = new ReactiveObject<bool>();
|
EnablePtc = new ReactiveObject<bool>();
|
||||||
EnablePtc.Event += static (sender, e) => LogValueChange(e, nameof(EnablePtc));
|
EnablePtc.LogChangesToValue(nameof(EnablePtc));
|
||||||
EnableLowPowerPtc = new ReactiveObject<bool>();
|
EnableLowPowerPtc = new ReactiveObject<bool>();
|
||||||
EnableLowPowerPtc.Event += static (sender, e) => LogValueChange(e, nameof(EnableLowPowerPtc));
|
EnableLowPowerPtc.LogChangesToValue(nameof(EnableLowPowerPtc));
|
||||||
EnableInternetAccess = new ReactiveObject<bool>();
|
EnableInternetAccess = new ReactiveObject<bool>();
|
||||||
EnableInternetAccess.Event += static (sender, e) => LogValueChange(e, nameof(EnableInternetAccess));
|
EnableInternetAccess.LogChangesToValue(nameof(EnableInternetAccess));
|
||||||
EnableFsIntegrityChecks = new ReactiveObject<bool>();
|
EnableFsIntegrityChecks = new ReactiveObject<bool>();
|
||||||
EnableFsIntegrityChecks.Event += static (sender, e) => LogValueChange(e, nameof(EnableFsIntegrityChecks));
|
EnableFsIntegrityChecks.LogChangesToValue(nameof(EnableFsIntegrityChecks));
|
||||||
FsGlobalAccessLogMode = new ReactiveObject<int>();
|
FsGlobalAccessLogMode = new ReactiveObject<int>();
|
||||||
FsGlobalAccessLogMode.Event += static (sender, e) => LogValueChange(e, nameof(FsGlobalAccessLogMode));
|
FsGlobalAccessLogMode.LogChangesToValue(nameof(FsGlobalAccessLogMode));
|
||||||
AudioBackend = new ReactiveObject<AudioBackend>();
|
AudioBackend = new ReactiveObject<AudioBackend>();
|
||||||
AudioBackend.Event += static (sender, e) => LogValueChange(e, nameof(AudioBackend));
|
AudioBackend.LogChangesToValue(nameof(AudioBackend));
|
||||||
MemoryManagerMode = new ReactiveObject<MemoryManagerMode>();
|
MemoryManagerMode = new ReactiveObject<MemoryManagerMode>();
|
||||||
MemoryManagerMode.Event += static (sender, e) => LogValueChange(e, nameof(MemoryManagerMode));
|
MemoryManagerMode.LogChangesToValue(nameof(MemoryManagerMode));
|
||||||
DramSize = new ReactiveObject<MemoryConfiguration>();
|
DramSize = new ReactiveObject<MemoryConfiguration>();
|
||||||
DramSize.Event += static (sender, e) => LogValueChange(e, nameof(DramSize));
|
DramSize.LogChangesToValue(nameof(DramSize));
|
||||||
IgnoreMissingServices = new ReactiveObject<bool>();
|
IgnoreMissingServices = new ReactiveObject<bool>();
|
||||||
IgnoreMissingServices.Event += static (sender, e) => LogValueChange(e, nameof(IgnoreMissingServices));
|
IgnoreMissingServices.LogChangesToValue(nameof(IgnoreMissingServices));
|
||||||
AudioVolume = new ReactiveObject<float>();
|
AudioVolume = new ReactiveObject<float>();
|
||||||
AudioVolume.Event += static (sender, e) => LogValueChange(e, nameof(AudioVolume));
|
AudioVolume.LogChangesToValue(nameof(AudioVolume));
|
||||||
UseHypervisor = new ReactiveObject<bool>();
|
UseHypervisor = new ReactiveObject<bool>();
|
||||||
UseHypervisor.Event += static (sender, e) => LogValueChange(e, nameof(UseHypervisor));
|
UseHypervisor.LogChangesToValue(nameof(UseHypervisor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,36 +527,36 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
public GraphicsSection()
|
public GraphicsSection()
|
||||||
{
|
{
|
||||||
BackendThreading = new ReactiveObject<BackendThreading>();
|
BackendThreading = new ReactiveObject<BackendThreading>();
|
||||||
BackendThreading.Event += static (_, e) => LogValueChange(e, nameof(BackendThreading));
|
BackendThreading.LogChangesToValue(nameof(BackendThreading));
|
||||||
ResScale = new ReactiveObject<int>();
|
ResScale = new ReactiveObject<int>();
|
||||||
ResScale.Event += static (_, e) => LogValueChange(e, nameof(ResScale));
|
ResScale.LogChangesToValue(nameof(ResScale));
|
||||||
ResScaleCustom = new ReactiveObject<float>();
|
ResScaleCustom = new ReactiveObject<float>();
|
||||||
ResScaleCustom.Event += static (_, e) => LogValueChange(e, nameof(ResScaleCustom));
|
ResScaleCustom.LogChangesToValue(nameof(ResScaleCustom));
|
||||||
MaxAnisotropy = new ReactiveObject<float>();
|
MaxAnisotropy = new ReactiveObject<float>();
|
||||||
MaxAnisotropy.Event += static (_, e) => LogValueChange(e, nameof(MaxAnisotropy));
|
MaxAnisotropy.LogChangesToValue(nameof(MaxAnisotropy));
|
||||||
AspectRatio = new ReactiveObject<AspectRatio>();
|
AspectRatio = new ReactiveObject<AspectRatio>();
|
||||||
AspectRatio.Event += static (_, e) => LogValueChange(e, nameof(AspectRatio));
|
AspectRatio.LogChangesToValue(nameof(AspectRatio));
|
||||||
ShadersDumpPath = new ReactiveObject<string>();
|
ShadersDumpPath = new ReactiveObject<string>();
|
||||||
EnableVsync = new ReactiveObject<bool>();
|
EnableVsync = new ReactiveObject<bool>();
|
||||||
EnableVsync.Event += static (_, e) => LogValueChange(e, nameof(EnableVsync));
|
EnableVsync.LogChangesToValue(nameof(EnableVsync));
|
||||||
EnableShaderCache = new ReactiveObject<bool>();
|
EnableShaderCache = new ReactiveObject<bool>();
|
||||||
EnableShaderCache.Event += static (_, e) => LogValueChange(e, nameof(EnableShaderCache));
|
EnableShaderCache.LogChangesToValue(nameof(EnableShaderCache));
|
||||||
EnableTextureRecompression = new ReactiveObject<bool>();
|
EnableTextureRecompression = new ReactiveObject<bool>();
|
||||||
EnableTextureRecompression.Event += static (_, e) => LogValueChange(e, nameof(EnableTextureRecompression));
|
EnableTextureRecompression.LogChangesToValue(nameof(EnableTextureRecompression));
|
||||||
GraphicsBackend = new ReactiveObject<GraphicsBackend>();
|
GraphicsBackend = new ReactiveObject<GraphicsBackend>();
|
||||||
GraphicsBackend.Event += static (_, e) => LogValueChange(e, nameof(GraphicsBackend));
|
GraphicsBackend.LogChangesToValue(nameof(GraphicsBackend));
|
||||||
PreferredGpu = new ReactiveObject<string>();
|
PreferredGpu = new ReactiveObject<string>();
|
||||||
PreferredGpu.Event += static (_, e) => LogValueChange(e, nameof(PreferredGpu));
|
PreferredGpu.LogChangesToValue(nameof(PreferredGpu));
|
||||||
EnableMacroHLE = new ReactiveObject<bool>();
|
EnableMacroHLE = new ReactiveObject<bool>();
|
||||||
EnableMacroHLE.Event += static (_, e) => LogValueChange(e, nameof(EnableMacroHLE));
|
EnableMacroHLE.LogChangesToValue(nameof(EnableMacroHLE));
|
||||||
EnableColorSpacePassthrough = new ReactiveObject<bool>();
|
EnableColorSpacePassthrough = new ReactiveObject<bool>();
|
||||||
EnableColorSpacePassthrough.Event += static (_, e) => LogValueChange(e, nameof(EnableColorSpacePassthrough));
|
EnableColorSpacePassthrough.LogChangesToValue(nameof(EnableColorSpacePassthrough));
|
||||||
AntiAliasing = new ReactiveObject<AntiAliasing>();
|
AntiAliasing = new ReactiveObject<AntiAliasing>();
|
||||||
AntiAliasing.Event += static (_, e) => LogValueChange(e, nameof(AntiAliasing));
|
AntiAliasing.LogChangesToValue(nameof(AntiAliasing));
|
||||||
ScalingFilter = new ReactiveObject<ScalingFilter>();
|
ScalingFilter = new ReactiveObject<ScalingFilter>();
|
||||||
ScalingFilter.Event += static (_, e) => LogValueChange(e, nameof(ScalingFilter));
|
ScalingFilter.LogChangesToValue(nameof(ScalingFilter));
|
||||||
ScalingFilterLevel = new ReactiveObject<int>();
|
ScalingFilterLevel = new ReactiveObject<int>();
|
||||||
ScalingFilterLevel.Event += static (_, e) => LogValueChange(e, nameof(ScalingFilterLevel));
|
ScalingFilterLevel.LogChangesToValue(nameof(ScalingFilterLevel));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,7 +579,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
{
|
{
|
||||||
LanInterfaceId = new ReactiveObject<string>();
|
LanInterfaceId = new ReactiveObject<string>();
|
||||||
Mode = new ReactiveObject<MultiplayerMode>();
|
Mode = new ReactiveObject<MultiplayerMode>();
|
||||||
Mode.Event += static (_, e) => LogValueChange(e, nameof(MultiplayerMode));
|
Mode.LogChangesToValue(nameof(Mode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -652,6 +643,11 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ReactiveObject<bool> RememberWindowState { get; private set; }
|
public ReactiveObject<bool> RememberWindowState { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enables or disables the redesigned title bar
|
||||||
|
/// </summary>
|
||||||
|
public ReactiveObject<bool> ShowTitleBar { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enables hardware-accelerated rendering for Avalonia
|
/// Enables hardware-accelerated rendering for Avalonia
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -674,7 +670,9 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
CheckUpdatesOnStart = new ReactiveObject<bool>();
|
CheckUpdatesOnStart = new ReactiveObject<bool>();
|
||||||
ShowConfirmExit = new ReactiveObject<bool>();
|
ShowConfirmExit = new ReactiveObject<bool>();
|
||||||
IgnoreApplet = new ReactiveObject<bool>();
|
IgnoreApplet = new ReactiveObject<bool>();
|
||||||
|
IgnoreApplet.LogChangesToValue(nameof(IgnoreApplet));
|
||||||
RememberWindowState = new ReactiveObject<bool>();
|
RememberWindowState = new ReactiveObject<bool>();
|
||||||
|
ShowTitleBar = new ReactiveObject<bool>();
|
||||||
EnableHardwareAcceleration = new ReactiveObject<bool>();
|
EnableHardwareAcceleration = new ReactiveObject<bool>();
|
||||||
HideCursor = new ReactiveObject<HideCursorMode>();
|
HideCursor = new ReactiveObject<HideCursorMode>();
|
||||||
}
|
}
|
||||||
@@ -714,6 +712,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
ShowConfirmExit = ShowConfirmExit,
|
ShowConfirmExit = ShowConfirmExit,
|
||||||
IgnoreApplet = IgnoreApplet,
|
IgnoreApplet = IgnoreApplet,
|
||||||
RememberWindowState = RememberWindowState,
|
RememberWindowState = RememberWindowState,
|
||||||
|
ShowTitleBar = ShowTitleBar,
|
||||||
EnableHardwareAcceleration = EnableHardwareAcceleration,
|
EnableHardwareAcceleration = EnableHardwareAcceleration,
|
||||||
HideCursor = HideCursor,
|
HideCursor = HideCursor,
|
||||||
EnableVsync = Graphics.EnableVsync,
|
EnableVsync = Graphics.EnableVsync,
|
||||||
@@ -770,8 +769,6 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
WindowMaximized = UI.WindowStartup.WindowMaximized,
|
WindowMaximized = UI.WindowStartup.WindowMaximized,
|
||||||
},
|
},
|
||||||
LanguageCode = UI.LanguageCode,
|
LanguageCode = UI.LanguageCode,
|
||||||
EnableCustomTheme = UI.EnableCustomTheme,
|
|
||||||
CustomThemePath = UI.CustomThemePath,
|
|
||||||
BaseStyle = UI.BaseStyle,
|
BaseStyle = UI.BaseStyle,
|
||||||
GameListViewMode = UI.GameListViewMode,
|
GameListViewMode = UI.GameListViewMode,
|
||||||
ShowNames = UI.ShowNames,
|
ShowNames = UI.ShowNames,
|
||||||
@@ -804,8 +801,8 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
Graphics.MaxAnisotropy.Value = -1.0f;
|
Graphics.MaxAnisotropy.Value = -1.0f;
|
||||||
Graphics.AspectRatio.Value = AspectRatio.Fixed16x9;
|
Graphics.AspectRatio.Value = AspectRatio.Fixed16x9;
|
||||||
Graphics.GraphicsBackend.Value = DefaultGraphicsBackend();
|
Graphics.GraphicsBackend.Value = DefaultGraphicsBackend();
|
||||||
Graphics.PreferredGpu.Value = "";
|
Graphics.PreferredGpu.Value = string.Empty;
|
||||||
Graphics.ShadersDumpPath.Value = "";
|
Graphics.ShadersDumpPath.Value = string.Empty;
|
||||||
Logger.EnableDebug.Value = false;
|
Logger.EnableDebug.Value = false;
|
||||||
Logger.EnableStub.Value = true;
|
Logger.EnableStub.Value = true;
|
||||||
Logger.EnableInfo.Value = true;
|
Logger.EnableInfo.Value = true;
|
||||||
@@ -814,7 +811,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
Logger.EnableTrace.Value = false;
|
Logger.EnableTrace.Value = false;
|
||||||
Logger.EnableGuest.Value = true;
|
Logger.EnableGuest.Value = true;
|
||||||
Logger.EnableFsAccessLog.Value = false;
|
Logger.EnableFsAccessLog.Value = false;
|
||||||
Logger.FilteredClasses.Value = Array.Empty<LogClass>();
|
Logger.FilteredClasses.Value = [];
|
||||||
Logger.GraphicsDebugLevel.Value = GraphicsDebugLevel.None;
|
Logger.GraphicsDebugLevel.Value = GraphicsDebugLevel.None;
|
||||||
System.Language.Value = Language.AmericanEnglish;
|
System.Language.Value = Language.AmericanEnglish;
|
||||||
System.Region.Value = Region.USA;
|
System.Region.Value = Region.USA;
|
||||||
@@ -826,6 +823,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
ShowConfirmExit.Value = true;
|
ShowConfirmExit.Value = true;
|
||||||
IgnoreApplet.Value = false;
|
IgnoreApplet.Value = false;
|
||||||
RememberWindowState.Value = true;
|
RememberWindowState.Value = true;
|
||||||
|
ShowTitleBar.Value = !OperatingSystem.IsWindows();
|
||||||
EnableHardwareAcceleration.Value = true;
|
EnableHardwareAcceleration.Value = true;
|
||||||
HideCursor.Value = HideCursorMode.OnIdle;
|
HideCursor.Value = HideCursorMode.OnIdle;
|
||||||
Graphics.EnableVsync.Value = true;
|
Graphics.EnableVsync.Value = true;
|
||||||
@@ -860,17 +858,15 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
UI.GuiColumns.PathColumn.Value = true;
|
UI.GuiColumns.PathColumn.Value = true;
|
||||||
UI.ColumnSort.SortColumnId.Value = 0;
|
UI.ColumnSort.SortColumnId.Value = 0;
|
||||||
UI.ColumnSort.SortAscending.Value = false;
|
UI.ColumnSort.SortAscending.Value = false;
|
||||||
UI.GameDirs.Value = new List<string>();
|
UI.GameDirs.Value = [];
|
||||||
UI.AutoloadDirs.Value = new List<string>();
|
UI.AutoloadDirs.Value = [];
|
||||||
UI.ShownFileTypes.NSP.Value = true;
|
UI.ShownFileTypes.NSP.Value = true;
|
||||||
UI.ShownFileTypes.PFS0.Value = true;
|
UI.ShownFileTypes.PFS0.Value = true;
|
||||||
UI.ShownFileTypes.XCI.Value = true;
|
UI.ShownFileTypes.XCI.Value = true;
|
||||||
UI.ShownFileTypes.NCA.Value = true;
|
UI.ShownFileTypes.NCA.Value = true;
|
||||||
UI.ShownFileTypes.NRO.Value = true;
|
UI.ShownFileTypes.NRO.Value = true;
|
||||||
UI.ShownFileTypes.NSO.Value = true;
|
UI.ShownFileTypes.NSO.Value = true;
|
||||||
UI.EnableCustomTheme.Value = true;
|
|
||||||
UI.LanguageCode.Value = "en_US";
|
UI.LanguageCode.Value = "en_US";
|
||||||
UI.CustomThemePath.Value = "";
|
|
||||||
UI.BaseStyle.Value = "Dark";
|
UI.BaseStyle.Value = "Dark";
|
||||||
UI.GameListViewMode.Value = 0;
|
UI.GameListViewMode.Value = 0;
|
||||||
UI.ShowNames.Value = true;
|
UI.ShowNames.Value = true;
|
||||||
@@ -1540,6 +1536,15 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
configurationFileUpdated = true;
|
configurationFileUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (configurationFileFormat.Version < 56)
|
||||||
|
{
|
||||||
|
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 56.");
|
||||||
|
|
||||||
|
configurationFileFormat.ShowTitleBar = !OperatingSystem.IsWindows();
|
||||||
|
|
||||||
|
configurationFileUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
||||||
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
||||||
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
||||||
@@ -1572,6 +1577,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit;
|
ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit;
|
||||||
IgnoreApplet.Value = configurationFileFormat.IgnoreApplet;
|
IgnoreApplet.Value = configurationFileFormat.IgnoreApplet;
|
||||||
RememberWindowState.Value = configurationFileFormat.RememberWindowState;
|
RememberWindowState.Value = configurationFileFormat.RememberWindowState;
|
||||||
|
ShowTitleBar.Value = configurationFileFormat.ShowTitleBar;
|
||||||
EnableHardwareAcceleration.Value = configurationFileFormat.EnableHardwareAcceleration;
|
EnableHardwareAcceleration.Value = configurationFileFormat.EnableHardwareAcceleration;
|
||||||
HideCursor.Value = configurationFileFormat.HideCursor;
|
HideCursor.Value = configurationFileFormat.HideCursor;
|
||||||
Graphics.EnableVsync.Value = configurationFileFormat.EnableVsync;
|
Graphics.EnableVsync.Value = configurationFileFormat.EnableVsync;
|
||||||
@@ -1610,9 +1616,7 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
UI.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA;
|
UI.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA;
|
||||||
UI.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO;
|
UI.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO;
|
||||||
UI.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO;
|
UI.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO;
|
||||||
UI.EnableCustomTheme.Value = configurationFileFormat.EnableCustomTheme;
|
|
||||||
UI.LanguageCode.Value = configurationFileFormat.LanguageCode;
|
UI.LanguageCode.Value = configurationFileFormat.LanguageCode;
|
||||||
UI.CustomThemePath.Value = configurationFileFormat.CustomThemePath;
|
|
||||||
UI.BaseStyle.Value = configurationFileFormat.BaseStyle;
|
UI.BaseStyle.Value = configurationFileFormat.BaseStyle;
|
||||||
UI.GameListViewMode.Value = configurationFileFormat.GameListViewMode;
|
UI.GameListViewMode.Value = configurationFileFormat.GameListViewMode;
|
||||||
UI.ShowNames.Value = configurationFileFormat.ShowNames;
|
UI.ShowNames.Value = configurationFileFormat.ShowNames;
|
||||||
@@ -1654,13 +1658,6 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
return GraphicsBackend.OpenGl;
|
return GraphicsBackend.OpenGl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void LogValueChange<T>(ReactiveEventArgs<T> eventArgs, string valueName)
|
|
||||||
{
|
|
||||||
string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}");
|
|
||||||
|
|
||||||
Ryujinx.Common.Logging.Logger.Info?.Print(LogClass.Configuration, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Initialize()
|
public static void Initialize()
|
||||||
{
|
{
|
||||||
if (Instance != null)
|
if (Instance != null)
|
||||||
|
@@ -122,70 +122,145 @@ namespace Ryujinx.UI.Common
|
|||||||
|
|
||||||
private static readonly string[] _discordGameAssetKeys =
|
private static readonly string[] _discordGameAssetKeys =
|
||||||
[
|
[
|
||||||
"01002da013484000", // The Legend of Zelda: Skyward Sword HD
|
"010055d009f78000", // Fire Emblem: Three Houses
|
||||||
|
"0100a12011cc8000", // Fire Emblem: Shadow Dragon
|
||||||
|
"0100a6301214e000", // Fire Emblem Engage
|
||||||
|
"0100f15003e64000", // Fire Emblem Warriors
|
||||||
|
"010071f0143ea000", // Fire Emblem Warriors: Three Hopes
|
||||||
|
|
||||||
|
"01007e3006dda000", // Kirby Star Allies
|
||||||
|
"01004d300c5ae000", // Kirby and the Forgotten Land
|
||||||
|
"01006b601380e000", // Kirby's Return to Dream Land Deluxe
|
||||||
|
"01003fb00c5a8000", // Super Kirby Clash
|
||||||
|
"0100227010460000", // Kirby Fighters 2
|
||||||
|
"0100a8e016236000", // Kirby's Dream Buffet
|
||||||
|
|
||||||
"01007ef00011e000", // The Legend of Zelda: Breath of the Wild
|
"01007ef00011e000", // The Legend of Zelda: Breath of the Wild
|
||||||
|
"01006bb00c6f0000", // The Legend of Zelda: Link's Awakening
|
||||||
|
"01002da013484000", // The Legend of Zelda: Skyward Sword HD
|
||||||
"0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom
|
"0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom
|
||||||
"01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom
|
"01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom
|
||||||
"01006bb00c6f0000", // The Legend of Zelda: Link's Awakening
|
"01000b900d8b0000", // Cadence of Hyrule
|
||||||
|
"0100ae00096ea000", // Hyrule Warriors: Definitive Edition
|
||||||
"0100000000010000", // SUPER MARIO ODYSSEY
|
"01002b00111a2000", // Hyrule Warriors: Age of Calamity
|
||||||
"010015100b514000", // Super Mario Bros. Wonder
|
|
||||||
"0100152000022000", // Mario Kart 8 Deluxe
|
|
||||||
"01006fe013472000", // Mario Party Superstars
|
|
||||||
"0100965017338000", // Super Mario Party Jamboree
|
|
||||||
"010049900f546000", // Super Mario 3D All-Stars
|
|
||||||
"010028600ebda000", // Super Mario 3D World + Bowser's Fury
|
|
||||||
"0100ecd018ebe000", // Paper Mario: The Thousand-Year Door
|
|
||||||
"010019401051c000", // Mario Strikers League
|
|
||||||
"0100ea80032ea000", // Super Mario Bros. U Deluxe
|
|
||||||
"0100bc0018138000", // Super Mario RPG
|
|
||||||
"0100bde00862a000", // Mario Tennis Aces
|
|
||||||
|
|
||||||
"010048701995e000", // Luigi's Mansion 2 HD
|
"010048701995e000", // Luigi's Mansion 2 HD
|
||||||
"0100dca0064a6000", // Luigi's Mansion 3
|
"0100dca0064a6000", // Luigi's Mansion 3
|
||||||
|
|
||||||
"01008f6008c5e000", // Pokémon Violet
|
"010093801237c000", // Metroid Dread
|
||||||
"0100abf008968000", // Pokémon Sword
|
"010012101468c000", // Metroid Prime Remastered
|
||||||
"01008db008c2c000", // Pokémon Shield
|
|
||||||
"0100000011d90000", // Pokémon Brilliant Diamond
|
"0100000000010000", // SUPER MARIO ODYSSEY
|
||||||
"01001f5010dfa000", // Pokémon Legends: Arceus
|
"0100ea80032ea000", // Super Mario Bros. U Deluxe
|
||||||
|
"01009b90006dc000", // Super Mario Maker 2
|
||||||
|
"010049900f546000", // Super Mario 3D All-Stars
|
||||||
|
"010049900F546001", // ^ 64
|
||||||
|
"010049900F546002", // ^ Sunshine
|
||||||
|
"010049900F546003", // ^ Galaxy
|
||||||
|
"010028600ebda000", // Super Mario 3D World + Bowser's Fury
|
||||||
|
"010015100b514000", // Super Mario Bros. Wonder
|
||||||
|
"0100152000022000", // Mario Kart 8 Deluxe
|
||||||
|
"010036b0034e4000", // Super Mario Party
|
||||||
|
"01006fe013472000", // Mario Party Superstars
|
||||||
|
"0100965017338000", // Super Mario Party Jamboree
|
||||||
|
"01006d0017f7a000", // Mario & Luigi: Brothership
|
||||||
|
"010067300059a000", // Mario + Rabbids: Kingdom Battle
|
||||||
|
"0100317013770000", // Mario + Rabbids: Sparks of Hope
|
||||||
|
"0100a3900c3e2000", // Paper Mario: The Origami King
|
||||||
|
"0100ecd018ebe000", // Paper Mario: The Thousand-Year Door
|
||||||
|
"0100bc0018138000", // Super Mario RPG
|
||||||
|
"0100bde00862a000", // Mario Tennis Aces
|
||||||
|
"0100c9c00e25c000", // Mario Golf: Super Rush
|
||||||
|
"010019401051c000", // Mario Strikers: Battle League
|
||||||
|
"010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020
|
||||||
|
"0100b99019412000", // Mario vs. Donkey Kong
|
||||||
|
|
||||||
"0100aa80194b0000", // Pikmin 1
|
"0100aa80194b0000", // Pikmin 1
|
||||||
"0100d680194b2000", // Pikmin 2
|
"0100d680194b2000", // Pikmin 2
|
||||||
"0100f4c009322000", // Pikmin 3 Deluxe
|
"0100f4c009322000", // Pikmin 3 Deluxe
|
||||||
"0100b7c00933a000", // Pikmin 4
|
"0100b7c00933a000", // Pikmin 4
|
||||||
|
|
||||||
|
"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
|
||||||
|
"0100a3d008c5c000", // Pokémon Scarlet
|
||||||
|
"01008f6008c5e000", // Pokémon Violet
|
||||||
|
"0100b3f000be2000", // Pokkén Tournament DX
|
||||||
|
"0100f4300bf2c000", // New Pokémon Snap
|
||||||
|
|
||||||
|
"01003bc0000a0000", // Splatoon 2 (US)
|
||||||
|
"0100f8f0000a2000", // Splatoon 2 (EU)
|
||||||
|
"01003c700009c000", // Splatoon 2 (JP)
|
||||||
|
"0100c2500fc20000", // Splatoon 3
|
||||||
|
"0100ba0018500000", // Splatoon 3: Splatfest World Premiere
|
||||||
|
|
||||||
|
"010040600c5ce000", // Tetris 99
|
||||||
|
"0100277011f1a000", // Super Mario Bros. 35
|
||||||
|
"0100ad9012510000", // PAC-MAN 99
|
||||||
|
"0100ccf019c8c000", // F-ZERO 99
|
||||||
|
"0100d870045b6000", // NES - Nintendo Switch Online
|
||||||
|
"01008d300c50c000", // SNES - Nintendo Switch Online
|
||||||
|
"0100c9a00ece6000", // N64 - Nintendo Switch Online
|
||||||
|
"0100e0601c632000", // N64 - Nintendo Switch Online 18+
|
||||||
|
"0100c62011050000", // GB - Nintendo Switch Online
|
||||||
|
"010012f017576000", // GBA - Nintendo Switch Online
|
||||||
|
|
||||||
|
"01000320000cc000", // 1-2 Switch
|
||||||
|
"0100300012f2a000", // Advance Wars 1+2: Re-Boot Camp
|
||||||
|
"01006f8002326000", // Animal Crossing: New Horizons
|
||||||
|
"0100620012d6e000", // Big Brain Academy: Brain vs. Brain
|
||||||
|
"010018300d006000", // BOXBOY! + BOXGIRL!
|
||||||
|
"0100c1f0051b6000", // Donkey Kong Country: Tropical Freeze
|
||||||
|
"0100ed000d390000", // Dr. Kawashima's Brain Training
|
||||||
|
"010067b017588000", // Endless Ocean Luminous
|
||||||
|
"0100d2f00d5c0000", // Nintendo Switch Sports
|
||||||
|
"01006b5012b32000", // Part Time UFO
|
||||||
|
"0100704000B3A000", // Snipperclips
|
||||||
|
"01006a800016e000", // Super Smash Bros. Ultimate
|
||||||
|
"0100a9400c9c2000", // Tokyo Mirage Sessions #FE Encore
|
||||||
|
|
||||||
|
"010076f0049a2000", // Bayonetta
|
||||||
|
"01007960049a0000", // Bayonetta 2
|
||||||
|
"01004a4010fea000", // Bayonetta 3
|
||||||
|
"0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon
|
||||||
|
|
||||||
|
"0100dcd01525a000", // Persona 3 Portable
|
||||||
|
"010062b01525c000", // Persona 4 Golden
|
||||||
|
"010075a016a3a000", // Persona 4 Arena Ultimax
|
||||||
|
"01005ca01580e000", // Persona 5 Royal
|
||||||
|
"0100801011c3e000", // Persona 5 Strikers
|
||||||
|
"010087701b092000", // Persona 5 Tactica
|
||||||
|
|
||||||
|
"01009aa000faa000", // Sonic Mania
|
||||||
"01004ad014bf0000", // Sonic Frontiers
|
"01004ad014bf0000", // Sonic Frontiers
|
||||||
"01005ea01c0fc000", // SONIC X SHADOW GENERATIONS
|
"01005ea01c0fc000", // SONIC X SHADOW GENERATIONS
|
||||||
"01005ea01c0fc001", // ^
|
"01005ea01c0fc001", // ^
|
||||||
|
|
||||||
"01004d300c5ae000", // Kirby and the Forgotten Land
|
|
||||||
"01006b601380e000", // Kirby's Return to Dreamland Deluxe
|
|
||||||
"01007e3006dda000", // Kirby Star Allies
|
|
||||||
|
|
||||||
"0100c2500fc20000", // Splatoon 3
|
|
||||||
"0100ba0018500000", // Splatoon 3: Splatfest World Premiere
|
|
||||||
"01000a10041ea000", // The Elder Scrolls V: Skyrim
|
|
||||||
"01007820196a6000", // Red Dead Redemption
|
|
||||||
"01008c8012920000", // Dying Light Platinum Edition
|
|
||||||
"0100744001588000", // Cars 3: Driven to Win
|
|
||||||
"0100c1f0051b6000", // Donkey Kong Country: Tropical Freeze
|
|
||||||
"01002b00111a2000", // Hyrule Warriors: Age of Calamity
|
|
||||||
"01006f8002326000", // Animal Crossing: New Horizons
|
|
||||||
"0100853015e86000", // No Man's Sky
|
|
||||||
"01008d100d43e000", // Saints Row IV
|
|
||||||
"0100de600beee000", // Saints Row: The Third - The Full Package
|
|
||||||
"0100d7a01b7a2000", // Star Wars: Bounty Hunter
|
|
||||||
"0100dbf01000a000", // Burnout Paradise Remastered
|
|
||||||
"0100e46006708000", // Terraria
|
|
||||||
"010056e00853a000", // A Hat in Time
|
"010056e00853a000", // A Hat in Time
|
||||||
"01006a800016e000", // Super Smash Bros. Ultimate
|
"0100dbf01000a000", // Burnout Paradise Remastered
|
||||||
|
"0100744001588000", // Cars 3: Driven to Win
|
||||||
|
"0100b41013c82000", // Cruis'n Blast
|
||||||
|
"01008c8012920000", // Dying Light Platinum Edition
|
||||||
|
"01000a10041ea000", // The Elder Scrolls V: Skyrim
|
||||||
|
"0100770008dd8000", // Monster Hunter Generations Ultimate
|
||||||
|
"0100b04011742000", // Monster Hunter Rise
|
||||||
|
"0100853015e86000", // No Man's Sky
|
||||||
"01007bb017812000", // Portal
|
"01007bb017812000", // Portal
|
||||||
"0100abd01785c000", // Portal 2
|
"0100abd01785c000", // Portal 2
|
||||||
"01008e200c5c2000", // Muse Dash
|
"01008e200c5c2000", // Muse Dash
|
||||||
|
"01007820196a6000", // Red Dead Redemption
|
||||||
|
"01002f7013224000", // Rune Factory 5
|
||||||
|
"01008d100d43e000", // Saints Row IV
|
||||||
|
"0100de600beee000", // Saints Row: The Third - The Full Package
|
||||||
"01001180021fa000", // Shovel Knight: Specter of Torment
|
"01001180021fa000", // Shovel Knight: Specter of Torment
|
||||||
"010012101468c000", // Metroid Prime Remastered
|
"0100d7a01b7a2000", // Star Wars: Bounty Hunter
|
||||||
"0100c9a00ece6000", // Nintendo 64 - Nintendo Switch Online
|
"0100800015926000", // Suika Game
|
||||||
|
"0100e46006708000", // Terraria
|
||||||
|
"010080b00ad66000", // Undertale
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,7 @@ using Ryujinx.Common.Logging;
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.Versioning;
|
using System.Runtime.Versioning;
|
||||||
|
|
||||||
@@ -23,6 +24,26 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2);
|
public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2);
|
||||||
|
|
||||||
public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild;
|
public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild;
|
||||||
|
|
||||||
|
public static bool AreMimeTypesRegistered
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (OperatingSystem.IsLinux())
|
||||||
|
{
|
||||||
|
return AreMimeTypesRegisteredLinux();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OperatingSystem.IsWindows())
|
||||||
|
{
|
||||||
|
return AreMimeTypesRegisteredWindows();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add macOS support.
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[SupportedOSPlatform("linux")]
|
[SupportedOSPlatform("linux")]
|
||||||
private static bool AreMimeTypesRegisteredLinux() => File.Exists(Path.Combine(_mimeDbPath, "packages", "Ryujinx.xml"));
|
private static bool AreMimeTypesRegisteredLinux() => File.Exists(Path.Combine(_mimeDbPath, "packages", "Ryujinx.xml"));
|
||||||
@@ -35,7 +56,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
if ((uninstall && AreMimeTypesRegisteredLinux()) || (!uninstall && !AreMimeTypesRegisteredLinux()))
|
if ((uninstall && AreMimeTypesRegisteredLinux()) || (!uninstall && !AreMimeTypesRegisteredLinux()))
|
||||||
{
|
{
|
||||||
string mimeTypesFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mime", "Ryujinx.xml");
|
string mimeTypesFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mime", "Ryujinx.xml");
|
||||||
string additionalArgs = !uninstall ? "--novendor" : "";
|
string additionalArgs = !uninstall ? "--novendor" : string.Empty;
|
||||||
|
|
||||||
using Process mimeProcess = new();
|
using Process mimeProcess = new();
|
||||||
|
|
||||||
@@ -72,6 +93,10 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
[SupportedOSPlatform("windows")]
|
[SupportedOSPlatform("windows")]
|
||||||
private static bool AreMimeTypesRegisteredWindows()
|
private static bool AreMimeTypesRegisteredWindows()
|
||||||
{
|
{
|
||||||
|
return _fileExtensions.Aggregate(false,
|
||||||
|
(current, ext) => current | CheckRegistering(ext)
|
||||||
|
);
|
||||||
|
|
||||||
static bool CheckRegistering(string ext)
|
static bool CheckRegistering(string ext)
|
||||||
{
|
{
|
||||||
RegistryKey key = Registry.CurrentUser.OpenSubKey(@$"Software\Classes\{ext}");
|
RegistryKey key = Registry.CurrentUser.OpenSubKey(@$"Software\Classes\{ext}");
|
||||||
@@ -83,24 +108,24 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
|
|
||||||
var openCmd = key.OpenSubKey(@"shell\open\command");
|
var openCmd = key.OpenSubKey(@"shell\open\command");
|
||||||
|
|
||||||
string keyValue = (string)openCmd.GetValue("");
|
string keyValue = (string)openCmd.GetValue(string.Empty);
|
||||||
|
|
||||||
return keyValue is not null && (keyValue.Contains("Ryujinx") || keyValue.Contains(AppDomain.CurrentDomain.FriendlyName));
|
return keyValue is not null && (keyValue.Contains("Ryujinx") || keyValue.Contains(AppDomain.CurrentDomain.FriendlyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool registered = false;
|
|
||||||
|
|
||||||
foreach (string ext in _fileExtensions)
|
|
||||||
{
|
|
||||||
registered |= CheckRegistering(ext);
|
|
||||||
}
|
|
||||||
|
|
||||||
return registered;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[SupportedOSPlatform("windows")]
|
[SupportedOSPlatform("windows")]
|
||||||
private static bool InstallWindowsMimeTypes(bool uninstall = false)
|
private static bool InstallWindowsMimeTypes(bool uninstall = false)
|
||||||
{
|
{
|
||||||
|
bool registered = _fileExtensions.Aggregate(false,
|
||||||
|
(current, ext) => current | RegisterExtension(ext, uninstall)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Notify Explorer the file association has been changed.
|
||||||
|
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, nint.Zero, nint.Zero);
|
||||||
|
|
||||||
|
return registered;
|
||||||
|
|
||||||
static bool RegisterExtension(string ext, bool uninstall = false)
|
static bool RegisterExtension(string ext, bool uninstall = false)
|
||||||
{
|
{
|
||||||
string keyString = @$"Software\Classes\{ext}";
|
string keyString = @$"Software\Classes\{ext}";
|
||||||
@@ -127,42 +152,13 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
|
|
||||||
Logger.Debug?.Print(LogClass.Application, $"Adding type association {ext}");
|
Logger.Debug?.Print(LogClass.Application, $"Adding type association {ext}");
|
||||||
using var openCmd = key.CreateSubKey(@"shell\open\command");
|
using var openCmd = key.CreateSubKey(@"shell\open\command");
|
||||||
openCmd.SetValue("", $"\"{Environment.ProcessPath}\" \"%1\"");
|
openCmd.SetValue(string.Empty, $"\"{Environment.ProcessPath}\" \"%1\"");
|
||||||
Logger.Debug?.Print(LogClass.Application, $"Added type association {ext}");
|
Logger.Debug?.Print(LogClass.Application, $"Added type association {ext}");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool registered = false;
|
|
||||||
|
|
||||||
foreach (string ext in _fileExtensions)
|
|
||||||
{
|
|
||||||
registered |= RegisterExtension(ext, uninstall);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notify Explorer the file association has been changed.
|
|
||||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, nint.Zero, nint.Zero);
|
|
||||||
|
|
||||||
return registered;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool AreMimeTypesRegistered()
|
|
||||||
{
|
|
||||||
if (OperatingSystem.IsLinux())
|
|
||||||
{
|
|
||||||
return AreMimeTypesRegisteredLinux();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OperatingSystem.IsWindows())
|
|
||||||
{
|
|
||||||
return AreMimeTypesRegisteredWindows();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Add macOS support.
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool Install()
|
public static bool Install()
|
||||||
|
@@ -12,18 +12,11 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
{
|
{
|
||||||
public static bool IsFirmwareValid(ContentManager contentManager, out UserError error)
|
public static bool IsFirmwareValid(ContentManager contentManager, out UserError error)
|
||||||
{
|
{
|
||||||
bool hasFirmware = contentManager.GetCurrentFirmwareVersion() != null;
|
error = contentManager.GetCurrentFirmwareVersion() != null
|
||||||
|
? UserError.Success
|
||||||
|
: UserError.NoFirmware;
|
||||||
|
|
||||||
if (hasFirmware)
|
return error is UserError.Success;
|
||||||
{
|
|
||||||
error = UserError.Success;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
error = UserError.NoFirmware;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion)
|
public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion)
|
||||||
@@ -95,14 +88,18 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
|
string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
|
||||||
|
|
||||||
// NOTE: We don't force homebrew developers to install a system firmware.
|
// NOTE: We don't force homebrew developers to install a system firmware.
|
||||||
if (baseApplicationExtension is not (".nro" or ".nso"))
|
if (baseApplicationExtension is ".nro" or ".nso")
|
||||||
return IsFirmwareValid(contentManager, out error);
|
{
|
||||||
|
error = UserError.Success;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IsFirmwareValid(contentManager, out error);
|
||||||
}
|
}
|
||||||
|
|
||||||
error = UserError.ApplicationNotFound;
|
error = UserError.ApplicationNotFound;
|
||||||
|
|
||||||
return error is UserError.Success;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -53,7 +53,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
{
|
{
|
||||||
var titleUpdateWindowData = new TitleUpdateMetadata
|
var titleUpdateWindowData = new TitleUpdateMetadata
|
||||||
{
|
{
|
||||||
Selected = "",
|
Selected = string.Empty,
|
||||||
Paths = [],
|
Paths = [],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -5,6 +5,8 @@ namespace Ryujinx.UI.Common.Models.Github
|
|||||||
public class GithubReleasesJsonResponse
|
public class GithubReleasesJsonResponse
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
public string TagName { get; set; }
|
||||||
public List<GithubReleaseAssetJsonResponse> Assets { get; set; }
|
public List<GithubReleaseAssetJsonResponse> Assets { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
55
src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs
Normal file
55
src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
|
using Ryujinx.Common.Utilities;
|
||||||
|
using Ryujinx.UI.App.Common;
|
||||||
|
|
||||||
|
namespace Ryujinx.UI.Common.Models
|
||||||
|
{
|
||||||
|
public record XCITrimmerFileModel(
|
||||||
|
string Name,
|
||||||
|
string Path,
|
||||||
|
bool Trimmable,
|
||||||
|
bool Untrimmable,
|
||||||
|
long PotentialSavingsB,
|
||||||
|
long CurrentSavingsB,
|
||||||
|
int? PercentageProgress,
|
||||||
|
XCIFileTrimmer.OperationOutcome ProcessingOutcome)
|
||||||
|
{
|
||||||
|
public static XCITrimmerFileModel FromApplicationData(ApplicationData applicationData, XCIFileTrimmerLog logger)
|
||||||
|
{
|
||||||
|
var trimmer = new XCIFileTrimmer(applicationData.Path, logger);
|
||||||
|
|
||||||
|
return new XCITrimmerFileModel(
|
||||||
|
applicationData.Name,
|
||||||
|
applicationData.Path,
|
||||||
|
trimmer.CanBeTrimmed,
|
||||||
|
trimmer.CanBeUntrimmed,
|
||||||
|
trimmer.DiskSpaceSavingsB,
|
||||||
|
trimmer.DiskSpaceSavedB,
|
||||||
|
null,
|
||||||
|
XCIFileTrimmer.OperationOutcome.Undetermined
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsFailed
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return ProcessingOutcome != XCIFileTrimmer.OperationOutcome.Undetermined &&
|
||||||
|
ProcessingOutcome != XCIFileTrimmer.OperationOutcome.Successful;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool Equals(XCITrimmerFileModel obj)
|
||||||
|
{
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.Path == obj.Path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return this.Path.GetHashCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 93 KiB |
@@ -51,7 +51,6 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DiscordRichPresence" />
|
<PackageReference Include="DiscordRichPresence" />
|
||||||
<PackageReference Include="DynamicData" />
|
<PackageReference Include="DynamicData" />
|
||||||
<PackageReference Include="Humanizer" />
|
|
||||||
<PackageReference Include="securifybv.ShellLink" />
|
<PackageReference Include="securifybv.ShellLink" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ namespace Ryujinx.UI.LocaleGenerator
|
|||||||
|
|
||||||
context.RegisterSourceOutput(contents, (spc, content) =>
|
context.RegisterSourceOutput(contents, (spc, content) =>
|
||||||
{
|
{
|
||||||
var lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"")).Select(x => x.Split(':')[0].Trim().Replace("\"", ""));
|
var lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"")).Select(x => x.Split(':')[0].Trim().Replace("\"", string.Empty));
|
||||||
StringBuilder enumSourceBuilder = new();
|
StringBuilder enumSourceBuilder = new();
|
||||||
enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;");
|
enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;");
|
||||||
enumSourceBuilder.AppendLine("internal enum LocaleKeys");
|
enumSourceBuilder.AppendLine("internal enum LocaleKeys");
|
||||||
|
@@ -23,8 +23,10 @@ namespace Ryujinx.Ava
|
|||||||
{
|
{
|
||||||
internal static string FormatTitle(LocaleKeys? windowTitleKey = null)
|
internal static string FormatTitle(LocaleKeys? windowTitleKey = null)
|
||||||
=> windowTitleKey is null
|
=> windowTitleKey is null
|
||||||
? $"Ryujinx {Program.Version}"
|
? $"{FullAppName} {Program.Version}"
|
||||||
: $"Ryujinx {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}";
|
: $"{FullAppName} {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}";
|
||||||
|
|
||||||
|
public static readonly string FullAppName = ReleaseInformation.IsCanaryBuild ? "Ryujinx Canary" : "Ryujinx";
|
||||||
|
|
||||||
public static MainWindow MainWindow => Current!
|
public static MainWindow MainWindow => Current!
|
||||||
.ApplicationLifetime.Cast<IClassicDesktopStyleApplicationLifetime>()
|
.ApplicationLifetime.Cast<IClassicDesktopStyleApplicationLifetime>()
|
||||||
@@ -58,11 +60,9 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
if (Program.PreviewerDetached)
|
if (Program.PreviewerDetached)
|
||||||
{
|
{
|
||||||
ApplyConfiguredTheme();
|
ApplyConfiguredTheme(ConfigurationState.Instance.UI.BaseStyle);
|
||||||
|
|
||||||
ConfigurationState.Instance.UI.BaseStyle.Event += ThemeChanged_Event;
|
ConfigurationState.Instance.UI.BaseStyle.Event += ThemeChanged_Event;
|
||||||
ConfigurationState.Instance.UI.CustomThemePath.Event += ThemeChanged_Event;
|
|
||||||
ConfigurationState.Instance.UI.EnableCustomTheme.Event += CustomThemeChanged_Event;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,17 +88,13 @@ namespace Ryujinx.Ava
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CustomThemeChanged_Event(object _, ReactiveEventArgs<bool> __) => ApplyConfiguredTheme();
|
|
||||||
|
|
||||||
private void ThemeChanged_Event(object _, ReactiveEventArgs<string> __) => ApplyConfiguredTheme();
|
private void ThemeChanged_Event(object _, ReactiveEventArgs<string> rArgs) => ApplyConfiguredTheme(rArgs.NewValue);
|
||||||
|
|
||||||
public void ApplyConfiguredTheme()
|
public void ApplyConfiguredTheme(string baseStyle)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string baseStyle = ConfigurationState.Instance.UI.BaseStyle;
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(baseStyle))
|
if (string.IsNullOrWhiteSpace(baseStyle))
|
||||||
{
|
{
|
||||||
ConfigurationState.Instance.UI.BaseStyle.Value = "Auto";
|
ConfigurationState.Instance.UI.BaseStyle.Value = "Auto";
|
||||||
|
@@ -604,61 +604,59 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
SystemVersion firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
|
SystemVersion firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
|
||||||
|
|
||||||
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
|
||||||
{
|
{
|
||||||
if (!SetupValidator.CanStartApplication(ContentManager, ApplicationPath, out UserError userError))
|
if (!SetupValidator.CanStartApplication(ContentManager, ApplicationPath, out UserError userError))
|
||||||
{
|
{
|
||||||
|
if (SetupValidator.CanFixStartApplication(ContentManager, ApplicationPath, userError, out firmwareVersion))
|
||||||
{
|
{
|
||||||
if (SetupValidator.CanFixStartApplication(ContentManager, ApplicationPath, userError, out firmwareVersion))
|
if (userError is UserError.NoFirmware)
|
||||||
{
|
{
|
||||||
if (userError == UserError.NoFirmware)
|
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
|
||||||
{
|
LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage],
|
||||||
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
|
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString),
|
||||||
LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage],
|
LocaleManager.Instance[LocaleKeys.InputDialogYes],
|
||||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString),
|
LocaleManager.Instance[LocaleKeys.InputDialogNo],
|
||||||
LocaleManager.Instance[LocaleKeys.InputDialogYes],
|
string.Empty);
|
||||||
LocaleManager.Instance[LocaleKeys.InputDialogNo],
|
|
||||||
"");
|
|
||||||
|
|
||||||
if (result != UserResult.Yes)
|
if (result != UserResult.Yes)
|
||||||
{
|
|
||||||
await UserErrorDialog.ShowUserErrorDialog(userError);
|
|
||||||
Device.Dispose();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SetupValidator.TryFixStartApplication(ContentManager, ApplicationPath, userError, out _))
|
|
||||||
{
|
{
|
||||||
await UserErrorDialog.ShowUserErrorDialog(userError);
|
await UserErrorDialog.ShowUserErrorDialog(userError);
|
||||||
Device.Dispose();
|
Device.Dispose();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell the user that we installed a firmware for them.
|
|
||||||
if (userError == UserError.NoFirmware)
|
|
||||||
{
|
|
||||||
firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
|
|
||||||
|
|
||||||
_viewModel.RefreshFirmwareStatus();
|
|
||||||
|
|
||||||
await ContentDialogHelper.CreateInfoDialog(
|
|
||||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstalledMessage, firmwareVersion.VersionString),
|
|
||||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedSuccessMessage, firmwareVersion.VersionString),
|
|
||||||
LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
|
||||||
"",
|
|
||||||
LocaleManager.Instance[LocaleKeys.RyujinxInfo]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (!SetupValidator.TryFixStartApplication(ContentManager, ApplicationPath, userError, out _))
|
||||||
{
|
{
|
||||||
await UserErrorDialog.ShowUserErrorDialog(userError);
|
await UserErrorDialog.ShowUserErrorDialog(userError);
|
||||||
Device.Dispose();
|
Device.Dispose();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tell the user that we installed a firmware for them.
|
||||||
|
if (userError is UserError.NoFirmware)
|
||||||
|
{
|
||||||
|
firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
|
||||||
|
|
||||||
|
_viewModel.RefreshFirmwareStatus();
|
||||||
|
|
||||||
|
await ContentDialogHelper.CreateInfoDialog(
|
||||||
|
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstalledMessage, firmwareVersion.VersionString),
|
||||||
|
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedSuccessMessage, firmwareVersion.VersionString),
|
||||||
|
LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
||||||
|
string.Empty,
|
||||||
|
LocaleManager.Instance[LocaleKeys.RyujinxInfo]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await UserErrorDialog.ShowUserErrorDialog(userError);
|
||||||
|
Device.Dispose();
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -820,20 +818,12 @@ namespace Ryujinx.Ava
|
|||||||
VirtualFileSystem.ReloadKeySet();
|
VirtualFileSystem.ReloadKeySet();
|
||||||
|
|
||||||
// Initialize Renderer.
|
// Initialize Renderer.
|
||||||
IRenderer renderer;
|
IRenderer renderer = ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl
|
||||||
|
? new OpenGLRenderer()
|
||||||
if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Vulkan)
|
: VulkanRenderer.Create(
|
||||||
{
|
ConfigurationState.Instance.Graphics.PreferredGpu,
|
||||||
renderer = new VulkanRenderer(
|
|
||||||
Vk.GetApi(),
|
|
||||||
(RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface,
|
(RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface,
|
||||||
VulkanHelper.GetRequiredInstanceExtensions,
|
VulkanHelper.GetRequiredInstanceExtensions);
|
||||||
ConfigurationState.Instance.Graphics.PreferredGpu.Value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
renderer = new OpenGLRenderer();
|
|
||||||
}
|
|
||||||
|
|
||||||
BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading;
|
BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading;
|
||||||
|
|
||||||
|
@@ -10,7 +10,10 @@
|
|||||||
"SettingsTabSystemUseHypervisor": "استخدم مراقب الأجهزة الافتراضية",
|
"SettingsTabSystemUseHypervisor": "استخدم مراقب الأجهزة الافتراضية",
|
||||||
"MenuBarFile": "_ملف",
|
"MenuBarFile": "_ملف",
|
||||||
"MenuBarFileOpenFromFile": "_تحميل تطبيق من ملف",
|
"MenuBarFileOpenFromFile": "_تحميل تطبيق من ملف",
|
||||||
|
"MenuBarFileOpenFromFileError": "No applications found in selected file.",
|
||||||
"MenuBarFileOpenUnpacked": "تحميل لُعْبَة غير محزومة",
|
"MenuBarFileOpenUnpacked": "تحميل لُعْبَة غير محزومة",
|
||||||
|
"MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
|
||||||
|
"MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
|
||||||
"MenuBarFileOpenEmuFolder": "فتح مجلد Ryujinx",
|
"MenuBarFileOpenEmuFolder": "فتح مجلد Ryujinx",
|
||||||
"MenuBarFileOpenLogsFolder": "فتح مجلد السجلات",
|
"MenuBarFileOpenLogsFolder": "فتح مجلد السجلات",
|
||||||
"MenuBarFileExit": "_خروج",
|
"MenuBarFileExit": "_خروج",
|
||||||
@@ -97,11 +100,14 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "التحقق من وجود تحديثات عند التشغيل",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "التحقق من وجود تحديثات عند التشغيل",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "إظهار مربع حوار \"تأكيد الخروج\"",
|
"SettingsTabGeneralShowConfirmExitDialog": "إظهار مربع حوار \"تأكيد الخروج\"",
|
||||||
"SettingsTabGeneralRememberWindowState": "تذكر حجم/موضع النافذة",
|
"SettingsTabGeneralRememberWindowState": "تذكر حجم/موضع النافذة",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
|
||||||
"SettingsTabGeneralHideCursor": "إخفاء المؤشر:",
|
"SettingsTabGeneralHideCursor": "إخفاء المؤشر:",
|
||||||
"SettingsTabGeneralHideCursorNever": "مطلقا",
|
"SettingsTabGeneralHideCursorNever": "مطلقا",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "عند الخمول",
|
"SettingsTabGeneralHideCursorOnIdle": "عند الخمول",
|
||||||
"SettingsTabGeneralHideCursorAlways": "دائما",
|
"SettingsTabGeneralHideCursorAlways": "دائما",
|
||||||
"SettingsTabGeneralGameDirectories": "مجلدات الألعاب",
|
"SettingsTabGeneralGameDirectories": "مجلدات الألعاب",
|
||||||
|
"SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
|
||||||
|
"SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
|
||||||
"SettingsTabGeneralAdd": "إضافة",
|
"SettingsTabGeneralAdd": "إضافة",
|
||||||
"SettingsTabGeneralRemove": "إزالة",
|
"SettingsTabGeneralRemove": "إزالة",
|
||||||
"SettingsTabSystem": "النظام",
|
"SettingsTabSystem": "النظام",
|
||||||
@@ -401,6 +407,7 @@
|
|||||||
"AvatarSetBackgroundColor": "تعيين لون الخلفية",
|
"AvatarSetBackgroundColor": "تعيين لون الخلفية",
|
||||||
"AvatarClose": "إغلاق",
|
"AvatarClose": "إغلاق",
|
||||||
"ControllerSettingsLoadProfileToolTip": "تحميل الملف الشخصي",
|
"ControllerSettingsLoadProfileToolTip": "تحميل الملف الشخصي",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsAddProfileToolTip": "إضافة ملف شخصي",
|
"ControllerSettingsAddProfileToolTip": "إضافة ملف شخصي",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "إزالة الملف الشخصي",
|
"ControllerSettingsRemoveProfileToolTip": "إزالة الملف الشخصي",
|
||||||
"ControllerSettingsSaveProfileToolTip": "حفظ الملف الشخصي",
|
"ControllerSettingsSaveProfileToolTip": "حفظ الملف الشخصي",
|
||||||
@@ -410,6 +417,7 @@
|
|||||||
"GameListContextMenuToggleFavorite": "تعيين كمفضل",
|
"GameListContextMenuToggleFavorite": "تعيين كمفضل",
|
||||||
"GameListContextMenuToggleFavoriteToolTip": "تبديل الحالة المفضلة للعبة",
|
"GameListContextMenuToggleFavoriteToolTip": "تبديل الحالة المفضلة للعبة",
|
||||||
"SettingsTabGeneralTheme": "السمة:",
|
"SettingsTabGeneralTheme": "السمة:",
|
||||||
|
"SettingsTabGeneralThemeAuto": "Auto",
|
||||||
"SettingsTabGeneralThemeDark": "داكن",
|
"SettingsTabGeneralThemeDark": "داكن",
|
||||||
"SettingsTabGeneralThemeLight": "فاتح",
|
"SettingsTabGeneralThemeLight": "فاتح",
|
||||||
"ControllerSettingsConfigureGeneral": "ضبط",
|
"ControllerSettingsConfigureGeneral": "ضبط",
|
||||||
@@ -430,7 +438,7 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "حدث خطأ أثناء البحث عن بيانات الحفظ المحددة: {0}",
|
"DialogMessageFindSaveErrorMessage": "حدث خطأ أثناء البحث عن بيانات الحفظ المحددة: {0}",
|
||||||
"FolderDialogExtractTitle": "اختر المجلد الذي تريد الاستخراج إليه",
|
"FolderDialogExtractTitle": "اختر المجلد الذي تريد الاستخراج إليه",
|
||||||
"DialogNcaExtractionMessage": "استخراج قسم {0} من {1}...",
|
"DialogNcaExtractionMessage": "استخراج قسم {0} من {1}...",
|
||||||
"DialogNcaExtractionTitle": "ريوجينكس - مستخرج قسم NCA",
|
"DialogNcaExtractionTitle": "مستخرج قسم NCA",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "فشل الاستخراج. لم يكن NCA الرئيسي موجودا في الملف المحدد.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "فشل الاستخراج. لم يكن NCA الرئيسي موجودا في الملف المحدد.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "فشل الاستخراج. اقرأ ملف التسجيل لمزيد من المعلومات.",
|
"DialogNcaExtractionCheckLogErrorMessage": "فشل الاستخراج. اقرأ ملف التسجيل لمزيد من المعلومات.",
|
||||||
"DialogNcaExtractionSuccessMessage": "تم الاستخراج بنجاح.",
|
"DialogNcaExtractionSuccessMessage": "تم الاستخراج بنجاح.",
|
||||||
@@ -560,6 +568,9 @@
|
|||||||
"AddGameDirBoxTooltip": "أدخل مجلد اللعبة لإضافته إلى القائمة",
|
"AddGameDirBoxTooltip": "أدخل مجلد اللعبة لإضافته إلى القائمة",
|
||||||
"AddGameDirTooltip": "إضافة مجلد اللعبة إلى القائمة",
|
"AddGameDirTooltip": "إضافة مجلد اللعبة إلى القائمة",
|
||||||
"RemoveGameDirTooltip": "إزالة مجلد اللعبة المحدد",
|
"RemoveGameDirTooltip": "إزالة مجلد اللعبة المحدد",
|
||||||
|
"AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
|
||||||
|
"AddAutoloadDirTooltip": "Add an autoload directory to the list",
|
||||||
|
"RemoveAutoloadDirTooltip": "Remove selected autoload directory",
|
||||||
"CustomThemeCheckTooltip": "استخدم سمة أفالونيا المخصصة لواجهة المستخدم الرسومية لتغيير مظهر قوائم المحاكي",
|
"CustomThemeCheckTooltip": "استخدم سمة أفالونيا المخصصة لواجهة المستخدم الرسومية لتغيير مظهر قوائم المحاكي",
|
||||||
"CustomThemePathTooltip": "مسار سمة واجهة المستخدم المخصصة",
|
"CustomThemePathTooltip": "مسار سمة واجهة المستخدم المخصصة",
|
||||||
"CustomThemeBrowseTooltip": "تصفح للحصول على سمة واجهة المستخدم المخصصة",
|
"CustomThemeBrowseTooltip": "تصفح للحصول على سمة واجهة المستخدم المخصصة",
|
||||||
@@ -605,6 +616,8 @@
|
|||||||
"DebugLogTooltip": "طباعة رسائل سجل التصحيح في وحدة التحكم.\n\nاستخدم هذا فقط إذا طلب منك أحد الموظفين تحديدًا ذلك، لأنه سيجعل من الصعب قراءة السجلات وسيؤدي إلى تدهور أداء المحاكي.",
|
"DebugLogTooltip": "طباعة رسائل سجل التصحيح في وحدة التحكم.\n\nاستخدم هذا فقط إذا طلب منك أحد الموظفين تحديدًا ذلك، لأنه سيجعل من الصعب قراءة السجلات وسيؤدي إلى تدهور أداء المحاكي.",
|
||||||
"LoadApplicationFileTooltip": "افتح مستكشف الملفات لاختيار ملف متوافق مع سويتش لتحميله",
|
"LoadApplicationFileTooltip": "افتح مستكشف الملفات لاختيار ملف متوافق مع سويتش لتحميله",
|
||||||
"LoadApplicationFolderTooltip": "افتح مستكشف الملفات لاختيار تطبيق متوافق مع سويتش للتحميل",
|
"LoadApplicationFolderTooltip": "افتح مستكشف الملفات لاختيار تطبيق متوافق مع سويتش للتحميل",
|
||||||
|
"LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
|
||||||
|
"LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
|
||||||
"OpenRyujinxFolderTooltip": "فتح مجلد نظام ملفات ريوجينكس",
|
"OpenRyujinxFolderTooltip": "فتح مجلد نظام ملفات ريوجينكس",
|
||||||
"OpenRyujinxLogsTooltip": "يفتح المجلد الذي تتم كتابة السجلات إليه",
|
"OpenRyujinxLogsTooltip": "يفتح المجلد الذي تتم كتابة السجلات إليه",
|
||||||
"ExitTooltip": "الخروج من ريوجينكس",
|
"ExitTooltip": "الخروج من ريوجينكس",
|
||||||
@@ -656,6 +669,8 @@
|
|||||||
"OpenSetupGuideMessage": "فتح دليل الإعداد",
|
"OpenSetupGuideMessage": "فتح دليل الإعداد",
|
||||||
"NoUpdate": "لا يوجد تحديث",
|
"NoUpdate": "لا يوجد تحديث",
|
||||||
"TitleUpdateVersionLabel": "الإصدار: {0}",
|
"TitleUpdateVersionLabel": "الإصدار: {0}",
|
||||||
|
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||||
|
"TitleBundledDlcLabel": "Bundled:",
|
||||||
"RyujinxInfo": "ريوجينكس - معلومات",
|
"RyujinxInfo": "ريوجينكس - معلومات",
|
||||||
"RyujinxConfirm": "ريوجينكس - تأكيد",
|
"RyujinxConfirm": "ريوجينكس - تأكيد",
|
||||||
"FileDialogAllTypes": "كل الأنواع",
|
"FileDialogAllTypes": "كل الأنواع",
|
||||||
@@ -713,9 +728,17 @@
|
|||||||
"DlcWindowTitle": "إدارة المحتوى القابل للتنزيل لـ {0} ({1})",
|
"DlcWindowTitle": "إدارة المحتوى القابل للتنزيل لـ {0} ({1})",
|
||||||
"ModWindowTitle": "إدارة التعديلات لـ {0} ({1})",
|
"ModWindowTitle": "إدارة التعديلات لـ {0} ({1})",
|
||||||
"UpdateWindowTitle": "مدير تحديث العنوان",
|
"UpdateWindowTitle": "مدير تحديث العنوان",
|
||||||
|
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||||
"CheatWindowHeading": "الغش متوفر لـ {0} [{1}]",
|
"CheatWindowHeading": "الغش متوفر لـ {0} [{1}]",
|
||||||
"BuildId": "معرف البناء:",
|
"BuildId": "معرف البناء:",
|
||||||
|
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||||
"DlcWindowHeading": "المحتويات القابلة للتنزيل {0}",
|
"DlcWindowHeading": "المحتويات القابلة للتنزيل {0}",
|
||||||
|
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||||
|
"AutoloadUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
||||||
"ModWindowHeading": "{0} تعديل",
|
"ModWindowHeading": "{0} تعديل",
|
||||||
"UserProfilesEditProfile": "تعديل المحدد",
|
"UserProfilesEditProfile": "تعديل المحدد",
|
||||||
"Cancel": "إلغاء",
|
"Cancel": "إلغاء",
|
||||||
@@ -766,6 +789,7 @@
|
|||||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||||
"GraphicsScalingFilterNearest": "Nearest",
|
"GraphicsScalingFilterNearest": "Nearest",
|
||||||
"GraphicsScalingFilterFsr": "FSR",
|
"GraphicsScalingFilterFsr": "FSR",
|
||||||
|
"GraphicsScalingFilterArea": "Area",
|
||||||
"GraphicsScalingFilterLevelLabel": "المستوى",
|
"GraphicsScalingFilterLevelLabel": "المستوى",
|
||||||
"GraphicsScalingFilterLevelTooltip": "اضبط مستوى وضوح FSR 1.0. الأعلى هو أكثر وضوحا.",
|
"GraphicsScalingFilterLevelTooltip": "اضبط مستوى وضوح FSR 1.0. الأعلى هو أكثر وضوحا.",
|
||||||
"SmaaLow": "SMAA منخفض",
|
"SmaaLow": "SMAA منخفض",
|
||||||
|
@@ -10,7 +10,10 @@
|
|||||||
"SettingsTabSystemUseHypervisor": "Hypervisor verwenden",
|
"SettingsTabSystemUseHypervisor": "Hypervisor verwenden",
|
||||||
"MenuBarFile": "_Datei",
|
"MenuBarFile": "_Datei",
|
||||||
"MenuBarFileOpenFromFile": "Datei _öffnen",
|
"MenuBarFileOpenFromFile": "Datei _öffnen",
|
||||||
|
"MenuBarFileOpenFromFileError": "No applications found in selected file.",
|
||||||
"MenuBarFileOpenUnpacked": "_Entpacktes Spiel öffnen",
|
"MenuBarFileOpenUnpacked": "_Entpacktes Spiel öffnen",
|
||||||
|
"MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
|
||||||
|
"MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
|
||||||
"MenuBarFileOpenEmuFolder": "Ryujinx-Ordner öffnen",
|
"MenuBarFileOpenEmuFolder": "Ryujinx-Ordner öffnen",
|
||||||
"MenuBarFileOpenLogsFolder": "Logs-Ordner öffnen",
|
"MenuBarFileOpenLogsFolder": "Logs-Ordner öffnen",
|
||||||
"MenuBarFileExit": "_Beenden",
|
"MenuBarFileExit": "_Beenden",
|
||||||
@@ -97,11 +100,14 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Beim Start nach Updates suchen",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "Beim Start nach Updates suchen",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "Zeige den \"Beenden bestätigen\"-Dialog",
|
"SettingsTabGeneralShowConfirmExitDialog": "Zeige den \"Beenden bestätigen\"-Dialog",
|
||||||
"SettingsTabGeneralRememberWindowState": "Fenstergröße/-position merken",
|
"SettingsTabGeneralRememberWindowState": "Fenstergröße/-position merken",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
|
||||||
"SettingsTabGeneralHideCursor": "Mauszeiger ausblenden",
|
"SettingsTabGeneralHideCursor": "Mauszeiger ausblenden",
|
||||||
"SettingsTabGeneralHideCursorNever": "Niemals",
|
"SettingsTabGeneralHideCursorNever": "Niemals",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "Mauszeiger bei Inaktivität ausblenden",
|
"SettingsTabGeneralHideCursorOnIdle": "Mauszeiger bei Inaktivität ausblenden",
|
||||||
"SettingsTabGeneralHideCursorAlways": "Immer",
|
"SettingsTabGeneralHideCursorAlways": "Immer",
|
||||||
"SettingsTabGeneralGameDirectories": "Spielverzeichnisse",
|
"SettingsTabGeneralGameDirectories": "Spielverzeichnisse",
|
||||||
|
"SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
|
||||||
|
"SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
|
||||||
"SettingsTabGeneralAdd": "Hinzufügen",
|
"SettingsTabGeneralAdd": "Hinzufügen",
|
||||||
"SettingsTabGeneralRemove": "Entfernen",
|
"SettingsTabGeneralRemove": "Entfernen",
|
||||||
"SettingsTabSystem": "System",
|
"SettingsTabSystem": "System",
|
||||||
@@ -401,6 +407,7 @@
|
|||||||
"AvatarSetBackgroundColor": "Hintergrundfarbe auswählen",
|
"AvatarSetBackgroundColor": "Hintergrundfarbe auswählen",
|
||||||
"AvatarClose": "Schließen",
|
"AvatarClose": "Schließen",
|
||||||
"ControllerSettingsLoadProfileToolTip": "Lädt ein Profil",
|
"ControllerSettingsLoadProfileToolTip": "Lädt ein Profil",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsAddProfileToolTip": "Fügt ein Profil hinzu",
|
"ControllerSettingsAddProfileToolTip": "Fügt ein Profil hinzu",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "Entfernt ein Profil",
|
"ControllerSettingsRemoveProfileToolTip": "Entfernt ein Profil",
|
||||||
"ControllerSettingsSaveProfileToolTip": "Speichert ein Profil",
|
"ControllerSettingsSaveProfileToolTip": "Speichert ein Profil",
|
||||||
@@ -410,6 +417,7 @@
|
|||||||
"GameListContextMenuToggleFavorite": "Als Favoriten hinzufügen/entfernen",
|
"GameListContextMenuToggleFavorite": "Als Favoriten hinzufügen/entfernen",
|
||||||
"GameListContextMenuToggleFavoriteToolTip": "Aktiviert den Favoriten-Status des Spiels",
|
"GameListContextMenuToggleFavoriteToolTip": "Aktiviert den Favoriten-Status des Spiels",
|
||||||
"SettingsTabGeneralTheme": "Design:",
|
"SettingsTabGeneralTheme": "Design:",
|
||||||
|
"SettingsTabGeneralThemeAuto": "Auto",
|
||||||
"SettingsTabGeneralThemeDark": "Dunkel",
|
"SettingsTabGeneralThemeDark": "Dunkel",
|
||||||
"SettingsTabGeneralThemeLight": "Hell",
|
"SettingsTabGeneralThemeLight": "Hell",
|
||||||
"ControllerSettingsConfigureGeneral": "Konfigurieren",
|
"ControllerSettingsConfigureGeneral": "Konfigurieren",
|
||||||
@@ -430,7 +438,7 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "Es ist ein Fehler beim Suchen der angegebenen Speicherdaten aufgetreten: {0}",
|
"DialogMessageFindSaveErrorMessage": "Es ist ein Fehler beim Suchen der angegebenen Speicherdaten aufgetreten: {0}",
|
||||||
"FolderDialogExtractTitle": "Wähle den Ordner, in welchen die Dateien entpackt werden sollen",
|
"FolderDialogExtractTitle": "Wähle den Ordner, in welchen die Dateien entpackt werden sollen",
|
||||||
"DialogNcaExtractionMessage": "Extrahiert {0} abschnitt von {1}...",
|
"DialogNcaExtractionMessage": "Extrahiert {0} abschnitt von {1}...",
|
||||||
"DialogNcaExtractionTitle": "Ryujinx - NCA-Abschnitt-Extraktor",
|
"DialogNcaExtractionTitle": "NCA-Abschnitt-Extraktor",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraktion fehlgeschlagen. Der Hauptheader der NCA war in der ausgewählten Datei nicht vorhanden.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraktion fehlgeschlagen. Der Hauptheader der NCA war in der ausgewählten Datei nicht vorhanden.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "Extraktion fehlgeschlagen. Überprüfe die Logs für weitere Informationen.",
|
"DialogNcaExtractionCheckLogErrorMessage": "Extraktion fehlgeschlagen. Überprüfe die Logs für weitere Informationen.",
|
||||||
"DialogNcaExtractionSuccessMessage": "Extraktion erfolgreich abgeschlossen.",
|
"DialogNcaExtractionSuccessMessage": "Extraktion erfolgreich abgeschlossen.",
|
||||||
@@ -560,6 +568,9 @@
|
|||||||
"AddGameDirBoxTooltip": "Gibt das Spielverzeichnis an, das der Liste hinzuzufügt wird",
|
"AddGameDirBoxTooltip": "Gibt das Spielverzeichnis an, das der Liste hinzuzufügt wird",
|
||||||
"AddGameDirTooltip": "Fügt ein neues Spielverzeichnis hinzu",
|
"AddGameDirTooltip": "Fügt ein neues Spielverzeichnis hinzu",
|
||||||
"RemoveGameDirTooltip": "Entfernt das ausgewähltes Spielverzeichnis",
|
"RemoveGameDirTooltip": "Entfernt das ausgewähltes Spielverzeichnis",
|
||||||
|
"AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
|
||||||
|
"AddAutoloadDirTooltip": "Add an autoload directory to the list",
|
||||||
|
"RemoveAutoloadDirTooltip": "Remove selected autoload directory",
|
||||||
"CustomThemeCheckTooltip": "Verwende ein eigenes Design für die Emulator-Benutzeroberfläche",
|
"CustomThemeCheckTooltip": "Verwende ein eigenes Design für die Emulator-Benutzeroberfläche",
|
||||||
"CustomThemePathTooltip": "Gibt den Pfad zum Design für die Emulator-Benutzeroberfläche an",
|
"CustomThemePathTooltip": "Gibt den Pfad zum Design für die Emulator-Benutzeroberfläche an",
|
||||||
"CustomThemeBrowseTooltip": "Ermöglicht die Suche nach einem benutzerdefinierten Design für die Emulator-Benutzeroberfläche",
|
"CustomThemeBrowseTooltip": "Ermöglicht die Suche nach einem benutzerdefinierten Design für die Emulator-Benutzeroberfläche",
|
||||||
@@ -605,6 +616,8 @@
|
|||||||
"DebugLogTooltip": "Ausgabe von Debug-Logs in der Konsole.\n\nVerwende diese Option nur auf ausdrückliche Anweisung von Ryujinx Entwicklern, da sie das Lesen der Protokolle erschwert und die Leistung des Emulators verschlechtert.",
|
"DebugLogTooltip": "Ausgabe von Debug-Logs in der Konsole.\n\nVerwende diese Option nur auf ausdrückliche Anweisung von Ryujinx Entwicklern, da sie das Lesen der Protokolle erschwert und die Leistung des Emulators verschlechtert.",
|
||||||
"LoadApplicationFileTooltip": "Öffnet die Dateiauswahl um Datei zu laden, welche mit der Switch kompatibel ist",
|
"LoadApplicationFileTooltip": "Öffnet die Dateiauswahl um Datei zu laden, welche mit der Switch kompatibel ist",
|
||||||
"LoadApplicationFolderTooltip": "Öffnet die Dateiauswahl um ein Spiel zu laden, welches mit der Switch kompatibel ist",
|
"LoadApplicationFolderTooltip": "Öffnet die Dateiauswahl um ein Spiel zu laden, welches mit der Switch kompatibel ist",
|
||||||
|
"LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
|
||||||
|
"LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
|
||||||
"OpenRyujinxFolderTooltip": "Öffnet den Ordner, der das Ryujinx Dateisystem enthält",
|
"OpenRyujinxFolderTooltip": "Öffnet den Ordner, der das Ryujinx Dateisystem enthält",
|
||||||
"OpenRyujinxLogsTooltip": "Öffnet den Ordner, in welchem die Logs gespeichert werden",
|
"OpenRyujinxLogsTooltip": "Öffnet den Ordner, in welchem die Logs gespeichert werden",
|
||||||
"ExitTooltip": "Beendet Ryujinx",
|
"ExitTooltip": "Beendet Ryujinx",
|
||||||
@@ -656,6 +669,8 @@
|
|||||||
"OpenSetupGuideMessage": "Öffne den 'Setup Guide'",
|
"OpenSetupGuideMessage": "Öffne den 'Setup Guide'",
|
||||||
"NoUpdate": "Kein Update",
|
"NoUpdate": "Kein Update",
|
||||||
"TitleUpdateVersionLabel": "Version {0} - {1}",
|
"TitleUpdateVersionLabel": "Version {0} - {1}",
|
||||||
|
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||||
|
"TitleBundledDlcLabel": "Bundled:",
|
||||||
"RyujinxInfo": "Ryujinx - Info",
|
"RyujinxInfo": "Ryujinx - Info",
|
||||||
"RyujinxConfirm": "Ryujinx - Bestätigung",
|
"RyujinxConfirm": "Ryujinx - Bestätigung",
|
||||||
"FileDialogAllTypes": "Alle Typen",
|
"FileDialogAllTypes": "Alle Typen",
|
||||||
@@ -713,9 +728,17 @@
|
|||||||
"DlcWindowTitle": "Spiel-DLC verwalten",
|
"DlcWindowTitle": "Spiel-DLC verwalten",
|
||||||
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
||||||
"UpdateWindowTitle": "Spiel-Updates verwalten",
|
"UpdateWindowTitle": "Spiel-Updates verwalten",
|
||||||
|
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||||
"CheatWindowHeading": "Cheats verfügbar für {0} [{1}]",
|
"CheatWindowHeading": "Cheats verfügbar für {0} [{1}]",
|
||||||
|
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||||
"BuildId": "BuildId:",
|
"BuildId": "BuildId:",
|
||||||
"DlcWindowHeading": "DLC verfügbar für {0} [{1}]",
|
"DlcWindowHeading": "DLC verfügbar für {0} [{1}]",
|
||||||
|
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||||
|
"AutoloadUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
||||||
"ModWindowHeading": "{0} Mod(s)",
|
"ModWindowHeading": "{0} Mod(s)",
|
||||||
"UserProfilesEditProfile": "Profil bearbeiten",
|
"UserProfilesEditProfile": "Profil bearbeiten",
|
||||||
"Cancel": "Abbrechen",
|
"Cancel": "Abbrechen",
|
||||||
@@ -766,6 +789,7 @@
|
|||||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||||
"GraphicsScalingFilterNearest": "Nächstes",
|
"GraphicsScalingFilterNearest": "Nächstes",
|
||||||
"GraphicsScalingFilterFsr": "FSR",
|
"GraphicsScalingFilterFsr": "FSR",
|
||||||
|
"GraphicsScalingFilterArea": "Area",
|
||||||
"GraphicsScalingFilterLevelLabel": "Stufe",
|
"GraphicsScalingFilterLevelLabel": "Stufe",
|
||||||
"GraphicsScalingFilterLevelTooltip": "FSR 1.0 Schärfelevel festlegen. Höher ist schärfer.",
|
"GraphicsScalingFilterLevelTooltip": "FSR 1.0 Schärfelevel festlegen. Höher ist schärfer.",
|
||||||
"SmaaLow": "SMAA Niedrig",
|
"SmaaLow": "SMAA Niedrig",
|
||||||
|
@@ -10,7 +10,10 @@
|
|||||||
"SettingsTabSystemUseHypervisor": "Χρήση Hypervisor",
|
"SettingsTabSystemUseHypervisor": "Χρήση Hypervisor",
|
||||||
"MenuBarFile": "_Αρχείο",
|
"MenuBarFile": "_Αρχείο",
|
||||||
"MenuBarFileOpenFromFile": "_Φόρτωση Αρχείου Εφαρμογής",
|
"MenuBarFileOpenFromFile": "_Φόρτωση Αρχείου Εφαρμογής",
|
||||||
|
"MenuBarFileOpenFromFileError": "No applications found in selected file.",
|
||||||
"MenuBarFileOpenUnpacked": "Φόρτωση Απακετάριστου _Παιχνιδιού",
|
"MenuBarFileOpenUnpacked": "Φόρτωση Απακετάριστου _Παιχνιδιού",
|
||||||
|
"MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
|
||||||
|
"MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
|
||||||
"MenuBarFileOpenEmuFolder": "Άνοιγμα Φακέλου Ryujinx",
|
"MenuBarFileOpenEmuFolder": "Άνοιγμα Φακέλου Ryujinx",
|
||||||
"MenuBarFileOpenLogsFolder": "Άνοιγμα Φακέλου Καταγραφής",
|
"MenuBarFileOpenLogsFolder": "Άνοιγμα Φακέλου Καταγραφής",
|
||||||
"MenuBarFileExit": "_Έξοδος",
|
"MenuBarFileExit": "_Έξοδος",
|
||||||
@@ -97,11 +100,14 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Έλεγχος για Ενημερώσεις στην Εκκίνηση",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "Έλεγχος για Ενημερώσεις στην Εκκίνηση",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "Εμφάνιση διαλόγου \"Επιβεβαίωση Εξόδου\".",
|
"SettingsTabGeneralShowConfirmExitDialog": "Εμφάνιση διαλόγου \"Επιβεβαίωση Εξόδου\".",
|
||||||
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
|
||||||
"SettingsTabGeneralHideCursor": "Απόκρυψη Κέρσορα:",
|
"SettingsTabGeneralHideCursor": "Απόκρυψη Κέρσορα:",
|
||||||
"SettingsTabGeneralHideCursorNever": "Ποτέ",
|
"SettingsTabGeneralHideCursorNever": "Ποτέ",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "Απόκρυψη Δρομέα στην Αδράνεια",
|
"SettingsTabGeneralHideCursorOnIdle": "Απόκρυψη Δρομέα στην Αδράνεια",
|
||||||
"SettingsTabGeneralHideCursorAlways": "Πάντα",
|
"SettingsTabGeneralHideCursorAlways": "Πάντα",
|
||||||
"SettingsTabGeneralGameDirectories": "Τοποθεσίες παιχνιδιών",
|
"SettingsTabGeneralGameDirectories": "Τοποθεσίες παιχνιδιών",
|
||||||
|
"SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
|
||||||
|
"SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
|
||||||
"SettingsTabGeneralAdd": "Προσθήκη",
|
"SettingsTabGeneralAdd": "Προσθήκη",
|
||||||
"SettingsTabGeneralRemove": "Αφαίρεση",
|
"SettingsTabGeneralRemove": "Αφαίρεση",
|
||||||
"SettingsTabSystem": "Σύστημα",
|
"SettingsTabSystem": "Σύστημα",
|
||||||
@@ -401,6 +407,7 @@
|
|||||||
"AvatarSetBackgroundColor": "Ορισμός Χρώματος Φόντου",
|
"AvatarSetBackgroundColor": "Ορισμός Χρώματος Φόντου",
|
||||||
"AvatarClose": "Κλείσιμο",
|
"AvatarClose": "Κλείσιμο",
|
||||||
"ControllerSettingsLoadProfileToolTip": "Φόρτωση Προφίλ",
|
"ControllerSettingsLoadProfileToolTip": "Φόρτωση Προφίλ",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsAddProfileToolTip": "Προσθήκη Προφίλ",
|
"ControllerSettingsAddProfileToolTip": "Προσθήκη Προφίλ",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "Κατάργηση Προφίλ",
|
"ControllerSettingsRemoveProfileToolTip": "Κατάργηση Προφίλ",
|
||||||
"ControllerSettingsSaveProfileToolTip": "Αποθήκευση Προφίλ",
|
"ControllerSettingsSaveProfileToolTip": "Αποθήκευση Προφίλ",
|
||||||
@@ -410,6 +417,7 @@
|
|||||||
"GameListContextMenuToggleFavorite": "Εναλλαγή Αγαπημένου",
|
"GameListContextMenuToggleFavorite": "Εναλλαγή Αγαπημένου",
|
||||||
"GameListContextMenuToggleFavoriteToolTip": "Εναλλαγή της Κατάστασης Αγαπημένο του Παιχνιδιού",
|
"GameListContextMenuToggleFavoriteToolTip": "Εναλλαγή της Κατάστασης Αγαπημένο του Παιχνιδιού",
|
||||||
"SettingsTabGeneralTheme": "Theme:",
|
"SettingsTabGeneralTheme": "Theme:",
|
||||||
|
"SettingsTabGeneralThemeAuto": "Auto",
|
||||||
"SettingsTabGeneralThemeDark": "Dark",
|
"SettingsTabGeneralThemeDark": "Dark",
|
||||||
"SettingsTabGeneralThemeLight": "Light",
|
"SettingsTabGeneralThemeLight": "Light",
|
||||||
"ControllerSettingsConfigureGeneral": "Παραμέτρων",
|
"ControllerSettingsConfigureGeneral": "Παραμέτρων",
|
||||||
@@ -430,7 +438,7 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "Σφάλμα κατά την εύρεση των αποθηκευμένων δεδομένων: {0}",
|
"DialogMessageFindSaveErrorMessage": "Σφάλμα κατά την εύρεση των αποθηκευμένων δεδομένων: {0}",
|
||||||
"FolderDialogExtractTitle": "Επιλέξτε τον φάκελο στον οποίο θέλετε να εξαγάγετε",
|
"FolderDialogExtractTitle": "Επιλέξτε τον φάκελο στον οποίο θέλετε να εξαγάγετε",
|
||||||
"DialogNcaExtractionMessage": "Εξαγωγή ενότητας {0} από {1}...",
|
"DialogNcaExtractionMessage": "Εξαγωγή ενότητας {0} από {1}...",
|
||||||
"DialogNcaExtractionTitle": "Ryujinx - NCA Εξαγωγέας Τμημάτων",
|
"DialogNcaExtractionTitle": "NCA Εξαγωγέας Τμημάτων",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Αποτυχία εξαγωγής. Η κύρια NCA δεν υπήρχε στο επιλεγμένο αρχείο.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Αποτυχία εξαγωγής. Η κύρια NCA δεν υπήρχε στο επιλεγμένο αρχείο.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "Αποτυχία εξαγωγής. Διαβάστε το αρχείο καταγραφής για περισσότερες πληροφορίες.",
|
"DialogNcaExtractionCheckLogErrorMessage": "Αποτυχία εξαγωγής. Διαβάστε το αρχείο καταγραφής για περισσότερες πληροφορίες.",
|
||||||
"DialogNcaExtractionSuccessMessage": "Η εξαγωγή ολοκληρώθηκε με επιτυχία.",
|
"DialogNcaExtractionSuccessMessage": "Η εξαγωγή ολοκληρώθηκε με επιτυχία.",
|
||||||
@@ -560,6 +568,9 @@
|
|||||||
"AddGameDirBoxTooltip": "Εισαγάγετε μία τοποθεσία παιχνιδιών για προσθήκη στη λίστα",
|
"AddGameDirBoxTooltip": "Εισαγάγετε μία τοποθεσία παιχνιδιών για προσθήκη στη λίστα",
|
||||||
"AddGameDirTooltip": "Προσθέστε μία τοποθεσία παιχνιδιών στη λίστα",
|
"AddGameDirTooltip": "Προσθέστε μία τοποθεσία παιχνιδιών στη λίστα",
|
||||||
"RemoveGameDirTooltip": "Αφαιρέστε την επιλεγμένη τοποθεσία παιχνιδιών",
|
"RemoveGameDirTooltip": "Αφαιρέστε την επιλεγμένη τοποθεσία παιχνιδιών",
|
||||||
|
"AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
|
||||||
|
"AddAutoloadDirTooltip": "Add an autoload directory to the list",
|
||||||
|
"RemoveAutoloadDirTooltip": "Remove selected autoload directory",
|
||||||
"CustomThemeCheckTooltip": "Ενεργοποίηση ή απενεργοποίηση προσαρμοσμένων θεμάτων στο GUI",
|
"CustomThemeCheckTooltip": "Ενεργοποίηση ή απενεργοποίηση προσαρμοσμένων θεμάτων στο GUI",
|
||||||
"CustomThemePathTooltip": "Διαδρομή προς το προσαρμοσμένο θέμα GUI",
|
"CustomThemePathTooltip": "Διαδρομή προς το προσαρμοσμένο θέμα GUI",
|
||||||
"CustomThemeBrowseTooltip": "Αναζητήστε ένα προσαρμοσμένο θέμα GUI",
|
"CustomThemeBrowseTooltip": "Αναζητήστε ένα προσαρμοσμένο θέμα GUI",
|
||||||
@@ -605,6 +616,8 @@
|
|||||||
"DebugLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής εντοπισμού σφαλμάτων",
|
"DebugLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής εντοπισμού σφαλμάτων",
|
||||||
"LoadApplicationFileTooltip": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε ένα αρχείο συμβατό με το Switch για φόρτωση",
|
"LoadApplicationFileTooltip": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε ένα αρχείο συμβατό με το Switch για φόρτωση",
|
||||||
"LoadApplicationFolderTooltip": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε μία μη συσκευασμένη εφαρμογή, συμβατή με το Switch για φόρτωση",
|
"LoadApplicationFolderTooltip": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε μία μη συσκευασμένη εφαρμογή, συμβατή με το Switch για φόρτωση",
|
||||||
|
"LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
|
||||||
|
"LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
|
||||||
"OpenRyujinxFolderTooltip": "Ανοίξτε το φάκελο συστήματος αρχείων Ryujinx",
|
"OpenRyujinxFolderTooltip": "Ανοίξτε το φάκελο συστήματος αρχείων Ryujinx",
|
||||||
"OpenRyujinxLogsTooltip": "Ανοίξτε το φάκελο στον οποίο διατηρούνται τα αρχεία καταγραφής",
|
"OpenRyujinxLogsTooltip": "Ανοίξτε το φάκελο στον οποίο διατηρούνται τα αρχεία καταγραφής",
|
||||||
"ExitTooltip": "Έξοδος από το Ryujinx",
|
"ExitTooltip": "Έξοδος από το Ryujinx",
|
||||||
@@ -656,6 +669,8 @@
|
|||||||
"OpenSetupGuideMessage": "Ανοίξτε τον Οδηγό Εγκατάστασης.",
|
"OpenSetupGuideMessage": "Ανοίξτε τον Οδηγό Εγκατάστασης.",
|
||||||
"NoUpdate": "Καμία Eνημέρωση",
|
"NoUpdate": "Καμία Eνημέρωση",
|
||||||
"TitleUpdateVersionLabel": "Version {0} - {1}",
|
"TitleUpdateVersionLabel": "Version {0} - {1}",
|
||||||
|
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||||
|
"TitleBundledDlcLabel": "Bundled:",
|
||||||
"RyujinxInfo": "Ryujinx - Πληροφορίες",
|
"RyujinxInfo": "Ryujinx - Πληροφορίες",
|
||||||
"RyujinxConfirm": "Ryujinx - Επιβεβαίωση",
|
"RyujinxConfirm": "Ryujinx - Επιβεβαίωση",
|
||||||
"FileDialogAllTypes": "Όλοι οι τύποι",
|
"FileDialogAllTypes": "Όλοι οι τύποι",
|
||||||
@@ -713,9 +728,17 @@
|
|||||||
"DlcWindowTitle": "Downloadable Content Manager",
|
"DlcWindowTitle": "Downloadable Content Manager",
|
||||||
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
||||||
"UpdateWindowTitle": "Διαχειριστής Ενημερώσεων Τίτλου",
|
"UpdateWindowTitle": "Διαχειριστής Ενημερώσεων Τίτλου",
|
||||||
|
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||||
"CheatWindowHeading": "Διαθέσιμα Cheats για {0} [{1}]",
|
"CheatWindowHeading": "Διαθέσιμα Cheats για {0} [{1}]",
|
||||||
"BuildId": "BuildId:",
|
"BuildId": "BuildId:",
|
||||||
|
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||||
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
||||||
|
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||||
|
"AutoloadUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
||||||
"ModWindowHeading": "{0} Mod(s)",
|
"ModWindowHeading": "{0} Mod(s)",
|
||||||
"UserProfilesEditProfile": "Επεξεργασία Επιλεγμένων",
|
"UserProfilesEditProfile": "Επεξεργασία Επιλεγμένων",
|
||||||
"Cancel": "Ακύρωση",
|
"Cancel": "Ακύρωση",
|
||||||
@@ -766,6 +789,7 @@
|
|||||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||||
"GraphicsScalingFilterNearest": "Nearest",
|
"GraphicsScalingFilterNearest": "Nearest",
|
||||||
"GraphicsScalingFilterFsr": "FSR",
|
"GraphicsScalingFilterFsr": "FSR",
|
||||||
|
"GraphicsScalingFilterArea": "Area",
|
||||||
"GraphicsScalingFilterLevelLabel": "Επίπεδο",
|
"GraphicsScalingFilterLevelLabel": "Επίπεδο",
|
||||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||||
"SmaaLow": "Χαμηλό SMAA",
|
"SmaaLow": "Χαμηλό SMAA",
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
"MenuBarToolsManageFileTypes": "Manage file types",
|
"MenuBarToolsManageFileTypes": "Manage file types",
|
||||||
"MenuBarToolsInstallFileTypes": "Install file types",
|
"MenuBarToolsInstallFileTypes": "Install file types",
|
||||||
"MenuBarToolsUninstallFileTypes": "Uninstall file types",
|
"MenuBarToolsUninstallFileTypes": "Uninstall file types",
|
||||||
|
"MenuBarToolsXCITrimmer": "Trim XCI Files",
|
||||||
"MenuBarView": "_View",
|
"MenuBarView": "_View",
|
||||||
"MenuBarViewWindow": "Window Size",
|
"MenuBarViewWindow": "Window Size",
|
||||||
"MenuBarViewWindow720": "720p",
|
"MenuBarViewWindow720": "720p",
|
||||||
@@ -84,8 +85,11 @@
|
|||||||
"GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods",
|
"GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods",
|
||||||
"GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory",
|
"GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory",
|
||||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.",
|
"GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.",
|
||||||
|
"GameListContextMenuTrimXCI": "Check and Trim XCI File",
|
||||||
|
"GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space",
|
||||||
"StatusBarGamesLoaded": "{0}/{1} Games Loaded",
|
"StatusBarGamesLoaded": "{0}/{1} Games Loaded",
|
||||||
"StatusBarSystemVersion": "System Version: {0}",
|
"StatusBarSystemVersion": "System Version: {0}",
|
||||||
|
"StatusBarXCIFileTrimming": "Trimming XCI File '{0}'",
|
||||||
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
||||||
"LinuxVmMaxMapCountDialogTextPrimary": "Would you like to increase the value of vm.max_map_count to {0}",
|
"LinuxVmMaxMapCountDialogTextPrimary": "Would you like to increase the value of vm.max_map_count to {0}",
|
||||||
"LinuxVmMaxMapCountDialogTextSecondary": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.",
|
"LinuxVmMaxMapCountDialogTextSecondary": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.",
|
||||||
@@ -100,6 +104,7 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Check for Updates on Launch",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "Check for Updates on Launch",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "Show \"Confirm Exit\" Dialog",
|
"SettingsTabGeneralShowConfirmExitDialog": "Show \"Confirm Exit\" Dialog",
|
||||||
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
|
||||||
"SettingsTabGeneralHideCursor": "Hide Cursor:",
|
"SettingsTabGeneralHideCursor": "Hide Cursor:",
|
||||||
"SettingsTabGeneralHideCursorNever": "Never",
|
"SettingsTabGeneralHideCursorNever": "Never",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "On Idle",
|
"SettingsTabGeneralHideCursorOnIdle": "On Idle",
|
||||||
@@ -399,6 +404,8 @@
|
|||||||
"InputDialogTitle": "Input Dialog",
|
"InputDialogTitle": "Input Dialog",
|
||||||
"InputDialogOk": "OK",
|
"InputDialogOk": "OK",
|
||||||
"InputDialogCancel": "Cancel",
|
"InputDialogCancel": "Cancel",
|
||||||
|
"InputDialogCancelling": "Cancelling",
|
||||||
|
"InputDialogClose": "Close",
|
||||||
"InputDialogAddNewProfileTitle": "Choose the Profile Name",
|
"InputDialogAddNewProfileTitle": "Choose the Profile Name",
|
||||||
"InputDialogAddNewProfileHeader": "Please Enter a Profile Name",
|
"InputDialogAddNewProfileHeader": "Please Enter a Profile Name",
|
||||||
"InputDialogAddNewProfileSubtext": "(Max Length: {0})",
|
"InputDialogAddNewProfileSubtext": "(Max Length: {0})",
|
||||||
@@ -406,6 +413,7 @@
|
|||||||
"AvatarSetBackgroundColor": "Set Background Color",
|
"AvatarSetBackgroundColor": "Set Background Color",
|
||||||
"AvatarClose": "Close",
|
"AvatarClose": "Close",
|
||||||
"ControllerSettingsLoadProfileToolTip": "Load Profile",
|
"ControllerSettingsLoadProfileToolTip": "Load Profile",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsAddProfileToolTip": "Add Profile",
|
"ControllerSettingsAddProfileToolTip": "Add Profile",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "Remove Profile",
|
"ControllerSettingsRemoveProfileToolTip": "Remove Profile",
|
||||||
"ControllerSettingsSaveProfileToolTip": "Save Profile",
|
"ControllerSettingsSaveProfileToolTip": "Save Profile",
|
||||||
@@ -436,15 +444,15 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "There was an error finding the specified savedata: {0}",
|
"DialogMessageFindSaveErrorMessage": "There was an error finding the specified savedata: {0}",
|
||||||
"FolderDialogExtractTitle": "Choose the folder to extract into",
|
"FolderDialogExtractTitle": "Choose the folder to extract into",
|
||||||
"DialogNcaExtractionMessage": "Extracting {0} section from {1}...",
|
"DialogNcaExtractionMessage": "Extracting {0} section from {1}...",
|
||||||
"DialogNcaExtractionTitle": "Ryujinx - NCA Section Extractor",
|
"DialogNcaExtractionTitle": "NCA Section Extractor",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraction failure. The main NCA was not present in the selected file.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraction failure. The main NCA was not present in the selected file.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "Extraction failure. Read the log file for further information.",
|
"DialogNcaExtractionCheckLogErrorMessage": "Extraction failed. Please check the log file for more details.",
|
||||||
"DialogNcaExtractionSuccessMessage": "Extraction completed successfully.",
|
"DialogNcaExtractionSuccessMessage": "Extraction completed successfully.",
|
||||||
"DialogUpdaterConvertFailedMessage": "Failed to convert the current Ryujinx version.",
|
"DialogUpdaterConvertFailedMessage": "Unable to convert the current Ryujinx version.",
|
||||||
"DialogUpdaterCancelUpdateMessage": "Cancelling Update!",
|
"DialogUpdaterCancelUpdateMessage": "Update canceled!",
|
||||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "You are already using the most updated version of Ryujinx!",
|
"DialogUpdaterAlreadyOnLatestVersionMessage": "You are already using the latest version of Ryujinx!",
|
||||||
"DialogUpdaterFailedToGetVersionMessage": "An error has occurred when trying to get release information from GitHub Release. This can be caused if a new release is being compiled by GitHub Actions. Try again in a few minutes.",
|
"DialogUpdaterFailedToGetVersionMessage": "An error occurred while trying to retrieve release information from GitHub. This may happen if a new release is currently being compiled by GitHub Actions. Please try again in a few minutes.",
|
||||||
"DialogUpdaterConvertFailedGithubMessage": "Failed to convert the received Ryujinx version from Github Release.",
|
"DialogUpdaterConvertFailedGithubMessage": "Failed to convert the Ryujinx version received from GitHub.",
|
||||||
"DialogUpdaterDownloadingMessage": "Downloading Update...",
|
"DialogUpdaterDownloadingMessage": "Downloading Update...",
|
||||||
"DialogUpdaterExtractionMessage": "Extracting Update...",
|
"DialogUpdaterExtractionMessage": "Extracting Update...",
|
||||||
"DialogUpdaterRenamingMessage": "Renaming Update...",
|
"DialogUpdaterRenamingMessage": "Renaming Update...",
|
||||||
@@ -453,8 +461,8 @@
|
|||||||
"DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?",
|
"DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?",
|
||||||
"DialogUpdaterNoInternetMessage": "You are not connected to the Internet!",
|
"DialogUpdaterNoInternetMessage": "You are not connected to the Internet!",
|
||||||
"DialogUpdaterNoInternetSubMessage": "Please verify that you have a working Internet connection!",
|
"DialogUpdaterNoInternetSubMessage": "Please verify that you have a working Internet connection!",
|
||||||
"DialogUpdaterDirtyBuildMessage": "You Cannot update a Dirty build of Ryujinx!",
|
"DialogUpdaterDirtyBuildMessage": "You cannot update a Dirty build of Ryujinx!",
|
||||||
"DialogUpdaterDirtyBuildSubMessage": "Please download Ryujinx at https://https://github.com/GreemDev/Ryujinx/releases/ if you are looking for a supported version.",
|
"DialogUpdaterDirtyBuildSubMessage": "Please download Ryujinx at https://github.com/GreemDev/Ryujinx/releases/ if you are looking for a supported version.",
|
||||||
"DialogRestartRequiredMessage": "Restart Required",
|
"DialogRestartRequiredMessage": "Restart Required",
|
||||||
"DialogThemeRestartMessage": "Theme has been saved. A restart is needed to apply the theme.",
|
"DialogThemeRestartMessage": "Theme has been saved. A restart is needed to apply the theme.",
|
||||||
"DialogThemeRestartSubMessage": "Do you want to restart",
|
"DialogThemeRestartSubMessage": "Do you want to restart",
|
||||||
@@ -467,6 +475,7 @@
|
|||||||
"DialogUninstallFileTypesSuccessMessage": "Successfully uninstalled file types!",
|
"DialogUninstallFileTypesSuccessMessage": "Successfully uninstalled file types!",
|
||||||
"DialogUninstallFileTypesErrorMessage": "Failed to uninstall file types.",
|
"DialogUninstallFileTypesErrorMessage": "Failed to uninstall file types.",
|
||||||
"DialogOpenSettingsWindowLabel": "Open Settings Window",
|
"DialogOpenSettingsWindowLabel": "Open Settings Window",
|
||||||
|
"DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window",
|
||||||
"DialogControllerAppletTitle": "Controller Applet",
|
"DialogControllerAppletTitle": "Controller Applet",
|
||||||
"DialogMessageDialogErrorExceptionMessage": "Error displaying Message Dialog: {0}",
|
"DialogMessageDialogErrorExceptionMessage": "Error displaying Message Dialog: {0}",
|
||||||
"DialogSoftwareKeyboardErrorExceptionMessage": "Error displaying Software Keyboard: {0}",
|
"DialogSoftwareKeyboardErrorExceptionMessage": "Error displaying Software Keyboard: {0}",
|
||||||
@@ -669,6 +678,12 @@
|
|||||||
"TitleUpdateVersionLabel": "Version {0}",
|
"TitleUpdateVersionLabel": "Version {0}",
|
||||||
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||||
"TitleBundledDlcLabel": "Bundled:",
|
"TitleBundledDlcLabel": "Bundled:",
|
||||||
|
"TitleXCIStatusPartialLabel": "Partial",
|
||||||
|
"TitleXCIStatusTrimmableLabel": "Untrimmed",
|
||||||
|
"TitleXCIStatusUntrimmableLabel": "Trimmed",
|
||||||
|
"TitleXCIStatusFailedLabel": "(Failed)",
|
||||||
|
"TitleXCICanSaveLabel": "Save {0:n0} Mb",
|
||||||
|
"TitleXCISavingLabel": "Saved {0:n0} Mb",
|
||||||
"RyujinxInfo": "Ryujinx - Info",
|
"RyujinxInfo": "Ryujinx - Info",
|
||||||
"RyujinxConfirm": "Ryujinx - Confirmation",
|
"RyujinxConfirm": "Ryujinx - Confirmation",
|
||||||
"FileDialogAllTypes": "All types",
|
"FileDialogAllTypes": "All types",
|
||||||
@@ -721,17 +736,43 @@
|
|||||||
"SelectDlcDialogTitle": "Select DLC files",
|
"SelectDlcDialogTitle": "Select DLC files",
|
||||||
"SelectUpdateDialogTitle": "Select update files",
|
"SelectUpdateDialogTitle": "Select update files",
|
||||||
"SelectModDialogTitle": "Select mod directory",
|
"SelectModDialogTitle": "Select mod directory",
|
||||||
|
"TrimXCIFileDialogTitle": "Check and Trim XCI File",
|
||||||
|
"TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.",
|
||||||
|
"TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB",
|
||||||
|
"TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details",
|
||||||
|
"TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details",
|
||||||
|
"TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details",
|
||||||
|
"TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.",
|
||||||
|
"TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim",
|
||||||
|
"TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details",
|
||||||
|
"TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details",
|
||||||
|
"TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed",
|
||||||
|
"TrimXCIFileCancelled": "The operation was cancelled",
|
||||||
|
"TrimXCIFileFileUndertermined": "No operation was performed",
|
||||||
"UserProfileWindowTitle": "User Profiles Manager",
|
"UserProfileWindowTitle": "User Profiles Manager",
|
||||||
"CheatWindowTitle": "Cheats Manager",
|
"CheatWindowTitle": "Cheats Manager",
|
||||||
"DlcWindowTitle": "Manage Downloadable Content for {0} ({1})",
|
"DlcWindowTitle": "Manage Downloadable Content for {0} ({1})",
|
||||||
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
||||||
"UpdateWindowTitle": "Title Update Manager",
|
"UpdateWindowTitle": "Title Update Manager",
|
||||||
|
"XCITrimmerWindowTitle": "XCI File Trimmer",
|
||||||
|
"XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected",
|
||||||
|
"XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)",
|
||||||
|
"XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...",
|
||||||
|
"XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...",
|
||||||
|
"XCITrimmerTitleStatusFailed": "Failed",
|
||||||
|
"XCITrimmerPotentialSavings": "Potential Savings",
|
||||||
|
"XCITrimmerActualSavings": "Actual Savings",
|
||||||
|
"XCITrimmerSavingsMb": "{0:n0} Mb",
|
||||||
|
"XCITrimmerSelectDisplayed": "Select Shown",
|
||||||
|
"XCITrimmerDeselectDisplayed": "Deselect Shown",
|
||||||
|
"XCITrimmerSortName": "Title",
|
||||||
|
"XCITrimmerSortSaved": "Space Savings",
|
||||||
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
||||||
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||||
"CheatWindowHeading": "Cheats Available for {0} [{1}]",
|
"CheatWindowHeading": "Cheats Available for {0} [{1}]",
|
||||||
"BuildId": "BuildId:",
|
"BuildId": "BuildId:",
|
||||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||||
"DlcWindowHeading": "{0} Downloadable Content(s)",
|
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
||||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||||
@@ -739,6 +780,7 @@
|
|||||||
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
||||||
"ModWindowHeading": "{0} Mod(s)",
|
"ModWindowHeading": "{0} Mod(s)",
|
||||||
"UserProfilesEditProfile": "Edit Selected",
|
"UserProfilesEditProfile": "Edit Selected",
|
||||||
|
"Continue": "Continue",
|
||||||
"Cancel": "Cancel",
|
"Cancel": "Cancel",
|
||||||
"Save": "Save",
|
"Save": "Save",
|
||||||
"Discard": "Discard",
|
"Discard": "Discard",
|
||||||
|
@@ -10,7 +10,10 @@
|
|||||||
"SettingsTabSystemUseHypervisor": "Usar hipervisor",
|
"SettingsTabSystemUseHypervisor": "Usar hipervisor",
|
||||||
"MenuBarFile": "_Archivo",
|
"MenuBarFile": "_Archivo",
|
||||||
"MenuBarFileOpenFromFile": "_Cargar aplicación desde un archivo",
|
"MenuBarFileOpenFromFile": "_Cargar aplicación desde un archivo",
|
||||||
|
"MenuBarFileOpenFromFileError": "No applications found in selected file.",
|
||||||
"MenuBarFileOpenUnpacked": "Cargar juego _desempaquetado",
|
"MenuBarFileOpenUnpacked": "Cargar juego _desempaquetado",
|
||||||
|
"MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
|
||||||
|
"MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
|
||||||
"MenuBarFileOpenEmuFolder": "Abrir carpeta de Ryujinx",
|
"MenuBarFileOpenEmuFolder": "Abrir carpeta de Ryujinx",
|
||||||
"MenuBarFileOpenLogsFolder": "Abrir carpeta de registros",
|
"MenuBarFileOpenLogsFolder": "Abrir carpeta de registros",
|
||||||
"MenuBarFileExit": "_Salir",
|
"MenuBarFileExit": "_Salir",
|
||||||
@@ -97,11 +100,14 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Buscar actualizaciones al iniciar",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "Buscar actualizaciones al iniciar",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "Mostrar diálogo de confirmación al cerrar",
|
"SettingsTabGeneralShowConfirmExitDialog": "Mostrar diálogo de confirmación al cerrar",
|
||||||
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
|
||||||
"SettingsTabGeneralHideCursor": "Esconder el cursor:",
|
"SettingsTabGeneralHideCursor": "Esconder el cursor:",
|
||||||
"SettingsTabGeneralHideCursorNever": "Nunca",
|
"SettingsTabGeneralHideCursorNever": "Nunca",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "Ocultar cursor cuando esté inactivo",
|
"SettingsTabGeneralHideCursorOnIdle": "Ocultar cursor cuando esté inactivo",
|
||||||
"SettingsTabGeneralHideCursorAlways": "Siempre",
|
"SettingsTabGeneralHideCursorAlways": "Siempre",
|
||||||
"SettingsTabGeneralGameDirectories": "Carpetas de juegos",
|
"SettingsTabGeneralGameDirectories": "Carpetas de juegos",
|
||||||
|
"SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
|
||||||
|
"SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
|
||||||
"SettingsTabGeneralAdd": "Agregar",
|
"SettingsTabGeneralAdd": "Agregar",
|
||||||
"SettingsTabGeneralRemove": "Quitar",
|
"SettingsTabGeneralRemove": "Quitar",
|
||||||
"SettingsTabSystem": "Sistema",
|
"SettingsTabSystem": "Sistema",
|
||||||
@@ -401,6 +407,7 @@
|
|||||||
"AvatarSetBackgroundColor": "Establecer color de fondo",
|
"AvatarSetBackgroundColor": "Establecer color de fondo",
|
||||||
"AvatarClose": "Cerrar",
|
"AvatarClose": "Cerrar",
|
||||||
"ControllerSettingsLoadProfileToolTip": "Cargar perfil",
|
"ControllerSettingsLoadProfileToolTip": "Cargar perfil",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsAddProfileToolTip": "Agregar perfil",
|
"ControllerSettingsAddProfileToolTip": "Agregar perfil",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "Eliminar perfil",
|
"ControllerSettingsRemoveProfileToolTip": "Eliminar perfil",
|
||||||
"ControllerSettingsSaveProfileToolTip": "Guardar perfil",
|
"ControllerSettingsSaveProfileToolTip": "Guardar perfil",
|
||||||
@@ -410,6 +417,7 @@
|
|||||||
"GameListContextMenuToggleFavorite": "Marcar favorito",
|
"GameListContextMenuToggleFavorite": "Marcar favorito",
|
||||||
"GameListContextMenuToggleFavoriteToolTip": "Marca o desmarca el juego como favorito",
|
"GameListContextMenuToggleFavoriteToolTip": "Marca o desmarca el juego como favorito",
|
||||||
"SettingsTabGeneralTheme": "Tema:",
|
"SettingsTabGeneralTheme": "Tema:",
|
||||||
|
"SettingsTabGeneralThemeAuto": "Auto",
|
||||||
"SettingsTabGeneralThemeDark": "Oscuro",
|
"SettingsTabGeneralThemeDark": "Oscuro",
|
||||||
"SettingsTabGeneralThemeLight": "Claro",
|
"SettingsTabGeneralThemeLight": "Claro",
|
||||||
"ControllerSettingsConfigureGeneral": "Configurar",
|
"ControllerSettingsConfigureGeneral": "Configurar",
|
||||||
@@ -430,7 +438,7 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "Hubo un error encontrando los datos de guardado especificados: {0}",
|
"DialogMessageFindSaveErrorMessage": "Hubo un error encontrando los datos de guardado especificados: {0}",
|
||||||
"FolderDialogExtractTitle": "Elige la carpeta en la que deseas extraer",
|
"FolderDialogExtractTitle": "Elige la carpeta en la que deseas extraer",
|
||||||
"DialogNcaExtractionMessage": "Extrayendo {0} sección de {1}...",
|
"DialogNcaExtractionMessage": "Extrayendo {0} sección de {1}...",
|
||||||
"DialogNcaExtractionTitle": "Ryujinx - Extractor de sección NCA",
|
"DialogNcaExtractionTitle": "Extractor de sección NCA",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Fallo de extracción. El NCA principal no estaba presente en el archivo seleccionado.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Fallo de extracción. El NCA principal no estaba presente en el archivo seleccionado.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "Fallo de extracción. Lee el registro para más información.",
|
"DialogNcaExtractionCheckLogErrorMessage": "Fallo de extracción. Lee el registro para más información.",
|
||||||
"DialogNcaExtractionSuccessMessage": "Se completó la extracción con éxito.",
|
"DialogNcaExtractionSuccessMessage": "Se completó la extracción con éxito.",
|
||||||
@@ -560,6 +568,9 @@
|
|||||||
"AddGameDirBoxTooltip": "Elige un directorio de juegos para mostrar en la ventana principal",
|
"AddGameDirBoxTooltip": "Elige un directorio de juegos para mostrar en la ventana principal",
|
||||||
"AddGameDirTooltip": "Agrega un directorio de juegos a la lista",
|
"AddGameDirTooltip": "Agrega un directorio de juegos a la lista",
|
||||||
"RemoveGameDirTooltip": "Quita el directorio seleccionado de la lista",
|
"RemoveGameDirTooltip": "Quita el directorio seleccionado de la lista",
|
||||||
|
"AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
|
||||||
|
"AddAutoloadDirTooltip": "Add an autoload directory to the list",
|
||||||
|
"RemoveAutoloadDirTooltip": "Remove selected autoload directory",
|
||||||
"CustomThemeCheckTooltip": "Activa o desactiva los temas personalizados para la interfaz",
|
"CustomThemeCheckTooltip": "Activa o desactiva los temas personalizados para la interfaz",
|
||||||
"CustomThemePathTooltip": "Carpeta que contiene los temas personalizados para la interfaz",
|
"CustomThemePathTooltip": "Carpeta que contiene los temas personalizados para la interfaz",
|
||||||
"CustomThemeBrowseTooltip": "Busca un tema personalizado para la interfaz",
|
"CustomThemeBrowseTooltip": "Busca un tema personalizado para la interfaz",
|
||||||
@@ -605,6 +616,8 @@
|
|||||||
"DebugLogTooltip": "Escribe mensajes de debug en la consola\n\nActiva esto solo si un miembro del equipo te lo pide expresamente, pues hará que el registro sea difícil de leer y empeorará el rendimiento del emulador.",
|
"DebugLogTooltip": "Escribe mensajes de debug en la consola\n\nActiva esto solo si un miembro del equipo te lo pide expresamente, pues hará que el registro sea difícil de leer y empeorará el rendimiento del emulador.",
|
||||||
"LoadApplicationFileTooltip": "Abre el explorador de archivos para elegir un archivo compatible con Switch para cargar",
|
"LoadApplicationFileTooltip": "Abre el explorador de archivos para elegir un archivo compatible con Switch para cargar",
|
||||||
"LoadApplicationFolderTooltip": "Abre el explorador de archivos para elegir un archivo desempaquetado y compatible con Switch para cargar",
|
"LoadApplicationFolderTooltip": "Abre el explorador de archivos para elegir un archivo desempaquetado y compatible con Switch para cargar",
|
||||||
|
"LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
|
||||||
|
"LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
|
||||||
"OpenRyujinxFolderTooltip": "Abre la carpeta de sistema de Ryujinx",
|
"OpenRyujinxFolderTooltip": "Abre la carpeta de sistema de Ryujinx",
|
||||||
"OpenRyujinxLogsTooltip": "Abre la carpeta en la que se guardan los registros",
|
"OpenRyujinxLogsTooltip": "Abre la carpeta en la que se guardan los registros",
|
||||||
"ExitTooltip": "Cierra Ryujinx",
|
"ExitTooltip": "Cierra Ryujinx",
|
||||||
@@ -656,6 +669,8 @@
|
|||||||
"OpenSetupGuideMessage": "Abrir la guía de instalación",
|
"OpenSetupGuideMessage": "Abrir la guía de instalación",
|
||||||
"NoUpdate": "No actualizado",
|
"NoUpdate": "No actualizado",
|
||||||
"TitleUpdateVersionLabel": "Versión {0} - {1}",
|
"TitleUpdateVersionLabel": "Versión {0} - {1}",
|
||||||
|
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||||
|
"TitleBundledDlcLabel": "Bundled:",
|
||||||
"RyujinxInfo": "Ryujinx - Info",
|
"RyujinxInfo": "Ryujinx - Info",
|
||||||
"RyujinxConfirm": "Ryujinx - Confirmación",
|
"RyujinxConfirm": "Ryujinx - Confirmación",
|
||||||
"FileDialogAllTypes": "Todos los tipos",
|
"FileDialogAllTypes": "Todos los tipos",
|
||||||
@@ -713,9 +728,16 @@
|
|||||||
"DlcWindowTitle": "Administrar contenido descargable",
|
"DlcWindowTitle": "Administrar contenido descargable",
|
||||||
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
||||||
"UpdateWindowTitle": "Administrar actualizaciones",
|
"UpdateWindowTitle": "Administrar actualizaciones",
|
||||||
|
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||||
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
||||||
"BuildId": "Id de compilación:",
|
"BuildId": "Id de compilación:",
|
||||||
"DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]",
|
"DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]",
|
||||||
|
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||||
|
"AutoloadUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
||||||
"ModWindowHeading": "{0} Mod(s)",
|
"ModWindowHeading": "{0} Mod(s)",
|
||||||
"UserProfilesEditProfile": "Editar selección",
|
"UserProfilesEditProfile": "Editar selección",
|
||||||
"Cancel": "Cancelar",
|
"Cancel": "Cancelar",
|
||||||
@@ -766,6 +788,7 @@
|
|||||||
"GraphicsScalingFilterBilinear": "Bilinear\n",
|
"GraphicsScalingFilterBilinear": "Bilinear\n",
|
||||||
"GraphicsScalingFilterNearest": "Cercano",
|
"GraphicsScalingFilterNearest": "Cercano",
|
||||||
"GraphicsScalingFilterFsr": "FSR",
|
"GraphicsScalingFilterFsr": "FSR",
|
||||||
|
"GraphicsScalingFilterArea": "Area",
|
||||||
"GraphicsScalingFilterLevelLabel": "Nivel",
|
"GraphicsScalingFilterLevelLabel": "Nivel",
|
||||||
"GraphicsScalingFilterLevelTooltip": "Ajuste el nivel de nitidez FSR 1.0. Mayor es más nítido.",
|
"GraphicsScalingFilterLevelTooltip": "Ajuste el nivel de nitidez FSR 1.0. Mayor es más nítido.",
|
||||||
"SmaaLow": "SMAA Bajo",
|
"SmaaLow": "SMAA Bajo",
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
"MenuBarToolsManageFileTypes": "Gérer les types de fichiers",
|
"MenuBarToolsManageFileTypes": "Gérer les types de fichiers",
|
||||||
"MenuBarToolsInstallFileTypes": "Installer les types de fichiers",
|
"MenuBarToolsInstallFileTypes": "Installer les types de fichiers",
|
||||||
"MenuBarToolsUninstallFileTypes": "Désinstaller les types de fichiers",
|
"MenuBarToolsUninstallFileTypes": "Désinstaller les types de fichiers",
|
||||||
"MenuBarView": "_View",
|
"MenuBarView": "_Fenêtre",
|
||||||
"MenuBarViewWindow": "Taille de la fenêtre",
|
"MenuBarViewWindow": "Taille de la fenêtre",
|
||||||
"MenuBarViewWindow720": "720p",
|
"MenuBarViewWindow720": "720p",
|
||||||
"MenuBarViewWindow1080": "1080p",
|
"MenuBarViewWindow1080": "1080p",
|
||||||
@@ -100,6 +100,7 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Vérifier les mises à jour au démarrage",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "Vérifier les mises à jour au démarrage",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "Afficher le message de \"Confirmation de sortie\"",
|
"SettingsTabGeneralShowConfirmExitDialog": "Afficher le message de \"Confirmation de sortie\"",
|
||||||
"SettingsTabGeneralRememberWindowState": "Mémoriser la taille/position de la fenêtre",
|
"SettingsTabGeneralRememberWindowState": "Mémoriser la taille/position de la fenêtre",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Afficher Barre de Titre (Nécessite redémarrage)",
|
||||||
"SettingsTabGeneralHideCursor": "Masquer le Curseur :",
|
"SettingsTabGeneralHideCursor": "Masquer le Curseur :",
|
||||||
"SettingsTabGeneralHideCursorNever": "Jamais",
|
"SettingsTabGeneralHideCursorNever": "Jamais",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "Masquer le curseur si inactif",
|
"SettingsTabGeneralHideCursorOnIdle": "Masquer le curseur si inactif",
|
||||||
@@ -111,7 +112,7 @@
|
|||||||
"SettingsTabGeneralRemove": "Retirer",
|
"SettingsTabGeneralRemove": "Retirer",
|
||||||
"SettingsTabSystem": "Système",
|
"SettingsTabSystem": "Système",
|
||||||
"SettingsTabSystemCore": "Cœur",
|
"SettingsTabSystemCore": "Cœur",
|
||||||
"SettingsTabSystemSystemRegion": "Région du système:",
|
"SettingsTabSystemSystemRegion": "Région du système :",
|
||||||
"SettingsTabSystemSystemRegionJapan": "Japon",
|
"SettingsTabSystemSystemRegionJapan": "Japon",
|
||||||
"SettingsTabSystemSystemRegionUSA": "USA",
|
"SettingsTabSystemSystemRegionUSA": "USA",
|
||||||
"SettingsTabSystemSystemRegionEurope": "Europe",
|
"SettingsTabSystemSystemRegionEurope": "Europe",
|
||||||
@@ -119,7 +120,7 @@
|
|||||||
"SettingsTabSystemSystemRegionChina": "Chine",
|
"SettingsTabSystemSystemRegionChina": "Chine",
|
||||||
"SettingsTabSystemSystemRegionKorea": "Corée",
|
"SettingsTabSystemSystemRegionKorea": "Corée",
|
||||||
"SettingsTabSystemSystemRegionTaiwan": "Taïwan",
|
"SettingsTabSystemSystemRegionTaiwan": "Taïwan",
|
||||||
"SettingsTabSystemSystemLanguage": "Langue du système:",
|
"SettingsTabSystemSystemLanguage": "Langue du système :",
|
||||||
"SettingsTabSystemSystemLanguageJapanese": "Japonais",
|
"SettingsTabSystemSystemLanguageJapanese": "Japonais",
|
||||||
"SettingsTabSystemSystemLanguageAmericanEnglish": "Anglais Américain",
|
"SettingsTabSystemSystemLanguageAmericanEnglish": "Anglais Américain",
|
||||||
"SettingsTabSystemSystemLanguageFrench": "Français",
|
"SettingsTabSystemSystemLanguageFrench": "Français",
|
||||||
@@ -138,10 +139,10 @@
|
|||||||
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Chinois simplifié",
|
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Chinois simplifié",
|
||||||
"SettingsTabSystemSystemLanguageTraditionalChinese": "Chinois traditionnel",
|
"SettingsTabSystemSystemLanguageTraditionalChinese": "Chinois traditionnel",
|
||||||
"SettingsTabSystemSystemTimeZone": "Fuseau horaire du système :",
|
"SettingsTabSystemSystemTimeZone": "Fuseau horaire du système :",
|
||||||
"SettingsTabSystemSystemTime": "Heure du système:",
|
"SettingsTabSystemSystemTime": "Heure du système :",
|
||||||
"SettingsTabSystemEnableVsync": "Synchronisation verticale (VSync)",
|
"SettingsTabSystemEnableVsync": "Synchronisation verticale (VSync)",
|
||||||
"SettingsTabSystemEnablePptc": "Activer le PPTC (Profiled Persistent Translation Cache)",
|
"SettingsTabSystemEnablePptc": "Activer le PPTC (Profiled Persistent Translation Cache)",
|
||||||
"SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC",
|
"SettingsTabSystemEnableLowPowerPptc": "PPTC à faible puissance",
|
||||||
"SettingsTabSystemEnableFsIntegrityChecks": "Activer la vérification de l'intégrité du système de fichiers",
|
"SettingsTabSystemEnableFsIntegrityChecks": "Activer la vérification de l'intégrité du système de fichiers",
|
||||||
"SettingsTabSystemAudioBackend": "Bibliothèque Audio :",
|
"SettingsTabSystemAudioBackend": "Bibliothèque Audio :",
|
||||||
"SettingsTabSystemAudioBackendDummy": "Désactivée",
|
"SettingsTabSystemAudioBackendDummy": "Désactivée",
|
||||||
@@ -150,23 +151,23 @@
|
|||||||
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
||||||
"SettingsTabSystemHacks": "Hacks",
|
"SettingsTabSystemHacks": "Hacks",
|
||||||
"SettingsTabSystemHacksNote": "Cela peut causer des instabilités",
|
"SettingsTabSystemHacksNote": "Cela peut causer des instabilités",
|
||||||
"SettingsTabSystemDramSize": "Taille de la DRAM:",
|
"SettingsTabSystemDramSize": "Taille de la DRAM :",
|
||||||
"SettingsTabSystemDramSize4GiB": "4GiO",
|
"SettingsTabSystemDramSize4GiB": "4GiO",
|
||||||
"SettingsTabSystemDramSize6GiB": "6GiO",
|
"SettingsTabSystemDramSize6GiB": "6GiO",
|
||||||
"SettingsTabSystemDramSize8GiB": "8GiO",
|
"SettingsTabSystemDramSize8GiB": "8GiO",
|
||||||
"SettingsTabSystemDramSize12GiB": "12GiO",
|
"SettingsTabSystemDramSize12GiB": "12GiO",
|
||||||
"SettingsTabSystemIgnoreMissingServices": "Ignorer les services manquants",
|
"SettingsTabSystemIgnoreMissingServices": "Ignorer les services manquants",
|
||||||
"SettingsTabSystemIgnoreApplet": "Ignorer l'applet",
|
"SettingsTabSystemIgnoreApplet": "Ignorer la déconnexion de la manette",
|
||||||
"SettingsTabGraphics": "Graphismes",
|
"SettingsTabGraphics": "Graphismes",
|
||||||
"SettingsTabGraphicsAPI": "API Graphique",
|
"SettingsTabGraphicsAPI": "API Graphique",
|
||||||
"SettingsTabGraphicsEnableShaderCache": "Activer le cache des shaders",
|
"SettingsTabGraphicsEnableShaderCache": "Activer le cache des shaders",
|
||||||
"SettingsTabGraphicsAnisotropicFiltering": "Filtrage anisotrope:",
|
"SettingsTabGraphicsAnisotropicFiltering": "Filtrage anisotrope :",
|
||||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "Auto",
|
"SettingsTabGraphicsAnisotropicFilteringAuto": "Auto",
|
||||||
"SettingsTabGraphicsAnisotropicFiltering2x": "x2",
|
"SettingsTabGraphicsAnisotropicFiltering2x": "x2",
|
||||||
"SettingsTabGraphicsAnisotropicFiltering4x": "x4",
|
"SettingsTabGraphicsAnisotropicFiltering4x": "x4",
|
||||||
"SettingsTabGraphicsAnisotropicFiltering8x": "x8",
|
"SettingsTabGraphicsAnisotropicFiltering8x": "x8",
|
||||||
"SettingsTabGraphicsAnisotropicFiltering16x": "x16",
|
"SettingsTabGraphicsAnisotropicFiltering16x": "x16",
|
||||||
"SettingsTabGraphicsResolutionScale": "Échelle de résolution:",
|
"SettingsTabGraphicsResolutionScale": "Échelle de résolution :",
|
||||||
"SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)",
|
"SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)",
|
||||||
"SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)",
|
"SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)",
|
||||||
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
|
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
|
||||||
@@ -180,7 +181,7 @@
|
|||||||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||||
"SettingsTabGraphicsAspectRatioStretch": "Étirer pour remplir la fenêtre",
|
"SettingsTabGraphicsAspectRatioStretch": "Étirer pour remplir la fenêtre",
|
||||||
"SettingsTabGraphicsDeveloperOptions": "Options développeur",
|
"SettingsTabGraphicsDeveloperOptions": "Options développeur",
|
||||||
"SettingsTabGraphicsShaderDumpPath": "Chemin du dossier de copie des shaders:",
|
"SettingsTabGraphicsShaderDumpPath": "Chemin du dossier de copie des shaders :",
|
||||||
"SettingsTabLogging": "Journaux",
|
"SettingsTabLogging": "Journaux",
|
||||||
"SettingsTabLoggingLogging": "Journaux",
|
"SettingsTabLoggingLogging": "Journaux",
|
||||||
"SettingsTabLoggingEnableLoggingToFile": "Activer la sauvegarde des journaux vers un fichier",
|
"SettingsTabLoggingEnableLoggingToFile": "Activer la sauvegarde des journaux vers un fichier",
|
||||||
@@ -188,10 +189,10 @@
|
|||||||
"SettingsTabLoggingEnableInfoLogs": "Activer les journaux d'informations",
|
"SettingsTabLoggingEnableInfoLogs": "Activer les journaux d'informations",
|
||||||
"SettingsTabLoggingEnableWarningLogs": "Activer les journaux d'avertissements",
|
"SettingsTabLoggingEnableWarningLogs": "Activer les journaux d'avertissements",
|
||||||
"SettingsTabLoggingEnableErrorLogs": "Activer les journaux d'erreurs",
|
"SettingsTabLoggingEnableErrorLogs": "Activer les journaux d'erreurs",
|
||||||
"SettingsTabLoggingEnableTraceLogs": "Activer journaux d'erreurs Trace",
|
"SettingsTabLoggingEnableTraceLogs": "Activer les journaux d'erreurs Trace",
|
||||||
"SettingsTabLoggingEnableGuestLogs": "Activer les journaux du programme simulé",
|
"SettingsTabLoggingEnableGuestLogs": "Activer les journaux du programme simulé",
|
||||||
"SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux d'accès au système de fichiers",
|
"SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux d'accès au système de fichiers",
|
||||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux d'accès au système de fichiers:",
|
"SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux d'accès au système de fichiers :",
|
||||||
"SettingsTabLoggingDeveloperOptions": "Options développeur",
|
"SettingsTabLoggingDeveloperOptions": "Options développeur",
|
||||||
"SettingsTabLoggingDeveloperOptionsNote": "ATTENTION : Réduira les performances",
|
"SettingsTabLoggingDeveloperOptionsNote": "ATTENTION : Réduira les performances",
|
||||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Niveau du journal du backend graphique :",
|
"SettingsTabLoggingGraphicsBackendLogLevel": "Niveau du journal du backend graphique :",
|
||||||
@@ -223,7 +224,7 @@
|
|||||||
"ControllerSettingsDeviceDisabled": "Désactivé",
|
"ControllerSettingsDeviceDisabled": "Désactivé",
|
||||||
"ControllerSettingsControllerType": "Type de manette",
|
"ControllerSettingsControllerType": "Type de manette",
|
||||||
"ControllerSettingsControllerTypeHandheld": "Portable",
|
"ControllerSettingsControllerTypeHandheld": "Portable",
|
||||||
"ControllerSettingsControllerTypeProController": "Pro Controller",
|
"ControllerSettingsControllerTypeProController": "Manette Switch Pro",
|
||||||
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Joints",
|
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Joints",
|
||||||
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon Gauche",
|
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon Gauche",
|
||||||
"ControllerSettingsControllerTypeJoyConRight": "JoyCon Droite",
|
"ControllerSettingsControllerTypeJoyConRight": "JoyCon Droite",
|
||||||
@@ -271,15 +272,15 @@
|
|||||||
"ControllerSettingsExtraButtonsLeft": "Boutons Gauche",
|
"ControllerSettingsExtraButtonsLeft": "Boutons Gauche",
|
||||||
"ControllerSettingsExtraButtonsRight": "Boutons Droite",
|
"ControllerSettingsExtraButtonsRight": "Boutons Droite",
|
||||||
"ControllerSettingsMisc": "Divers",
|
"ControllerSettingsMisc": "Divers",
|
||||||
"ControllerSettingsTriggerThreshold": "Seuil de gachettes:",
|
"ControllerSettingsTriggerThreshold": "Seuil de gachettes :",
|
||||||
"ControllerSettingsMotion": "Mouvements",
|
"ControllerSettingsMotion": "Mouvements",
|
||||||
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "Utiliser un capteur de mouvements CemuHook",
|
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "Utiliser un capteur de mouvements CemuHook",
|
||||||
"ControllerSettingsMotionControllerSlot": "Contrôleur ID:",
|
"ControllerSettingsMotionControllerSlot": "Contrôleur ID :",
|
||||||
"ControllerSettingsMotionMirrorInput": "Inverser les contrôles",
|
"ControllerSettingsMotionMirrorInput": "Inverser les contrôles",
|
||||||
"ControllerSettingsMotionRightJoyConSlot": "JoyCon Droit ID:",
|
"ControllerSettingsMotionRightJoyConSlot": "JoyCon Droit ID :",
|
||||||
"ControllerSettingsMotionServerHost": "Serveur d'hébergement :",
|
"ControllerSettingsMotionServerHost": "Serveur d'hébergement :",
|
||||||
"ControllerSettingsMotionGyroSensitivity": "Sensibilitée du gyroscope:",
|
"ControllerSettingsMotionGyroSensitivity": "Sensibilitée du gyroscope :",
|
||||||
"ControllerSettingsMotionGyroDeadzone": "Zone morte du gyroscope:",
|
"ControllerSettingsMotionGyroDeadzone": "Zone morte du gyroscope :",
|
||||||
"ControllerSettingsSave": "Enregistrer",
|
"ControllerSettingsSave": "Enregistrer",
|
||||||
"ControllerSettingsClose": "Fermer",
|
"ControllerSettingsClose": "Fermer",
|
||||||
"KeyUnknown": "Touche inconnue",
|
"KeyUnknown": "Touche inconnue",
|
||||||
@@ -386,7 +387,7 @@
|
|||||||
"UserProfilesSelectedUserProfile": "Profil utilisateur sélectionné :",
|
"UserProfilesSelectedUserProfile": "Profil utilisateur sélectionné :",
|
||||||
"UserProfilesSaveProfileName": "Enregistrer le nom du profil",
|
"UserProfilesSaveProfileName": "Enregistrer le nom du profil",
|
||||||
"UserProfilesChangeProfileImage": "Changer l'image du profil",
|
"UserProfilesChangeProfileImage": "Changer l'image du profil",
|
||||||
"UserProfilesAvailableUserProfiles": "Profils utilisateurs disponibles:",
|
"UserProfilesAvailableUserProfiles": "Profils utilisateurs disponibles :",
|
||||||
"UserProfilesAddNewProfile": "Créer un profil",
|
"UserProfilesAddNewProfile": "Créer un profil",
|
||||||
"UserProfilesDelete": "Supprimer",
|
"UserProfilesDelete": "Supprimer",
|
||||||
"UserProfilesClose": "Fermer",
|
"UserProfilesClose": "Fermer",
|
||||||
@@ -407,6 +408,7 @@
|
|||||||
"AvatarClose": "Fermer",
|
"AvatarClose": "Fermer",
|
||||||
"ControllerSettingsLoadProfileToolTip": "Charger un profil",
|
"ControllerSettingsLoadProfileToolTip": "Charger un profil",
|
||||||
"ControllerSettingsAddProfileToolTip": "Ajouter un profil",
|
"ControllerSettingsAddProfileToolTip": "Ajouter un profil",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "Supprimer un profil",
|
"ControllerSettingsRemoveProfileToolTip": "Supprimer un profil",
|
||||||
"ControllerSettingsSaveProfileToolTip": "Enregistrer un profil",
|
"ControllerSettingsSaveProfileToolTip": "Enregistrer un profil",
|
||||||
"MenuBarFileToolsTakeScreenshot": "Prendre une capture d'écran",
|
"MenuBarFileToolsTakeScreenshot": "Prendre une capture d'écran",
|
||||||
@@ -436,7 +438,7 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "Une erreur s'est produite lors de la recherche de la sauvegarde spécifiée : {0}",
|
"DialogMessageFindSaveErrorMessage": "Une erreur s'est produite lors de la recherche de la sauvegarde spécifiée : {0}",
|
||||||
"FolderDialogExtractTitle": "Choisissez le dossier dans lequel extraire",
|
"FolderDialogExtractTitle": "Choisissez le dossier dans lequel extraire",
|
||||||
"DialogNcaExtractionMessage": "Extraction de la section {0} depuis {1}...",
|
"DialogNcaExtractionMessage": "Extraction de la section {0} depuis {1}...",
|
||||||
"DialogNcaExtractionTitle": "Ryujinx - Extracteur de la section NCA",
|
"DialogNcaExtractionTitle": "Extracteur de la section NCA",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Échec de l'extraction. Le NCA principal n'était pas présent dans le fichier sélectionné.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Échec de l'extraction. Le NCA principal n'était pas présent dans le fichier sélectionné.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "Échec de l'extraction. Lisez le fichier journal pour plus d'informations.",
|
"DialogNcaExtractionCheckLogErrorMessage": "Échec de l'extraction. Lisez le fichier journal pour plus d'informations.",
|
||||||
"DialogNcaExtractionSuccessMessage": "Extraction terminée avec succès.",
|
"DialogNcaExtractionSuccessMessage": "Extraction terminée avec succès.",
|
||||||
@@ -519,7 +521,7 @@
|
|||||||
"DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
"DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||||
"DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?",
|
"DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||||
"SettingsTabGraphicsFeaturesOptions": "Fonctionnalités",
|
"SettingsTabGraphicsFeaturesOptions": "Fonctionnalités",
|
||||||
"SettingsTabGraphicsBackendMultithreading": "Interface graphique multithread",
|
"SettingsTabGraphicsBackendMultithreading": "Interface graphique multithread :",
|
||||||
"CommonAuto": "Auto",
|
"CommonAuto": "Auto",
|
||||||
"CommonOff": "Désactivé",
|
"CommonOff": "Désactivé",
|
||||||
"CommonOn": "Activé",
|
"CommonOn": "Activé",
|
||||||
@@ -584,14 +586,14 @@
|
|||||||
"LowPowerPptcToggleTooltip": "Charger le PPTC en utilisant un tiers des coeurs.",
|
"LowPowerPptcToggleTooltip": "Charger le PPTC en utilisant un tiers des coeurs.",
|
||||||
"FsIntegrityToggleTooltip": "Vérifie si des fichiers sont corrompus lors du lancement d'un jeu, et si des fichiers corrompus sont détectés, affiche une erreur de hachage dans la console.\n\nN'a aucun impact sur les performances et est destiné à aider le dépannage.\n\nLaissez activé en cas d'incertitude.",
|
"FsIntegrityToggleTooltip": "Vérifie si des fichiers sont corrompus lors du lancement d'un jeu, et si des fichiers corrompus sont détectés, affiche une erreur de hachage dans la console.\n\nN'a aucun impact sur les performances et est destiné à aider le dépannage.\n\nLaissez activé en cas d'incertitude.",
|
||||||
"AudioBackendTooltip": "Modifie le backend utilisé pour donnée un rendu audio.\n\nSDL2 est recommandé, tandis que OpenAL et SoundIO sont utilisés comme backend secondaire. Le backend Dummy (Désactivé) ne rend aucun son.\n\nLaissez sur SDL2 si vous n'êtes pas sûr.",
|
"AudioBackendTooltip": "Modifie le backend utilisé pour donnée un rendu audio.\n\nSDL2 est recommandé, tandis que OpenAL et SoundIO sont utilisés comme backend secondaire. Le backend Dummy (Désactivé) ne rend aucun son.\n\nLaissez sur SDL2 si vous n'êtes pas sûr.",
|
||||||
"MemoryManagerTooltip": "Change la façon dont la mémoire émulée est mappée et utilisée. Cela affecte grandement les performances du processeur.\n\nRéglez sur Host Uncheked en cas d'incertitude.",
|
"MemoryManagerTooltip": "Change la façon dont la mémoire émulée est mappée et utilisée. Cela affecte grandement les performances du processeur.\n\nRéglez sur Hôte non vérifié en cas d'incertitude.",
|
||||||
"MemoryManagerSoftwareTooltip": "Utilisez une table logicielle pour la traduction d'adresses. La plus grande précision est fournie, mais les performances en seront impactées.",
|
"MemoryManagerSoftwareTooltip": "Utilisez une table logicielle pour la traduction d'adresses. La plus grande précision est fournie, mais les performances en seront impactées.",
|
||||||
"MemoryManagerHostTooltip": "Mappez directement la mémoire dans l'espace d'adresses de l'hôte. Compilation et exécution JIT beaucoup plus rapides.",
|
"MemoryManagerHostTooltip": "Mappez directement la mémoire dans l'espace d'adresses de l'hôte. Compilation et exécution JIT beaucoup plus rapides.",
|
||||||
"MemoryManagerUnsafeTooltip": "Mapper directement la mémoire dans la carte, mais ne pas masquer l'adresse dans l'espace d'adressage du client avant l'accès. Plus rapide, mais la sécurité sera négligée. L'application peut accéder à la mémoire depuis n'importe où dans Ryujinx, donc exécutez uniquement les programmes en qui vous avez confiance avec ce mode.",
|
"MemoryManagerUnsafeTooltip": "Mapper directement la mémoire dans la carte, mais ne pas masquer l'adresse dans l'espace d'adressage du client avant l'accès. Plus rapide, mais la sécurité sera négligée. L'application peut accéder à la mémoire depuis n'importe où dans Ryujinx, donc exécutez uniquement les programmes en qui vous avez confiance avec ce mode.",
|
||||||
"UseHypervisorTooltip": "Utiliser l'Hyperviseur au lieu du JIT. Améliore considérablement les performances lorsqu'il est disponible, mais peut être instable dans son état actuel.",
|
"UseHypervisorTooltip": "Utiliser l'Hyperviseur au lieu du JIT. Améliore considérablement les performances lorsqu'il est disponible, mais peut être instable dans son état actuel.",
|
||||||
"DRamTooltip": "Utilise une disposition alternative de la mémoire avec 8GiO de DRAM pour imiter le kit de développeur de la Switch.\n\nActivez cette option pour les packs de textures 4k ou les mods à résolution 4k.\nN'améliore pas les performances.\n\nLaissez désactivé en cas d'incertitude.",
|
"DRamTooltip": "Change le montant de DRAM qui est alloué.\n\nActivez cette option pour les packs de textures 4k ou les mods à résolution 4k.\nN'améliore pas les performances.\n\nLaissez à 4GiO en cas de doute.",
|
||||||
"IgnoreMissingServicesTooltip": "Ignore les services Horizon OS non-intégré. Cela peut aider à contourner les plantages lors du démarrage de certains jeux.\n\nActivez-le en cas d'incertitude.",
|
"IgnoreMissingServicesTooltip": "Ignore les services Horizon OS non-intégrés. Cela peut aider à contourner les plantages lors du démarrage de certains jeux.\n\nLaissez désactivé en cas d'incertitude.",
|
||||||
"IgnoreAppletTooltip": "La boîte de dialogue externe \"Applet du contrôleur\" n'apparaîtra pas si la manette est déconnectée pendant le jeu. Il n'y aura aucune invite pour fermer la boîte de dialogue ou configurer un nouveau contrôleur. Une fois que le contrôleur précédemment déconnecté est reconnecté, le jeu reprendra automatiquement.",
|
"IgnoreAppletTooltip": "La boîte de dialogue externe \"Programme Manette\" n'apparaîtra pas si la manette est déconnectée en jeu. Il n'y aura aucune boîte de dialogue ouverte pour configurer une nouvelle manette. Une fois que la manette précédemment déconnectée est reconnectée, le jeu reprendra automatiquement. \n\nLaissez désactivé en cas d'incertitude.",
|
||||||
"GraphicsBackendThreadingTooltip": "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.",
|
"GraphicsBackendThreadingTooltip": "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.",
|
||||||
"GalThreadingTooltip": "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.",
|
"GalThreadingTooltip": "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.",
|
||||||
"ShaderCacheToggleTooltip": "Enregistre un cache de shaders sur le disque dur, réduit le lag lors de multiples exécutions.\n\nLaissez activé si vous n'êtes pas sûr.",
|
"ShaderCacheToggleTooltip": "Enregistre un cache de shaders sur le disque dur, réduit le lag lors de multiples exécutions.\n\nLaissez activé si vous n'êtes pas sûr.",
|
||||||
@@ -599,15 +601,15 @@
|
|||||||
"ResolutionScaleEntryTooltip": "É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.",
|
"ResolutionScaleEntryTooltip": "É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.",
|
||||||
"AnisotropyTooltip": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.",
|
"AnisotropyTooltip": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.",
|
||||||
"AspectRatioTooltip": "Format d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.",
|
"AspectRatioTooltip": "Format d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.",
|
||||||
"ShaderDumpPathTooltip": "Chemin de copie des Shaders",
|
"ShaderDumpPathTooltip": "Chemin de copie des Shaders :",
|
||||||
"FileLogTooltip": "Sauvegarde le journal de la console dans un fichier journal sur le disque. Cela n'affecte pas les performances.",
|
"FileLogTooltip": "Sauvegarde le journal de la console dans un fichier journal sur le disque. Cela n'affecte pas les performances.",
|
||||||
"StubLogTooltip": "Affiche les messages de log dans la console. N'affecte pas les performances.",
|
"StubLogTooltip": "Affiche les messages de journaux dans la console. N'affecte pas les performances.",
|
||||||
"InfoLogTooltip": "Affiche les messages de log d'informations dans la console. N'affecte pas les performances.",
|
"InfoLogTooltip": "Affiche les messages de journaux d'informations dans la console. N'affecte pas les performances.",
|
||||||
"WarnLogTooltip": "Affiche les messages d'avertissement dans la console. N'affecte pas les performances.",
|
"WarnLogTooltip": "Affiche les messages d'avertissement dans la console. N'affecte pas les performances.",
|
||||||
"ErrorLogTooltip": "Affiche les messages de log d'erreur dans la console. N'affecte pas les performances.",
|
"ErrorLogTooltip": "Affiche les messages de journaux d'erreur dans la console. N'affecte pas les performances.",
|
||||||
"TraceLogTooltip": "Affiche la trace des messages de log dans la console. N'affecte pas les performances.",
|
"TraceLogTooltip": "Affiche la trace des messages de journaux dans la console. N'affecte pas les performances.",
|
||||||
"GuestLogTooltip": "Affiche les messages de log des invités dans la console. N'affecte pas les performances.",
|
"GuestLogTooltip": "Affiche les messages de journaux des invités dans la console. N'affecte pas les performances.",
|
||||||
"FileAccessLogTooltip": "Affiche les messages de log d'accès aux fichiers dans la console.",
|
"FileAccessLogTooltip": "Affiche les messages de journaux d'accès aux fichiers dans la console.",
|
||||||
"FSAccessLogModeTooltip": "Active la sortie du journal d'accès FS de la console. Les modes possibles sont 0-3",
|
"FSAccessLogModeTooltip": "Active la sortie du journal d'accès FS de la console. Les modes possibles sont 0-3",
|
||||||
"DeveloperOptionTooltip": "À utiliser avec précaution",
|
"DeveloperOptionTooltip": "À utiliser avec précaution",
|
||||||
"OpenGlLogLevel": "Nécessite l'activation des niveaux de journalisation appropriés",
|
"OpenGlLogLevel": "Nécessite l'activation des niveaux de journalisation appropriés",
|
||||||
@@ -639,12 +641,12 @@
|
|||||||
"ControllerSettingsStickRange": "Intervalle :",
|
"ControllerSettingsStickRange": "Intervalle :",
|
||||||
"DialogStopEmulationTitle": "Ryujinx - Arrêt de l'émulation",
|
"DialogStopEmulationTitle": "Ryujinx - Arrêt de l'émulation",
|
||||||
"DialogStopEmulationMessage": "Êtes-vous sûr de vouloir arrêter l'émulation ?",
|
"DialogStopEmulationMessage": "Êtes-vous sûr de vouloir arrêter l'émulation ?",
|
||||||
"SettingsTabCpu": "CPU",
|
"SettingsTabCpu": "Processeur",
|
||||||
"SettingsTabAudio": "Audio",
|
"SettingsTabAudio": "Audio",
|
||||||
"SettingsTabNetwork": "Réseau",
|
"SettingsTabNetwork": "Réseau",
|
||||||
"SettingsTabNetworkConnection": "Connexion réseau",
|
"SettingsTabNetworkConnection": "Connexion réseau",
|
||||||
"SettingsTabCpuCache": "Cache CPU",
|
"SettingsTabCpuCache": "Cache Processeur",
|
||||||
"SettingsTabCpuMemory": "Mémoire CPU",
|
"SettingsTabCpuMemory": "Mémoire Processeur",
|
||||||
"DialogUpdaterFlatpakNotSupportedMessage": "Merci de mettre à jour Ryujinx via FlatHub.",
|
"DialogUpdaterFlatpakNotSupportedMessage": "Merci de mettre à jour Ryujinx via FlatHub.",
|
||||||
"UpdaterDisabledWarningTitle": "Mises à jour désactivées !",
|
"UpdaterDisabledWarningTitle": "Mises à jour désactivées !",
|
||||||
"ControllerSettingsRotate90": "Faire pivoter de 90° à droite",
|
"ControllerSettingsRotate90": "Faire pivoter de 90° à droite",
|
||||||
@@ -668,7 +670,7 @@
|
|||||||
"NoUpdate": "Aucune mise à jour",
|
"NoUpdate": "Aucune mise à jour",
|
||||||
"TitleUpdateVersionLabel": "Version {0}",
|
"TitleUpdateVersionLabel": "Version {0}",
|
||||||
"TitleBundledUpdateVersionLabel": "Inclus avec le jeu: Version {0}",
|
"TitleBundledUpdateVersionLabel": "Inclus avec le jeu: Version {0}",
|
||||||
"TitleBundledDlcLabel": "Inclus avec le jeu:",
|
"TitleBundledDlcLabel": "Inclus avec le jeu :",
|
||||||
"RyujinxInfo": "Ryujinx - Info",
|
"RyujinxInfo": "Ryujinx - Info",
|
||||||
"RyujinxConfirm": "Ryujinx - Confirmation",
|
"RyujinxConfirm": "Ryujinx - Confirmation",
|
||||||
"FileDialogAllTypes": "Tous les types",
|
"FileDialogAllTypes": "Tous les types",
|
||||||
@@ -680,7 +682,7 @@
|
|||||||
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
|
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
|
||||||
"SoftwareKeyboardModeASCII": "Doit être uniquement du texte ASCII",
|
"SoftwareKeyboardModeASCII": "Doit être uniquement du texte ASCII",
|
||||||
"ControllerAppletControllers": "Contrôleurs pris en charge :",
|
"ControllerAppletControllers": "Contrôleurs pris en charge :",
|
||||||
"ControllerAppletPlayers": "Joueurs :",
|
"ControllerAppletPlayers": "Joueurs :",
|
||||||
"ControllerAppletDescription": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.",
|
"ControllerAppletDescription": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.",
|
||||||
"ControllerAppletDocked": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.",
|
"ControllerAppletDocked": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.",
|
||||||
"UpdaterRenaming": "Renommage des anciens fichiers...",
|
"UpdaterRenaming": "Renommage des anciens fichiers...",
|
||||||
@@ -729,7 +731,7 @@
|
|||||||
"UpdateWindowUpdateAddedMessage": "{0} nouvelle(s) mise(s) à jour ajoutée(s)",
|
"UpdateWindowUpdateAddedMessage": "{0} nouvelle(s) mise(s) à jour ajoutée(s)",
|
||||||
"UpdateWindowBundledContentNotice": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.",
|
"UpdateWindowBundledContentNotice": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.",
|
||||||
"CheatWindowHeading": "Cheats disponibles pour {0} [{1}]",
|
"CheatWindowHeading": "Cheats disponibles pour {0} [{1}]",
|
||||||
"BuildId": "BuildId:",
|
"BuildId": "BuildId :",
|
||||||
"DlcWindowBundledContentNotice": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.",
|
"DlcWindowBundledContentNotice": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.",
|
||||||
"DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)",
|
"DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)",
|
||||||
"DlcWindowDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",
|
"DlcWindowDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",
|
||||||
@@ -797,7 +799,7 @@
|
|||||||
"UserEditorTitle": "Modifier Utilisateur",
|
"UserEditorTitle": "Modifier Utilisateur",
|
||||||
"UserEditorTitleCreate": "Créer Utilisateur",
|
"UserEditorTitleCreate": "Créer Utilisateur",
|
||||||
"SettingsTabNetworkInterface": "Interface Réseau :",
|
"SettingsTabNetworkInterface": "Interface Réseau :",
|
||||||
"NetworkInterfaceTooltip": "L'interface réseau utilisée pour les fonctionnalités LAN/LDN.\n\nEn conjonction avec un VPN ou XLink Kai et un jeu prenant en charge le LAN, peut être utilisée pour simuler une connexion sur le même réseau via Internet.\n\nLaissez sur PAR DÉFAU T si vous n'êtes pas sûr.",
|
"NetworkInterfaceTooltip": "L'interface réseau utilisée pour les fonctionnalités LAN/LDN.\n\nEn conjonction avec un VPN ou XLink Kai et un jeu prenant en charge le LAN, peut être utilisée pour simuler une connexion sur le même réseau via Internet.\n\nLaissez sur PAR DÉFAUT si vous n'êtes pas sûr.",
|
||||||
"NetworkInterfaceDefault": "Par défaut",
|
"NetworkInterfaceDefault": "Par défaut",
|
||||||
"PackagingShaders": "Empaquetage des Shaders",
|
"PackagingShaders": "Empaquetage des Shaders",
|
||||||
"AboutChangelogButton": "Voir le Changelog sur GitHub",
|
"AboutChangelogButton": "Voir le Changelog sur GitHub",
|
||||||
|
@@ -10,7 +10,10 @@
|
|||||||
"SettingsTabSystemUseHypervisor": "השתמש ב Hypervisor",
|
"SettingsTabSystemUseHypervisor": "השתמש ב Hypervisor",
|
||||||
"MenuBarFile": "_קובץ",
|
"MenuBarFile": "_קובץ",
|
||||||
"MenuBarFileOpenFromFile": "_טען יישום מקובץ",
|
"MenuBarFileOpenFromFile": "_טען יישום מקובץ",
|
||||||
|
"MenuBarFileOpenFromFileError": "No applications found in selected file.",
|
||||||
"MenuBarFileOpenUnpacked": "טען משחק _שאינו ארוז",
|
"MenuBarFileOpenUnpacked": "טען משחק _שאינו ארוז",
|
||||||
|
"MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
|
||||||
|
"MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
|
||||||
"MenuBarFileOpenEmuFolder": "פתח את תיקיית ריוג'ינקס",
|
"MenuBarFileOpenEmuFolder": "פתח את תיקיית ריוג'ינקס",
|
||||||
"MenuBarFileOpenLogsFolder": "פתח את תיקיית קבצי הלוג",
|
"MenuBarFileOpenLogsFolder": "פתח את תיקיית קבצי הלוג",
|
||||||
"MenuBarFileExit": "_יציאה",
|
"MenuBarFileExit": "_יציאה",
|
||||||
@@ -97,11 +100,14 @@
|
|||||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "בדוק אם קיימים עדכונים בהפעלה",
|
"SettingsTabGeneralCheckUpdatesOnLaunch": "בדוק אם קיימים עדכונים בהפעלה",
|
||||||
"SettingsTabGeneralShowConfirmExitDialog": "הראה דיאלוג \"אשר יציאה\"",
|
"SettingsTabGeneralShowConfirmExitDialog": "הראה דיאלוג \"אשר יציאה\"",
|
||||||
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
|
||||||
|
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
|
||||||
"SettingsTabGeneralHideCursor": "הסתר את הסמן",
|
"SettingsTabGeneralHideCursor": "הסתר את הסמן",
|
||||||
"SettingsTabGeneralHideCursorNever": "אף פעם",
|
"SettingsTabGeneralHideCursorNever": "אף פעם",
|
||||||
"SettingsTabGeneralHideCursorOnIdle": "במצב סרק",
|
"SettingsTabGeneralHideCursorOnIdle": "במצב סרק",
|
||||||
"SettingsTabGeneralHideCursorAlways": "תמיד",
|
"SettingsTabGeneralHideCursorAlways": "תמיד",
|
||||||
"SettingsTabGeneralGameDirectories": "תקיות משחקים",
|
"SettingsTabGeneralGameDirectories": "תקיות משחקים",
|
||||||
|
"SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
|
||||||
|
"SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
|
||||||
"SettingsTabGeneralAdd": "הוסף",
|
"SettingsTabGeneralAdd": "הוסף",
|
||||||
"SettingsTabGeneralRemove": "הסר",
|
"SettingsTabGeneralRemove": "הסר",
|
||||||
"SettingsTabSystem": "מערכת",
|
"SettingsTabSystem": "מערכת",
|
||||||
@@ -401,6 +407,7 @@
|
|||||||
"AvatarSetBackgroundColor": "הגדר צבע רקע",
|
"AvatarSetBackgroundColor": "הגדר צבע רקע",
|
||||||
"AvatarClose": "סגור",
|
"AvatarClose": "סגור",
|
||||||
"ControllerSettingsLoadProfileToolTip": "טען פרופיל",
|
"ControllerSettingsLoadProfileToolTip": "טען פרופיל",
|
||||||
|
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||||
"ControllerSettingsAddProfileToolTip": "הוסף פרופיל",
|
"ControllerSettingsAddProfileToolTip": "הוסף פרופיל",
|
||||||
"ControllerSettingsRemoveProfileToolTip": "הסר פרופיל",
|
"ControllerSettingsRemoveProfileToolTip": "הסר פרופיל",
|
||||||
"ControllerSettingsSaveProfileToolTip": "שמור פרופיל",
|
"ControllerSettingsSaveProfileToolTip": "שמור פרופיל",
|
||||||
@@ -410,6 +417,7 @@
|
|||||||
"GameListContextMenuToggleFavorite": "למתג העדפה",
|
"GameListContextMenuToggleFavorite": "למתג העדפה",
|
||||||
"GameListContextMenuToggleFavoriteToolTip": "למתג סטטוס העדפה של משחק",
|
"GameListContextMenuToggleFavoriteToolTip": "למתג סטטוס העדפה של משחק",
|
||||||
"SettingsTabGeneralTheme": "ערכת נושא:",
|
"SettingsTabGeneralTheme": "ערכת נושא:",
|
||||||
|
"SettingsTabGeneralThemeAuto": "Auto",
|
||||||
"SettingsTabGeneralThemeDark": "כהה",
|
"SettingsTabGeneralThemeDark": "כהה",
|
||||||
"SettingsTabGeneralThemeLight": "בהיר",
|
"SettingsTabGeneralThemeLight": "בהיר",
|
||||||
"ControllerSettingsConfigureGeneral": "הגדר",
|
"ControllerSettingsConfigureGeneral": "הגדר",
|
||||||
@@ -430,7 +438,7 @@
|
|||||||
"DialogMessageFindSaveErrorMessage": "אירעה שגיאה במציאת שמור המשחק שצויין: {0}",
|
"DialogMessageFindSaveErrorMessage": "אירעה שגיאה במציאת שמור המשחק שצויין: {0}",
|
||||||
"FolderDialogExtractTitle": "בחרו את התיקייה לחילוץ",
|
"FolderDialogExtractTitle": "בחרו את התיקייה לחילוץ",
|
||||||
"DialogNcaExtractionMessage": "מלחץ {0} ממקטע {1}...",
|
"DialogNcaExtractionMessage": "מלחץ {0} ממקטע {1}...",
|
||||||
"DialogNcaExtractionTitle": "ריוג'ינקס - מחלץ מקטע NCA",
|
"DialogNcaExtractionTitle": "מחלץ מקטע NCA",
|
||||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "כשל בחילוץ. ה-NCA הראשי לא היה קיים בקובץ שנבחר.",
|
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "כשל בחילוץ. ה-NCA הראשי לא היה קיים בקובץ שנבחר.",
|
||||||
"DialogNcaExtractionCheckLogErrorMessage": "כשל בחילוץ. קרא את קובץ הרישום למידע נוסף.",
|
"DialogNcaExtractionCheckLogErrorMessage": "כשל בחילוץ. קרא את קובץ הרישום למידע נוסף.",
|
||||||
"DialogNcaExtractionSuccessMessage": "החילוץ הושלם בהצלחה.",
|
"DialogNcaExtractionSuccessMessage": "החילוץ הושלם בהצלחה.",
|
||||||
@@ -560,6 +568,9 @@
|
|||||||
"AddGameDirBoxTooltip": "הזן תקיית משחקים כדי להוסיף לרשימה",
|
"AddGameDirBoxTooltip": "הזן תקיית משחקים כדי להוסיף לרשימה",
|
||||||
"AddGameDirTooltip": "הוסף תקיית משחקים לרשימה",
|
"AddGameDirTooltip": "הוסף תקיית משחקים לרשימה",
|
||||||
"RemoveGameDirTooltip": "הסר את תקיית המשחקים שנבחרה",
|
"RemoveGameDirTooltip": "הסר את תקיית המשחקים שנבחרה",
|
||||||
|
"AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
|
||||||
|
"AddAutoloadDirTooltip": "Add an autoload directory to the list",
|
||||||
|
"RemoveAutoloadDirTooltip": "Remove selected autoload directory",
|
||||||
"CustomThemeCheckTooltip": "השתמש בעיצוב מותאם אישית של אבלוניה עבור ה-ממשק הגראפי כדי לשנות את המראה של תפריטי האמולטור",
|
"CustomThemeCheckTooltip": "השתמש בעיצוב מותאם אישית של אבלוניה עבור ה-ממשק הגראפי כדי לשנות את המראה של תפריטי האמולטור",
|
||||||
"CustomThemePathTooltip": "נתיב לערכת נושא לממשק גראפי מותאם אישית",
|
"CustomThemePathTooltip": "נתיב לערכת נושא לממשק גראפי מותאם אישית",
|
||||||
"CustomThemeBrowseTooltip": "חפש עיצוב ממשק גראפי מותאם אישית",
|
"CustomThemeBrowseTooltip": "חפש עיצוב ממשק גראפי מותאם אישית",
|
||||||
@@ -605,6 +616,8 @@
|
|||||||
"DebugLogTooltip": "מדפיס הודעות יומן ניפוי באגים בשורת הפקודות.",
|
"DebugLogTooltip": "מדפיס הודעות יומן ניפוי באגים בשורת הפקודות.",
|
||||||
"LoadApplicationFileTooltip": "פתח סייר קבצים כדי לבחור קובץ תואם סוויץ' לטעינה",
|
"LoadApplicationFileTooltip": "פתח סייר קבצים כדי לבחור קובץ תואם סוויץ' לטעינה",
|
||||||
"LoadApplicationFolderTooltip": "פתח סייר קבצים כדי לבחור יישום תואם סוויץ', לא ארוז לטעינה.",
|
"LoadApplicationFolderTooltip": "פתח סייר קבצים כדי לבחור יישום תואם סוויץ', לא ארוז לטעינה.",
|
||||||
|
"LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
|
||||||
|
"LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
|
||||||
"OpenRyujinxFolderTooltip": "פתח את תיקיית מערכת הקבצים ריוג'ינקס",
|
"OpenRyujinxFolderTooltip": "פתח את תיקיית מערכת הקבצים ריוג'ינקס",
|
||||||
"OpenRyujinxLogsTooltip": "פותח את התיקיה שאליה נכתבים רישומים",
|
"OpenRyujinxLogsTooltip": "פותח את התיקיה שאליה נכתבים רישומים",
|
||||||
"ExitTooltip": "צא מריוג'ינקס",
|
"ExitTooltip": "צא מריוג'ינקס",
|
||||||
@@ -656,6 +669,8 @@
|
|||||||
"OpenSetupGuideMessage": "פתח מדריך התקנה",
|
"OpenSetupGuideMessage": "פתח מדריך התקנה",
|
||||||
"NoUpdate": "אין עדכון",
|
"NoUpdate": "אין עדכון",
|
||||||
"TitleUpdateVersionLabel": "גרסה {0}",
|
"TitleUpdateVersionLabel": "גרסה {0}",
|
||||||
|
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||||
|
"TitleBundledDlcLabel": "Bundled:",
|
||||||
"RyujinxInfo": "ריוג'ינקס - מידע",
|
"RyujinxInfo": "ריוג'ינקס - מידע",
|
||||||
"RyujinxConfirm": "ריוג'ינקס - אישור",
|
"RyujinxConfirm": "ריוג'ינקס - אישור",
|
||||||
"FileDialogAllTypes": "כל הסוגים",
|
"FileDialogAllTypes": "כל הסוגים",
|
||||||
@@ -713,9 +728,17 @@
|
|||||||
"DlcWindowTitle": "נהל הרחבות משחק עבור {0} ({1})",
|
"DlcWindowTitle": "נהל הרחבות משחק עבור {0} ({1})",
|
||||||
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
||||||
"UpdateWindowTitle": "נהל עדכוני משחקים",
|
"UpdateWindowTitle": "נהל עדכוני משחקים",
|
||||||
|
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||||
"CheatWindowHeading": "צ'יטים זמינים עבור {0} [{1}]",
|
"CheatWindowHeading": "צ'יטים זמינים עבור {0} [{1}]",
|
||||||
"BuildId": "מזהה בניה:",
|
"BuildId": "מזהה בניה:",
|
||||||
|
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||||
"DlcWindowHeading": "{0} הרחבות משחק",
|
"DlcWindowHeading": "{0} הרחבות משחק",
|
||||||
|
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||||
|
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||||
|
"AutoloadUpdateAddedMessage": "{0} new update(s) added",
|
||||||
|
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
|
||||||
"ModWindowHeading": "{0} מוד(ים)",
|
"ModWindowHeading": "{0} מוד(ים)",
|
||||||
"UserProfilesEditProfile": "ערוך נבחר/ים",
|
"UserProfilesEditProfile": "ערוך נבחר/ים",
|
||||||
"Cancel": "בטל",
|
"Cancel": "בטל",
|
||||||
@@ -766,6 +789,7 @@
|
|||||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||||
"GraphicsScalingFilterNearest": "Nearest",
|
"GraphicsScalingFilterNearest": "Nearest",
|
||||||
"GraphicsScalingFilterFsr": "FSR",
|
"GraphicsScalingFilterFsr": "FSR",
|
||||||
|
"GraphicsScalingFilterArea": "Area",
|
||||||
"GraphicsScalingFilterLevelLabel": "רמה",
|
"GraphicsScalingFilterLevelLabel": "רמה",
|
||||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||||
"SmaaLow": "SMAA נמוך",
|
"SmaaLow": "SMAA נמוך",
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user