mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-07-24 17:17:11 +02:00
Compare commits
23 commits
32ae313d77
...
a151ae5b8a
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a151ae5b8a | ||
![]() |
84758d0ddc | ||
![]() |
6bb2af0091 | ||
![]() |
534a194ed9 | ||
![]() |
331805791e | ||
![]() |
6773406bb6 | ||
![]() |
6226eadf55 | ||
![]() |
b1cde5fd97 | ||
![]() |
39944b2063 | ||
![]() |
973c6ba5df | ||
![]() |
6803c91da8 | ||
![]() |
557c2a50b2 | ||
![]() |
77a797f154 | ||
![]() |
faf9e3cdd7 | ||
![]() |
7bc80ed4fe | ||
![]() |
a1d44ec496 | ||
![]() |
bab3beb0ac | ||
![]() |
aa9e74339b | ||
![]() |
908273d848 | ||
![]() |
b51ad11574 | ||
![]() |
ea027d65a7 | ||
![]() |
d03ae9c164 | ||
![]() |
90e9492f6c |
19 changed files with 157 additions and 182 deletions
4
.github/workflows/canary.yml
vendored
4
.github/workflows/canary.yml
vendored
|
@ -243,3 +243,7 @@ jobs:
|
||||||
- name: Send notification webhook
|
- name: Send notification webhook
|
||||||
run: |
|
run: |
|
||||||
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|FF4500|${{ secrets.CANARY_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false"
|
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|FF4500|${{ secrets.CANARY_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false"
|
||||||
|
|
||||||
|
- name: Notify update server of new builds
|
||||||
|
run: |
|
||||||
|
curl 'https://update.ryujinx.app/api/v1/admin/refresh_cache?rc=canary' -X PATCH -H 'accept: */*' -H 'Authorization: ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }}'
|
||||||
|
|
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
|
@ -228,3 +228,7 @@ jobs:
|
||||||
- name: Send notification webhook
|
- name: Send notification webhook
|
||||||
run: |
|
run: |
|
||||||
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|32cd32|${{ secrets.STABLE_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false"
|
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|32cd32|${{ secrets.STABLE_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false"
|
||||||
|
|
||||||
|
- name: Notify update server of new builds
|
||||||
|
run: |
|
||||||
|
curl 'https://update.ryujinx.app/api/v1/admin/refresh_cache?rc=stable' -X PATCH -H 'accept: */*' -H 'Authorization: ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }}'
|
||||||
|
|
|
@ -42,6 +42,8 @@
|
||||||
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
|
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
|
||||||
<PackageVersion Include="Ryujinx.LibHac" Version="0.20.0" />
|
<PackageVersion Include="Ryujinx.LibHac" Version="0.20.0" />
|
||||||
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
|
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
|
||||||
|
<PackageVersion Include="Ryujinx.UpdateClient" Version="1.0.29" />
|
||||||
|
<PackageVersion Include="Ryujinx.Systems.Update.Common" Version="1.0.29" />
|
||||||
<PackageVersion Include="Gommon" Version="2.7.1.1" />
|
<PackageVersion Include="Gommon" Version="2.7.1.1" />
|
||||||
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
|
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
|
||||||
<PackageVersion Include="Sep" Version="0.6.0" />
|
<PackageVersion Include="Sep" Version="0.6.0" />
|
||||||
|
|
|
@ -77,6 +77,8 @@ 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("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}"
|
||||||
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
.editorconfig = .editorconfig
|
.editorconfig = .editorconfig
|
||||||
|
@ -84,10 +86,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||||
.github\workflows\canary.yml = .github\workflows\canary.yml
|
.github\workflows\canary.yml = .github\workflows\canary.yml
|
||||||
Directory.Packages.props = Directory.Packages.props
|
Directory.Packages.props = Directory.Packages.props
|
||||||
.github\workflows\release.yml = .github\workflows\release.yml
|
.github\workflows\release.yml = .github\workflows\release.yml
|
||||||
|
nuget.config = nuget.config
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
|
@ -187,7 +187,7 @@
|
||||||
"ko_KR": "소프트웨어",
|
"ko_KR": "소프트웨어",
|
||||||
"no_NO": "Programvare",
|
"no_NO": "Programvare",
|
||||||
"pl_PL": "Oprogramowanie",
|
"pl_PL": "Oprogramowanie",
|
||||||
"pt_BR": "",
|
"pt_BR": "Programa",
|
||||||
"ru_RU": "Программное обеспечение",
|
"ru_RU": "Программное обеспечение",
|
||||||
"sv_SE": "Programvara",
|
"sv_SE": "Programvara",
|
||||||
"th_TH": "ซอฟต์แวร์",
|
"th_TH": "ซอฟต์แวร์",
|
||||||
|
@ -2089,12 +2089,12 @@
|
||||||
"pl_PL": "Całkowity czas gry: {0}",
|
"pl_PL": "Całkowity czas gry: {0}",
|
||||||
"pt_BR": "Tempo total de jogo: {0}",
|
"pt_BR": "Tempo total de jogo: {0}",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Total speltid: {0}",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "Toplam Oyun Süresi: {0}",
|
"tr_TR": "Toplam Oyun Süresi: {0}",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
"zh_CN": "总游戏时间: {0}",
|
"zh_CN": "总游戏时间: {0}",
|
||||||
"zh_TW": ""
|
"zh_TW": "總遊戲時間: {0}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -2537,7 +2537,7 @@
|
||||||
"ko_KR": "PPTC 디렉터리 열기",
|
"ko_KR": "PPTC 디렉터리 열기",
|
||||||
"no_NO": "Åpne PPTC mappe",
|
"no_NO": "Åpne PPTC mappe",
|
||||||
"pl_PL": "Otwórz katalog PPTC",
|
"pl_PL": "Otwórz katalog PPTC",
|
||||||
"pt_BR": "Abrir Diretório de PPTC Cache",
|
"pt_BR": "Abrir Diretório de Cache PPTC",
|
||||||
"ru_RU": "Открыть папку PPTC",
|
"ru_RU": "Открыть папку PPTC",
|
||||||
"sv_SE": "Öppna PPTC-katalog",
|
"sv_SE": "Öppna PPTC-katalog",
|
||||||
"th_TH": "เปิดไดเรกทอรี่ PPTC",
|
"th_TH": "เปิดไดเรกทอรี่ PPTC",
|
||||||
|
@ -2912,7 +2912,7 @@
|
||||||
"ko_KR": "사용자 정의 구성 만들기",
|
"ko_KR": "사용자 정의 구성 만들기",
|
||||||
"no_NO": "Opprett egendefinert konfigurasjon",
|
"no_NO": "Opprett egendefinert konfigurasjon",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Criar Configuração Custumizada",
|
||||||
"ru_RU": "Задать индивидуальные параметры",
|
"ru_RU": "Задать индивидуальные параметры",
|
||||||
"sv_SE": "Skapa anpassad konfiguration",
|
"sv_SE": "Skapa anpassad konfiguration",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -2937,7 +2937,7 @@
|
||||||
"ko_KR": "사용자 정의 구성 편집",
|
"ko_KR": "사용자 정의 구성 편집",
|
||||||
"no_NO": "Rediger egendefinert konfigurasjon",
|
"no_NO": "Rediger egendefinert konfigurasjon",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Editar Configuração Customizada",
|
||||||
"ru_RU": "Изменить индивидуальные параметры",
|
"ru_RU": "Изменить индивидуальные параметры",
|
||||||
"sv_SE": "Redigera anpassad konfiguration",
|
"sv_SE": "Redigera anpassad konfiguration",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -3012,7 +3012,7 @@
|
||||||
"ko_KR": "선택한 게임에 대한 기존 독립 구성 편집",
|
"ko_KR": "선택한 게임에 대한 기존 독립 구성 편집",
|
||||||
"no_NO": "Rediger din eksisterende uavhengige konfigurasjon for det valgte spillet",
|
"no_NO": "Rediger din eksisterende uavhengige konfigurasjon for det valgte spillet",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Editar sua configuração independente existente para o jogo selecionado",
|
||||||
"ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.",
|
"ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.",
|
||||||
"sv_SE": "Redigera din befintliga oberoende konfiguration för det valda spelet",
|
"sv_SE": "Redigera din befintliga oberoende konfiguration för det valda spelet",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -3162,7 +3162,7 @@
|
||||||
"ko_KR": "앱의 모드가 포함된 디렉터리 열기",
|
"ko_KR": "앱의 모드가 포함된 디렉터리 열기",
|
||||||
"no_NO": "Åpner mappen som inneholder programmets modifikasjoner",
|
"no_NO": "Åpner mappen som inneholder programmets modifikasjoner",
|
||||||
"pl_PL": "Otwiera katalog zawierający mody dla danej aplikacji",
|
"pl_PL": "Otwiera katalog zawierający mody dla danej aplikacji",
|
||||||
"pt_BR": "Abre a pasta que contém os mods da aplicação ",
|
"pt_BR": "Abre a pasta que contém os mods da aplicação",
|
||||||
"ru_RU": "Открывает папку, содержащую моды для приложений и игр",
|
"ru_RU": "Открывает папку, содержащую моды для приложений и игр",
|
||||||
"sv_SE": "Öppnar katalogen som innehåller applikationens Mods",
|
"sv_SE": "Öppnar katalogen som innehåller applikationens Mods",
|
||||||
"th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน",
|
"th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน",
|
||||||
|
@ -3987,7 +3987,7 @@
|
||||||
"ko_KR": "원래 UI 스타일 표시(다시 시작 필요)",
|
"ko_KR": "원래 UI 스타일 표시(다시 시작 필요)",
|
||||||
"no_NO": "Vis original UI-stil (krever omstart)",
|
"no_NO": "Vis original UI-stil (krever omstart)",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Mostrar Estilo Original da Interface (Requer Reinicialização)",
|
||||||
"ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)",
|
"ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)",
|
||||||
"sv_SE": "Visa ursprunglig gränssnittsstil (kräver omstart)",
|
"sv_SE": "Visa ursprunglig gränssnittsstil (kräver omstart)",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -4009,10 +4009,10 @@
|
||||||
"he_IL": "",
|
"he_IL": "",
|
||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "Ryujinx 1.1.1403을 연상시키는 이전 Avalonia Ryujinx UI를 표시합니다. 이 기능은 Windows가 아닌 플랫폼에서는 기본적으로 활성화됩니다.\n 클래식 스타일의 타이틀 바가 돌아왔고 주요 창 레이아웃 재작업이 역전되었습니다. 이 툴팁 위의 설정 탐색 배치와 같은 작업입니다.",
|
"ko_KR": "Ryujinx 1.1.1403을 연상시키는 이전 Avalonia Ryujinx UI를 표시합니다. 이 기능은 윈도가 아닌 플랫폼에서는 기본적으로 활성화됩니다.\n 클래식 스타일의 타이틀 바가 돌아왔고 주요 창 레이아웃 변경 사항이 원래대로 적용됩니다. 이 툴팁 위의 설정 탐색 배치와 같은 경우입니다.",
|
||||||
"no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.",
|
"no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Mostrar a Interface Avalonia antiga do Ryujinx 1.1.1403. Esta versão é ativada por padrão nas plataformas que não sejam Windows. \nO estilo clássico da Barra de Título retorna e grande parte das mudanças do Layout de janela são revertidas; assim como as configurações de posicionamento da navegação acima dessa descrição.",
|
||||||
"ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.",
|
"ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.",
|
||||||
"sv_SE": "Visa det gamla Ryuijinx-gränssnittet baserat på Avalonia som påminner om version 1.1.1403. Detta är aktiverat som standard på plattformat som inte är Windows.\nDen klassiska titelfältet är tillbaka och de stora omarbetningarna av fönsterlayouten är omvända, till exempel placeringen av inställningsnavigeringen ovanför detta verktygstips.",
|
"sv_SE": "Visa det gamla Ryuijinx-gränssnittet baserat på Avalonia som påminner om version 1.1.1403. Detta är aktiverat som standard på plattformat som inte är Windows.\nDen klassiska titelfältet är tillbaka och de stora omarbetningarna av fönsterlayouten är omvända, till exempel placeringen av inställningsnavigeringen ovanför detta verktygstips.",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -5087,7 +5087,7 @@
|
||||||
"ko_KR": "터보 모드 배수 :",
|
"ko_KR": "터보 모드 배수 :",
|
||||||
"no_NO": "Multiplikator i turbomodus:",
|
"no_NO": "Multiplikator i turbomodus:",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Multiplicador do Modo Turbo",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "Multiplikator för turboläge:",
|
"sv_SE": "Multiplikator för turboläge:",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -5112,7 +5112,7 @@
|
||||||
"ko_KR": "터보 모드 배수 목표 값입니다.\n\n모르면 200으로 두세요.",
|
"ko_KR": "터보 모드 배수 목표 값입니다.\n\n모르면 200으로 두세요.",
|
||||||
"no_NO": "Målverdien for multiplikatoren i turbomodus. \n\nLa syå på 200 hvis du er usikker.",
|
"no_NO": "Målverdien for multiplikatoren i turbomodus. \n\nLa syå på 200 hvis du er usikker.",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "O valor do Multiplicador do Modo Turbo. Deixe em 200 se não tiver certeza.",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "Målvärdet för multiplikatorn i turboläget. \n\nLämna den på 200 om du är osäker.",
|
"sv_SE": "Målvärdet för multiplikatorn i turboläget. \n\nLämna den på 200 om du är osäker.",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -5137,7 +5137,7 @@
|
||||||
"ko_KR": "터보 모드는 게임이 프레임 속도에 민감하지 않을 때 효과적으로 속도를 높이거나 낮추는 에뮬레이터 기능입니다.\n이 기능은 Ryujinx 키보드 단축키 설정에서 구성할 수 있는 단축키를 사용하여 게임 내에서 전환할 수 있습니다.\n\n모르면 200으로 두세요.",
|
"ko_KR": "터보 모드는 게임이 프레임 속도에 민감하지 않을 때 효과적으로 속도를 높이거나 낮추는 에뮬레이터 기능입니다.\n이 기능은 Ryujinx 키보드 단축키 설정에서 구성할 수 있는 단축키를 사용하여 게임 내에서 전환할 수 있습니다.\n\n모르면 200으로 두세요.",
|
||||||
"no_NO": "Turbo-modus er en emulatorfunksjon som effektivt øker eller senker hastigheten når et spill ikke er følsom for bildefrekvens.\nDu kan slå på denne funksjonen i spillet med en hurtigtast, som kan konfigureres i Ryujinx Keyboard Hotkeys-innstillingene.\n\nLa den stå på 200 hvis du er usikker.",
|
"no_NO": "Turbo-modus er en emulatorfunksjon som effektivt øker eller senker hastigheten når et spill ikke er følsom for bildefrekvens.\nDu kan slå på denne funksjonen i spillet med en hurtigtast, som kan konfigureres i Ryujinx Keyboard Hotkeys-innstillingene.\n\nLa den stå på 200 hvis du er usikker.",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "O Modo Turbo é um recurso do emulador que efetivamente aumenta ou dimimui a velocidade de um jogo quando o mesmo não é sensivel à taxa de quadros. \nVocê pode ativar esse recurso dentro do jogo com uma tecla de atalho, configurável nas Configurações de Teclas de Atalho do Ryujinx. \n\nDeixe em 200 se não tiver certeza.",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "Turboläget är en emulatorfunktion som effektivt ökar eller sänker hastigheten när ett spel inte är känsligt för bildfrekvens.\nDu kan växla denna funktion i spelet med en snabbtangent, konfigurerbar i Ryujinx inställningar för snabbtangenter.\n\nLämna den på 200 om du är osäker.",
|
"sv_SE": "Turboläget är en emulatorfunktion som effektivt ökar eller sänker hastigheten när ett spel inte är känsligt för bildfrekvens.\nDu kan växla denna funktion i spelet med en snabbtangent, konfigurerbar i Ryujinx inställningar för snabbtangenter.\n\nLämna den på 200 om du är osäker.",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -5312,7 +5312,7 @@
|
||||||
"ko_KR": "핵",
|
"ko_KR": "핵",
|
||||||
"no_NO": "",
|
"no_NO": "",
|
||||||
"pl_PL": "Hacki",
|
"pl_PL": "Hacki",
|
||||||
"pt_BR": "",
|
"pt_BR": "Trapaças",
|
||||||
"ru_RU": "Хаки",
|
"ru_RU": "Хаки",
|
||||||
"sv_SE": "Hack",
|
"sv_SE": "Hack",
|
||||||
"th_TH": "แฮ็ก",
|
"th_TH": "แฮ็ก",
|
||||||
|
@ -6112,7 +6112,7 @@
|
||||||
"ko_KR": "개발자 옵션",
|
"ko_KR": "개발자 옵션",
|
||||||
"no_NO": "Utvikleralternativer",
|
"no_NO": "Utvikleralternativer",
|
||||||
"pl_PL": "Opcje programisty",
|
"pl_PL": "Opcje programisty",
|
||||||
"pt_BR": "Opções do desenvolvedor",
|
"pt_BR": "Opções do Desenvolvedor",
|
||||||
"ru_RU": "Параметры разработчика",
|
"ru_RU": "Параметры разработчика",
|
||||||
"sv_SE": "Utvecklarinställningar",
|
"sv_SE": "Utvecklarinställningar",
|
||||||
"th_TH": "ตัวเลือกนักพัฒนา",
|
"th_TH": "ตัวเลือกนักพัฒนา",
|
||||||
|
@ -6237,7 +6237,7 @@
|
||||||
"ko_KR": "조각 기록 활성화",
|
"ko_KR": "조각 기록 활성화",
|
||||||
"no_NO": "Aktiver Stub-logger",
|
"no_NO": "Aktiver Stub-logger",
|
||||||
"pl_PL": "Wlącz Skróty Logów",
|
"pl_PL": "Wlącz Skróty Logów",
|
||||||
"pt_BR": "Habilitar logs de Stub",
|
"pt_BR": "Habilitar Logs de Stub",
|
||||||
"ru_RU": "Включить журнал-заглушку",
|
"ru_RU": "Включить журнал-заглушку",
|
||||||
"sv_SE": "Aktivera stubbloggar",
|
"sv_SE": "Aktivera stubbloggar",
|
||||||
"th_TH": "เปิดใช้งานการบันทึกประวัติ",
|
"th_TH": "เปิดใช้งานการบันทึกประวัติ",
|
||||||
|
@ -6262,7 +6262,7 @@
|
||||||
"ko_KR": "정보 기록 활성화",
|
"ko_KR": "정보 기록 활성화",
|
||||||
"no_NO": "Aktiver informasjonslogger",
|
"no_NO": "Aktiver informasjonslogger",
|
||||||
"pl_PL": "Włącz Logi Informacyjne",
|
"pl_PL": "Włącz Logi Informacyjne",
|
||||||
"pt_BR": "Habilitar logs de Informação",
|
"pt_BR": "Habilitar Logs de Informação",
|
||||||
"ru_RU": "Включить информационный журнал",
|
"ru_RU": "Включить информационный журнал",
|
||||||
"sv_SE": "Aktivera informationsloggar",
|
"sv_SE": "Aktivera informationsloggar",
|
||||||
"th_TH": "เปิดใช้งานการบันทึกประวัติการใช้งาน",
|
"th_TH": "เปิดใช้งานการบันทึกประวัติการใช้งาน",
|
||||||
|
@ -6462,7 +6462,7 @@
|
||||||
"ko_KR": "개발자 옵션",
|
"ko_KR": "개발자 옵션",
|
||||||
"no_NO": "Utvikleralternativer",
|
"no_NO": "Utvikleralternativer",
|
||||||
"pl_PL": "Opcje programisty (UWAGA: wpływa na wydajność)",
|
"pl_PL": "Opcje programisty (UWAGA: wpływa na wydajność)",
|
||||||
"pt_BR": "Opções do desenvolvedor",
|
"pt_BR": "Opções do Desenvolvedor",
|
||||||
"ru_RU": "Параметры разработчика",
|
"ru_RU": "Параметры разработчика",
|
||||||
"sv_SE": "Utvecklarinställningar",
|
"sv_SE": "Utvecklarinställningar",
|
||||||
"th_TH": "ตัวเลือกนักพัฒนา",
|
"th_TH": "ตัวเลือกนักพัฒนา",
|
||||||
|
@ -7212,14 +7212,14 @@
|
||||||
"ko_KR": "발견된 구성 :\n\n이름 : \t{0}\n가이드 : \t{1}\n\n 컨트롤러 연결 대기 중...",
|
"ko_KR": "발견된 구성 :\n\n이름 : \t{0}\n가이드 : \t{1}\n\n 컨트롤러 연결 대기 중...",
|
||||||
"no_NO": "",
|
"no_NO": "",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Configuração encontrada:\n\nNome:\t{0}\nGUID:\t{1}\n\n Aguardando conexão do controle...",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Konfiguration hittad:\n\nNamn:\t{0}\nGUID:\t{1}\n\n Väntar på anslutning till kontroller...",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
"zh_CN": "发现配置:\n\n名称:\t{0}\nGUID:\t{1}\n\n 正在等待控制器连接...",
|
"zh_CN": "发现配置:\n\n名称:\t{0}\nGUID:\t{1}\n\n 正在等待控制器连接...",
|
||||||
"zh_TW": ""
|
"zh_TW": "找到控制器的配置:\n\n名稱:\t{0}\nGUID:\t{1}\n\n 正在等待控制器連線..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -10912,7 +10912,7 @@
|
||||||
"ko_KR": "좌측 스틱 버튼",
|
"ko_KR": "좌측 스틱 버튼",
|
||||||
"no_NO": "Venstre Styrespak Trykk",
|
"no_NO": "Venstre Styrespak Trykk",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Botão Analógico Esquerdo",
|
||||||
"ru_RU": "Кнопка лев. стика",
|
"ru_RU": "Кнопка лев. стика",
|
||||||
"sv_SE": "L-spakknapp",
|
"sv_SE": "L-spakknapp",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -10937,7 +10937,7 @@
|
||||||
"ko_KR": "우측 스틱 버튼",
|
"ko_KR": "우측 스틱 버튼",
|
||||||
"no_NO": "Høyre Styrespak Trykk",
|
"no_NO": "Høyre Styrespak Trykk",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Botão Analógico Direito",
|
||||||
"ru_RU": "Кнопка пр. стика",
|
"ru_RU": "Кнопка пр. стика",
|
||||||
"sv_SE": "R-spakknapp",
|
"sv_SE": "R-spakknapp",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -10962,7 +10962,7 @@
|
||||||
"ko_KR": "좌측 숄더",
|
"ko_KR": "좌측 숄더",
|
||||||
"no_NO": "Venstre Skulder",
|
"no_NO": "Venstre Skulder",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Ombro Esquerdo",
|
||||||
"ru_RU": "Левый бампер",
|
"ru_RU": "Левый бампер",
|
||||||
"sv_SE": "Vänster kantknapp",
|
"sv_SE": "Vänster kantknapp",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -10987,7 +10987,7 @@
|
||||||
"ko_KR": "우측 숄더",
|
"ko_KR": "우측 숄더",
|
||||||
"no_NO": "Høyre Skulder",
|
"no_NO": "Høyre Skulder",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Ombro Direito",
|
||||||
"ru_RU": "Правый бампер",
|
"ru_RU": "Правый бампер",
|
||||||
"sv_SE": "Höger kantknapp",
|
"sv_SE": "Höger kantknapp",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11012,7 +11012,7 @@
|
||||||
"ko_KR": "좌측 트리거",
|
"ko_KR": "좌측 트리거",
|
||||||
"no_NO": "Venstre utløser",
|
"no_NO": "Venstre utløser",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Gatilho Esquerdo",
|
||||||
"ru_RU": "Левый триггер",
|
"ru_RU": "Левый триггер",
|
||||||
"sv_SE": "Vänster avtryckare",
|
"sv_SE": "Vänster avtryckare",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11037,7 +11037,7 @@
|
||||||
"ko_KR": "우측 트리거",
|
"ko_KR": "우측 트리거",
|
||||||
"no_NO": "Høyre utløser",
|
"no_NO": "Høyre utløser",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Gatilho Direito",
|
||||||
"ru_RU": "Правый триггер",
|
"ru_RU": "Правый триггер",
|
||||||
"sv_SE": "Höger avtryckare",
|
"sv_SE": "Höger avtryckare",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11062,7 +11062,7 @@
|
||||||
"ko_KR": "↑",
|
"ko_KR": "↑",
|
||||||
"no_NO": "Opp",
|
"no_NO": "Opp",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Cima",
|
||||||
"ru_RU": "Вверх",
|
"ru_RU": "Вверх",
|
||||||
"sv_SE": "Upp",
|
"sv_SE": "Upp",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11087,7 +11087,7 @@
|
||||||
"ko_KR": "↓",
|
"ko_KR": "↓",
|
||||||
"no_NO": "Ned",
|
"no_NO": "Ned",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Baixo",
|
||||||
"ru_RU": "Вниз",
|
"ru_RU": "Вниз",
|
||||||
"sv_SE": "Ner",
|
"sv_SE": "Ner",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11112,7 +11112,7 @@
|
||||||
"ko_KR": "←",
|
"ko_KR": "←",
|
||||||
"no_NO": "Venstre",
|
"no_NO": "Venstre",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Esquerda",
|
||||||
"ru_RU": "Влево",
|
"ru_RU": "Влево",
|
||||||
"sv_SE": "Vänster",
|
"sv_SE": "Vänster",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11137,7 +11137,7 @@
|
||||||
"ko_KR": "→",
|
"ko_KR": "→",
|
||||||
"no_NO": "Høyre",
|
"no_NO": "Høyre",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Direita",
|
||||||
"ru_RU": "Вправо",
|
"ru_RU": "Вправо",
|
||||||
"sv_SE": "Höger",
|
"sv_SE": "Höger",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11212,7 +11212,7 @@
|
||||||
"ko_KR": "가이드",
|
"ko_KR": "가이드",
|
||||||
"no_NO": "Veiledning",
|
"no_NO": "Veiledning",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Guia",
|
||||||
"ru_RU": "Кнопка меню",
|
"ru_RU": "Кнопка меню",
|
||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11387,7 +11387,7 @@
|
||||||
"ko_KR": "좌측 트리거 0",
|
"ko_KR": "좌측 트리거 0",
|
||||||
"no_NO": "Venstre utløser 0",
|
"no_NO": "Venstre utløser 0",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Gatilho Esquerdo 0",
|
||||||
"ru_RU": "Левый триггер 0",
|
"ru_RU": "Левый триггер 0",
|
||||||
"sv_SE": "Vänster avtryckare 0",
|
"sv_SE": "Vänster avtryckare 0",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11412,7 +11412,7 @@
|
||||||
"ko_KR": "우측 트리거 0",
|
"ko_KR": "우측 트리거 0",
|
||||||
"no_NO": "Høyre utløser 0",
|
"no_NO": "Høyre utløser 0",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Gatilho Direito 0",
|
||||||
"ru_RU": "Правый триггер 0",
|
"ru_RU": "Правый триггер 0",
|
||||||
"sv_SE": "Höger avtryckare 0",
|
"sv_SE": "Höger avtryckare 0",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11437,7 +11437,7 @@
|
||||||
"ko_KR": "좌측 트리거 1",
|
"ko_KR": "좌측 트리거 1",
|
||||||
"no_NO": "Venstre utløser 1",
|
"no_NO": "Venstre utløser 1",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": " Gatilho Esquerdo 1",
|
||||||
"ru_RU": "Левый триггер 1",
|
"ru_RU": "Левый триггер 1",
|
||||||
"sv_SE": "Vänster avtryckare 1",
|
"sv_SE": "Vänster avtryckare 1",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11462,7 +11462,7 @@
|
||||||
"ko_KR": "우측 트리거 1",
|
"ko_KR": "우측 트리거 1",
|
||||||
"no_NO": "Høyre utløser 1",
|
"no_NO": "Høyre utløser 1",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Gatilho Direito 1",
|
||||||
"ru_RU": "Правый триггер 1",
|
"ru_RU": "Правый триггер 1",
|
||||||
"sv_SE": "Höger avtryckare 1",
|
"sv_SE": "Höger avtryckare 1",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11487,7 +11487,7 @@
|
||||||
"ko_KR": "좌측 스틱",
|
"ko_KR": "좌측 스틱",
|
||||||
"no_NO": "Venstre styrespak",
|
"no_NO": "Venstre styrespak",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Analógico Esquerdo",
|
||||||
"ru_RU": "Левый стик",
|
"ru_RU": "Левый стик",
|
||||||
"sv_SE": "Vänster spak",
|
"sv_SE": "Vänster spak",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11512,7 +11512,7 @@
|
||||||
"ko_KR": "우측 스틱",
|
"ko_KR": "우측 스틱",
|
||||||
"no_NO": "Høyre styrespak",
|
"no_NO": "Høyre styrespak",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Analógico Direito",
|
||||||
"ru_RU": "Правый стик",
|
"ru_RU": "Правый стик",
|
||||||
"sv_SE": "Höger spak",
|
"sv_SE": "Höger spak",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -11787,7 +11787,7 @@
|
||||||
"ko_KR": "사용자 지정 프로필 이미지를 가져오거나 시스템 펌웨어에서 아바타 선택 가능",
|
"ko_KR": "사용자 지정 프로필 이미지를 가져오거나 시스템 펌웨어에서 아바타 선택 가능",
|
||||||
"no_NO": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare",
|
"no_NO": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare",
|
||||||
"pl_PL": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego",
|
"pl_PL": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego",
|
||||||
"pt_BR": "Você pode importar uma imagem customizada, ou selecionar um avatar do firmware",
|
"pt_BR": "Você pode importar uma imagem customizada, ou selecionar um avatar do Firmware",
|
||||||
"ru_RU": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.",
|
"ru_RU": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.",
|
||||||
"sv_SE": "Du kan importera en anpassad profilbild eller välja en avatar från systemets firmware",
|
"sv_SE": "Du kan importera en anpassad profilbild eller välja en avatar från systemets firmware",
|
||||||
"th_TH": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ",
|
"th_TH": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ",
|
||||||
|
@ -13087,7 +13087,7 @@
|
||||||
"ko_KR": "업데이트가 취소되었습니다!",
|
"ko_KR": "업데이트가 취소되었습니다!",
|
||||||
"no_NO": "Avbryter oppdatering!",
|
"no_NO": "Avbryter oppdatering!",
|
||||||
"pl_PL": "Anulowanie aktualizacji!",
|
"pl_PL": "Anulowanie aktualizacji!",
|
||||||
"pt_BR": "Cancelando atualização!",
|
"pt_BR": "Atualização Cancelada!",
|
||||||
"ru_RU": "Отмена обновления...",
|
"ru_RU": "Отмена обновления...",
|
||||||
"sv_SE": "Avbryter uppdatering!",
|
"sv_SE": "Avbryter uppdatering!",
|
||||||
"th_TH": "ยกเลิกการอัพเดต!",
|
"th_TH": "ยกเลิกการอัพเดต!",
|
||||||
|
@ -13134,17 +13134,17 @@
|
||||||
"he_IL": "",
|
"he_IL": "",
|
||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "업데이트 서버에서 받은 Ryujinx 버전을 변환하는 데 실패했습니다.",
|
||||||
"no_NO": "Kunne ikke konvertere Ryujinx-versjonen som ble mottatt fra oppdateringsserveren.",
|
"no_NO": "Kunne ikke konvertere Ryujinx-versjonen som ble mottatt fra oppdateringsserveren.",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "Falha em atualizar a versão do Ryujinx recebida do servidor de atualização.",
|
"pt_BR": "Falha em atualizar a versão do Ryujinx recebida do servidor de atualização.",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Det gick inte att konvertera Ryujinx-versionen som mottogs från uppdateringsservern.",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "无法转换从更新服务器接收的 Ryujinx 版本。",
|
||||||
"zh_TW": ""
|
"zh_TW": "無法轉換從更新伺服器接收的 Ryujinx 版本。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -16559,17 +16559,17 @@
|
||||||
"he_IL": "",
|
"he_IL": "",
|
||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "사용자 지정 설정에서 이 옵션을 활성화하면 전역 입력 구성이 사용됩니다.\n\n전역 설정에서 필요에 따라 활성화하거나 비활성화할 수 있습니다. 이 설정은 새로 생성된 모든 사용자 지정 구성에 상속됩니다.",
|
||||||
"no_NO": "",
|
"no_NO": "",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Se esta opção está ativada nas configurações customizadas, as configurações globais de entrada serão usadas.\n\nNas configurações globais: você pode ativar ou desativá-las se necessário; está configuração será herdada por qualquer nova configuração customizada criada.",
|
||||||
"ru_RU": "Если эта опция включена в пользовательских настройках, будет использована глобальная конфигурация ввода.\n\nВ глобальных настройках: переключите эту опцию по своему усмотрению, это будет унаследовано для вновь созданых пользовательских конфигураций",
|
"ru_RU": "Если эта опция включена в пользовательских настройках, будет использована глобальная конфигурация ввода.\n\nВ глобальных настройках: переключите эту опцию по своему усмотрению, это будет унаследовано для вновь созданых пользовательских конфигураций",
|
||||||
"sv_SE": "",
|
"sv_SE": "Om det här alternativet är aktiverat i anpassade inställningar kommer den globala inmatningskonfigurationen att användas.\n\nI de globala inställningarna: du kan aktivera eller inaktivera det efter behov; den här inställningen kommer att ärvas av alla nya anpassade konfigurationer som skapas.",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "如果在自定义设置中启用了此选项,则将使用全局输入配置。\n\n在全局设置中: 您可以根据需要启用或禁用它;之后创建的任何自定义配置都将继承此设置。",
|
||||||
"zh_TW": ""
|
"zh_TW": "如果在自訂設定啟用了此選項,則將使用全域輸入配置。\n\n在全域設定中:你可以根據需要啟用或停用它;之後建立的任何自訂配置都將繼承此設定。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -18544,7 +18544,7 @@
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
"zh_CN": "{0} FPS ({1}毫秒)",
|
"zh_CN": "{0} FPS ({1}毫秒)",
|
||||||
"zh_TW": ""
|
"zh_TW": "{0} FPS ({1}毫秒)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -23062,7 +23062,7 @@
|
||||||
"ko_KR": "근린",
|
"ko_KR": "근린",
|
||||||
"no_NO": "Nærmeste",
|
"no_NO": "Nærmeste",
|
||||||
"pl_PL": "Najbliższe",
|
"pl_PL": "Najbliższe",
|
||||||
"pt_BR": "",
|
"pt_BR": "Mais Próximo",
|
||||||
"ru_RU": "Ступенчатая",
|
"ru_RU": "Ступенчатая",
|
||||||
"sv_SE": "Närmaste",
|
"sv_SE": "Närmaste",
|
||||||
"th_TH": "ใกล้สุด",
|
"th_TH": "ใกล้สุด",
|
||||||
|
@ -23437,14 +23437,14 @@
|
||||||
"ko_KR": "변경 로그 보기",
|
"ko_KR": "변경 로그 보기",
|
||||||
"no_NO": "",
|
"no_NO": "",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Ver Registro",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Visa ändringslogg",
|
||||||
"th_TH": "ด",
|
"th_TH": "ด",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
"zh_CN": "查看更新日志",
|
"zh_CN": "查看更新日志",
|
||||||
"zh_TW": ""
|
"zh_TW": "檢視更新日誌"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -23669,7 +23669,7 @@
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.",
|
"uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.",
|
||||||
"zh_CN": "禁用 P2P 网络连接,对方将通过主服务器进行连接,而不是直接连接到您。",
|
"zh_CN": "禁用 P2P 网络连接,对方将通过主服务器进行连接,而不是直接连接到您。",
|
||||||
"zh_TW": "停用對等網路代管 (P2P Network Hosting), 用戶群會經過代理何服器而非直接連線至你的主機。"
|
"zh_TW": "停用對等網路代管 (P2P Network Hosting), 用戶群會經過代理伺服器而非直接連線至你的主機。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -24312,7 +24312,7 @@
|
||||||
"ko_KR": "터보 모드 :",
|
"ko_KR": "터보 모드 :",
|
||||||
"no_NO": "",
|
"no_NO": "",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Modo Turbo:",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "Turboläge:",
|
"sv_SE": "Turboläge:",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -24337,7 +24337,7 @@
|
||||||
"ko_KR": "터보 모드 단축키입니다.\nRyujinx CPU 설정에서 터보 모드의 동작을 구성합니다.\n\n모르면 바인딩 해제 상태로 두세요.",
|
"ko_KR": "터보 모드 단축키입니다.\nRyujinx CPU 설정에서 터보 모드의 동작을 구성합니다.\n\n모르면 바인딩 해제 상태로 두세요.",
|
||||||
"no_NO": "Hurtigtasten for turbo-modus.\nKonfigurer oppførselen til turbo-modus i Ryujinx CPU-innstillinger.\n\nLa være ubundet hvis du er usikker.",
|
"no_NO": "Hurtigtasten for turbo-modus.\nKonfigurer oppførselen til turbo-modus i Ryujinx CPU-innstillinger.\n\nLa være ubundet hvis du er usikker.",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Tecla de atalho do Modo Turbo.\nConfigure o comportamento do Modo Turbo nas configurações de CPU do Ryujinx.\n\nDeixe Não Atribuído se não tiver certeza.",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "Snabbtangenten för turboläge.\nKonfigurera beteendet för turboläge i Ryujinx CPU-inställningar.\n\nLämna Obunden om du är osäker.",
|
"sv_SE": "Snabbtangenten för turboläge.\nKonfigurera beteendet för turboläge i Ryujinx CPU-inställningar.\n\nLämna Obunden om du är osäker.",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -24362,7 +24362,7 @@
|
||||||
"ko_KR": "누르고 있는 동안만",
|
"ko_KR": "누르고 있는 동안만",
|
||||||
"no_NO": "Bare mens du trykker på",
|
"no_NO": "Bare mens du trykker på",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Somente enquanto pressionado.",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "Endast när du trycker ner",
|
"sv_SE": "Endast när du trycker ner",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -24412,7 +24412,7 @@
|
||||||
"ko_KR": "호환성 목록 - {0}개 항목",
|
"ko_KR": "호환성 목록 - {0}개 항목",
|
||||||
"no_NO": "Kompatibilitetsliste - {0} oppføringer",
|
"no_NO": "Kompatibilitetsliste - {0} oppføringer",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Lista de Compatibilidade - {0} registros",
|
||||||
"ru_RU": "Список совместимости — записей: {0}",
|
"ru_RU": "Список совместимости — записей: {0}",
|
||||||
"sv_SE": "Kompatibilitetslista - {0} poster",
|
"sv_SE": "Kompatibilitetslista - {0} poster",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -24487,7 +24487,7 @@
|
||||||
"ko_KR": "어카이브 {0} 호환성 항목...",
|
"ko_KR": "어카이브 {0} 호환성 항목...",
|
||||||
"no_NO": "Søk i {0} kompatibilitetsoppføringer...",
|
"no_NO": "Søk i {0} kompatibilitetsoppføringer...",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Procurando {0} registros de compatibilidade...",
|
||||||
"ru_RU": "Поиск среди {0} записей о совместимости...",
|
"ru_RU": "Поиск среди {0} записей о совместимости...",
|
||||||
"sv_SE": "Sök i {0} kompatibilitetsposter...",
|
"sv_SE": "Sök i {0} kompatibilitetsposter...",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
@ -24539,7 +24539,7 @@
|
||||||
"pl_PL": "Gry i Aplikacje",
|
"pl_PL": "Gry i Aplikacje",
|
||||||
"pt_BR": "Jogos e Aplicativos",
|
"pt_BR": "Jogos e Aplicativos",
|
||||||
"ru_RU": "Игры и Приложения",
|
"ru_RU": "Игры и Приложения",
|
||||||
"sv_SE": "Spel och Applikationer",
|
"sv_SE": "Spel och applikationer",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "Oyunlar ve Uygulamalar",
|
"tr_TR": "Oyunlar ve Uygulamalar",
|
||||||
"uk_UA": "Ігри та Додатки",
|
"uk_UA": "Ігри та Додатки",
|
||||||
|
@ -24589,7 +24589,7 @@
|
||||||
"pl_PL": "Problemy i Cechy",
|
"pl_PL": "Problemy i Cechy",
|
||||||
"pt_BR": "Problemas e Características",
|
"pt_BR": "Problemas e Características",
|
||||||
"ru_RU": "Проблемы и Особенности",
|
"ru_RU": "Проблемы и Особенности",
|
||||||
"sv_SE": "Problem och Egenskaper",
|
"sv_SE": "Problem och egenskaper",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "Sorunlar ve Özellikler",
|
"tr_TR": "Sorunlar ve Özellikler",
|
||||||
"uk_UA": "Проблеми та Особливості",
|
"uk_UA": "Проблеми та Особливості",
|
||||||
|
@ -24912,7 +24912,7 @@
|
||||||
"ko_KR": "사용자 정의 설정",
|
"ko_KR": "사용자 정의 설정",
|
||||||
"no_NO": "Tilpasset konfigurasjon",
|
"no_NO": "Tilpasset konfigurasjon",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "Configurações Customizadas",
|
||||||
"ru_RU": "Индивидуальные параметры",
|
"ru_RU": "Индивидуальные параметры",
|
||||||
"sv_SE": "Anpassad konfiguration",
|
"sv_SE": "Anpassad konfiguration",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
|
|
|
@ -2746,6 +2746,7 @@
|
||||||
01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51
|
01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51
|
||||||
010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33
|
010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33
|
||||||
0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05
|
0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05
|
||||||
|
0100E1D01EB2E000,"Squeakross: Home Squeak Home",,playable,2025-06-16 02:02:00
|
||||||
010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08
|
010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08
|
||||||
0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32
|
0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32
|
||||||
0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16
|
0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16
|
||||||
|
@ -3016,6 +3017,7 @@
|
||||||
01009B101044C000,"The Legend of Heroes: Trails of Cold Steel III Demo",demo;nvdec,playable,2021-04-23 01:07:32
|
01009B101044C000,"The Legend of Heroes: Trails of Cold Steel III Demo",demo;nvdec,playable,2021-04-23 01:07:32
|
||||||
0100D3C010DE8000,"The Legend of Heroes: Trails of Cold Steel IV",nvdec,playable,2021-04-23 14:01:05
|
0100D3C010DE8000,"The Legend of Heroes: Trails of Cold Steel IV",nvdec,playable,2021-04-23 14:01:05
|
||||||
01005E5013862000,"THE LEGEND OF HEROES: ZERO NO KISEKI KAI [英雄傳說 零之軌跡:改]",crash,nothing,2021-09-30 14:41:07
|
01005E5013862000,"THE LEGEND OF HEROES: ZERO NO KISEKI KAI [英雄傳說 零之軌跡:改]",crash,nothing,2021-09-30 14:41:07
|
||||||
|
01009C901ACEE000,"The Legend of Nayuta: Boundless Trails",,ingame,2025-06-12 15:47
|
||||||
01008CF01BAAC000,"The Legend of Zelda Echoes of Wisdom",nvdec;ASTC;intel-vendor-bug,playable,2024-10-01 14:11:01
|
01008CF01BAAC000,"The Legend of Zelda Echoes of Wisdom",nvdec;ASTC;intel-vendor-bug,playable,2024-10-01 14:11:01
|
||||||
0100509005AF2000,"The Legend of Zelda: Breath of the Wild Demo",demo,ingame,2022-12-24 05:02:58
|
0100509005AF2000,"The Legend of Zelda: Breath of the Wild Demo",demo,ingame,2022-12-24 05:02:58
|
||||||
01007EF00011E000,"The Legend of Zelda™: Breath of the Wild",gpu;amd-vendor-bug;mac-bug,ingame,2024-09-23 19:35:46
|
01007EF00011E000,"The Legend of Zelda™: Breath of the Wild",gpu;amd-vendor-bug;mac-bug,ingame,2024-09-23 19:35:46
|
||||||
|
|
|
15
nuget.config
15
nuget.config
|
@ -6,5 +6,20 @@
|
||||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||||
<!-- Only needed when using pre-release versions of Ryujinx.LibHac. -->
|
<!-- Only needed when using pre-release versions of Ryujinx.LibHac. -->
|
||||||
<!--<add key="LibHacAlpha" value="https://git.ryujinx.app/api/v4/projects/17/packages/nuget/index.json" />-->
|
<!--<add key="LibHacAlpha" value="https://git.ryujinx.app/api/v4/projects/17/packages/nuget/index.json" />-->
|
||||||
|
<add key="Ryujinx.UpdateClient" value="https://git.ryujinx.app/api/v4/projects/71/packages/nuget/index.json" />
|
||||||
</packageSources>
|
</packageSources>
|
||||||
|
<packageSourceMapping>
|
||||||
|
<!-- key value for <packageSource> should match key values from <packageSources> element -->
|
||||||
|
<!-- These are defined and .NET still yells about multiple package sources with no mappings. Not sure what to do, this is in the docs lol -->
|
||||||
|
<packageSource key="nuget.org">
|
||||||
|
<package pattern="*" />
|
||||||
|
</packageSource>
|
||||||
|
<packageSource key="Ryujinx.UpdateClient">
|
||||||
|
<package pattern="Ryujinx.UpdateClient" />
|
||||||
|
<package pattern="Ryujinx.Systems.Update.Common" />
|
||||||
|
</packageSource>
|
||||||
|
<!--<packageSource key="LibHacAlpha">
|
||||||
|
<package pattern="Ryujinx.LibHac" />
|
||||||
|
</packageSource>-->
|
||||||
|
</packageSourceMapping>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
@ -195,6 +195,7 @@ namespace Ryujinx.Common
|
||||||
"01008d100d43e000", // Saints Row IV
|
"01008d100d43e000", // Saints Row IV
|
||||||
"0100de600beee000", // Saints Row: The Third - The Full Package
|
"0100de600beee000", // Saints Row: The Third - The Full Package
|
||||||
"01001180021fa000", // Shovel Knight: Specter of Torment
|
"01001180021fa000", // Shovel Knight: Specter of Torment
|
||||||
|
"0100e1D01eb2e000", // Squeakross: Home Squeak Home
|
||||||
"0100e65002bb8000", // Stardew Valley
|
"0100e65002bb8000", // Stardew Valley
|
||||||
"0100d7a01b7a2000", // Star Wars: Bounty Hunter
|
"0100d7a01b7a2000", // Star Wars: Bounty Hunter
|
||||||
"0100800015926000", // Suika Game
|
"0100800015926000", // Suika Game
|
||||||
|
|
|
@ -21,6 +21,21 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[CommandCmif(3)] // 20.0.0+
|
||||||
|
// CreateLibraryAppletEx(u32, u32, u64) -> object<nn::am::service::ILibraryAppletAccessor>
|
||||||
|
public ResultCode CreateLibraryAppletEx(ServiceCtx context)
|
||||||
|
{
|
||||||
|
AppletId appletId = (AppletId)context.RequestData.ReadInt32();
|
||||||
|
|
||||||
|
_ = context.RequestData.ReadInt32(); // libraryAppletMode
|
||||||
|
|
||||||
|
_ = context.RequestData.ReadUInt64(); // threadId
|
||||||
|
|
||||||
|
MakeObject(context, new ILibraryAppletAccessor(appletId, context.Device.System));
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
[CommandCmif(10)]
|
[CommandCmif(10)]
|
||||||
// CreateStorage(u64) -> object<nn::am::service::IStorage>
|
// CreateStorage(u64) -> object<nn::am::service::IStorage>
|
||||||
public ResultCode CreateStorage(ServiceCtx context)
|
public ResultCode CreateStorage(ServiceCtx context)
|
||||||
|
|
|
@ -885,7 +885,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
// F_SETFL
|
// F_SETFL
|
||||||
else if (cmd == 0x4)
|
else if (cmd == 0x4)
|
||||||
{
|
{
|
||||||
socket.Blocking = (arg & 0x800) != 0;
|
socket.Blocking = (arg & 0x800) == 0;
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
namespace Ryujinx.Ava.Common.Models.Github
|
|
||||||
{
|
|
||||||
public class GithubReleaseAssetJsonResponse
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
public string State { get; set; }
|
|
||||||
public string BrowserDownloadUrl { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Common.Models.Github
|
|
||||||
{
|
|
||||||
public class GithubReleasesJsonResponse
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
public string TagName { get; set; }
|
|
||||||
public List<GithubReleaseAssetJsonResponse> Assets { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Common.Models.Github
|
|
||||||
{
|
|
||||||
[JsonSerializable(typeof(GithubReleasesJsonResponse), GenerationMode = JsonSourceGenerationMode.Metadata)]
|
|
||||||
public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext;
|
|
||||||
}
|
|
|
@ -65,6 +65,8 @@
|
||||||
<PackageReference Include="Ryujinx.Audio.OpenAL.Dependencies" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'linux-arm64' AND '$(RuntimeIdentifier)' != 'osx-x64' AND '$(RuntimeIdentifier)' != 'osx-arm64'" />
|
<PackageReference Include="Ryujinx.Audio.OpenAL.Dependencies" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'linux-arm64' AND '$(RuntimeIdentifier)' != 'osx-x64' AND '$(RuntimeIdentifier)' != 'osx-arm64'" />
|
||||||
<PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies.AllArch" />
|
<PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies.AllArch" />
|
||||||
<PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'linux-arm64' AND '$(RuntimeIdentifier)' != 'win-x64' AND '$(RuntimeIdentifier)' != 'win-arm64'" />
|
<PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'linux-arm64' AND '$(RuntimeIdentifier)' != 'win-x64' AND '$(RuntimeIdentifier)' != 'win-arm64'" />
|
||||||
|
<PackageReference Include="Ryujinx.UpdateClient" />
|
||||||
|
<PackageReference Include="Ryujinx.Systems.Update.Common" />
|
||||||
<PackageReference Include="securifybv.ShellLink" />
|
<PackageReference Include="securifybv.ShellLink" />
|
||||||
<PackageReference Include="Sep" />
|
<PackageReference Include="Sep" />
|
||||||
<PackageReference Include="Silk.NET.Vulkan" />
|
<PackageReference Include="Silk.NET.Vulkan" />
|
||||||
|
|
|
@ -75,6 +75,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
|
|
||||||
private readonly long _ticksPerFrame;
|
private readonly long _ticksPerFrame;
|
||||||
private readonly Stopwatch _chrono;
|
private readonly Stopwatch _chrono;
|
||||||
|
private readonly Stopwatch _playTimer;
|
||||||
private long _ticks;
|
private long _ticks;
|
||||||
|
|
||||||
private readonly AccountManager _accountManager;
|
private readonly AccountManager _accountManager;
|
||||||
|
@ -175,6 +176,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
|
|
||||||
_chrono = new Stopwatch();
|
_chrono = new Stopwatch();
|
||||||
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
|
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
|
||||||
|
_playTimer = new Stopwatch();
|
||||||
|
|
||||||
if (ApplicationPath.StartsWith("@SystemContent"))
|
if (ApplicationPath.StartsWith("@SystemContent"))
|
||||||
{
|
{
|
||||||
|
@ -565,6 +567,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
_isActive = false;
|
_isActive = false;
|
||||||
|
_playTimer.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Exit()
|
private void Exit()
|
||||||
|
@ -616,7 +619,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
private void Dispose()
|
private void Dispose()
|
||||||
{
|
{
|
||||||
if (Device.Processes != null)
|
if (Device.Processes != null)
|
||||||
MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText);
|
MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText, _playTimer.Elapsed);
|
||||||
|
|
||||||
ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState;
|
ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState;
|
||||||
ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState;
|
ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState;
|
||||||
|
@ -635,6 +638,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
_gpuCancellationTokenSource.Dispose();
|
_gpuCancellationTokenSource.Dispose();
|
||||||
|
|
||||||
_chrono.Stop();
|
_chrono.Stop();
|
||||||
|
_playTimer.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisposeGpu()
|
public void DisposeGpu()
|
||||||
|
@ -868,6 +872,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
|
ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
|
||||||
appMetadata => appMetadata.UpdatePreGame()
|
appMetadata => appMetadata.UpdatePreGame()
|
||||||
);
|
);
|
||||||
|
_playTimer.Start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -877,6 +882,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
Device?.System.TogglePauseEmulation(false);
|
Device?.System.TogglePauseEmulation(false);
|
||||||
|
|
||||||
_viewModel.IsPaused = false;
|
_viewModel.IsPaused = false;
|
||||||
|
_playTimer.Start();
|
||||||
_viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI);
|
_viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI);
|
||||||
Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed");
|
Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed");
|
||||||
}
|
}
|
||||||
|
@ -886,6 +892,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
Device?.System.TogglePauseEmulation(true);
|
Device?.System.TogglePauseEmulation(true);
|
||||||
|
|
||||||
_viewModel.IsPaused = true;
|
_viewModel.IsPaused = true;
|
||||||
|
_playTimer.Stop();
|
||||||
_viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI, LocaleManager.Instance[LocaleKeys.Paused]);
|
_viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI, LocaleManager.Instance[LocaleKeys.Paused]);
|
||||||
Logger.Info?.Print(LogClass.Emulation, "Emulation was paused");
|
Logger.Info?.Print(LogClass.Emulation, "Emulation was paused");
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,19 +33,11 @@ namespace Ryujinx.Ava.Systems.AppLibrary
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates <see cref="LastPlayed"/> and <see cref="TimePlayed"/>. Call this after a game ends.
|
/// Updates <see cref="LastPlayed"/> and <see cref="TimePlayed"/>. Call this after a game ends.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void UpdatePostGame()
|
/// <param name="playTime">The active gameplay time this past session.</param>
|
||||||
|
public void UpdatePostGame(TimeSpan playTime)
|
||||||
{
|
{
|
||||||
DateTime? prevLastPlayed = LastPlayed;
|
|
||||||
UpdatePreGame();
|
UpdatePreGame();
|
||||||
|
TimePlayed += playTime;
|
||||||
if (!prevLastPlayed.HasValue)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
TimeSpan diff = DateTime.UtcNow - prevLastPlayed.Value;
|
|
||||||
double newTotalSeconds = TimePlayed.Add(diff).TotalSeconds;
|
|
||||||
TimePlayed = TimeSpan.FromSeconds(Math.Round(newTotalSeconds, MidpointRounding.AwayFromZero));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,42 +4,26 @@ using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
|
using Ryujinx.Systems.Update.Client;
|
||||||
|
using Ryujinx.Systems.Update.Common;
|
||||||
using System;
|
using System;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Net.Http.Json;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems
|
namespace Ryujinx.Ava.Systems
|
||||||
{
|
{
|
||||||
internal static partial class Updater
|
internal static partial class Updater
|
||||||
{
|
{
|
||||||
private static string CreateUpdateQueryUrl()
|
private static VersionResponse _versionResponse;
|
||||||
{
|
|
||||||
#pragma warning disable CS8524
|
|
||||||
var os = RunningPlatform.CurrentOS switch
|
|
||||||
#pragma warning restore CS8524
|
|
||||||
{
|
|
||||||
OperatingSystemType.MacOS => "mac",
|
|
||||||
OperatingSystemType.Linux => "linux",
|
|
||||||
OperatingSystemType.Windows => "win"
|
|
||||||
};
|
|
||||||
|
|
||||||
var arch = RunningPlatform.Architecture switch
|
private static UpdateClient CreateUpdateClient()
|
||||||
{
|
=> UpdateClient.Builder()
|
||||||
Architecture.Arm64 => "arm",
|
.WithServerEndpoint("https://update.ryujinx.app") // This is the default, and doesn't need to be provided; it's here for transparency.
|
||||||
Architecture.X64 => "amd64",
|
.WithLogger((format, args, caller) =>
|
||||||
_ => null
|
Logger.Info?.Print(
|
||||||
};
|
LogClass.Application,
|
||||||
|
args.Length is 0 ? format : format.Format(args),
|
||||||
if (arch is null)
|
caller: caller)
|
||||||
return null;
|
);
|
||||||
|
|
||||||
var rc = ReleaseInformation.IsCanaryBuild ? "canary" : "stable";
|
|
||||||
|
|
||||||
return $"https://update.ryujinx.app/latest/query?os={os}&arch={arch}&rc={rc}";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<Optional<(Version Current, Version Incoming)>> CheckVersionAsync(bool showVersionUpToDate = false)
|
public static async Task<Optional<(Version Current, Version Incoming)>> CheckVersionAsync(bool showVersionUpToDate = false)
|
||||||
{
|
{
|
||||||
|
@ -57,39 +41,31 @@ namespace Ryujinx.Ava.Systems
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CreateUpdateQueryUrl() is not {} updateUrl)
|
using UpdateClient updateClient = CreateUpdateClient();
|
||||||
{
|
|
||||||
Logger.Error?.Print(LogClass.Application, "Could not determine URL for updates.");
|
|
||||||
|
|
||||||
_running = false;
|
|
||||||
|
|
||||||
return default;
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Info?.Print(LogClass.Application, $"Checking for updates from {updateUrl}.");
|
|
||||||
|
|
||||||
// Get latest version number from update.ryujinx.app API
|
|
||||||
using HttpClient jsonClient = ConstructHttpClient();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
UpdaterResponse response =
|
_versionResponse = await updateClient.QueryLatestAsync(ReleaseInformation.IsCanaryBuild
|
||||||
await jsonClient.GetFromJsonAsync(updateUrl, UpdaterResponseJsonContext.Default.UpdaterResponse);
|
? ReleaseChannel.Canary
|
||||||
|
: ReleaseChannel.Stable);
|
||||||
_buildVer = response.Tag;
|
|
||||||
_buildUrl = response.DownloadUrl;
|
|
||||||
_changelogUrlFormat = response.ReleaseUrlFormat;
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.Application, $"An error occurred when parsing JSON response from API ({e.GetType().AsFullNamePrettyString()}): {e.Message}");
|
Logger.Error?.Print(LogClass.Application, $"An error occurred when requesting for updates ({e.GetType().AsFullNamePrettyString()}): {e.Message}");
|
||||||
|
|
||||||
_running = false;
|
_running = false;
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_versionResponse == null)
|
||||||
|
{
|
||||||
|
// logging is done via the UpdateClient library
|
||||||
|
_running = false;
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
// If build URL not found, assume no new update is available.
|
// If build URL not found, assume no new update is available.
|
||||||
if (_buildUrl is null or "")
|
if (_versionResponse.ArtifactUrl is null or "")
|
||||||
{
|
{
|
||||||
if (showVersionUpToDate)
|
if (showVersionUpToDate)
|
||||||
{
|
{
|
||||||
|
@ -99,7 +75,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
|
|
||||||
if (userResult is UserResult.Ok)
|
if (userResult is UserResult.Ok)
|
||||||
{
|
{
|
||||||
OpenHelper.OpenUrl(_changelogUrlFormat.Format(currentVersion));
|
OpenHelper.OpenUrl(_versionResponse.ReleaseUrlFormat.Format(currentVersion));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +87,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!Version.TryParse(_buildVer, out Version newVersion))
|
if (!Version.TryParse(_versionResponse.Version, out Version newVersion))
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.Application,
|
Logger.Error?.Print(LogClass.Application,
|
||||||
$"Failed to convert the received {RyujinxApp.FullAppName} version from the update server!");
|
$"Failed to convert the received {RyujinxApp.FullAppName} version from the update server!");
|
||||||
|
@ -127,17 +103,5 @@ namespace Ryujinx.Ava.Systems
|
||||||
|
|
||||||
return (currentVersion, newVersion);
|
return (currentVersion, newVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonSerializable(typeof(UpdaterResponse))]
|
|
||||||
partial class UpdaterResponseJsonContext : JsonSerializerContext;
|
|
||||||
|
|
||||||
public class UpdaterResponse
|
|
||||||
{
|
|
||||||
[JsonPropertyName("tag")] public string Tag { get; set; }
|
|
||||||
[JsonPropertyName("download_url")] public string DownloadUrl { get; set; }
|
|
||||||
[JsonPropertyName("web_url")] public string ReleaseUrl { get; set; }
|
|
||||||
|
|
||||||
[JsonIgnore] public string ReleaseUrlFormat => ReleaseUrl.Replace(Tag, "{0}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,13 +5,11 @@ using ICSharpCode.SharpZipLib.GZip;
|
||||||
using ICSharpCode.SharpZipLib.Tar;
|
using ICSharpCode.SharpZipLib.Tar;
|
||||||
using ICSharpCode.SharpZipLib.Zip;
|
using ICSharpCode.SharpZipLib.Zip;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Common.Models.Github;
|
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Common.Utilities;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
@ -35,17 +33,13 @@ namespace Ryujinx.Ava.Systems
|
||||||
private static readonly string _updateDir = Path.Combine(Path.GetTempPath(), "Ryujinx", "update");
|
private static readonly string _updateDir = Path.Combine(Path.GetTempPath(), "Ryujinx", "update");
|
||||||
private static readonly string _updatePublishDir = Path.Combine(_updateDir, "publish");
|
private static readonly string _updatePublishDir = Path.Combine(_updateDir, "publish");
|
||||||
private const int ConnectionCount = 4;
|
private const int ConnectionCount = 4;
|
||||||
|
|
||||||
private static string _buildVer;
|
|
||||||
private static string _buildUrl;
|
|
||||||
private static long _buildSize;
|
private static long _buildSize;
|
||||||
private static bool _updateSuccessful;
|
private static bool _updateSuccessful;
|
||||||
private static bool _running;
|
private static bool _running;
|
||||||
|
|
||||||
private static readonly string[] _windowsDependencyDirs = [];
|
private static readonly string[] _windowsDependencyDirs = [];
|
||||||
|
|
||||||
private static string _changelogUrlFormat = null;
|
|
||||||
|
|
||||||
public static async Task BeginUpdateAsync(bool showVersionUpToDate = false)
|
public static async Task BeginUpdateAsync(bool showVersionUpToDate = false)
|
||||||
{
|
{
|
||||||
if (_running)
|
if (_running)
|
||||||
|
@ -72,7 +66,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
|
|
||||||
if (userResult is UserResult.Ok)
|
if (userResult is UserResult.Ok)
|
||||||
{
|
{
|
||||||
OpenHelper.OpenUrl(_changelogUrlFormat.Format(currentVersion));
|
OpenHelper.OpenUrl(_versionResponse.ReleaseUrlFormat.Format(currentVersion));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +86,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
// GitLab instance is located in Ukraine. Connection times will vary across the world.
|
// GitLab instance is located in Ukraine. Connection times will vary across the world.
|
||||||
buildSizeClient.Timeout = TimeSpan.FromSeconds(10);
|
buildSizeClient.Timeout = TimeSpan.FromSeconds(10);
|
||||||
|
|
||||||
HttpResponseMessage message = await buildSizeClient.GetAsync(new Uri(_buildUrl), HttpCompletionOption.ResponseHeadersRead);
|
HttpResponseMessage message = await buildSizeClient.GetAsync(new Uri(_versionResponse.ArtifactUrl), HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
|
||||||
_buildSize = message.Content.Headers.ContentRange.Length.Value;
|
_buildSize = message.Content.Headers.ContentRange.Length.Value;
|
||||||
}
|
}
|
||||||
|
@ -122,7 +116,7 @@ namespace Ryujinx.Ava.Systems
|
||||||
switch (shouldUpdate)
|
switch (shouldUpdate)
|
||||||
{
|
{
|
||||||
case UserResult.Yes:
|
case UserResult.Yes:
|
||||||
await UpdateRyujinx(_buildUrl);
|
await UpdateRyujinx(_versionResponse.ArtifactUrl);
|
||||||
break;
|
break;
|
||||||
// Secondary button maps to no, which in this case is the show changelog button.
|
// Secondary button maps to no, which in this case is the show changelog button.
|
||||||
case UserResult.No:
|
case UserResult.No:
|
||||||
|
|
|
@ -1688,8 +1688,8 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
RendererHostControl.Focus();
|
RendererHostControl.Focus();
|
||||||
});
|
});
|
||||||
|
|
||||||
public static void UpdateGameMetadata(string titleId)
|
public static void UpdateGameMetadata(string titleId, TimeSpan playTime)
|
||||||
=> ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => appMetadata.UpdatePostGame());
|
=> ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => appMetadata.UpdatePostGame(playTime));
|
||||||
|
|
||||||
public void RefreshFirmwareStatus()
|
public void RefreshFirmwareStatus()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue