Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| caef97f84b |
@@ -1,2 +0,0 @@
|
|||||||
liberapay: crueter
|
|
||||||
custom: 'https://www.paypal.biz/edenemulator'
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
- [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
|
- [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
|
||||||
|
- [ ] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md)
|
||||||
- [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
|
- [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
|
||||||
- [ ] I have read and followed the [website policy](https://git.eden-emu.dev/eden-emu/site-policy).
|
|
||||||
- [ ] I affirm that the content of this pull request body was written and submitted entirely by me, in my own words, and not by an AI agent or LLM.
|
|
||||||
- [ ] I affirm that I did not read any of this, and understand that my pull request will be closed if I check this box.
|
|
||||||
- [ ] I affirm that, by submitting this pull request, I am responsible for all of the changes contained within these commits.
|
|
||||||
|
|
||||||
-------------------
|
-------------------
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
# Build directory
|
# Build directory
|
||||||
/[Bb]uild*/
|
/[Bb]uild*/
|
||||||
doc-build/
|
doc-build/
|
||||||
out/
|
|
||||||
AppDir/
|
AppDir/
|
||||||
uruntime
|
uruntime
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
diff --git a/cmake/ConfigureOpenSSL.cmake b/cmake/ConfigureOpenSSL.cmake
|
|
||||||
index 3012e05..2ae23ff 100644
|
|
||||||
--- a/cmake/ConfigureOpenSSL.cmake
|
|
||||||
+++ b/cmake/ConfigureOpenSSL.cmake
|
|
||||||
@@ -108,7 +108,8 @@ function(configure_openssl)
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT "${CONFIGURE_OPTIONS_OLD}" STREQUAL "")
|
|
||||||
- if(CONFIGURE_OPTIONS STREQUAL CONFIGURE_OPTIONS_OLD)
|
|
||||||
+ # TODO(lizzie): Emscripten has issues with rebuilding due to the wrapper it uses
|
|
||||||
+ if(CMAKE_SYSTEM_NAME MATCHES "Emscripten" OR CONFIGURE_OPTIONS STREQUAL CONFIGURE_OPTIONS_OLD)
|
|
||||||
message(STATUS "Found previous configure results. Don't perform configuration")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
@@ -134,10 +135,24 @@ function(configure_openssl)
|
|
||||||
set(VERBOSE_OPTION OUTPUT_QUIET)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
+ if (CMAKE_SYSTEM_NAME MATCHES "Emscripten")
|
|
||||||
+ set(EMSCRIPTEN_CMAKE_WRAPPER "emcmake")
|
|
||||||
+ find_program(EMCC emcc REQUIRED)
|
|
||||||
+ set(EMSCRIPTEN_LINKER ${EMCC})
|
|
||||||
+ list(APPEND CONFIGURE_COMMAND wasm64)
|
|
||||||
+ else()
|
|
||||||
+ set(EMSCRIPTEN_CMAKE_WRAPPER "")
|
|
||||||
+ set(EMSCRIPTEN_LINKER ${CMAKE_LINKER})
|
|
||||||
+ endif ()
|
|
||||||
+
|
|
||||||
execute_process(
|
|
||||||
- COMMAND ${CMAKE_COMMAND} -E env
|
|
||||||
+ COMMAND ${EMSCRIPTEN_CMAKE_WRAPPER} ${CMAKE_COMMAND} -E env
|
|
||||||
"CFLAGS=${CMAKE_C_FLAGS}"
|
|
||||||
"CXXFLAGS=${CMAKE_CXX_FLAGS}"
|
|
||||||
+ "LDFLAGS=${CMAKE_CXX_LINK_FLAGS}"
|
|
||||||
+ "CC=${CMAKE_C_COMPILER}"
|
|
||||||
+ "CXX=${CMAKE_CXX_COMPILER}"
|
|
||||||
+ "LD=${EMSCRIPTEN_LINKER}"
|
|
||||||
${CONFIGURE_COMMAND}
|
|
||||||
WORKING_DIRECTORY ${CONFIGURE_BUILD_DIR}
|
|
||||||
${VERBOSE_OPTION}
|
|
||||||
@@ -1,10 +1 @@
|
|||||||
# AGENTS
|
AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase.
|
||||||
|
|
||||||
Read and follow the [contribution guidelines](./CONTRIBUTING.md) and our [site policy](https://git.eden-emu.dev/eden-emu/site-policy/src/branch/master)..
|
|
||||||
|
|
||||||
Do not, under any circumstances, ever:
|
|
||||||
|
|
||||||
- Submit PRs, push commits, or request any API calls on behalf of the user.
|
|
||||||
- Write commit messages, PR descriptions, or issues on behalf of the user.
|
|
||||||
|
|
||||||
Keep comments to a reasonable level. Do not overexplain or add/remove comments from unrelated parts of the codebase.
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase.
|
||||||
@@ -24,7 +24,7 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (lz4_FOUND AND NOT TARGET lz4::lz4)
|
if (lz4_FOUND AND NOT TARGET lz4::lz4)
|
||||||
if (TARGET LZ4::lz4_shared AND NOT YUZU_STATIC_BUILD)
|
if (TARGET LZ4::lz4_shared)
|
||||||
add_library(lz4::lz4 ALIAS LZ4::lz4_shared)
|
add_library(lz4::lz4 ALIAS LZ4::lz4_shared)
|
||||||
elseif (TARGET LZ4::lz4_static)
|
elseif (TARGET LZ4::lz4_static)
|
||||||
add_library(lz4::lz4 ALIAS LZ4::lz4_static)
|
add_library(lz4::lz4 ALIAS LZ4::lz4_static)
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This document is not to be perused by AI models.
|
||||||
|
-->
|
||||||
|
|
||||||
Eden has lots of different ways that you can contribute to its efforts, even without knowing how to write code:
|
Eden has lots of different ways that you can contribute to its efforts, even without knowing how to write code:
|
||||||
|
|
||||||
- Donate! This will help us live our lives, pay for infrastructure/testing hardware, and more
|
- Donate! This will help us live our lives, pay for infrastructure/testing hardware, and more
|
||||||
@@ -16,38 +20,18 @@ Eden is free, open-source, copyleft software, licensed under the terms of the [G
|
|||||||
|
|
||||||
### Policies
|
### Policies
|
||||||
|
|
||||||
- AI usage is allowed, but we reserve the right to close and rework your PR if you don't fully understand the changes you're making. Additionally:
|
- No LLM or AI usage, *period*, for patches, pull requests, issues, comments, debugging, brainstorming, etc.
|
||||||
- As a common courtesy, please disclose your AI usage under the PR description, as `Assisted-by: <AI model> (<how it helped>)`.
|
- For details on why, see the [detailed AI policy](docs/policies/AI.md).
|
||||||
- All PR descriptions, issue bodies, and comments **must** be written by you, in your own words.
|
- Usage of any form of profanity or otherwise unsavory language is generally discouraged.
|
||||||
- AI-written comments/descriptions/bodies are not only difficult for us to read, they also indicate to us that you did not put in the effort to actually understand your changes. These will be closed, deleted, or hidden without warning.
|
- This is primarily because it rarely helps to actually understand what's going on.
|
||||||
- Spamming of low-effort AI-generated pull requests or issues is considered a [Human Effort Denial of Service](https://tiangolo.com/open-source/contributing/#human-effort-denial-of-service), and will result in the immediate suspension of your Forgejo account, or you getting blocked from the organization on other platforms.
|
- Remember that your comments should be focused and actually address what's happening. With very few exceptions, expletives are actively detrimental at best.
|
||||||
- Usage of any form of profanity or otherwise unsavory language is discouraged but not strictly disallowed.
|
- New code must follow the same general style as the surrounding codebase. Exceptions may be granted in certain cases.
|
||||||
- New code must follow the same style as the surrounding codebase. Exceptions may be granted in certain cases.
|
|
||||||
- Maintainers reserve the right to change your patches and pull requests at will. We will try to avoid this.
|
- Maintainers reserve the right to change your patches and pull requests at will. We will try to avoid this.
|
||||||
- You should generally respect all decisions made by the [code owners](docs/CODEOWNERS) in your particular subsystem.
|
- You should generally respect all decisions made by the [code owners](docs/CODEOWNERS) in your particular subsystem.
|
||||||
- However, if you feel they are overstepping or are incorrect, don't be afraid to stand your ground! Maintainers are not always correct.
|
- However, if you feel they are overstepping or are incorrect, don't be afraid to stand your ground! Maintainers are not always correct.
|
||||||
- While we do *not* adhere to the terms of a formal code of conduct, you are expected to treat other developers, contributors, and community members respectfully.
|
- While we do *not* adhere to the terms of a formal code of conduct, you will generally be expected to respect other developers, contributors, and community members.
|
||||||
- You **must** have basic knowledge of [Git](https://git-scm.com/learn). Knowing how to manage your branches and follow proper fork policies is a necessity.
|
- You **must** have basic knowledge of [Git](https://git-scm.com/learn). Knowing how to manage your branches and follow proper fork policies is a necessity.
|
||||||
|
|
||||||
### Pull Requests
|
|
||||||
|
|
||||||
Pull requests are only to be merged by core developers when properly tested and discussions conclude on Discord or other communication channels. Labels are recommended but not required. However, all PRs MUST be namespaced and optionally typed:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
[cmake] refactor: CPM over submodules
|
|
||||||
[desktop] feat: implement firmware install from ZIP
|
|
||||||
[hle] stub fw20 functions
|
|
||||||
[core] test: raise maximum CPU cores to 6
|
|
||||||
[cmake, core] Unbreak FreeBSD Building Process
|
|
||||||
```
|
|
||||||
|
|
||||||
- The level of namespacing is generally left to the committer's choice.
|
|
||||||
- However, we never recommend going more than two levels *except* in `hle`, in which case you may go as many as four levels depending on the specificity of your changes.
|
|
||||||
- Ocassionally, up to two additional namespaces may be provided for more clarity.
|
|
||||||
- Changes that affect the entire project (sans CMake changes) should be namespaced as `meta`.
|
|
||||||
- Maintainers are permitted to change namespaces at will.
|
|
||||||
- Commits within PRs are not required to be namespaced, but it is highly recommended.
|
|
||||||
|
|
||||||
### Where do I start?
|
### Where do I start?
|
||||||
|
|
||||||
Anywhere you like! If you are facing an issue and want to fix it, go ahead. For new features, you are heavily encouraged to open a feature request on GitHub, Codeberg, or Forgejo first, discussing the motivations, potential implementation, and user flow of your desired feature. Our UI/UX designers will work with you to refine your feature before you actually choose to implement it.
|
Anywhere you like! If you are facing an issue and want to fix it, go ahead. For new features, you are heavily encouraged to open a feature request on GitHub, Codeberg, or Forgejo first, discussing the motivations, potential implementation, and user flow of your desired feature. Our UI/UX designers will work with you to refine your feature before you actually choose to implement it.
|
||||||
@@ -59,10 +43,7 @@ You may also search for open issues on [GitHub](https://github.com/eden-emulator
|
|||||||
There are five primary ways to contribute.
|
There are five primary ways to contribute.
|
||||||
|
|
||||||
- Submit pull requests directly to our source tree
|
- Submit pull requests directly to our source tree
|
||||||
- You must first [create an account](https://git.eden-emu.dev/user/sign_up).
|
- You must first request an account on our Forgejo. See [Signup](#how-do-i-sign-up)
|
||||||
- You may use an internal account, or you may use a GitHub/Codeberg account linked to our instance.
|
|
||||||
- Please make sure to read our [site policy](https://git.eden-emu.dev/eden-emu/site-policy/src/branch/master).
|
|
||||||
- Both your account and your associated fork must be public, *not* limited/private, otherwise our CI workflow will not work on your pull requests.
|
|
||||||
- Submit pull requests to our [GitHub mirror](https://github.com/eden-emulator/Issue-Reports)
|
- Submit pull requests to our [GitHub mirror](https://github.com/eden-emulator/Issue-Reports)
|
||||||
- Note that this is subject to being removed by DMCA, so don't rely on this.
|
- Note that this is subject to being removed by DMCA, so don't rely on this.
|
||||||
- Submit pull requests to our [Codeberg mirror](https://codeberg.org/eden-emu/eden)
|
- Submit pull requests to our [Codeberg mirror](https://codeberg.org/eden-emu/eden)
|
||||||
@@ -72,10 +53,33 @@ There are five primary ways to contribute.
|
|||||||
- Alongside the contents of your email, please attach the patch/diff file itself for easy access and use.
|
- Alongside the contents of your email, please attach the patch/diff file itself for easy access and use.
|
||||||
- Email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev) with any of your relevant findings or code changes.
|
- Email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev) with any of your relevant findings or code changes.
|
||||||
|
|
||||||
To test your changes, ensure to read the [build documentation](./docs/Build.md) for your specific platform(s) to ensure everything compiles and works properly. You should also make sure that your branch is up-to-date with the upstream `master` branch before opening a pull request. **You** are responsible for ensuring that your contribution does what it says and doesn't break everything else horribly.
|
To test your changes, ensure to read the [build documentation](./docs/Build.md) for your specific platform(s) to ensure everything compiles and works properly. You should also make sure that your branch is up-to-date with the upstream `master` branch before opening a pull request.
|
||||||
|
|
||||||
|
### How do I sign up?
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>To sign up and begin contributing... (click to open)</summary>
|
||||||
|
|
||||||
|
Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the following format:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Subject: [Eden Git] Registration Request
|
||||||
|
Username: <Your Desired Username>
|
||||||
|
Email: <Your Desired Email>
|
||||||
|
I wish to sign up because... <your reason here>
|
||||||
|
```
|
||||||
|
|
||||||
|
Received mail that does not follow this format will be ignored.
|
||||||
|
|
||||||
|
Once your request is processed, you will receive a confirmation email with your temporary password and some information on Git access and policies. If you do not receive a response within 48 hours, feel free to send another email.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Some email providers may place the response email in your spam/junk folder; notable offenders include Gmail and Outlook. *Always* ensure to check your Spam or Junk folder.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## Non-code Contributions
|
## Non-code Contributions
|
||||||
|
|
||||||
Alongside the other contribution methods listed up top, you can also choose to contribute through documentation, organization, or community guides. These can be done either through the code contribution methods described above, or created externally and shared via our Discord community.
|
Alongside the other contribution methods listed up top, you can also choose to contribute through documentation, organization, or community guides. These can be done either through the code contribution methods described above, or created externally and shared via our Discord community.
|
||||||
|
|
||||||
If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev).
|
If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev). **Do not submit vibe-coded or AI generated tools or applications**.
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
"name": "ffmpeg",
|
"name": "ffmpeg",
|
||||||
"package": "FFmpeg",
|
"package": "FFmpeg",
|
||||||
"repo": "crueter-ci/FFmpeg",
|
"repo": "crueter-ci/FFmpeg",
|
||||||
"version": "9.0.2-1790726865-946fcce07b"
|
"version": "9.0.1-1788120736-bf1b838f2a"
|
||||||
},
|
},
|
||||||
"fmt": {
|
"fmt": {
|
||||||
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
||||||
@@ -202,8 +202,7 @@
|
|||||||
"0001-cpmutil-compat.patch",
|
"0001-cpmutil-compat.patch",
|
||||||
"0002-use-ccache.patch",
|
"0002-use-ccache.patch",
|
||||||
"0003-use-cmake-compiler-flags.patch",
|
"0003-use-cmake-compiler-flags.patch",
|
||||||
"0004-use-shell-wrapper.patch",
|
"0004-use-shell-wrapper.patch"
|
||||||
"0005-cross-compile.patch"
|
|
||||||
],
|
],
|
||||||
"repo": "jimmy-park/openssl-cmake",
|
"repo": "jimmy-park/openssl-cmake",
|
||||||
"version": "3.6.2"
|
"version": "3.6.2"
|
||||||
@@ -334,11 +333,6 @@
|
|||||||
"repo": "herumi/xbyak",
|
"repo": "herumi/xbyak",
|
||||||
"version": "v7.40.1"
|
"version": "v7.40.1"
|
||||||
},
|
},
|
||||||
"zbic": {
|
|
||||||
"hash": "fbe2f37986377d7f0d96ae3224c80b5971df6e8b6961f68061f1975ebb2e8cb78f07b90f014b007be4023dbf5513581504e7f7d61a5237cb2a8a7a61ae11e482",
|
|
||||||
"repo": "kinnay/zbic",
|
|
||||||
"version": "11b08f2712264bbed731545085cbd9702096ceb7"
|
|
||||||
},
|
|
||||||
"zlib": {
|
"zlib": {
|
||||||
"hash": "16fea4df307a68cf0035858abe2fd550250618a97590e202037acd18a666f57afc10f8836cbbd472d54a0e76539d0e558cb26f059d53de52ff90634bbf4f47d4",
|
"hash": "16fea4df307a68cf0035858abe2fd550250618a97590e202037acd18a666f57afc10f8836cbbd472d54a0e76539d0e558cb26f059d53de52ff90634bbf4f47d4",
|
||||||
"min_version": "1.2",
|
"min_version": "1.2",
|
||||||
@@ -352,13 +346,13 @@
|
|||||||
},
|
},
|
||||||
"zstd": {
|
"zstd": {
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE",
|
||||||
"hash": "2b006c3c110c38bd2f5896b42d36a38931c8eae261f30552f9a9fd04458d218d8f1a1425f117fd12af545ed77042e4b2d1a1a9b6286c4d0b9d74ef79f20a8f08",
|
"hash": "cc5ad4b119a9c2ea57f0b71eeff01113bb506e0d17000159c5409cb8236d22e38c52d5e9e97e7947a4bf1b2dfc44b6c503ab2d9aedbd59458435c6a2849cb029",
|
||||||
"min_version": "1.5",
|
"min_version": "1.5",
|
||||||
"options": [
|
"options": [
|
||||||
"ZSTD_BUILD_SHARED OFF"
|
"ZSTD_BUILD_SHARED OFF"
|
||||||
],
|
],
|
||||||
"repo": "facebook/zstd",
|
"repo": "facebook/zstd",
|
||||||
"source_subdir": "build/cmake",
|
"source_subdir": "build/cmake",
|
||||||
"version": "33618c8"
|
"version": "b8d6101fba"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 14 KiB |
@@ -1 +1,144 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" fill="none" viewBox="0 0 512 512"><defs><linearGradient id="c"><stop offset="0" style="stop-color:#f71baa;stop-opacity:.56623769"/><stop offset="1" style="stop-color:#fa87d4;stop-opacity:.25"/></linearGradient><linearGradient id="b"><stop offset="0" style="stop-color:#fe00b1;stop-opacity:1"/><stop offset="1" style="stop-color:#fe00b1;stop-opacity:0"/></linearGradient><linearGradient id="a"><stop offset="0" style="stop-color:#ff0950;stop-opacity:.5"/><stop offset=".496" style="stop-color:#bf42f6;stop-opacity:.75"/><stop offset="1" style="stop-color:#5da5ed;stop-opacity:1"/></linearGradient><linearGradient xlink:href="#a" id="d" x1="270.4" x2="270.4" y1="40" y2="494.4" gradientTransform="translate(-33.928 -34.199)scale(1.07505)" gradientUnits="userSpaceOnUse" spreadMethod="reflect"/><linearGradient xlink:href="#b" id="f" x1="125.402" x2="431.024" y1="271.834" y2="271.834" gradientTransform="translate(-33.928 -34.199)scale(1.07505)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#c" id="e" x1="270.4" x2="270.4" y1="33.584" y2="500.816" gradientTransform="translate(-33.928 -34.199)scale(1.07505)" gradientUnits="userSpaceOnUse"/></defs><circle cx="256.764" cy="253.054" r="244.25" style="fill:url(#d);fill-opacity:1;stroke:url(#e);stroke-width:13.7948;stroke-opacity:.566238;paint-order:stroke fill markers"/><path d="M55.701 114.372a244 244 0 0 0-10.836 17.2h423.797a244 244 0 0 0-10.837-17.2z" style="fill:#fff;fill-opacity:.5;stroke:none;stroke-width:17.2007;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"/><path d="m219.665 499.138-10.338-55.949" style="fill:#ff2bd5;fill-opacity:1;stroke-width:14.3776;stroke-opacity:.415999;paint-order:stroke fill markers"/><path d="M58.272 395.39a244 244 0 0 0 13.54 17.2h369.902a244 244 0 0 0 13.541-17.2zM24.605 328.953a244 244 0 0 0 6.347 17.2h451.623a244 244 0 0 0 6.347-17.2zM12.586 259.075a244 244 0 0 0 1.033 17.2h486.289a244 244 0 0 0 1.033-17.2z" style="fill:#fff;fill-opacity:.5;stroke:none;stroke-width:17.2007;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"/><path d="M306.217 12.242s-11.75 42.031-17.703 63.363c-12.713 9.965-21.075 19.29-21.075 19.29s-22.956-32.534-44.85-46.065c-21.892-13.531-51.398-11.788-51.398-11.788s-12.257 0-27.092 5.806c-14.836 5.805-20.857 9.675-20.857 9.675s15.053-.43 37.199 7.095 31.82 12.042 31.82 12.042l30.423-6.881-8.277 11.611s14.514 9.353 22.362 17.739c7.848 8.385 11.502 13.114 11.502 13.114s-13.652-5.697-55.579-1.826-83.209 59.127-83.209 59.127 40.42-16.771 64.287-22.362c23.866-5.59 46.657-8.386 46.657-8.386s-18.06 7.74-37.41 40.207c-19.351 32.467-13.762 84.07-13.762 84.07s30.747-61.923 60.203-82.778 35.476-21.501 35.476-21.501-23.65 50.742-32.896 132.23c-9.245 81.489 29.671 217.804 29.671 217.804l46.872-7.311s-44.721-44.291-48.591-158.676 16.34-182.758 16.34-182.758 16.771 1.29 41.712 34.401 39.56 60.203 39.56 60.203 9.463-53.753-11.178-78.264-52.463-35.26-52.463-35.26 13.438-6.988 41.282-4.945c27.844 2.042 85.6 28.444 85.6 28.444S405.336 132.903 369 114.355s-79.77.307-79.77.307 4.055-16.119 28.533-34.21C342.24 62.358 373.56 44.42 373.56 44.42s-25.845 1.217-54.124 12.62c-7.036 2.837-13.79 6.605-19.966 10.666l17.067-53.528z" style="fill:url(#f);fill-opacity:1;stroke:#fff;stroke-width:17.2007;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"/></svg>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="512"
|
||||||
|
height="512"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
version="1.1"
|
||||||
|
id="svg7"
|
||||||
|
sodipodi:docname="base.svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs7">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient24"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f71baa;stop-opacity:0.56623769;"
|
||||||
|
offset="0"
|
||||||
|
id="stop24" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#fa87d4;stop-opacity:0.25;"
|
||||||
|
offset="1"
|
||||||
|
id="stop25" />
|
||||||
|
</linearGradient>
|
||||||
|
<rect
|
||||||
|
x="22.627417"
|
||||||
|
y="402.76802"
|
||||||
|
width="521.34025"
|
||||||
|
height="248.94868"
|
||||||
|
id="rect24" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient1"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#fe00b1;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#fe00b1;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop2" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient11"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ff0950;stop-opacity:0.5;"
|
||||||
|
offset="0"
|
||||||
|
id="stop11" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bf42f6;stop-opacity:0.75;"
|
||||||
|
offset="0.49556771"
|
||||||
|
id="stop20" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5da5ed;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop12" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient11"
|
||||||
|
id="linearGradient12"
|
||||||
|
x1="270.39996"
|
||||||
|
y1="39.999989"
|
||||||
|
x2="270.39996"
|
||||||
|
y2="494.39996"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
spreadMethod="reflect"
|
||||||
|
gradientTransform="matrix(1.075046,0,0,1.075046,-33.928383,-34.198735)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1"
|
||||||
|
id="linearGradient2"
|
||||||
|
x1="125.40197"
|
||||||
|
y1="271.834"
|
||||||
|
x2="431.02424"
|
||||||
|
y2="271.834"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.075046,0,0,1.075046,-33.928383,-34.198735)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient24"
|
||||||
|
id="linearGradient25"
|
||||||
|
x1="270.39996"
|
||||||
|
y1="33.58408"
|
||||||
|
x2="270.39996"
|
||||||
|
y2="500.81589"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.075046,0,0,1.075046,-33.928383,-34.198735)" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="0.88388348"
|
||||||
|
inkscape:cx="141.98704"
|
||||||
|
inkscape:cy="265.87215"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="849"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg7" />
|
||||||
|
<circle
|
||||||
|
style="fill:url(#linearGradient12);fill-opacity:1;stroke:url(#linearGradient25);stroke-width:13.7948;stroke-opacity:0.566238;paint-order:stroke fill markers"
|
||||||
|
id="path8"
|
||||||
|
cx="256.76401"
|
||||||
|
cy="253.05354"
|
||||||
|
r="244.25046" />
|
||||||
|
<path
|
||||||
|
id="rect1-3"
|
||||||
|
style="fill:#ffffff;fill-opacity:0.5;stroke:none;stroke-width:17.2007;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="M 55.701477,114.37179 A 244.25044,244.25044 0 0 0 44.86493,131.57252 h 423.79699 a 244.25044,244.25044 0 0 0 -10.83655,-17.20073 z" />
|
||||||
|
<path
|
||||||
|
style="fill:#ff2bd5;fill-opacity:1;stroke-width:14.3776;stroke-opacity:0.415999;paint-order:stroke fill markers"
|
||||||
|
d="M 219.6651,499.13816 209.32675,443.18948"
|
||||||
|
id="path9" />
|
||||||
|
<path
|
||||||
|
id="rect1-2"
|
||||||
|
style="fill:#ffffff;fill-opacity:0.5;stroke:none;stroke-width:17.2007;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="m 58.271509,395.38922 a 244.25044,244.25044 0 0 0 13.54096,17.20073 H 441.71437 a 244.25044,244.25044 0 0 0 13.54097,-17.20073 z" />
|
||||||
|
<path
|
||||||
|
id="rect1-2-5"
|
||||||
|
style="fill:#ffffff;fill-opacity:0.5;stroke:none;stroke-width:17.2007;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="m 24.604933,328.95264 a 244.25044,244.25044 0 0 0 6.347389,17.20074 H 482.57453 a 244.25044,244.25044 0 0 0 6.34738,-17.20074 z" />
|
||||||
|
<path
|
||||||
|
id="rect1"
|
||||||
|
style="fill:#ffffff;fill-opacity:0.5;stroke:none;stroke-width:17.2007;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="m 12.586253,259.07464 a 244.25044,244.25044 0 0 0 1.033053,17.20075 H 499.90754 a 244.25044,244.25044 0 0 0 1.03305,-17.20075 z" />
|
||||||
|
<path
|
||||||
|
id="path15"
|
||||||
|
style="fill:url(#linearGradient2);fill-opacity:1;stroke:#ffffff;stroke-width:17.2007;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="m 306.21658,12.242412 c 0,0 -11.75029,42.031067 -17.70256,63.362621 -12.7133,9.964494 -21.07468,19.289937 -21.07468,19.289937 0,0 -22.95662,-32.534232 -44.84956,-46.065299 C 200.69681,35.298604 171.19123,37.04196 171.19123,37.04196 c 0,0 -12.25678,4.2e-4 -27.09242,5.805668 -14.83563,5.805249 -20.85631,9.675414 -20.85631,9.675414 0,0 15.05232,-0.430438 37.19828,7.094883 22.14594,7.525322 31.82093,12.041775 31.82093,12.041775 l 30.42255,-6.880714 -8.27702,11.611336 c 0,0 14.51396,9.3529 22.36179,17.738259 7.84785,8.385359 11.50216,13.114729 11.50216,13.114729 0,0 -13.65224,-5.69691 -55.57904,-1.82674 -41.92679,3.87016 -83.20898,59.12752 -83.20898,59.12752 0,0 40.42048,-16.77155 64.28649,-22.36179 23.86602,-5.59024 46.65742,-8.3862 46.65742,-8.3862 0,0 -18.05952,7.74075 -37.41035,40.20714 -19.35082,32.46639 -13.76142,84.06986 -13.76142,84.06986 0,0 30.74631,-61.92266 60.20258,-82.77854 29.45625,-20.8559 35.47652,-21.50092 35.47652,-21.50092 0,0 -23.6506,50.74216 -32.896,132.23065 -9.24539,81.48849 29.67085,217.8039 29.67085,217.8039 l 46.87159,-7.31116 c 0,0 -44.72107,-44.29147 -48.59124,-158.67636 -3.87017,-114.3849 16.33986,-182.75782 16.33986,-182.75782 0,0 16.77156,1.29005 41.71263,34.40147 24.94106,33.11142 39.56043,60.20258 39.56043,60.20258 0,0 9.46208,-53.75314 -11.1788,-78.26419 -20.64088,-24.51105 -52.46309,-35.26025 -52.46309,-35.26025 0,0 13.4385,-6.98738 41.28219,-4.94479 27.84369,2.04258 85.60053,28.44463 85.60053,28.44462 0,0 -15.50743,-26.7591 -51.84367,-45.30731 -36.33623,-18.548198 -79.76967,0.30655 -79.76967,0.30655 0,0 4.05525,-16.118294 28.53281,-34.210394 24.47756,-18.092095 55.79742,-36.030833 55.79742,-36.030833 0,0 -25.84554,1.216607 -54.12395,12.619193 -7.03608,2.837127 -13.78978,6.605056 -19.96604,10.666471 l 17.06635,-53.527632 z" />
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 21 KiB |
@@ -1 +1,80 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" fill="none" viewBox="0 0 512 512"><defs><linearGradient id="a"><stop offset="0" style="stop-color:#f977d9;stop-opacity:1"/><stop offset=".541" style="stop-color:#a655d5;stop-opacity:1"/><stop offset=".571" style="stop-color:#984fd5;stop-opacity:1"/><stop offset=".597" style="stop-color:#8c4ad4;stop-opacity:1"/><stop offset="1" style="stop-color:#3928d2;stop-opacity:1"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="264.175" x2="264.175" y1="28.386" y2="488.651" gradientTransform="matrix(.97816 0 0 .9788 4.57 5.88)" gradientUnits="userSpaceOnUse"/></defs><path d="M262.975 33.688A218.443 225.23 0 0 0 138.838 73.59l2.3-1.324 20.083-7.07 19.799-3.678 23.334 2.687L228.96 76.65 265.8 115 283 99.4l21.6-13.6 26.4-9.4 29.6-6.8 19.355-.391a218.443 225.23 0 0 0-116.98-35.521M380.076 69.29l-29.877 8.51-21 11.398L307.4 108l-18.6 21.8-1.4 5.2 15-5.4 16.6-1.8 29.8 4 21.4 9.6 22.8 20 6.6 10.2-24.8-10.8-36.4-10-29.2-.8-20.4 4.4 4.4.8 26 13.6 18.8 18.4 12.8 36.8-1.6 36-23.2-37.2-23.2-28.8-25.2-21.6-8.4 15.2-12.4 94L258 364l20.4 88.8 18.795 28.57a218.443 225.23 0 0 0 184.223-222.452A218.443 225.23 0 0 0 380.076 69.291M133.074 77.84a218.443 225.23 0 0 0-88.54 181.078A218.443 225.23 0 0 0 257.04 484.066l-9.695-25.437-9.475-40.445-4.809-37.76-2.687-25.457-.424-33.658 2.404-29.98 5.092-36.347 17.112-63.074 7.07-19.375-6.08 1.557-14.567 6.787-11.382 9.322-19 18-13.2 21.201-11 23.2-13 16.4-2-15.8 2.2-23.8 9.4-27 16.4-24.4 21.641-24.559-12.02 2.264-31.962 7.07-28.99 8.627L119.925 183l.707-2.83 9.191-14.283 21.356-18.385 21.779-12.02 17.111-5.941 18.951-1.555 18.667.707 20.082-.283-1.272-3.252-19.799-19.234-7.072-8.485 1.84-7.353-14.71 3.959-10.888 1.414-16.406-6.787-23.334-7.213z" style="fill:url(#b);fill-opacity:1;stroke:none;stroke-width:13.3314;stroke-opacity:1;paint-order:stroke fill markers"/><path d="M259.367 490.166 298.4 483.2l-20-30.4L258 364l-1.2-82.4 12.4-94 8.4-15.2 25.2 21.6 23.2 28.8 23.2 37.2 1.6-36-12.8-36.8-18.8-18.4-26-13.6-4.4-.8 20.4-4.4 29.2.8 36.4 10 24.8 10.8-6.6-10.2-22.8-20-21.4-9.6-29.8-4-16.6 1.8-15 5.4 1.4-5.2 18.6-21.8 21.8-18.8 21-11.4 30.2-8.6-19.8.4-29.6 6.8-26.4 9.4L283 99.4 265.8 115 228.96 76.65l-24.607-12.445-23.335-2.687-19.799 3.677-20.082 7.071-9.333 5.374 24.324 3.818 23.335 7.213 16.404 6.788 10.89-1.414 14.708-3.96-1.839 7.354 7.071 8.485 19.8 19.234 1.272 3.252-20.082.283-18.667-.707-18.95 1.556-17.113 5.94-21.779 12.02-21.354 18.385-9.193 14.284-.707 2.828 28.143-11.597 28.991-8.626 31.962-7.071 12.02-2.263L199.4 178 183 202.4l-9.4 27-2.2 23.8 2 15.8 13-16.4 11-23.2 13.2-21.2 19-18 11.382-9.322 14.566-6.789 6.081-1.555-7.07 19.375-17.113 63.073-5.09 36.346-2.405 29.981.424 33.658 2.687 25.456 4.809 37.76 9.475 40.446z" style="fill:#1b1b1b;fill-opacity:.12492698;stroke:none;stroke-width:13.374;stroke-opacity:.415999;paint-order:stroke fill markers"/></svg>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="512"
|
||||||
|
height="512"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
version="1.1"
|
||||||
|
id="svg7"
|
||||||
|
sodipodi:docname="base_small.svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs7">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient10"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f977d9;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop10" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#a655d5;stop-opacity:1;"
|
||||||
|
offset="0.54051435"
|
||||||
|
id="stop13" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#984fd5;stop-opacity:1;"
|
||||||
|
offset="0.5714342"
|
||||||
|
id="stop12" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#8c4ad4;stop-opacity:1;"
|
||||||
|
offset="0.59666741"
|
||||||
|
id="stop14" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#3928d2;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop11" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient10"
|
||||||
|
id="linearGradient11"
|
||||||
|
x1="264.17508"
|
||||||
|
y1="28.385544"
|
||||||
|
x2="264.17508"
|
||||||
|
y2="488.65109"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.97815818,0,0,0.97880258,4.570042,5.8799159)" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="0.88388348"
|
||||||
|
inkscape:cx="153.30075"
|
||||||
|
inkscape:cy="243.24473"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="849"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg7"
|
||||||
|
showguides="false" />
|
||||||
|
<path
|
||||||
|
id="path9"
|
||||||
|
style="fill:url(#linearGradient11);fill-opacity:1;stroke:none;stroke-width:13.3314;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="M 262.97461 33.6875 A 218.44267 225.23091 0 0 0 138.83789 73.589844 L 141.13867 72.265625 L 161.2207 65.195312 L 181.01953 61.517578 L 204.35352 64.205078 L 228.96094 76.650391 L 265.80078 115 L 283 99.400391 L 304.59961 85.800781 L 331 76.400391 L 360.59961 69.599609 L 379.95508 69.208984 A 218.44267 225.23091 0 0 0 262.97461 33.6875 z M 380.07617 69.291016 L 350.19922 77.800781 L 329.19922 89.199219 L 307.40039 108 L 288.80078 129.80078 L 287.40039 135 L 302.40039 129.59961 L 319 127.80078 L 348.80078 131.80078 L 370.19922 141.40039 L 393 161.40039 L 399.59961 171.59961 L 374.80078 160.80078 L 338.40039 150.80078 L 309.19922 150 L 288.80078 154.40039 L 293.19922 155.19922 L 319.19922 168.80078 L 338 187.19922 L 350.80078 224 L 349.19922 260 L 326 222.80078 L 302.80078 194 L 277.59961 172.40039 L 269.19922 187.59961 L 256.80078 281.59961 L 258 364 L 278.40039 452.80078 L 297.19531 481.36914 A 218.44267 225.23091 0 0 0 481.41797 258.91797 A 218.44267 225.23091 0 0 0 380.07617 69.291016 z M 133.07422 77.839844 A 218.44267 225.23091 0 0 0 44.533203 258.91797 A 218.44267 225.23091 0 0 0 257.04102 484.06641 L 247.3457 458.62891 L 237.87109 418.18359 L 233.0625 380.42383 L 230.375 354.9668 L 229.95117 321.30859 L 232.35547 291.32812 L 237.44727 254.98242 L 254.55859 191.9082 L 261.62891 172.5332 L 255.54883 174.08984 L 240.98242 180.87695 L 229.59961 190.19922 L 210.59961 208.19922 L 197.40039 229.40039 L 186.40039 252.59961 L 173.40039 269 L 171.40039 253.19922 L 173.59961 229.40039 L 183 202.40039 L 199.40039 178 L 221.04102 153.44141 L 209.02148 155.70508 L 177.05859 162.77539 L 148.06836 171.40234 L 119.92578 183 L 120.63281 180.16992 L 129.82422 165.88672 L 151.17969 147.50195 L 172.95898 135.48242 L 190.07031 129.54102 L 209.02148 127.98633 L 227.6875 128.69336 L 247.76953 128.41016 L 246.49805 125.1582 L 226.69922 105.92383 L 219.62695 97.439453 L 221.4668 90.085938 L 206.75781 94.044922 L 195.86914 95.458984 L 179.46289 88.671875 L 156.12891 81.458984 L 133.07422 77.839844 z " />
|
||||||
|
<path
|
||||||
|
style="fill:#1b1b1b;fill-opacity:0.12492698;stroke:none;stroke-width:13.374;stroke-opacity:0.415999;paint-order:stroke fill markers"
|
||||||
|
d="m 259.36665,490.16617 39.03323,-6.96642 -20,-30.4 -20.4,-88.8 -1.2,-82.4 12.4,-94 8.4,-15.2 25.2,21.6 23.2,28.8 23.2,37.2 1.6,-36 -12.8,-36.8 -18.8,-18.4 -26,-13.6 -4.4,-0.8 20.4,-4.4 29.2,0.8 36.4,10 24.8,10.8 -6.6,-10.2 -22.8,-20 -21.4,-9.6 -29.8,-4 -16.6,1.8 -15,5.4 1.4,-5.2 18.6,-21.8 21.8,-18.800003 21,-11.4 30.2,-8.6 -19.8,0.4 -29.6,6.8 -26.4,9.4 -21.6,13.6 -17.2,15.600003 -36.83882,-38.349628 -24.60732,-12.445079 -23.33452,-2.687006 -19.79899,3.676955 -20.08184,7.071068 -9.33381,5.374012 24.32448,3.818376 23.33452,7.212489 16.40488,6.788226 10.88944,-1.414214 14.70782,-3.959798 -1.83847,7.353911 7.07106,8.485288 19.79899,19.2333 1.2728,3.25269 -20.08184,0.28284 -18.66762,-0.7071 -18.95046,1.55563 -17.11198,5.9397 -21.77889,12.02081 -21.35462,18.38478 -9.19239,14.28356 -0.70711,2.82843 28.14285,-11.59656 28.99138,-8.6267 31.96122,-7.07107 12.02082,-2.26274 -21.64158,24.55783 -16.4,24.4 -9.4,27 -2.2,23.8 2,15.8 13,-16.4 11,-23.2 13.2,-21.2 19,-18 11.38199,-9.32209 14.5664,-6.78822 6.08112,-1.55564 -7.07107,19.37473 -17.11198,63.07393 -5.09117,36.34528 -2.40416,29.98133 0.42426,33.65828 2.68701,25.45585 4.80832,37.7595 9.47523,40.44651 z"
|
||||||
|
id="path8-4" />
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -6,31 +6,10 @@ General guide for cross compiling.
|
|||||||
|
|
||||||
A painless guide for cross compilation (or to test NCE) from a x86_64 system without polluting your main.
|
A painless guide for cross compilation (or to test NCE) from a x86_64 system without polluting your main.
|
||||||
|
|
||||||
```sh
|
- Install QEMU: `sudo pkg install qemu`
|
||||||
#!/bin/sh
|
- Download Debian 13: `wget https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/debian-13.0.0-arm64-netinst.iso`
|
||||||
ISO_FILE="debian-13.0.0-arm64-netinst.iso"
|
- Create a system disk: `qemu-img create -f qcow2 debian-13-arm64-ci.qcow2 30G`
|
||||||
DISK_FILE="debian-13-arm64-ci.qcow2"
|
- Run the VM: `qemu-system-aarch64 -M virt -m 2G -cpu max -bios /usr/local/share/qemu/edk2-aarch64-code.fd -drive if=none,file=debian-13.0.0-arm64-netinst.iso,format=raw,id=cdrom -device scsi-cd,drive=cdrom -drive if=none,file=debian-13-arm64-ci.qcow2,id=hd0,format=qcow2 -device virtio-blk-device,drive=hd0 -device virtio-gpu-pci -device usb-ehci -device usb-kbd -device intel-hda -device hda-output -nic user,model=virtio-net-pci`
|
||||||
which -- qemu-system-aarch64 || sudo pkg install qemu
|
|
||||||
[ -f "$ISO_FILE" ] || wget https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/$ISO_FILE
|
|
||||||
[ -f "$DISK_FILE" ] || qemu-img create -f qcow2 "$DISK_FILE" 30G
|
|
||||||
QEMU_FLAGS=(
|
|
||||||
-M virt
|
|
||||||
-m 2G
|
|
||||||
-cpu max
|
|
||||||
-bios /usr/local/share/qemu/edk2-aarch64-code.fd
|
|
||||||
-drive if=none,file=$ISO_FILE,format=raw,id=cdrom
|
|
||||||
-drive if=none,file=$DISK_FILE,id=hd0,format=qcow2
|
|
||||||
-device scsi-cd,drive=cdrom
|
|
||||||
-device virtio-blk-device,drive=hd0
|
|
||||||
-device virtio-gpu-pci
|
|
||||||
-device usb-ehci
|
|
||||||
-device usb-kbd
|
|
||||||
-device intel-hda
|
|
||||||
-device hda-output
|
|
||||||
-nic user,model=virtio-net-pci
|
|
||||||
)
|
|
||||||
qemu-system-aarch64 "${QEMU_FLAGS[@]}"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Gentoo
|
## Gentoo
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,25 @@ If the work is licensed/vendored from other people or projects, you may omit the
|
|||||||
|
|
||||||
For more information on the license header script, run `.ci/license-header.sh -h`.
|
For more information on the license header script, run `.ci/license-header.sh -h`.
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
Pull requests are only to be merged by core developers when properly tested and discussions conclude on Discord or other communication channels. Labels are recommended but not required. However, all PRs MUST be namespaced and optionally typed:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
[cmake] refactor: CPM over submodules
|
||||||
|
[desktop] feat: implement firmware install from ZIP
|
||||||
|
[hle] stub fw20 functions
|
||||||
|
[core] test: raise maximum CPU cores to 6
|
||||||
|
[cmake, core] Unbreak FreeBSD Building Process
|
||||||
|
```
|
||||||
|
|
||||||
|
- The level of namespacing is generally left to the committer's choice.
|
||||||
|
- However, we never recommend going more than two levels *except* in `hle`, in which case you may go as many as four levels depending on the specificity of your changes.
|
||||||
|
- Ocassionally, up to two additional namespaces may be provided for more clarity.
|
||||||
|
- Changes that affect the entire project (sans CMake changes) should be namespaced as `meta`.
|
||||||
|
- Maintainers are permitted to change namespaces at will.
|
||||||
|
- Commits within PRs are not required to be namespaced, but it is highly recommended.
|
||||||
|
|
||||||
## Adding new settings
|
## Adding new settings
|
||||||
|
|
||||||
When adding new settings, use `tr("Setting:")` if the setting is meant to be a field, otherwise use `tr("Setting")` if the setting is meant to be a Yes/No or checkmark type of setting, see [this short style guide](https://learn.microsoft.com/en-us/style-guide/punctuation/colons#in-ui).
|
When adding new settings, use `tr("Setting:")` if the setting is meant to be a field, otherwise use `tr("Setting")` if the setting is meant to be a Yes/No or checkmark type of setting, see [this short style guide](https://learn.microsoft.com/en-us/style-guide/punctuation/colons#in-ui).
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ This contains documentation created by developers, build instructions, guideline
|
|||||||
|
|
||||||
Policies and information on development.
|
Policies and information on development.
|
||||||
|
|
||||||
- **[AI and LLM Usage](./CONTRIBUTING.md#policies)**
|
- **[AI and LLM Usage](./policies/AI.md)**
|
||||||
- **[Coding guidelines](./policies/Coding.md)**
|
- **[Coding guidelines](./policies/Coding.md)**
|
||||||
- **[Contributing](../CONTRIBUTING.md)**
|
- **[Contributing](../CONTRIBUTING.md)**
|
||||||
|
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ Eden by default will be cloned into:
|
|||||||
## Building with Terminal
|
## Building with Terminal
|
||||||
|
|
||||||
1. Download the SDK and NDK from Android Studio.
|
1. Download the SDK and NDK from Android Studio.
|
||||||
2. Navigate to SDK path.
|
2. Navigate to SDK and NDK paths.
|
||||||
3. Then set ANDROID_HOME in terminal via
|
3. Then set ANDROID_SDK_ROOT and ANDROID_NDK_ROOT in terminal via
|
||||||
`export ANDROID_HOME=path/to/sdk`
|
`export ANDROID_SDK_ROOT=path/to/sdk`
|
||||||
|
`export ANDROID_NDK_ROOT=path/to/ndk`.
|
||||||
4. Navigate to `eden/src/android`.
|
4. Navigate to `eden/src/android`.
|
||||||
5. Then Build with `./gradlew assembleRelWithDebInfo`.
|
5. Then Build with `./gradlew assembleRelWithDebInfo`.
|
||||||
6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`.
|
6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,116 @@
|
|||||||
|
# AI Policy
|
||||||
|
|
||||||
|
AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase.
|
||||||
|
|
||||||
|
- [AI Policy](#ai-policy)
|
||||||
|
- [Low-quality code](#low-quality-code)
|
||||||
|
- [Licensing concerns](#licensing-concerns)
|
||||||
|
- [Vibe-coding](#vibe-coding)
|
||||||
|
- [Commit messages](#commit-messages)
|
||||||
|
- [Miscellaneous concerns](#miscellaneous-concerns)
|
||||||
|
- [Unacceptable Use Examples](#unacceptable-use-examples)
|
||||||
|
- [Addendum: Commit Messages](#addendum-commit-messages)
|
||||||
|
|
||||||
|
## Low-quality code
|
||||||
|
|
||||||
|
AI is notorious for producing low-quality code; be it:
|
||||||
|
|
||||||
|
- nonfunctional,
|
||||||
|
- verbose/inefficient,
|
||||||
|
- breaking other parts of the codebase,
|
||||||
|
- or writing/architecting in a completely different style
|
||||||
|
|
||||||
|
All code, AI or not, is held under a **strict standard of excellence**. AI/LLM-generated code will fail this test 10 times out of 10.
|
||||||
|
|
||||||
|
## Licensing concerns
|
||||||
|
|
||||||
|
This is an area of ongoing litigation, and as such, is still very iffy. For the time being, know that allowing AI to ingest the codebase may end up with its copyleft code regurgitated into incompatibly-licensed proprietary or permissive software. For you, this means to **not** feed code into LLMs.
|
||||||
|
|
||||||
|
AI models may have also ingested AGPLv3 code, which is license-incompatible with our codebase.
|
||||||
|
|
||||||
|
## Vibe-coding
|
||||||
|
|
||||||
|
Just don't. If you're not going to put the effort in to understand every line of code you wrote, neither will we, and your patch or pull request will be ignored.
|
||||||
|
|
||||||
|
## Commit messages
|
||||||
|
|
||||||
|
AI-generated commit messages are absolutely terrible, and your pull request or patch will immediately be rejected if you choose to do this. They are, quite simply, actively detrimental to our understanding of your changes, and if you're not willing to summarize the intent behind your changes, then we're not going to bother reading the code you wrote.
|
||||||
|
|
||||||
|
Write concise, simple, and descriptive commit messages that actually convey the proper intent behind what your change is trying to do.
|
||||||
|
|
||||||
|
See the [Addendum](#addendum-commit-messages) for an instance of how bad AI models are at commit messages.
|
||||||
|
|
||||||
|
## Miscellaneous concerns
|
||||||
|
|
||||||
|
- While many environmental concerns about AI are typically blown out of proportion, it *is* a legitimate issue, and should be taken into account.
|
||||||
|
- Many people have significant concerns over the ethics of AI usage due to inhumane and predatory behavior by large AI companies, particularly Anthropic and OpenAI. This can technically be avoided through the usage of local LLMs.
|
||||||
|
- LLMs have a tendency to add unicode characters (such as the arrow → and the em-dash — symbols) to their output, which can make viewing code or documents harder on command-line editors and viewers.
|
||||||
|
- Dedicated coding models--namely Claude--also like to add a lot of comments to overexplain every individual line of code it produces. This actually makes it *harder* to understand the code!
|
||||||
|
|
||||||
|
## Unacceptable Use Examples
|
||||||
|
|
||||||
|
Here are a few examples of unacceptable use:
|
||||||
|
|
||||||
|
- Solving problems
|
||||||
|
- Slapping a few files and a "please fix bug XYZ" into an LLM is a recipe for disaster that will pretty much never work.
|
||||||
|
- Fully AI-generated code, aka "vibecoding"
|
||||||
|
- Writing code based on pseudo-instructions
|
||||||
|
- If you don't know how to write code, don't. If you've figured out the root cause (preferably without feeding random files into an LLM) and actively know what's going on, provide information to other developers or friends of yours who have knowledge of the language and/or the codebase.
|
||||||
|
|
||||||
|
## Addendum: Commit Messages
|
||||||
|
|
||||||
|
The patchset for pull request [#3422](https://git.eden-emu.dev/eden-emu/eden/pulls/3422) was fed into several LLMs to generate a commit message. One LLM produced the following:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
profile_manager: Refactor user deletion to use index instead of UUID
|
||||||
|
|
||||||
|
This commit improves the user profile deletion flow in the following ways:
|
||||||
|
|
||||||
|
1. **UI layer (ConfigureProfileManager)**:
|
||||||
|
- Replaces UUID-based deletion with index-based deletion
|
||||||
|
- Passes the selected row index from the tree view to the confirmation dialog
|
||||||
|
- Emits deleteUser(int index) signal from ConfigureProfileManagerDeleteDialog
|
||||||
|
- Removes lambda capture and std::function callback in favor of direct signal/slot connection
|
||||||
|
|
||||||
|
2. **Delete dialog**:
|
||||||
|
- Changes SetInfo() signature to accept index instead of accept callback
|
||||||
|
- Stores index internally and emits it via deleteUser signal on acceptance
|
||||||
|
|
||||||
|
3. **Core ProfileManager**:
|
||||||
|
- Refactors RemoveUser(UUID) → RemoveProfileAtIndex(index)
|
||||||
|
- Removes duplicated stable_partition + save logic from RemoveUser()
|
||||||
|
- Centralizes profile removal and save-file writing in RemoveProfileAtIndex()
|
||||||
|
|
||||||
|
4. **Minor follow-up**:
|
||||||
|
- Adds profile_manager.ResetUserSaveFile() call in PopulateUserList() to ensure consistent state when refreshing the user list
|
||||||
|
|
||||||
|
These changes eliminate redundant code, reduce the risk of UUID → index mismatch bugs, and make the deletion path more straightforward and maintainable.
|
||||||
|
|
||||||
|
Fixes: potential inconsistency when user order changes between UI and backend
|
||||||
|
```
|
||||||
|
|
||||||
|
This is:
|
||||||
|
|
||||||
|
- Needlessly verbose (nobody cares about most of these details)
|
||||||
|
- Doesn't address the actual purpose of the PR (fixing a double-deletion bug in the profile manager)
|
||||||
|
- Has unicode arrows (this is bad for command-line editors)
|
||||||
|
- Uses corporate and word-salad language
|
||||||
|
|
||||||
|
Another (code-oriented) LLM output the following:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
profile(manager/ui): switch to index-based deletion and unify removal logic
|
||||||
|
|
||||||
|
- Make ConfigureProfileManagerDeleteDialog emit a deleteUser(int) signal instead of taking a callback. Store the target index in the dialog (m_index) and emit it on acceptance.
|
||||||
|
- Change ConfigureProfileManager to pass an index to SetInfo and to accept an index in DeleteUser. Wire the dialog signal to the new DeleteUser slot.
|
||||||
|
- Update headers: add the signal and m_index, add TODO to move dialog to a .ui file, and update slot/signature declarations.
|
||||||
|
- Add ProfileManager::RemoveProfileAtIndex(std::size_t) and refactor RemoveUser(UUID) to call RemoveProfileAtIndex to avoid duplicated removal logic. Ensure the removal path marks saves as needed and writes the user save file.
|
||||||
|
- Ensure the profile list updates immediately after deletes by calling profile_manager.ResetUserSaveFile() when populating the user list (qlaunch fix).
|
||||||
|
- Misc: update SPDX copyright year and fix build breakages caused by the API changes.
|
||||||
|
|
||||||
|
This consolidates profile removal behavior, fixes potential race conditions in the profile dialog, and removes duplicated removal code.
|
||||||
|
```
|
||||||
|
|
||||||
|
This has all of the same problems as the other one. Needlessly verbose, doesn't address *what* it actually fixes ("consolidates profile removal behavior"... okay, why? What does it fix?), etc. It even has the bonus of totally hallucinating the addition of a method!
|
||||||
|
|
||||||
|
On a more "philosophical" note, LLMs tend to be geared towards *corporate language*, as that's what they're trained on. This is why AI-generated commit messages feel like "word salad", and typically pad out the commit message to make it *look* like a lot of things were changed (trust me, it's like that in the corporate world). They typically also drift towards unneeded buzzwords and useless implementation details.
|
||||||
@@ -1,44 +1,32 @@
|
|||||||
# User Handbook - Command Line
|
# User Handbook - Command Line
|
||||||
|
|
||||||
There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept the same command line arguments.
|
There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept command line arguments.
|
||||||
|
|
||||||
|
## eden
|
||||||
|
|
||||||
- `./eden <path>`: Running with a single argument and nothing else, will make the emulator look for the given file and load it, this behavior is similar to `eden-cli`; allows dragging and dropping games into the application.
|
- `./eden <path>`: Running with a single argument and nothing else, will make the emulator look for the given file and load it, this behavior is similar to `eden-cli`; allows dragging and dropping games into the application.
|
||||||
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
- `-g <path>`: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument.
|
||||||
- `--config/-c`: Specify alternate configuration file.
|
- `-f`: Use fullscreen.
|
||||||
- `--fullscreen/-f`: Use fullscreen.
|
- `-u <number>`: Select the index of the user to load as.
|
||||||
- `--help/-h`: Display help.
|
- `-input-profile <name>`: Specifies input profile name to use (for player #0 only).
|
||||||
- `--game/-g <path>`: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument.
|
|
||||||
- `--multiplayer/-m`: Specify multiplayer options.
|
|
||||||
- `--program/-p`: Specify the program arguments to pass (optional).
|
|
||||||
- `--user/-u <number>`: Specify the user index.
|
|
||||||
- `--version/-v`: Display version and quit.
|
|
||||||
- `--input-profile/-i <name>`: Specifies input profile name to use (for player #0 only).
|
|
||||||
- `--null-render/-n`: Forces the usage of the "Null" render backend irrespective of settings.
|
|
||||||
- `--filter/-x`: Sets the debug log filter irrespective of settings.
|
|
||||||
- `--singlecore/-s`: Forces single-core regardless of settings.
|
|
||||||
|
|
||||||
Only the Qt frontend supports the following arguments:
|
|
||||||
|
|
||||||
- `-qlaunch`: Launch QLaunch.
|
- `-qlaunch`: Launch QLaunch.
|
||||||
- `-hlaunch`: Launch homebrew launcher `nx-hbloader`.
|
- `-hlaunch`: Launch homebrew launcher `nx-hbloader`.
|
||||||
- Requires a copy of Atmosphere to be extracted onto `sdmc`.
|
- Requires a copy of Atmosphere to be extracted onto `sdmc`.
|
||||||
- This is a shorthand for `<eden folder>/sdmc/atmosphere/hbl.nsp`.
|
- This is a shorthand for `<eden folder>/sdmc/atmosphere/hbl.nsp`.
|
||||||
- `-setup`: Launch setup applet.
|
- `-setup`: Launch setup applet.
|
||||||
|
|
||||||
`eden` (provided with `--room`), and `eden-room` supports the following options as well:
|
## eden-cli
|
||||||
|
|
||||||
- `-n/--room-name`: The name of the room.
|
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
||||||
- `-d/--room-description`: The room description.
|
- `--config/-c`: Specify alternate configuration file.
|
||||||
- `-s/--bind-address`: The bind address for the room.
|
- `--fullscreen/-f`: Set fullscreen.
|
||||||
- `-p/--port`: The port used for the room.
|
- `--help/-h`: Display help.
|
||||||
- `-m/--max-members`: The maximum number of players for this room.
|
- `--game/-g`: Specify the game to run.
|
||||||
- `-w/--password`: The password for the room.
|
- `--multiplayer/-m`: Specify multiplayer options.
|
||||||
- `-g/--preferred-game`: The preferred game for this room.
|
- `--program/-p`: Specify the program arguments to pass (optional).
|
||||||
- `-i/--preferred-game-id`: The preferred game-id for this room.
|
- `--user/-u`: Specify the user index.
|
||||||
- `-u/--username`: The username used for announce.
|
- `--version/-v`: Display version and quit.
|
||||||
- `-t/--token`: The token used for announce.
|
- `--input-profile/-i`: Specifies input profile name to use (for player #0 only).
|
||||||
- `-a/--web-api-url`: yuzu Web API url.
|
- `--null-render/-n`: Forces the usage of the "Null" render backend irrespective of settings.
|
||||||
- `-b/--ban-list-file`: The file for storing the room ban list.
|
- `--filter/-x`: Sets the debug log filter irrespective of settings.
|
||||||
- `-l/--log-file`: The file for storing the room log.
|
- `--singlecore/-s`: Forces single-core regardless of settings.
|
||||||
- `-h/--help`: Display this help and exit.
|
|
||||||
- `-v/--version`: Output version information and exit.
|
|
||||||
|
|||||||
@@ -45,13 +45,12 @@ Another option would be to launch the game in Eden and close it - then go into t
|
|||||||
***INFO***: Make sure you select the correct directory or it will not work, the screen should show the **cheats** sub-directory.
|
***INFO***: Make sure you select the correct directory or it will not work, the screen should show the **cheats** sub-directory.
|
||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
|
2. You should now see the cheat appear in the **Add-ons** screen.
|
||||||
9. You should now see the cheat appear in the **Add-ons** screen.
|
3. Launch the game and confirm that the cheat is applied.
|
||||||
10. Launch the game and confirm that the cheat is applied.
|
|
||||||
|
|
||||||
### Step 2: Multiple Cheats
|
### Step 2: Multiple Cheats
|
||||||
|
|
||||||
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory.
|
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory. You **cannot** install multiple cheats with a single file.
|
||||||
|
|
||||||
Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Windows or anything that can run Python) that can take a file with multiple cheats and create the files/structure for you with a provided Build ID. To download and run it, see the [GitHub Project](https://github.com/Ninjistix/nxCheat_Splitter) page.
|
Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Windows or anything that can run Python) that can take a file with multiple cheats and create the files/structure for you with a provided Build ID. To download and run it, see the [GitHub Project](https://github.com/Ninjistix/nxCheat_Splitter) page.
|
||||||
|
|
||||||
@@ -123,7 +122,7 @@ Another option would be to launch the game in Eden and close it - then go into t
|
|||||||
|
|
||||||
### Step 2: Multiple Cheats
|
### Step 2: Multiple Cheats
|
||||||
|
|
||||||
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory.
|
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory. You **cannot** install multiple cheats with a single file.
|
||||||
|
|
||||||
Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Windows or anything that can run Python) that can take a file with multiple cheats and create the files/structure for you with a provided Build ID. To download and run it, see the [GitHub Project](https://github.com/Ninjistix/nxCheat_Splitter) page.
|
Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Windows or anything that can run Python) that can take a file with multiple cheats and create the files/structure for you with a provided Build ID. To download and run it, see the [GitHub Project](https://github.com/Ninjistix/nxCheat_Splitter) page.
|
||||||
|
|
||||||
@@ -155,11 +154,3 @@ Cheats are enabled by default, but can be disabled so they don't affect gameplay
|
|||||||
3. *Select/Deselect* the name of the cheat you wish to enable/disable.
|
3. *Select/Deselect* the name of the cheat you wish to enable/disable.
|
||||||
4. Click **OK** to close the window.
|
4. Click **OK** to close the window.
|
||||||
5. Launch the game to confirm the cheat is/is not active.
|
5. Launch the game to confirm the cheat is/is not active.
|
||||||
|
|
||||||
### Runtime Cheat Controls
|
|
||||||
|
|
||||||
* While a game is running, open **Cheats** from the menu bar to toggle individual entries from the loaded cheat files. The menu stays open while toggling entries and is hidden when the running game has no cheats. Runtime changes apply to the current game session only.
|
|
||||||
|
|
||||||
* Use **Configure > System > Core > Enable cheats by default** to choose whether regular cheats start enabled. The setting can also be overridden for an individual game from its **System** settings.
|
|
||||||
|
|
||||||
* Master Code entries (`{}` blocks) are always enabled and appear as disabled and checked items in the runtime menu.
|
|
||||||
|
|||||||
@@ -48,11 +48,6 @@ if (NOT TARGET stb::headers)
|
|||||||
add_library(stb::headers ALIAS stb)
|
add_library(stb::headers ALIAS stb)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
AddJsonPackage(NAME zbic DOWNLOAD_ONLY)
|
|
||||||
set(ZBIC_INCLUDE_DIR
|
|
||||||
"${zbic_SOURCE_DIR}/src"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
|
|
||||||
# ItaniumDemangle (Windows only)
|
# ItaniumDemangle (Windows only)
|
||||||
if (WIN32 AND NOT TARGET LLVM::Demangle)
|
if (WIN32 AND NOT TARGET LLVM::Demangle)
|
||||||
add_library(demangle demangle/ItaniumDemangle.cpp)
|
add_library(demangle demangle/ItaniumDemangle.cpp)
|
||||||
|
|||||||
@@ -101,11 +101,6 @@ endfunction()
|
|||||||
# ia64 exists
|
# ia64 exists
|
||||||
# the rest exist, but are probably less popular than ia64
|
# the rest exist, but are probably less popular than ia64
|
||||||
|
|
||||||
detect_architecture_symbols(
|
|
||||||
ARCH wasm
|
|
||||||
SYMBOLS
|
|
||||||
"__EMSCRIPTEN__")
|
|
||||||
|
|
||||||
detect_architecture_symbols(
|
detect_architecture_symbols(
|
||||||
ARCH arm64
|
ARCH arm64
|
||||||
SYMBOLS
|
SYMBOLS
|
||||||
@@ -208,6 +203,11 @@ detect_architecture_symbols(
|
|||||||
"__loongarch__"
|
"__loongarch__"
|
||||||
"__loongarch64")
|
"__loongarch64")
|
||||||
|
|
||||||
|
detect_architecture_symbols(
|
||||||
|
ARCH wasm
|
||||||
|
SYMBOLS
|
||||||
|
"__EMSCRIPTEN__")
|
||||||
|
|
||||||
# "generic" target
|
# "generic" target
|
||||||
# If you have reached this point, you're on some as-of-yet unsupported architecture.
|
# If you have reached this point, you're on some as-of-yet unsupported architecture.
|
||||||
# See the docs up above for known unsupported architectures
|
# See the docs up above for known unsupported architectures
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ android {
|
|||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
version = "3.31.5"
|
version = "3.31.6"
|
||||||
path = file("${edenDir}/CMakeLists.txt")
|
path = file("${edenDir}/CMakeLists.txt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,13 +34,6 @@ import org.yuzu.yuzu_emu.applets.web.WebBrowser
|
|||||||
* with the native side of the Yuzu code.
|
* with the native side of the Yuzu code.
|
||||||
*/
|
*/
|
||||||
object NativeLibrary {
|
object NativeLibrary {
|
||||||
@Keep
|
|
||||||
class RuntimeCheat(
|
|
||||||
val id: Int,
|
|
||||||
val name: String,
|
|
||||||
val enabled: Boolean,
|
|
||||||
val isMaster: Boolean
|
|
||||||
)
|
|
||||||
@Keep
|
@Keep
|
||||||
data class UpdateResult(
|
data class UpdateResult(
|
||||||
var tag: String = "",
|
var tag: String = "",
|
||||||
@@ -204,9 +197,6 @@ object NativeLibrary {
|
|||||||
*/
|
*/
|
||||||
external fun isPaused(): Boolean
|
external fun isPaused(): Boolean
|
||||||
|
|
||||||
external fun getRuntimeCheats(): Array<RuntimeCheat>
|
|
||||||
external fun setRuntimeCheatEnabled(id: Int, enabled: Boolean): Boolean
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the performance stats for the current game
|
* Returns the performance stats for the current game
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
|||||||
FASTMEM("cpuopt_fastmem"),
|
FASTMEM("cpuopt_fastmem"),
|
||||||
FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives"),
|
FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives"),
|
||||||
CORE_SYNC_CORE_SPEED("sync_core_speed"),
|
CORE_SYNC_CORE_SPEED("sync_core_speed"),
|
||||||
ENABLE_CHEATS_BY_DEFAULT("enable_cheats_by_default"),
|
|
||||||
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
||||||
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
||||||
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
||||||
@@ -26,10 +25,12 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
|||||||
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
|
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
|
||||||
RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
|
RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
|
||||||
RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"),
|
RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"),
|
||||||
|
RENDERER_ASYNC_PRESENTATION("async_presentation"),
|
||||||
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
||||||
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
||||||
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
||||||
USE_OPTIMIZED_VERTEX_BUFFERS("use_optimized_vertex_buffers"),
|
USE_OPTIMIZED_VERTEX_BUFFERS("use_optimized_vertex_buffers"),
|
||||||
|
ENABLE_GPU_BUFFER_READBACK("enable_gpu_buffer_readback"),
|
||||||
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
||||||
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
||||||
RENDERER_DEBUG("debug"),
|
RENDERER_DEBUG("debug"),
|
||||||
@@ -94,7 +95,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
|||||||
|
|
||||||
ENABLE_QUICK_SETTINGS("enable_quick_settings");
|
ENABLE_QUICK_SETTINGS("enable_quick_settings");
|
||||||
|
|
||||||
//external fun isFrameSkippingEnabled(): Boolean
|
// external fun isFrameSkippingEnabled(): Boolean
|
||||||
external fun isFrameInterpolationEnabled(): Boolean
|
external fun isFrameInterpolationEnabled(): Boolean
|
||||||
|
|
||||||
override fun getBoolean(needsGlobal: Boolean): Boolean =
|
override fun getBoolean(needsGlobal: Boolean): Boolean =
|
||||||
|
|||||||
@@ -316,13 +316,6 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.use_sync_core_description
|
descriptionId = R.string.use_sync_core_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.ENABLE_CHEATS_BY_DEFAULT,
|
|
||||||
titleId = R.string.enable_cheats_by_default,
|
|
||||||
descriptionId = R.string.enable_cheats_by_default_description
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
put(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
IntSetting.REGION_INDEX,
|
IntSetting.REGION_INDEX,
|
||||||
@@ -760,6 +753,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.renderer_asynchronous_gpu_emulation_description
|
descriptionId = R.string.renderer_asynchronous_gpu_emulation_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.RENDERER_ASYNC_PRESENTATION,
|
||||||
|
titleId = R.string.renderer_async_presentation,
|
||||||
|
descriptionId = R.string.renderer_async_presentation_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
IntSetting.DMA_ACCURACY,
|
IntSetting.DMA_ACCURACY,
|
||||||
@@ -908,6 +908,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.enable_buffer_history_description
|
descriptionId = R.string.enable_buffer_history_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.ENABLE_GPU_BUFFER_READBACK,
|
||||||
|
titleId = R.string.enable_gpu_buffer_readback,
|
||||||
|
descriptionId = R.string.enable_gpu_buffer_readback_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS,
|
BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS,
|
||||||
|
|||||||
@@ -510,7 +510,6 @@ class SettingsFragmentPresenter(
|
|||||||
add(IntSetting.FAST_CPU_TIME.key)
|
add(IntSetting.FAST_CPU_TIME.key)
|
||||||
add(IntSetting.FAST_GPU_TIME.key)
|
add(IntSetting.FAST_GPU_TIME.key)
|
||||||
add(BooleanSetting.CORE_SYNC_CORE_SPEED.key)
|
add(BooleanSetting.CORE_SYNC_CORE_SPEED.key)
|
||||||
add(BooleanSetting.ENABLE_CHEATS_BY_DEFAULT.key)
|
|
||||||
|
|
||||||
add(IntSetting.MEMORY_LAYOUT.key)
|
add(IntSetting.MEMORY_LAYOUT.key)
|
||||||
add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key)
|
add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key)
|
||||||
@@ -550,6 +549,7 @@ class SettingsFragmentPresenter(
|
|||||||
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
||||||
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
||||||
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
||||||
|
add(BooleanSetting.ENABLE_GPU_BUFFER_READBACK.key)
|
||||||
add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key)
|
add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.hacks))
|
add(HeaderSetting(R.string.hacks))
|
||||||
@@ -560,6 +560,7 @@ class SettingsFragmentPresenter(
|
|||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
||||||
add(IntSetting.ANDROID_PIPELINE_WORKERS.key)
|
add(IntSetting.ANDROID_PIPELINE_WORKERS.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
||||||
|
add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key)
|
||||||
add(SettingsItem.GPU_UNSWIZZLE_COMBINED)
|
add(SettingsItem.GPU_UNSWIZZLE_COMBINED)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.extensions))
|
add(HeaderSetting(R.string.extensions))
|
||||||
|
|||||||
@@ -79,8 +79,9 @@ class DriverFetcherFragment : Fragment() {
|
|||||||
IntRange(100, 599) to "Unsupported",
|
IntRange(100, 599) to "Unsupported",
|
||||||
IntRange(600, 639) to "Mr. Purple EOL-24.3.4",
|
IntRange(600, 639) to "Mr. Purple EOL-24.3.4",
|
||||||
IntRange(640, 699) to "Mr. Purple T19",
|
IntRange(640, 699) to "Mr. Purple T19",
|
||||||
IntRange(700, 710) to "Mr. Purple T29",
|
IntRange(700, 710) to "KIMCHI 25.2.0_r5",
|
||||||
IntRange(711, 899) to "Mr. Purple T30",
|
IntRange(711, 799) to "Mr. Purple T23",
|
||||||
|
IntRange(800, 899) to "GameHub Adreno 8xx",
|
||||||
IntRange(900, Int.MAX_VALUE) to "Unsupported"
|
IntRange(900, Int.MAX_VALUE) to "Unsupported"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -734,7 +734,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
binding.inGameMenu.menu.findItem(R.id.menu_quick_settings)?.isVisible =
|
binding.inGameMenu.menu.findItem(R.id.menu_quick_settings)?.isVisible =
|
||||||
BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean()
|
BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean()
|
||||||
binding.inGameMenu.menu.findItem(R.id.menu_cheats)?.isVisible = false
|
|
||||||
|
|
||||||
binding.pausedIcon.setOnClickListener {
|
binding.pausedIcon.setOnClickListener {
|
||||||
if (this::emulationState.isInitialized && emulationState.isPaused) {
|
if (this::emulationState.isInitialized && emulationState.isPaused) {
|
||||||
@@ -818,12 +817,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
R.id.menu_load_amiibo -> handleLoadAmiiboSelection()
|
R.id.menu_load_amiibo -> handleLoadAmiiboSelection()
|
||||||
|
|
||||||
R.id.menu_cheats -> {
|
|
||||||
binding.drawerLayout.closeDrawer(binding.inGameMenu)
|
|
||||||
showRuntimeCheatDialog()
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
R.id.menu_controls -> {
|
R.id.menu_controls -> {
|
||||||
val action = HomeNavigationDirections.actionGlobalSettingsActivity(
|
val action = HomeNavigationDirections.actionGlobalSettingsActivity(
|
||||||
null,
|
null,
|
||||||
@@ -969,8 +962,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
emulationState.updateSurface()
|
emulationState.updateSurface()
|
||||||
|
|
||||||
binding.inGameMenu.menu.findItem(R.id.menu_cheats)?.isVisible =
|
|
||||||
NativeLibrary.getRuntimeCheats().isNotEmpty()
|
|
||||||
updateShowStatsOverlay()
|
updateShowStatsOverlay()
|
||||||
updateSocOverlay()
|
updateSocOverlay()
|
||||||
|
|
||||||
@@ -996,7 +987,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
}
|
}
|
||||||
emulationViewModel.isEmulationStopping.collect(viewLifecycleOwner) {
|
emulationViewModel.isEmulationStopping.collect(viewLifecycleOwner) {
|
||||||
if (it) {
|
if (it) {
|
||||||
binding.inGameMenu.menu.findItem(R.id.menu_cheats)?.isVisible = false
|
|
||||||
binding.loadingText.setText(R.string.shutting_down)
|
binding.loadingText.setText(R.string.shutting_down)
|
||||||
ViewUtils.showView(binding.loadingIndicator)
|
ViewUtils.showView(binding.loadingIndicator)
|
||||||
ViewUtils.hideView(binding.inputContainer)
|
ViewUtils.hideView(binding.inputContainer)
|
||||||
@@ -1129,45 +1119,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
NativePostProcessing.persist()
|
NativePostProcessing.persist()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showRuntimeCheatDialog() {
|
|
||||||
val cheats = NativeLibrary.getRuntimeCheats()
|
|
||||||
if (cheats.isEmpty()) return
|
|
||||||
|
|
||||||
val names = cheats.map { it.name.ifEmpty { getString(R.string.unnamed_cheat) } }.toTypedArray()
|
|
||||||
lateinit var dialog: androidx.appcompat.app.AlertDialog
|
|
||||||
dialog = MaterialAlertDialogBuilder(requireContext())
|
|
||||||
.setTitle(R.string.cheats)
|
|
||||||
.setMultiChoiceItems(names, cheats.map { it.enabled }.toBooleanArray()) { _, which, enabled ->
|
|
||||||
if (cheats[which].isMaster) {
|
|
||||||
dialog.listView.setItemChecked(which, true)
|
|
||||||
} else if (!NativeLibrary.setRuntimeCheatEnabled(cheats[which].id, enabled)) {
|
|
||||||
dialog.listView.setItemChecked(which, !enabled)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.setNegativeButton(R.string.disable_all_cheats) { _, _ ->
|
|
||||||
cheats.forEach {
|
|
||||||
if (!it.isMaster) NativeLibrary.setRuntimeCheatEnabled(it.id, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.setNeutralButton(R.string.enable_all_cheats) { _, _ ->
|
|
||||||
cheats.forEach {
|
|
||||||
if (!it.isMaster) NativeLibrary.setRuntimeCheatEnabled(it.id, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.setPositiveButton(R.string.done, null)
|
|
||||||
.create()
|
|
||||||
dialog.setOnShowListener {
|
|
||||||
val listView = dialog.listView
|
|
||||||
fun updateMasterVisuals() = repeat(listView.childCount) { index ->
|
|
||||||
listView.getChildAt(index).alpha =
|
|
||||||
if (cheats[listView.firstVisiblePosition + index].isMaster) 0.38f else 1f
|
|
||||||
}
|
|
||||||
listView.setOnScrollChangeListener { _, _, _, _, _ -> updateMasterVisuals() }
|
|
||||||
updateMasterVisuals()
|
|
||||||
}
|
|
||||||
dialog.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addQuickSettings() {
|
private fun addQuickSettings() {
|
||||||
binding.quickSettingsSheet.apply {
|
binding.quickSettingsSheet.apply {
|
||||||
val container = binding.quickSettingsSheet.findViewById<ViewGroup>(R.id.quick_settings_container)
|
val container = binding.quickSettingsSheet.findViewById<ViewGroup>(R.id.quick_settings_container)
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
|
|||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
|
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
|
||||||
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
|
||||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -147,11 +146,11 @@ class DriverViewModel : ViewModel() {
|
|||||||
private fun wipeGameShaders(game: Game) {
|
private fun wipeGameShaders(game: Game) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val userDirectory = DirectoryInitialization.userDirectory
|
val externalFilesDir = YuzuApplication.appContext.getExternalFilesDir(null)
|
||||||
?: return@withContext
|
?: return@withContext
|
||||||
val shaderDir = File(
|
val shaderDir = File(
|
||||||
userDirectory +
|
externalFilesDir.absolutePath +
|
||||||
"/cache/shader/" + game.settingsName.lowercase()
|
"/shader/" + game.settingsName.lowercase()
|
||||||
)
|
)
|
||||||
if (shaderDir.exists()) {
|
if (shaderDir.exists()) {
|
||||||
shaderDir.deleteRecursively()
|
shaderDir.deleteRecursively()
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class Game(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val extensions: Set<String> = HashSet(
|
val extensions: Set<String> = HashSet(
|
||||||
listOf("xci", "nsp", "nca", "nro", "nsz", "xcz")
|
listOf("xci", "nsp", "nca", "nro")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ object GameHelper {
|
|||||||
|
|
||||||
// File extensions considered as external content, buuut should
|
// File extensions considered as external content, buuut should
|
||||||
// be done better imo.
|
// be done better imo.
|
||||||
private val externalContentExtensions = setOf("nsp", "xci", "nsz", "xcz")
|
private val externalContentExtensions = setOf("nsp", "xci")
|
||||||
|
|
||||||
private fun scanContentContainersRecursive(
|
private fun scanContentContainersRecursive(
|
||||||
files: Array<MinimalDocumentFile>,
|
files: Array<MinimalDocumentFile>,
|
||||||
|
|||||||
@@ -76,9 +76,7 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj
|
|||||||
auto const file_type = loader->GetFileType();
|
auto const file_type = loader->GetFileType();
|
||||||
if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error)
|
if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error)
|
||||||
return false;
|
return false;
|
||||||
if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI ||
|
if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI) && !Loader::IsBootableGameContainer(file, file_type))
|
||||||
file_type == Loader::FileType::NSZ || file_type == Loader::FileType::XCZ) &&
|
|
||||||
!Loader::IsBootableGameContainer(file, file_type))
|
|
||||||
return false;
|
return false;
|
||||||
u64 program_id = 0;
|
u64 program_id = 0;
|
||||||
return loader->ReadProgramId(program_id) == Loader::ResultStatus::Success;
|
return loader->ReadProgramId(program_id) == Loader::ResultStatus::Success;
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ extern "C" {
|
|||||||
#include "core/file_sys/submission_package.h"
|
#include "core/file_sys/submission_package.h"
|
||||||
#include "core/file_sys/vfs/vfs.h"
|
#include "core/file_sys/vfs/vfs.h"
|
||||||
#include "core/file_sys/vfs/vfs_real.h"
|
#include "core/file_sys/vfs/vfs_real.h"
|
||||||
#include "core/memory/dmnt_cheat_types.h"
|
|
||||||
#include "core/frontend/applets/cabinet.h"
|
#include "core/frontend/applets/cabinet.h"
|
||||||
#include "core/frontend/applets/controller.h"
|
#include "core/frontend/applets/controller.h"
|
||||||
#include "core/frontend/applets/error.h"
|
#include "core/frontend/applets/error.h"
|
||||||
@@ -789,7 +788,7 @@ int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject
|
|||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj,
|
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj,
|
||||||
jstring jprogramId,
|
jstring jprogramId,
|
||||||
jstring jupdatePath) {
|
jstring jupdatePath) {
|
||||||
const u64 program_id = FileSys::GetBaseTitleID(EmulationSession::GetProgramId(env, jprogramId));
|
u64 program_id = EmulationSession::GetProgramId(env, jprogramId);
|
||||||
std::string updatePath = Common::Android::GetJString(env, jupdatePath);
|
std::string updatePath = Common::Android::GetJString(env, jupdatePath);
|
||||||
std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
|
std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
|
||||||
EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
|
EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
|
||||||
@@ -797,7 +796,7 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* en
|
|||||||
for (const auto& item : nsp->GetNCAs()) {
|
for (const auto& item : nsp->GetNCAs()) {
|
||||||
for (const auto& nca_details : item.second) {
|
for (const auto& nca_details : item.second) {
|
||||||
if (nca_details.second->GetName().ends_with(".cnmt.nca")) {
|
if (nca_details.second->GetName().ends_with(".cnmt.nca")) {
|
||||||
const auto update_id = FileSys::GetBaseTitleID(nca_details.second->GetTitleId());
|
auto update_id = nca_details.second->GetTitleId() & ~0xFFFULL;
|
||||||
if (update_id == program_id) {
|
if (update_id == program_id) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -947,31 +946,6 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass claz
|
|||||||
return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
|
return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
|
||||||
}
|
}
|
||||||
|
|
||||||
jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getRuntimeCheats(JNIEnv* env, jclass clazz) {
|
|
||||||
const auto cheats = EmulationSession::GetInstance().System().GetRuntimeCheats();
|
|
||||||
const auto runtime_cheat_class = env->FindClass("org/yuzu/yuzu_emu/NativeLibrary$RuntimeCheat");
|
|
||||||
const auto constructor = env->GetMethodID(runtime_cheat_class, "<init>", "(ILjava/lang/String;ZZ)V");
|
|
||||||
auto result = env->NewObjectArray(static_cast<jsize>(cheats.size()), runtime_cheat_class, nullptr);
|
|
||||||
for (jsize i = 0; i < static_cast<jsize>(cheats.size()); ++i) {
|
|
||||||
const auto& cheat = cheats[i];
|
|
||||||
const auto name = Common::Android::ToJString(env, cheat.name);
|
|
||||||
const auto item = env->NewObject(runtime_cheat_class, constructor, static_cast<jint>(cheat.id), name,
|
|
||||||
static_cast<jboolean>(cheat.enabled),
|
|
||||||
static_cast<jboolean>(cheat.is_master));
|
|
||||||
env->SetObjectArrayElement(result, i, item);
|
|
||||||
env->DeleteLocalRef(name);
|
|
||||||
env->DeleteLocalRef(item);
|
|
||||||
}
|
|
||||||
env->DeleteLocalRef(runtime_cheat_class);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_setRuntimeCheatEnabled(JNIEnv* env, jclass clazz,
|
|
||||||
jint id, jboolean enabled) {
|
|
||||||
return static_cast<jboolean>(EmulationSession::GetInstance().System().SetCheatEnabled(
|
|
||||||
static_cast<u32>(id), static_cast<bool>(enabled)));
|
|
||||||
}
|
|
||||||
|
|
||||||
jbyteArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletCaptureBuffer(JNIEnv* env, jclass clazz) {
|
jbyteArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletCaptureBuffer(JNIEnv* env, jclass clazz) {
|
||||||
using namespace VideoCore::Capture;
|
using namespace VideoCore::Capture;
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
|
|
||||||
android:viewportWidth="212"
|
|
||||||
android:viewportHeight="212"
|
|
||||||
android:width="212dp"
|
|
||||||
android:height="212dp">
|
|
||||||
<group
|
|
||||||
android:translateX="6"
|
|
||||||
android:translateY="6">
|
|
||||||
<path
|
|
||||||
android:pathData="M58 168v-98a50 50 0 0 1 50 -50h20"
|
|
||||||
android:strokeColor="#FFFFFF"
|
|
||||||
android:strokeWidth="25" />
|
|
||||||
<path
|
|
||||||
android:pathData="M58 168v-30a50 50 0 0 1 50 -50h20"
|
|
||||||
android:strokeColor="#FFFFFF"
|
|
||||||
android:strokeWidth="25" />
|
|
||||||
<path
|
|
||||||
android:pathData="M160 20A18 18 0 0 1 124 20A18 18 0 0 1 160 20Z"
|
|
||||||
android:strokeColor="#FFFFFF"
|
|
||||||
android:strokeWidth="15" />
|
|
||||||
<path
|
|
||||||
android:pathData="M160 88A18 18 0 0 1 124 88A18 18 0 0 1 160 88Z"
|
|
||||||
android:strokeColor="#FFFFFF"
|
|
||||||
android:strokeWidth="15" />
|
|
||||||
<path
|
|
||||||
android:pathData="M76 180A18 18 0 0 1 40 180A18 18 0 0 1 76 180Z"
|
|
||||||
android:strokeColor="#FFFFFF"
|
|
||||||
android:strokeWidth="15" />
|
|
||||||
</group>
|
|
||||||
</vector>
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="98dp"
|
||||||
|
android:height="96dp"
|
||||||
|
android:viewportWidth="98"
|
||||||
|
android:viewportHeight="96">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:fillType="evenOdd"
|
||||||
|
android:pathData="M48.854,0C21.839,0 0,22 0,49.217c0,21.756 13.993,40.172 33.405,46.69 2.427,0.49 3.316,-1.059 3.316,-2.362 0,-1.141 -0.08,-5.052 -0.08,-9.127 -13.59,2.934 -16.42,-5.867 -16.42,-5.867 -2.184,-5.704 -5.42,-7.17 -5.42,-7.17 -4.448,-3.015 0.324,-3.015 0.324,-3.015 4.934,0.326 7.523,5.052 7.523,5.052 4.367,7.496 11.404,5.378 14.235,4.074 0.404,-3.178 1.699,-5.378 3.074,-6.6 -10.839,-1.141 -22.243,-5.378 -22.243,-24.283 0,-5.378 1.94,-9.778 5.014,-13.2 -0.485,-1.222 -2.184,-6.275 0.486,-13.038 0,0 4.125,-1.304 13.426,5.052a46.97,46.97 0,0 1,12.214 -1.63c4.125,0 8.33,0.571 12.213,1.63 9.302,-6.356 13.427,-5.052 13.427,-5.052 2.67,6.763 0.97,11.816 0.485,13.038 3.155,3.422 5.015,7.822 5.015,13.2 0,18.905 -11.404,23.06 -22.324,24.283 1.78,1.548 3.316,4.481 3.316,9.126 0,6.6 -0.08,11.897 -0.08,13.526 0,1.304 0.89,2.853 3.316,2.364 19.412,-6.52 33.405,-24.935 33.405,-46.691C97.707,22 75.788,0 48.854,0z" />
|
||||||
|
</vector>
|
||||||
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
@@ -250,7 +250,7 @@
|
|||||||
style="@style/EdenButton.Secondary"
|
style="@style/EdenButton.Secondary"
|
||||||
android:layout_width="56dp"
|
android:layout_width="56dp"
|
||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
app:icon="@drawable/ic_forgejo"
|
app:icon="@drawable/ic_github"
|
||||||
app:iconGravity="textStart"
|
app:iconGravity="textStart"
|
||||||
app:iconSize="24dp"
|
app:iconSize="24dp"
|
||||||
app:iconPadding="0dp" />
|
app:iconPadding="0dp" />
|
||||||
|
|||||||
@@ -259,7 +259,7 @@
|
|||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
app:icon="@drawable/ic_forgejo"
|
app:icon="@drawable/ic_github"
|
||||||
app:iconSize="24dp"
|
app:iconSize="24dp"
|
||||||
app:iconGravity="textStart"
|
app:iconGravity="textStart"
|
||||||
app:iconPadding="0dp"
|
app:iconPadding="0dp"
|
||||||
|
|||||||
@@ -43,10 +43,6 @@
|
|||||||
android:icon="@drawable/ic_nfc"
|
android:icon="@drawable/ic_nfc"
|
||||||
android:title="@string/load_amiibo" />
|
android:title="@string/load_amiibo" />
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/menu_cheats"
|
|
||||||
android:icon="@drawable/ic_code"
|
|
||||||
android:title="@string/cheats" />
|
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_overlay_controls"
|
android:id="@+id/menu_overlay_controls"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
<string name="input_overlay_behavior">السلوك</string>
|
<string name="input_overlay_behavior">السلوك</string>
|
||||||
<string name="overlay_auto_hide">إخفاء الطبقة تلقائيًا</string>
|
<string name="overlay_auto_hide">إخفاء الطبقة تلقائيًا</string>
|
||||||
<string name="overlay_auto_hide_description">إخفاء طبقة ذراع التحكم باللمس تلقائيًا بعد مرور الوقت المحدد من عدم النشاط.</string>
|
<string name="overlay_auto_hide_description">إخفاء طبقة ذراع التحكم باللمس تلقائيًا بعد مرور الوقت المحدد من عدم النشاط.</string>
|
||||||
<string name="enable_input_overlay_auto_hide">تفعيل إخفاء الطبقة تلقائيًا</string>
|
<string name="enable_input_overlay_auto_hide">تمكين إخفاء الطبقة تلقائيًا</string>
|
||||||
<string name="hide_overlay_on_controller_input">إخفاء الطبقة عند إدخال ذراع التحكم</string>
|
<string name="hide_overlay_on_controller_input">إخفاء الطبقة عند إدخال ذراع التحكم</string>
|
||||||
<string name="hide_overlay_on_controller_input_description">إخفاء تلقائي لطبقة عناصر التحكم باللمس عند استخدام ذراع تحكم فعلية. تظهر الطبقة مرة أخرى عند فصل ذراع التحكم.</string>
|
<string name="hide_overlay_on_controller_input_description">إخفاء تلقائي لطبقة عناصر التحكم باللمس عند استخدام ذراع تحكم فعلية. تظهر الطبقة مرة أخرى عند فصل ذراع التحكم.</string>
|
||||||
<string name="invert_confirm_back_controller_buttons">عكس أزرار التأكيد/الرجوع في وحدة التحكم</string>
|
<string name="invert_confirm_back_controller_buttons">عكس أزرار التأكيد/الرجوع في وحدة التحكم</string>
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
<string name="stats_overlay_customization">التخصيص</string>
|
<string name="stats_overlay_customization">التخصيص</string>
|
||||||
<string name="stats_overlay_items">الرؤية</string>
|
<string name="stats_overlay_items">الرؤية</string>
|
||||||
<string name="stats_overlay_options">طبقة الأداء</string>
|
<string name="stats_overlay_options">طبقة الأداء</string>
|
||||||
<string name="enable_stats_overlay_">تفعيل طبقة إحصائيات الأداء</string>
|
<string name="enable_stats_overlay_">تمكين طبقة إحصائيات الأداء</string>
|
||||||
<string name="stats_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة إحصائيات الأداء</string>
|
<string name="stats_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة إحصائيات الأداء</string>
|
||||||
<string name="show_fps">عرض معدل الإطارات</string>
|
<string name="show_fps">عرض معدل الإطارات</string>
|
||||||
<string name="show_fps_description">عرض معدل الإطارات الحالي</string>
|
<string name="show_fps_description">عرض معدل الإطارات الحالي</string>
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
|
|
||||||
<!-- Device Overlay settings -->
|
<!-- Device Overlay settings -->
|
||||||
<string name="show_soc_overlay">عرض طبقة معلومات الجهاز</string>
|
<string name="show_soc_overlay">عرض طبقة معلومات الجهاز</string>
|
||||||
<string name="enable_soc_overlay">تفعيل طبقة الجهاز</string>
|
<string name="enable_soc_overlay">تمكين طبقة الجهاز</string>
|
||||||
<string name="soc_overlay_options">طبقة الجهاز</string>
|
<string name="soc_overlay_options">طبقة الجهاز</string>
|
||||||
<string name="soc_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة الجهاز</string>
|
<string name="soc_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة الجهاز</string>
|
||||||
|
|
||||||
@@ -98,8 +98,8 @@
|
|||||||
|
|
||||||
<string name="use_sync_core">مزامنة سرعة النواة</string>
|
<string name="use_sync_core">مزامنة سرعة النواة</string>
|
||||||
<string name="use_sync_core_description">قم بمزامنة سرعة النواة مع النسبة المئوية للسرعة القصوى لتحسين الأداء دون تغيير السرعة الفعلية للعبة.</string>
|
<string name="use_sync_core_description">قم بمزامنة سرعة النواة مع النسبة المئوية للسرعة القصوى لتحسين الأداء دون تغيير السرعة الفعلية للعبة.</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu">تفعيل محاكاة MMU المضيف</string>
|
<string name="cpuopt_unsafe_host_mmu">تمكين محاكاة MMU المضيف</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu_description">يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تفعيله إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية.</string>
|
<string name="cpuopt_unsafe_host_mmu_description">يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية.</string>
|
||||||
<string name="debug_knobs">مقابض تصحيح الأخطاء</string>
|
<string name="debug_knobs">مقابض تصحيح الأخطاء</string>
|
||||||
<string name="debug_knobs_description">للإستخدام في التطوير فقط.</string>
|
<string name="debug_knobs_description">للإستخدام في التطوير فقط.</string>
|
||||||
<string name="debug_knobs_hint">0 إلى 65535</string>
|
<string name="debug_knobs_hint">0 إلى 65535</string>
|
||||||
@@ -254,7 +254,7 @@
|
|||||||
<string name="emulator_data">إعداد بيانات المحاكي</string>
|
<string name="emulator_data">إعداد بيانات المحاكي</string>
|
||||||
<string name="emulator_data_description">يلزم وجود مفاتيح حتى يعمل المحاكي، ويوصى باستخدام الفيرموير ويكون ضروريًا لاستخدام تطبيق القائمة الرئيسية.</string>
|
<string name="emulator_data_description">يلزم وجود مفاتيح حتى يعمل المحاكي، ويوصى باستخدام الفيرموير ويكون ضروريًا لاستخدام تطبيق القائمة الرئيسية.</string>
|
||||||
<string name="permissions">منح الأذونات</string>
|
<string name="permissions">منح الأذونات</string>
|
||||||
<string name="permissions_description">منح أذونات اختيارية لاستخدام ميزات محددة في المحاكي</string>
|
<string name="permissions_description">منح أذونات اختيارية لاستخدام ميزات معينة للمحاكي</string>
|
||||||
<string name="install_firmware_warning_description">العديد من الألعاب تتطلب الوصول إلى الفيرموير لتشغيل بشكل صحيح.</string>
|
<string name="install_firmware_warning_description">العديد من الألعاب تتطلب الوصول إلى الفيرموير لتشغيل بشكل صحيح.</string>
|
||||||
<string name="install_firmware_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
|
<string name="install_firmware_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
|
||||||
<string name="notifications">الإشعارات</string>
|
<string name="notifications">الإشعارات</string>
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
<string name="frame_gen_flow_scale_description">دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء.</string>
|
<string name="frame_gen_flow_scale_description">دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء.</string>
|
||||||
<string name="frame_gen_unsupported">توليد الإطار غير متاح</string>
|
<string name="frame_gen_unsupported">توليد الإطار غير متاح</string>
|
||||||
<string name="frame_gen_unsupported_description">يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling».</string>
|
<string name="frame_gen_unsupported_description">يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling».</string>
|
||||||
<string name="lossless_scaling_setup_description">اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتفعيل إنشاء الإطارات لاحقًا</string>
|
<string name="lossless_scaling_setup_description">اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا</string>
|
||||||
<string name="lossless_scaling_install">تثبيت ملف Lossless.dll</string>
|
<string name="lossless_scaling_install">تثبيت ملف Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling</string>
|
<string name="lossless_scaling_install_description">يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_replace_description">اختر نسخة أخرى من ملف Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">اختر نسخة أخرى من ملف Lossless.dll</string>
|
||||||
@@ -350,7 +350,7 @@
|
|||||||
<string name="frame_generation_supported">مدعوم</string>
|
<string name="frame_generation_supported">مدعوم</string>
|
||||||
<string name="frame_generation_unsupported">غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16)</string>
|
<string name="frame_generation_unsupported">غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16)</string>
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_description">قم بتوفير نسختك الخاصة من ملف Lossless.dll لتفعيل توليد الإطارات</string>
|
<string name="lossless_scaling_description">قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات</string>
|
||||||
<string name="lossless_scaling_installed">مثبت</string>
|
<string name="lossless_scaling_installed">مثبت</string>
|
||||||
<string name="lossless_scaling_not_installed">غير مثبت</string>
|
<string name="lossless_scaling_not_installed">غير مثبت</string>
|
||||||
<string name="lossless_scaling_replace">استبدل</string>
|
<string name="lossless_scaling_replace">استبدل</string>
|
||||||
@@ -502,9 +502,9 @@
|
|||||||
<string name="frame_limit_slider">نسبة الحد الأقصى للسرعة</string>
|
<string name="frame_limit_slider">نسبة الحد الأقصى للسرعة</string>
|
||||||
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. %100 هي السرعة الطبيعية. القيم الأعلى أو الأقل ستزيد أو تقلل من الحد الأقصى للسرعة.</string>
|
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. %100 هي السرعة الطبيعية. القيم الأعلى أو الأقل ستزيد أو تقلل من الحد الأقصى للسرعة.</string>
|
||||||
<string name="turbo_speed_limit">سرعة تيربو</string>
|
<string name="turbo_speed_limit">سرعة تيربو</string>
|
||||||
<string name="turbo_speed_limit_description">عند تفعيل وضع التيربو، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
<string name="turbo_speed_limit_description">عند تمكين وضع التيربو، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
||||||
<string name="slow_speed_limit">سرعة بطيئة</string>
|
<string name="slow_speed_limit">سرعة بطيئة</string>
|
||||||
<string name="slow_speed_limit_description">عند تفعيل الوضع البطيء، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
<string name="slow_speed_limit_description">عند تمكين الوضع البطيء، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
||||||
<string name="cpu_backend">خلفية وحدة المعالجة المركزية</string>
|
<string name="cpu_backend">خلفية وحدة المعالجة المركزية</string>
|
||||||
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
||||||
<string name="value_with_units">%1$s%2$s</string>
|
<string name="value_with_units">%1$s%2$s</string>
|
||||||
@@ -574,10 +574,14 @@
|
|||||||
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت.</string>
|
||||||
|
<string name="renderer_async_presentation">عرض غير متزامن</string>
|
||||||
|
<string name="renderer_async_presentation_description">يمكن لهذه الحيلة أن تزيد من الأداء عن طريق نقل عملية العرض إلى خيط معالجة منفصل على حساب مشاكل الرسوميات.</string>
|
||||||
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
||||||
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
||||||
<string name="enable_buffer_history">تفعيل سجل التخزين المؤقت</string>
|
<string name="enable_buffer_history">تمكين سجل التخزين المؤقت</string>
|
||||||
<string name="enable_buffer_history_description">يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب.</string>
|
<string name="enable_buffer_history_description">يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب.</string>
|
||||||
|
<string name="enable_gpu_buffer_readback">تفعيل قراءة مخزن وحدة معالجة الرسومات</string>
|
||||||
|
<string name="enable_gpu_buffer_readback_description">يحافظ هذا النظام على بيانات المخزن المؤقت المُعدّلة بواسطة وحدة معالجة الرسومات عن طريق قراءتها مرة أخرى قبل التحميل. تتطلب بعض الألعاب ذلك لعرض بعض التأثيرات بشكل صحيح. قد يُسبب ذلك مشاكل إذا لم يتمكن الجهاز من التعامل مع عبء العمل الإضافي.</string>
|
||||||
<string name="use_optimized_vertex_buffers">مخازن الرؤوس المُحسّنة</string>
|
<string name="use_optimized_vertex_buffers">مخازن الرؤوس المُحسّنة</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">يُتيح ربطًا مُحسَّنًا لمخازن الرؤوس لتحسين الأداء. يتطلب برامج تشغيل Mesa 26.0+ Turnip/ برامج تشغيل QCOM. قد يتعطل على برامج تشغيل Turnip القديمة (25.3 وما دون).</string>
|
<string name="use_optimized_vertex_buffers_description">يُتيح ربطًا مُحسَّنًا لمخازن الرؤوس لتحسين الأداء. يتطلب برامج تشغيل Mesa 26.0+ Turnip/ برامج تشغيل QCOM. قد يتعطل على برامج تشغيل Turnip القديمة (25.3 وما دون).</string>
|
||||||
|
|
||||||
@@ -614,7 +618,7 @@
|
|||||||
<string name="dyna_state_description">يتحكم هذا الخيار في عدد الميزات التي يمكن استخدامها في ExtendedDynamicState (EDS). كلما زادت القيمة، قلّ عدد عمليات تجميع خط الأنابيب بناءً على الحالة الديناميكية التي يدعمها برنامج التشغيل.</string>
|
<string name="dyna_state_description">يتحكم هذا الخيار في عدد الميزات التي يمكن استخدامها في ExtendedDynamicState (EDS). كلما زادت القيمة، قلّ عدد عمليات تجميع خط الأنابيب بناءً على الحالة الديناميكية التي يدعمها برنامج التشغيل.</string>
|
||||||
<string name="disabled">معطل</string>
|
<string name="disabled">معطل</string>
|
||||||
<string name="vertex_input_dynamic_state">حالة ديناميكية لإدخال الرأس</string>
|
<string name="vertex_input_dynamic_state">حالة ديناميكية لإدخال الرأس</string>
|
||||||
<string name="vertex_input_dynamic_state_description">يتيح تفعيل هذه الميزة معالجة أكثر مرونة لمدخلات الرؤوس، مما قد يقلل من وقت تجميع خط الأنابيب في vertex/buffer.</string>
|
<string name="vertex_input_dynamic_state_description">يتيح تمكين هذه الميزة معالجة أكثر مرونة لمدخلات الرؤوس، مما قد يقلل من وقت تجميع خط الأنابيب في vertex/buffer.</string>
|
||||||
<string name="sample_shading_fraction">تظليل العينة</string>
|
<string name="sample_shading_fraction">تظليل العينة</string>
|
||||||
<string name="sample_shading_fraction_description">يسمح هذا الخيار بتنفيذ مُظلل الأجزاء لكل عينة في جزء متعدد العينات بدلاً من تنفيذه مرة واحدة لكل جزء. يُحسّن هذا من جودة الرسومات على حساب بعض الأداء.</string>
|
<string name="sample_shading_fraction_description">يسمح هذا الخيار بتنفيذ مُظلل الأجزاء لكل عينة في جزء متعدد العينات بدلاً من تنفيذه مرة واحدة لكل جزء. يُحسّن هذا من جودة الرسومات على حساب بعض الأداء.</string>
|
||||||
|
|
||||||
@@ -823,9 +827,9 @@
|
|||||||
<string name="preferences_system">النظام</string>
|
<string name="preferences_system">النظام</string>
|
||||||
<string name="preferences_system_description">وضع الإرساء، المنطقة، اللغة</string>
|
<string name="preferences_system_description">وضع الإرساء، المنطقة، اللغة</string>
|
||||||
<string name="preferences_graphics">الرسومات</string>
|
<string name="preferences_graphics">الرسومات</string>
|
||||||
<string name="preferences_graphics_description">مستوى دقة المحاكاة، الدقة، ذاكرة التخزين المؤقتة للتظليل</string>
|
<string name="preferences_graphics_description">مستوى الدقة، الدقة، ذاكرة التخزين المؤقتة للتظليل</string>
|
||||||
<string name="quick_settings">الإعدادات السريعة</string>
|
<string name="quick_settings">الإعدادات السريعة</string>
|
||||||
<string name="enable_quick_settings">تفعيل الإعدادات السريعة</string>
|
<string name="enable_quick_settings">تمكين الإعدادات السريعة</string>
|
||||||
<string name="enable_quick_settings_description">السماح بالوصول إلى قائمة الإعدادات السريعة عن طريق التمرير و زر القائمة</string>
|
<string name="enable_quick_settings_description">السماح بالوصول إلى قائمة الإعدادات السريعة عن طريق التمرير و زر القائمة</string>
|
||||||
<string name="preferences_audio">الصوت</string>
|
<string name="preferences_audio">الصوت</string>
|
||||||
<string name="preferences_audio_description">محرك الإخراج، مستوى الصوت</string>
|
<string name="preferences_audio_description">محرك الإخراج، مستوى الصوت</string>
|
||||||
@@ -1095,6 +1099,7 @@
|
|||||||
<string name="gpu_fence_behavior_immediate">فوري</string>
|
<string name="gpu_fence_behavior_immediate">فوري</string>
|
||||||
<string name="gpu_fence_behavior_balanced">متوازن</string>
|
<string name="gpu_fence_behavior_balanced">متوازن</string>
|
||||||
<string name="gpu_fence_behavior_accurate">دقيق</string>
|
<string name="gpu_fence_behavior_accurate">دقيق</string>
|
||||||
|
<string name="gpu_fence_behavior_strict">صارم</string>
|
||||||
|
|
||||||
<string name="vram_usage_conservative">محافظ</string>
|
<string name="vram_usage_conservative">محافظ</string>
|
||||||
<string name="vram_usage_aggressive">عدواني</string>
|
<string name="vram_usage_aggressive">عدواني</string>
|
||||||
@@ -1221,8 +1226,8 @@
|
|||||||
<string name="airplane_mode">وضع الطيران</string>
|
<string name="airplane_mode">وضع الطيران</string>
|
||||||
<string name="airplane_mode_description">يمرر وضع الطيران إلى نظام تشغيل Switch</string>
|
<string name="airplane_mode_description">يمرر وضع الطيران إلى نظام تشغيل Switch</string>
|
||||||
|
|
||||||
<string name="enable_overlay">تفعيل التطبيق الصغير للطبقة</string>
|
<string name="enable_overlay">تمكين التطبيق الصغير للطبقة</string>
|
||||||
<string name="enable_overlay_description">تفعيل التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره.</string>
|
<string name="enable_overlay_description">تمكين التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره.</string>
|
||||||
|
|
||||||
<!-- Profile Management -->
|
<!-- Profile Management -->
|
||||||
<string name="profile_manager">إدارة ملف التعريف</string>
|
<string name="profile_manager">إدارة ملف التعريف</string>
|
||||||
|
|||||||
@@ -967,6 +967,7 @@ Wirklich fortfahren?</string>
|
|||||||
<string name="gpu_fence_behavior_immediate">Direkt</string>
|
<string name="gpu_fence_behavior_immediate">Direkt</string>
|
||||||
<string name="gpu_fence_behavior_balanced">Ausgewogen</string>
|
<string name="gpu_fence_behavior_balanced">Ausgewogen</string>
|
||||||
<string name="gpu_fence_behavior_accurate">Genau</string>
|
<string name="gpu_fence_behavior_accurate">Genau</string>
|
||||||
|
<string name="gpu_fence_behavior_strict">Strikt</string>
|
||||||
|
|
||||||
<string name="vram_usage_conservative">Konservativ</string>
|
<string name="vram_usage_conservative">Konservativ</string>
|
||||||
<string name="vram_usage_aggressive">Aggressiv</string>
|
<string name="vram_usage_aggressive">Aggressiv</string>
|
||||||
|
|||||||
@@ -289,7 +289,6 @@
|
|||||||
<string name="gpu_driver_fetcher">Obtenedor de controladores de la GPU</string>
|
<string name="gpu_driver_fetcher">Obtenedor de controladores de la GPU</string>
|
||||||
<string name="gpu_driver_manager">Gestor de controladores de la GPU</string>
|
<string name="gpu_driver_manager">Gestor de controladores de la GPU</string>
|
||||||
<string name="install_gpu_driver_description">Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión</string>
|
<string name="install_gpu_driver_description">Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión</string>
|
||||||
<string name="post_processing_add">Añadir efecto</string>
|
|
||||||
<string name="post_processing_open_list">Abrir lista</string>
|
<string name="post_processing_open_list">Abrir lista</string>
|
||||||
<string name="post_processing_close_list">Cerrar lista</string>
|
<string name="post_processing_close_list">Cerrar lista</string>
|
||||||
<string name="post_processing_reset">Restablecer a predeterminado</string>
|
<string name="post_processing_reset">Restablecer a predeterminado</string>
|
||||||
@@ -518,10 +517,14 @@
|
|||||||
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización.</string>
|
||||||
|
<string name="renderer_async_presentation">Presentación asíncrona</string>
|
||||||
|
<string name="renderer_async_presentation_description">Este hack puede aumentar el rendimiento al mover la presentación a un hilo independiente de la CPU a costa de problemas gráficos.</string>
|
||||||
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
||||||
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
||||||
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
||||||
<string name="enable_buffer_history_description">Permite el acceso al estado del búfer anterior. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos.</string>
|
<string name="enable_buffer_history_description">Permite el acceso al estado del búfer anterior. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos.</string>
|
||||||
|
<string name="enable_gpu_buffer_readback">Activar la lectura del buffer de la GPU</string>
|
||||||
|
<string name="enable_gpu_buffer_readback_description">Conserva los datos del búfer modificados por la GPU leyéndolos antes de subirlos.\nAlgunos juegos requieren esto para renderizar correctamente ciertos efectos.\nPuede causar problemas si el hardware no puede soportar la carga de trabajo adicional.</string>
|
||||||
<string name="use_optimized_vertex_buffers">Búferes de vértices optimizados</string>
|
<string name="use_optimized_vertex_buffers">Búferes de vértices optimizados</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">Permite la optimización del enlace del búfer de vértices para un mejor rendimiento. Requiere controladores Mesa 26.0+ Turnip/ controladores QCOM. Fallará con controladores Turnip más antiguos (versión 25.3 o inferior).</string>
|
<string name="use_optimized_vertex_buffers_description">Permite la optimización del enlace del búfer de vértices para un mejor rendimiento. Requiere controladores Mesa 26.0+ Turnip/ controladores QCOM. Fallará con controladores Turnip más antiguos (versión 25.3 o inferior).</string>
|
||||||
|
|
||||||
@@ -1034,6 +1037,7 @@
|
|||||||
<string name="gpu_fence_behavior_immediate">Inmediato</string>
|
<string name="gpu_fence_behavior_immediate">Inmediato</string>
|
||||||
<string name="gpu_fence_behavior_balanced">Equilibrado</string>
|
<string name="gpu_fence_behavior_balanced">Equilibrado</string>
|
||||||
<string name="gpu_fence_behavior_accurate">Preciso</string>
|
<string name="gpu_fence_behavior_accurate">Preciso</string>
|
||||||
|
<string name="gpu_fence_behavior_strict">Estricto</string>
|
||||||
|
|
||||||
<string name="vram_usage_conservative">Conservador</string>
|
<string name="vram_usage_conservative">Conservador</string>
|
||||||
<string name="vram_usage_aggressive">Agresivo</string>
|
<string name="vram_usage_aggressive">Agresivo</string>
|
||||||
|
|||||||
@@ -318,13 +318,6 @@
|
|||||||
<string name="frame_gen_target_rate">Целевая частота кадров</string>
|
<string name="frame_gen_target_rate">Целевая частота кадров</string>
|
||||||
<string name="frame_gen_target_rate_description">Выберите значение под ваш дисплей. Множитель подстроится сам, чтобы его держать, и откатит изменения, если игра начнёт тормозить.</string>
|
<string name="frame_gen_target_rate_description">Выберите значение под ваш дисплей. Множитель подстроится сам, чтобы его держать, и откатит изменения, если игра начнёт тормозить.</string>
|
||||||
<string name="frame_gen_target_rate_off">Использовать фиксированный множитель</string>
|
<string name="frame_gen_target_rate_off">Использовать фиксированный множитель</string>
|
||||||
<string name="frame_gen_on">Вкл.</string>
|
|
||||||
<string name="frame_gen_off">Выкл.</string>
|
|
||||||
<string name="frame_gen_fixed">Фикс.</string>
|
|
||||||
<string name="frame_gen_flow_auto">Авто</string>
|
|
||||||
<string name="frame_gen_quick_description">Включите или выключите генерацию кадров и выберите множитель кадров.</string>
|
|
||||||
<string name="frame_gen_target_rate_quick_description">Генерация кадров с заданной частотой кадров. Множитель регулируется автоматически.</string>
|
|
||||||
<string name="frame_gen_flow_scale_quick_description">Разрешение, используемое для оценки движения между кадрами. Меньшие значения экономят время ГПУ.</string>
|
|
||||||
<string name="frame_gen_queue_target">Целевой размер очереди кадров</string>
|
<string name="frame_gen_queue_target">Целевой размер очереди кадров</string>
|
||||||
<string name="frame_gen_queue_target_description">Сколько готовых кадров может ожидать перед выводом на экран. Более длинные очереди сглаживают скачки ГПУ ценой задержки ввода.</string>
|
<string name="frame_gen_queue_target_description">Сколько готовых кадров может ожидать перед выводом на экран. Более длинные очереди сглаживают скачки ГПУ ценой задержки ввода.</string>
|
||||||
<string name="frame_gen_queue_target_0">Минимальная задержка (Без буферизации)</string>
|
<string name="frame_gen_queue_target_0">Минимальная задержка (Без буферизации)</string>
|
||||||
@@ -335,14 +328,12 @@
|
|||||||
<string name="frame_gen_flow_scale">Разрешение оценки движения</string>
|
<string name="frame_gen_flow_scale">Разрешение оценки движения</string>
|
||||||
<string name="frame_gen_flow_scale_description">Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность.</string>
|
<string name="frame_gen_flow_scale_description">Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность.</string>
|
||||||
<string name="frame_gen_unsupported">Генерация кадров недоступна</string>
|
<string name="frame_gen_unsupported">Генерация кадров недоступна</string>
|
||||||
<string name="frame_gen_unsupported_description">В этом ГПУ драйвере отсутствует поддержка модели памяти Vulkan или половинной точности (float16), которая требуется шейдерам Lossless Scaling.</string>
|
|
||||||
<string name="lossless_scaling_setup_description">Опционально. Укажите свой Lossless.dll для включения генерации кадров позже.</string>
|
<string name="lossless_scaling_setup_description">Опционально. Укажите свой Lossless.dll для включения генерации кадров позже.</string>
|
||||||
<string name="lossless_scaling_install">Установить Lossless.dll</string>
|
<string name="lossless_scaling_install">Установить Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling</string>
|
<string name="lossless_scaling_install_description">Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_replace_description">Выбрать другой файл Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">Выбрать другой файл Lossless.dll</string>
|
||||||
<string name="frame_generation_support">Генерация кадров</string>
|
<string name="frame_generation_support">Генерация кадров</string>
|
||||||
<string name="frame_generation_supported">Поддерживается</string>
|
<string name="frame_generation_supported">Поддерживается</string>
|
||||||
<string name="frame_generation_unsupported">Не поддерживается (нет модели памяти Vulkan или float16)</string>
|
|
||||||
<string name="lossless_scaling_description">Предоставьте свою копию Lossless.dll для включения генерации кадров</string>
|
<string name="lossless_scaling_description">Предоставьте свою копию Lossless.dll для включения генерации кадров</string>
|
||||||
<string name="lossless_scaling_installed">Установлена</string>
|
<string name="lossless_scaling_installed">Установлена</string>
|
||||||
<string name="lossless_scaling_not_installed">Не установлена</string>
|
<string name="lossless_scaling_not_installed">Не установлена</string>
|
||||||
@@ -563,10 +554,14 @@
|
|||||||
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации.</string>
|
||||||
|
<string name="renderer_async_presentation">Асинхронная презентация</string>
|
||||||
|
<string name="renderer_async_presentation_description">Может повысить производительность за счёт перемещения вывода кадров в отдельный поток ЦП, но ценой возникновения графических проблем.</string>
|
||||||
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
||||||
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
||||||
<string name="enable_buffer_history">Включить историю буфера</string>
|
<string name="enable_buffer_history">Включить историю буфера</string>
|
||||||
<string name="enable_buffer_history_description">Позволяет обращаться к предыдущим состояниям буфера. Эта опция может повысить качество рендеринга и стабильность производительности в некоторых играх.</string>
|
<string name="enable_buffer_history_description">Позволяет обращаться к предыдущим состояниям буфера. Эта опция может повысить качество рендеринга и стабильность производительности в некоторых играх.</string>
|
||||||
|
<string name="enable_gpu_buffer_readback">Включить обратное чтение буфера ГПУ</string>
|
||||||
|
<string name="enable_gpu_buffer_readback_description">Сохраняет измененные ГПУ данные буфера путем чтения их обратно перед выгрузками. Некоторые игры требуют этого, чтобы рендерить определенные эффекты правильно. Может вызывать проблемы если оборудование не может обработать дополнительную рабочую нагрузку.</string>
|
||||||
<string name="use_optimized_vertex_buffers">Оптимизированные вершинные буферы</string>
|
<string name="use_optimized_vertex_buffers">Оптимизированные вершинные буферы</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">Включает оптимизированную привязку вершинного буфера для повышения производительности. Требует Mesa Turnip 26.0+ / QCOM. Приводит к вылету на старых версиях драйверов Turnip (25.3 и ниже).</string>
|
<string name="use_optimized_vertex_buffers_description">Включает оптимизированную привязку вершинного буфера для повышения производительности. Требует Mesa Turnip 26.0+ / QCOM. Приводит к вылету на старых версиях драйверов Turnip (25.3 и ниже).</string>
|
||||||
|
|
||||||
@@ -1084,6 +1079,7 @@
|
|||||||
<string name="gpu_fence_behavior_immediate">Мгновенный</string>
|
<string name="gpu_fence_behavior_immediate">Мгновенный</string>
|
||||||
<string name="gpu_fence_behavior_balanced">Сбалансированный</string>
|
<string name="gpu_fence_behavior_balanced">Сбалансированный</string>
|
||||||
<string name="gpu_fence_behavior_accurate">Точный</string>
|
<string name="gpu_fence_behavior_accurate">Точный</string>
|
||||||
|
<string name="gpu_fence_behavior_strict">Строгий</string>
|
||||||
|
|
||||||
<string name="vram_usage_conservative">Консервативный</string>
|
<string name="vram_usage_conservative">Консервативный</string>
|
||||||
<string name="vram_usage_aggressive">Агрессивный</string>
|
<string name="vram_usage_aggressive">Агрессивный</string>
|
||||||
|
|||||||
@@ -481,6 +481,8 @@
|
|||||||
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій.</string>
|
||||||
|
<string name="renderer_async_presentation">Асинхронне подання</string>
|
||||||
|
<string name="renderer_async_presentation_description">Це обхідне рішення може покращити продуктивність завдяки переміщенню подання на окремий потік ЦП, але спричинить проблеми з графікою.</string>
|
||||||
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
||||||
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
||||||
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">本软件可以运行用于 Nintendo Switch 游戏机的游戏。不包含任何游戏或密钥。<br /><br />在您开始之前, 请定位您设备存储上的 <![CDATA[<b> prod.keys </b>]]> 文件。<br /><br /><![CDATA[<a href=\"https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/QuickStart.md\">了解更多</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">错误与注意事项</string>
|
<string name="notice_notification_channel_name">错误与注意事项</string>
|
||||||
<string name="notice_notification_channel_description">当发生错误时显示通知。</string>
|
<string name="notice_notification_channel_description">当发生错误时显示通知。</string>
|
||||||
<string name="notification_permission_not_granted">未授予通知权限!</string>
|
<string name="notification_permission_not_granted">未授予通知权限!</string>
|
||||||
@@ -291,25 +290,6 @@
|
|||||||
<string name="gpu_driver_fetcher">GPU驱动获取器</string>
|
<string name="gpu_driver_fetcher">GPU驱动获取器</string>
|
||||||
<string name="gpu_driver_manager">GPU 驱动管理器</string>
|
<string name="gpu_driver_manager">GPU 驱动管理器</string>
|
||||||
<string name="install_gpu_driver_description">安装替代的驱动程序以获得更好的性能和精度</string>
|
<string name="install_gpu_driver_description">安装替代的驱动程序以获得更好的性能和精度</string>
|
||||||
<string name="post_processing">后处理效果</string>
|
|
||||||
<string name="post_processing_description">在渲染完成后应用 ReShade FX 效果</string>
|
|
||||||
<string name="post_processing_per_game_description">配置此游戏的效果链</string>
|
|
||||||
<string name="post_processing_add">添加效果</string>
|
|
||||||
<string name="post_processing_remove">移除</string>
|
|
||||||
<string name="post_processing_open_list">打开列表</string>
|
|
||||||
<string name="post_processing_close_list">关闭列表</string>
|
|
||||||
<string name="post_processing_remove_all">移除效果</string>
|
|
||||||
<string name="post_processing_preset_locked">预设已激活。在开始游戏前可以在后处理效果中编辑它。</string>
|
|
||||||
<string name="post_processing_preset_modified">数值已从原始预设被更改。</string>
|
|
||||||
<string name="post_processing_presets">预设</string>
|
|
||||||
<string name="post_processing_preset_new">新建预设</string>
|
|
||||||
<string name="post_processing_preset_new_description">把您加载的效果及当前数值保存为一个预设,以便今后选用。</string>
|
|
||||||
<string name="post_processing_preset_name_invalid">请给预设起一个不含等号的名称。</string>
|
|
||||||
<string name="post_processing_preset_none">无预设</string>
|
|
||||||
<string name="post_processing_preset_delete">删除预设</string>
|
|
||||||
<string name="post_processing_preset_reset">重置预设值</string>
|
|
||||||
<string name="post_processing_reset">重置为默认值</string>
|
|
||||||
<string name="post_processing_empty">找不到效果。请在此文件中放置 .fx 文件:</string>
|
|
||||||
<string name="frame_gen">帧生成</string>
|
<string name="frame_gen">帧生成</string>
|
||||||
<string name="frame_gen_per_game_description">配置针对此游戏的帧生成设定</string>
|
<string name="frame_gen_per_game_description">配置针对此游戏的帧生成设定</string>
|
||||||
<string name="frame_gen_description">设定要在使用无损缩放渲染的帧之间应用的插帧。启用后强制采用FIFO呈现模式 。</string>
|
<string name="frame_gen_description">设定要在使用无损缩放渲染的帧之间应用的插帧。启用后强制采用FIFO呈现模式 。</string>
|
||||||
@@ -324,13 +304,6 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_on">开</string>
|
|
||||||
<string name="frame_gen_off">关</string>
|
|
||||||
<string name="frame_gen_fixed">固定</string>
|
|
||||||
<string name="frame_gen_flow_auto">自动</string>
|
|
||||||
<string name="frame_gen_quick_description">打开或关闭帧生成并选择帧生成倍数。</string>
|
|
||||||
<string name="frame_gen_target_rate_quick_description">生成帧到目标帧率。倍率会自动调整。</string>
|
|
||||||
<string name="frame_gen_flow_scale_quick_description">用来估算帧间运动的分辨率。较低的值可以节省 GPU 时间。</string>
|
|
||||||
<string name="frame_gen_queue_target">帧队列目标</string>
|
<string name="frame_gen_queue_target">帧队列目标</string>
|
||||||
<string name="frame_gen_queue_target_description">在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。</string>
|
<string name="frame_gen_queue_target_description">在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。</string>
|
||||||
<string name="frame_gen_queue_target_0">最低延迟 (无缓冲)</string>
|
<string name="frame_gen_queue_target_0">最低延迟 (无缓冲)</string>
|
||||||
@@ -341,14 +314,12 @@
|
|||||||
<string name="frame_gen_flow_scale">运动预估分辨率</string>
|
<string name="frame_gen_flow_scale">运动预估分辨率</string>
|
||||||
<string name="frame_gen_flow_scale_description">光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。</string>
|
<string name="frame_gen_flow_scale_description">光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。</string>
|
||||||
<string name="frame_gen_unsupported">帧生成不可用</string>
|
<string name="frame_gen_unsupported">帧生成不可用</string>
|
||||||
<string name="frame_gen_unsupported_description">这个 GPU 驱动缺少 Lossless Scaling 着色器所需的 Vulkan 内存模型或半精度 (float16) 支持。</string>
|
|
||||||
<string name="lossless_scaling_setup_description">作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。</string>
|
<string name="lossless_scaling_setup_description">作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。</string>
|
||||||
<string name="lossless_scaling_install">安装 Lossless.dll</string>
|
<string name="lossless_scaling_install">安装 Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本</string>
|
<string name="lossless_scaling_install_description">帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本</string>
|
||||||
<string name="lossless_scaling_replace_description">选择其它 Lossless.dll 副本</string>
|
<string name="lossless_scaling_replace_description">选择其它 Lossless.dll 副本</string>
|
||||||
<string name="frame_generation_support">帧生成</string>
|
<string name="frame_generation_support">帧生成</string>
|
||||||
<string name="frame_generation_supported">支持</string>
|
<string name="frame_generation_supported">支持</string>
|
||||||
<string name="frame_generation_unsupported">不支持 (无 Vulkan 内存模型或 float16)</string>
|
|
||||||
<string name="lossless_scaling">无损缩放</string>
|
<string name="lossless_scaling">无损缩放</string>
|
||||||
<string name="lossless_scaling_description">提供您自己的 Lossless.dll 文件以启用帧生成</string>
|
<string name="lossless_scaling_description">提供您自己的 Lossless.dll 文件以启用帧生成</string>
|
||||||
<string name="lossless_scaling_installed">已安装</string>
|
<string name="lossless_scaling_installed">已安装</string>
|
||||||
@@ -564,10 +535,14 @@
|
|||||||
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
||||||
|
<string name="renderer_async_presentation">异步呈现</string>
|
||||||
|
<string name="renderer_async_presentation_description">此技巧通过将图形呈现移至独立的 CPU 线程来提升性能,但可能会带来图形显示问题。</string>
|
||||||
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
||||||
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
||||||
<string name="enable_buffer_history">启用缓冲区历史</string>
|
<string name="enable_buffer_history">启用缓冲区历史</string>
|
||||||
<string name="enable_buffer_history_description">启用对先前缓冲区状态的访问。此选项可在某些游戏中提升渲染质量并保持性能的一致性。</string>
|
<string name="enable_buffer_history_description">启用对先前缓冲区状态的访问。此选项可在某些游戏中提升渲染质量并保持性能的一致性。</string>
|
||||||
|
<string name="enable_gpu_buffer_readback">启用 GPU 缓冲区回读</string>
|
||||||
|
<string name="enable_gpu_buffer_readback_description">在上传前回读经由 GPU 修改过的缓冲区数据,以将其保留。一些游戏会用到这项设定以正确渲染某些效果。如果硬件无法处理额外的工作负载,则可能会导致问题。</string>
|
||||||
<string name="use_optimized_vertex_buffers">优化顶点缓冲区</string>
|
<string name="use_optimized_vertex_buffers">优化顶点缓冲区</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">启用经过优化的顶点缓冲区绑定以提升性能。需要 Mesa 26.0 及以上版本的 Turnip 或 QCOM 驱动程序。若使用较旧版本的 Turnip 驱动 (25.3 及以下版本) 则会导致崩溃。</string>
|
<string name="use_optimized_vertex_buffers_description">启用经过优化的顶点缓冲区绑定以提升性能。需要 Mesa 26.0 及以上版本的 Turnip 或 QCOM 驱动程序。若使用较旧版本的 Turnip 驱动 (25.3 及以下版本) 则会导致崩溃。</string>
|
||||||
|
|
||||||
@@ -636,11 +611,6 @@
|
|||||||
<string name="log">日志记录</string>
|
<string name="log">日志记录</string>
|
||||||
<string name="flush_by_line">按行刷新调试日志</string>
|
<string name="flush_by_line">按行刷新调试日志</string>
|
||||||
<string name="flush_by_line_description">在每行写入时刷新调试日志,使在崩溃或冻结时调试更容易。</string>
|
<string name="flush_by_line_description">在每行写入时刷新调试日志,使在崩溃或冻结时调试更容易。</string>
|
||||||
<string name="extended_logging">开启扩展日志</string>
|
|
||||||
<string name="extended_logging_description">将最大日志文件大小从 100 MiB 提升至 1GiB。</string>
|
|
||||||
<string name="log_filter">日志筛选器</string>
|
|
||||||
<string name="log_filter_description">控制 Eden 的日志类别。例如: *:Info Service.LM:Debug</string>
|
|
||||||
|
|
||||||
<!-- GPU Logging strings -->
|
<!-- GPU Logging strings -->
|
||||||
<string name="gpu_logging_header">GPU 日志</string>
|
<string name="gpu_logging_header">GPU 日志</string>
|
||||||
<string name="gpu_log_level">日志等级</string>
|
<string name="gpu_log_level">日志等级</string>
|
||||||
@@ -924,8 +894,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROM 文件不存在</string>
|
<string name="loader_error_file_not_found">ROM 文件不存在</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">游戏需要固件</string>
|
<string name="loader_requires_firmware">游戏需要固件</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[这个游戏可能需要固件才能正常运行,但您还没有安装任何固件。请在启动前安装固件,或者按 “确定” 继续启动。]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">正在搜索游戏...</string>
|
<string name="searching_for_game">正在搜索游戏...</string>
|
||||||
<string name="game_not_found_for_title_id">未找到标题ID的游戏: %1$s</string>
|
<string name="game_not_found_for_title_id">未找到标题ID的游戏: %1$s</string>
|
||||||
@@ -1085,6 +1053,7 @@
|
|||||||
<string name="gpu_fence_behavior_immediate">即时</string>
|
<string name="gpu_fence_behavior_immediate">即时</string>
|
||||||
<string name="gpu_fence_behavior_balanced">均衡</string>
|
<string name="gpu_fence_behavior_balanced">均衡</string>
|
||||||
<string name="gpu_fence_behavior_accurate">精确</string>
|
<string name="gpu_fence_behavior_accurate">精确</string>
|
||||||
|
<string name="gpu_fence_behavior_strict">严格</string>
|
||||||
|
|
||||||
<string name="vram_usage_conservative">保守式</string>
|
<string name="vram_usage_conservative">保守式</string>
|
||||||
<string name="vram_usage_aggressive">主动式</string>
|
<string name="vram_usage_aggressive">主动式</string>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">本軟體可執行 Nintendo Switch 主機的遊戲,軟體不提供遊戲和金鑰檔案。<br /><br />在開始之前,請先安裝您的 <![CDATA[<b> prod.keys </b>]]> 檔案,<![CDATA[<a href=\"https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/QuickStart.md\">了解更多</a>]]></string>
|
<string name="app_disclaimer">本軟體可執行Nintendo Switch主機的遊戲,軟體不提供遊戲和金鑰檔案。<br /><br />在開始之前,請先安裝您的 <![CDATA[<b> prod.keys </b>]]> 檔案,<![CDATA[<a href=\"https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/QuickStart.md\">了解更多</a>]]></string>
|
||||||
<string name="notice_notification_channel_name">通知和錯誤</string>
|
<string name="notice_notification_channel_name">通知和錯誤</string>
|
||||||
<string name="notice_notification_channel_description">發生錯誤時顯示通知</string>
|
<string name="notice_notification_channel_description">發生錯誤時顯示通知</string>
|
||||||
<string name="notification_permission_not_granted">未授予通知權限!</string>
|
<string name="notification_permission_not_granted">未授予通知權限!</string>
|
||||||
<string name="app_notification_channel_description">Eden 模擬器通知</string>
|
<string name="app_notification_channel_description">Eden模擬器通知</string>
|
||||||
<string name="app_notification_running">Eden 正在執行</string>
|
<string name="app_notification_running">Eden正在執行</string>
|
||||||
<string name="seconds">秒</string>
|
<string name="seconds">秒</string>
|
||||||
|
|
||||||
<!-- Spinbox strings -->
|
<!-- Spinbox strings -->
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<string name="value_too_high">範圍最大必須為%1$d</string>
|
<string name="value_too_high">範圍最大必須為%1$d</string>
|
||||||
<string name="invalid_value">無效的範圍</string>
|
<string name="invalid_value">無效的範圍</string>
|
||||||
|
|
||||||
<string name="using_per_game_config">使用個別遊戲設定中</string>
|
<string name="using_per_game_config">使用個別設定中</string>
|
||||||
|
|
||||||
<!-- Input Overlay -->
|
<!-- Input Overlay -->
|
||||||
<string name="show_input_overlay">顯示虛擬按鍵</string>
|
<string name="show_input_overlay">顯示虛擬按鍵</string>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<string name="hide_overlay_on_controller_input">使用控制器時自動隱藏虛擬按鍵</string>
|
<string name="hide_overlay_on_controller_input">使用控制器時自動隱藏虛擬按鍵</string>
|
||||||
<string name="hide_overlay_on_controller_input_description">在使用控制器時自動隱藏畫面上的虛擬按鍵,會在控制器斷開連接後重新出現</string>
|
<string name="hide_overlay_on_controller_input_description">在使用控制器時自動隱藏畫面上的虛擬按鍵,會在控制器斷開連接後重新出現</string>
|
||||||
<string name="invert_confirm_back_controller_buttons">反轉手把的 確認/返回 按鈕</string>
|
<string name="invert_confirm_back_controller_buttons">反轉手把的 確認/返回 按鈕</string>
|
||||||
<string name="invert_confirm_back_controller_buttons_description">使用 Eden 時將手把的確認及返回鍵反轉以符合 Switch 與 Xbox 的操作方式</string>
|
<string name="invert_confirm_back_controller_buttons_description">使用Eden時將手把的確認及返回鍵反轉以符合Switch與Xbox的操作方式</string>
|
||||||
|
|
||||||
<string name="input_overlay_options">虛擬按鍵設定</string>
|
<string name="input_overlay_options">虛擬按鍵設定</string>
|
||||||
<string name="input_overlay_options_description">調整虛擬按鍵的位置與顯示設定</string>
|
<string name="input_overlay_options_description">調整虛擬按鍵的位置與顯示設定</string>
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
<string name="enable_stats_overlay_">啟用效能統計疊加層</string>
|
<string name="enable_stats_overlay_">啟用效能統計疊加層</string>
|
||||||
<string name="stats_overlay_options_description">設定疊加層中顯示的資訊</string>
|
<string name="stats_overlay_options_description">設定疊加層中顯示的資訊</string>
|
||||||
<string name="show_fps">顯示影格率</string>
|
<string name="show_fps">顯示影格率</string>
|
||||||
<string name="show_fps_description">顯示目前的影格率</string>
|
<string name="show_fps_description">顯示當前影格率</string>
|
||||||
<string name="show_frametime">顯示影格時間</string>
|
<string name="show_frametime">顯示影格時間</string>
|
||||||
<string name="show_app_ram_usage">顯示應用程式的記憶體用量</string>
|
<string name="show_app_ram_usage">顯示應用程式的記憶體用量</string>
|
||||||
<string name="show_app_ram_usage_description">顯示模擬器的記憶體用量</string>
|
<string name="show_app_ram_usage_description">顯示模擬器的記憶體用量</string>
|
||||||
@@ -85,11 +85,11 @@
|
|||||||
<string name="soc_overlay_options">裝置疊加層</string>
|
<string name="soc_overlay_options">裝置疊加層</string>
|
||||||
<string name="soc_overlay_options_description">設定裝置疊加層中顯示的資訊</string>
|
<string name="soc_overlay_options_description">設定裝置疊加層中顯示的資訊</string>
|
||||||
|
|
||||||
<string name="show_build_id">顯示 Eden 的組建版本</string>
|
<string name="show_build_id">顯示Eden的組建版本</string>
|
||||||
<string name="show_driver_version">顯示圖形驅動程式的版本</string>
|
<string name="show_driver_version">顯示圖形驅動程式的版本</string>
|
||||||
<string name="show_device_model">顯示裝置型號</string>
|
<string name="show_device_model">顯示裝置型號</string>
|
||||||
<string name="show_gpu_model">顯示 GPU 型號</string>
|
<string name="show_gpu_model">顯示GPU型號</string>
|
||||||
<string name="show_soc_model">顯示 CPU 型號</string>
|
<string name="show_soc_model">顯示CPU型號</string>
|
||||||
<string name="show_fw_version">顯示韌體版本</string>
|
<string name="show_fw_version">顯示韌體版本</string>
|
||||||
|
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
@@ -99,13 +99,13 @@
|
|||||||
<string name="use_sync_core">同步核心速度</string>
|
<string name="use_sync_core">同步核心速度</string>
|
||||||
<string name="use_sync_core_description">將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能</string>
|
<string name="use_sync_core_description">將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu">啟用主機 MMU 模擬</string>
|
<string name="cpuopt_unsafe_host_mmu">啟用主機 MMU 模擬</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu_description">此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬</string>
|
<string name="cpuopt_unsafe_host_mmu_description">此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬。</string>
|
||||||
<string name="debug_knobs">偵錯開關</string>
|
<string name="debug_knobs">偵錯開關</string>
|
||||||
<string name="debug_knobs_description">僅限開發用途</string>
|
<string name="debug_knobs_description">僅限開發用途</string>
|
||||||
<string name="debug_knobs_hint">0 到 65535</string>
|
<string name="debug_knobs_hint">0到65535</string>
|
||||||
|
|
||||||
<!-- NVDEC Emulation -->
|
<!-- NVDEC Emulation -->
|
||||||
<string name="nvdec_emulation">NVDEC 模擬</string>
|
<string name="nvdec_emulation">NVDEC模擬</string>
|
||||||
<string name="nvdec_emulation_description">若在過場動畫中當機請切換成 CPU</string>
|
<string name="nvdec_emulation_description">若在過場動畫中當機請切換成 CPU</string>
|
||||||
<string name="nvdec_emulation_none">無</string>
|
<string name="nvdec_emulation_none">無</string>
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
<string name="multiplayer_join_room">加入</string>
|
<string name="multiplayer_join_room">加入</string>
|
||||||
<string name="multiplayer_public_room">瀏覽公開房間</string>
|
<string name="multiplayer_public_room">瀏覽公開房間</string>
|
||||||
<string name="multiplayer_username">使用者名稱</string>
|
<string name="multiplayer_username">使用者名稱</string>
|
||||||
<string name="multiplayer_ip_address">IP 位址</string>
|
<string name="multiplayer_ip_address">IP位址</string>
|
||||||
<string name="multiplayer_ip_port">埠</string>
|
<string name="multiplayer_ip_port">埠</string>
|
||||||
<string name="multiplayer_create_room_success">房間建立成功</string>
|
<string name="multiplayer_create_room_success">房間建立成功</string>
|
||||||
<string name="multiplayer_join_room_success">成功加入房間</string>
|
<string name="multiplayer_join_room_success">成功加入房間</string>
|
||||||
@@ -129,8 +129,8 @@
|
|||||||
<string name="multiplayer_network_error">網路錯誤</string>
|
<string name="multiplayer_network_error">網路錯誤</string>
|
||||||
<string name="multiplayer_lost_connection">連線中斷</string>
|
<string name="multiplayer_lost_connection">連線中斷</string>
|
||||||
<string name="multiplayer_name_collision">使用者名稱已被其他人使用</string>
|
<string name="multiplayer_name_collision">使用者名稱已被其他人使用</string>
|
||||||
<string name="multiplayer_mac_collision">MAC 位址衝突</string>
|
<string name="multiplayer_mac_collision">MAC位址衝突</string>
|
||||||
<string name="multiplayer_console_id_collision">主機 ID 衝突</string>
|
<string name="multiplayer_console_id_collision">主機ID衝突</string>
|
||||||
<string name="multiplayer_wrong_version">版本不符</string>
|
<string name="multiplayer_wrong_version">版本不符</string>
|
||||||
<string name="multiplayer_wrong_password">密碼錯誤</string>
|
<string name="multiplayer_wrong_password">密碼錯誤</string>
|
||||||
<string name="multiplayer_could_not_connect">無法連接</string>
|
<string name="multiplayer_could_not_connect">無法連接</string>
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
<string name="multiplayer_host_kicked">您已被房主踢出</string>
|
<string name="multiplayer_host_kicked">您已被房主踢出</string>
|
||||||
<string name="multiplayer_unknown_error">未知錯誤</string>
|
<string name="multiplayer_unknown_error">未知錯誤</string>
|
||||||
<string name="multiplayer_room_uninitialized">房間未初始化</string>
|
<string name="multiplayer_room_uninitialized">房間未初始化</string>
|
||||||
<string name="multiplayer_room_idle">房間閒置中</string>
|
<string name="multiplayer_room_idle">房間閒置</string>
|
||||||
<string name="multiplayer_room_joining">正在加入房間</string>
|
<string name="multiplayer_room_joining">正在加入房間</string>
|
||||||
<string name="multiplayer_room_joined">已加入房間</string>
|
<string name="multiplayer_room_joined">已加入房間</string>
|
||||||
<string name="multiplayer_room_moderator">房間管理員</string>
|
<string name="multiplayer_room_moderator">房間管理員</string>
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
<string name="multiplayer_member_leave">%1$s 離開</string>
|
<string name="multiplayer_member_leave">%1$s 離開</string>
|
||||||
<string name="multiplayer_member_kicked">%1$s 被踢出</string>
|
<string name="multiplayer_member_kicked">%1$s 被踢出</string>
|
||||||
<string name="multiplayer_member_banned">%1$s 被封鎖</string>
|
<string name="multiplayer_member_banned">%1$s 被封鎖</string>
|
||||||
<string name="multiplayer_address_unbanned">IP 位址已解封</string>
|
<string name="multiplayer_address_unbanned">位址已解封</string>
|
||||||
<string name="multiplayer_kick_member">踢出成員</string>
|
<string name="multiplayer_kick_member">踢出成員</string>
|
||||||
<string name="multiplayer_password">密碼</string>
|
<string name="multiplayer_password">密碼</string>
|
||||||
<string name="multiplayer_joining">正在加入…</string>
|
<string name="multiplayer_joining">正在加入…</string>
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
<string name="multiplayer_ban">封鎖使用者</string>
|
<string name="multiplayer_ban">封鎖使用者</string>
|
||||||
<string name="multiplayer_room_browser">公開房間</string>
|
<string name="multiplayer_room_browser">公開房間</string>
|
||||||
<string name="multiplayer_no_rooms_found">未找到公開房間</string>
|
<string name="multiplayer_no_rooms_found">未找到公開房間</string>
|
||||||
<string name="multiplayer_password_required">請輸入密碼</string>
|
<string name="multiplayer_password_required">需要輸入密碼</string>
|
||||||
<string name="multiplayer_player_count">:%1$d/%2$d</string>
|
<string name="multiplayer_player_count">:%1$d/%2$d</string>
|
||||||
<string name="multiplayer_game">遊戲</string>
|
<string name="multiplayer_game">遊戲</string>
|
||||||
<string name="multiplayer_no_game_info">任意遊戲</string>
|
<string name="multiplayer_no_game_info">任意遊戲</string>
|
||||||
@@ -184,14 +184,14 @@
|
|||||||
<string name="multiplayer_search_public_lobbies">搜尋房間…</string>
|
<string name="multiplayer_search_public_lobbies">搜尋房間…</string>
|
||||||
<string name="multiplayer_preferred_game_name">遊戲</string>
|
<string name="multiplayer_preferred_game_name">遊戲</string>
|
||||||
<string name="multiplayer_lobby_type">大廳類型</string>
|
<string name="multiplayer_lobby_type">大廳類型</string>
|
||||||
<string name="multiplayer_room_name_error">長度需為 3-20 個字元</string>
|
<string name="multiplayer_room_name_error">長度需為3-20個字元</string>
|
||||||
<string name="multiplayer_required">請填寫這個欄位</string>
|
<string name="multiplayer_required">必填</string>
|
||||||
<string name="multiplayer_token_required">需要 Web 令牌,請前往進階設定 -> 系統 -> 網路</string>
|
<string name="multiplayer_token_required">需要Web令牌,請前往進階設定 -> 系統 -> 網路</string>
|
||||||
<string name="multiplayer_ip_error">IP 格式無效</string>
|
<string name="multiplayer_ip_error">IP格式無效</string>
|
||||||
<string name="multiplayer_username_error">必須介於 4-20 個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
<string name="multiplayer_username_error">必須介於4-20個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
||||||
<string name="multiplayer_nickname_invalid">使用者名稱無效,請在系統 -> 網路中檢查設定</string>
|
<string name="multiplayer_nickname_invalid">使用者名稱無效,請在系統→網路中檢查設定</string>
|
||||||
<string name="multiplayer_token_error">必須為 48 個字元,且僅包含小寫字母 a-z</string>
|
<string name="multiplayer_token_error">必須為48個字元,且僅包含小寫字母a-z</string>
|
||||||
<string name="multiplayer_port_error">埠號需為 1-65535</string>
|
<string name="multiplayer_port_error">埠號需為1-65535</string>
|
||||||
<string name="cancel">取消</string>
|
<string name="cancel">取消</string>
|
||||||
<string name="ok">確定</string>
|
<string name="ok">確定</string>
|
||||||
<string name="refresh">重新整理</string>
|
<string name="refresh">重新整理</string>
|
||||||
@@ -201,16 +201,16 @@
|
|||||||
|
|
||||||
<!-- Setup strings -->
|
<!-- Setup strings -->
|
||||||
<string name="welcome">歡迎!</string>
|
<string name="welcome">歡迎!</string>
|
||||||
<string name="welcome_description">瞭解如何設定 <b>Eden</b> 並開始模擬</string>
|
<string name="welcome_description">瞭解如何設定 <b>Eden</b> 並開始模擬。</string>
|
||||||
<string name="get_started">開始使用</string>
|
<string name="get_started">開始使用</string>
|
||||||
<string name="keys">金鑰</string>
|
<string name="keys">金鑰</string>
|
||||||
<string name="keys_description">使用下方的按鈕安裝您的 <b>prod.keys</b> 檔案</string>
|
<string name="keys_description">使用下方的按鈕安裝您的 <b>prod.keys</b> 檔案。</string>
|
||||||
<string name="firmware">韌體</string>
|
<string name="firmware">韌體</string>
|
||||||
<string name="firmware_description">使用下方的按鈕安裝您的<b>firmware.zip</b>檔案</string>
|
<string name="firmware_description">使用下方的按鈕安裝您的<b>firmware.zip</b>檔案</string>
|
||||||
<string name="games">遊戲資料夾</string>
|
<string name="games">遊戲資料夾</string>
|
||||||
<string name="games_description">使用下方的按鈕選擇您的<b>遊戲</b>資料夾。</string>
|
<string name="games_description">使用下方的按鈕選擇您的<b>遊戲</b>資料夾。</string>
|
||||||
<string name="done">完成</string>
|
<string name="done">完成</string>
|
||||||
<string name="done_description">您已準備就緒\n盡情遊玩您的遊戲!</string>
|
<string name="done_description">您已準備就緒。\n盡情遊玩您的遊戲!</string>
|
||||||
<string name="next">下一步</string>
|
<string name="next">下一步</string>
|
||||||
<string name="back">上一步</string>
|
<string name="back">上一步</string>
|
||||||
<string name="add_games">新增遊戲</string>
|
<string name="add_games">新增遊戲</string>
|
||||||
@@ -228,8 +228,8 @@
|
|||||||
<string name="dont_show_again">不再顯示</string>
|
<string name="dont_show_again">不再顯示</string>
|
||||||
<string name="add_directory_success">遊戲目錄新增成功</string>
|
<string name="add_directory_success">遊戲目錄新增成功</string>
|
||||||
<string name="enable_update_checks">檢查更新</string>
|
<string name="enable_update_checks">檢查更新</string>
|
||||||
<string name="enable_update_checks_description">在 Eden 啟動時檢查有無新版本並選擇是否要下載與安裝更新</string>
|
<string name="enable_update_checks_description">在Eden啟動時檢查有無新版本並選擇是否要下載與安裝更新</string>
|
||||||
<string name="update_available">發現新版本</string>
|
<string name="update_available">偵測到新版本</string>
|
||||||
<string name="update_available_description">有更新可供安裝:%1$s\n\n您要進行更新嗎?</string>
|
<string name="update_available_description">有更新可供安裝:%1$s\n\n您要進行更新嗎?</string>
|
||||||
<string name="downloading_update">下載更新中</string>
|
<string name="downloading_update">下載更新中</string>
|
||||||
<string name="update_download_failed">更新下載失敗</string>
|
<string name="update_download_failed">更新下載失敗</string>
|
||||||
@@ -237,7 +237,7 @@
|
|||||||
<string name="update_install_failed">更新安裝失敗:%1$s</string>
|
<string name="update_install_failed">更新安裝失敗:%1$s</string>
|
||||||
<string name="home_search">搜尋</string>
|
<string name="home_search">搜尋</string>
|
||||||
<string name="home_settings">設定</string>
|
<string name="home_settings">設定</string>
|
||||||
<string name="empty_gamelist">找不到遊戲檔案,或者尚未選取遊戲目錄</string>
|
<string name="empty_gamelist">找不到檔案,或者尚未選取遊戲目錄</string>
|
||||||
<string name="manage_game_folders">管理遊戲資料夾</string>
|
<string name="manage_game_folders">管理遊戲資料夾</string>
|
||||||
<string name="select_games_folder_description">允許 Eden 尋找您的遊戲檔案</string>
|
<string name="select_games_folder_description">允許 Eden 尋找您的遊戲檔案</string>
|
||||||
<string name="add_games_warning">跳過選擇遊戲資料夾?</string>
|
<string name="add_games_warning">跳過選擇遊戲資料夾?</string>
|
||||||
@@ -252,7 +252,7 @@
|
|||||||
<string name="install_prod_keys_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
|
<string name="install_prod_keys_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
|
||||||
<string name="install_firmware_warning">跳過安裝韌體?</string>
|
<string name="install_firmware_warning">跳過安裝韌體?</string>
|
||||||
<string name="emulator_data">設定模擬器資料</string>
|
<string name="emulator_data">設定模擬器資料</string>
|
||||||
<string name="emulator_data_description">模擬器需要金鑰才能正常執行,同時建議安裝韌體以啟動 QLaunch 小程式</string>
|
<string name="emulator_data_description">模擬器需要金鑰才能正常執行,同時建議安裝韌體以啟動QLaunch小程式</string>
|
||||||
<string name="permissions">授予權限</string>
|
<string name="permissions">授予權限</string>
|
||||||
<string name="permissions_description">授予權限以使用模擬器的特定功能</string>
|
<string name="permissions_description">授予權限以使用模擬器的特定功能</string>
|
||||||
<string name="install_firmware_warning_description">許多遊戲需要韌體才能正常運作</string>
|
<string name="install_firmware_warning_description">許多遊戲需要韌體才能正常運作</string>
|
||||||
@@ -273,10 +273,10 @@
|
|||||||
<string name="build_id">版本號碼</string>
|
<string name="build_id">版本號碼</string>
|
||||||
<string name="general_information">基本資訊</string>
|
<string name="general_information">基本資訊</string>
|
||||||
<string name="hardware">硬體</string>
|
<string name="hardware">硬體</string>
|
||||||
<string name="supported_abis">支援的 ABI</string>
|
<string name="supported_abis">支援的ABI</string>
|
||||||
<string name="cpu_info">CPU 資訊</string>
|
<string name="cpu_info">CPU資訊</string>
|
||||||
<string name="gpu_information">GPU 資訊</string>
|
<string name="gpu_information">GPU資訊</string>
|
||||||
<string name="vulkan_driver_version">Vulkan 驅動程式版本</string>
|
<string name="vulkan_driver_version">Vulkan驅動程式版本</string>
|
||||||
<string name="error_getting_emulator_info">取得裝置資訊失敗</string>
|
<string name="error_getting_emulator_info">取得裝置資訊失敗</string>
|
||||||
<string name="memory_info">記憶體資訊</string>
|
<string name="memory_info">記憶體資訊</string>
|
||||||
<string name="total_memory">記憶體大小</string>
|
<string name="total_memory">記憶體大小</string>
|
||||||
@@ -287,8 +287,8 @@
|
|||||||
<string name="warning_skip">跳過</string>
|
<string name="warning_skip">跳過</string>
|
||||||
<string name="warning_cancel">取消</string>
|
<string name="warning_cancel">取消</string>
|
||||||
<string name="install_amiibo_keys">安裝 Amiibo 金鑰</string>
|
<string name="install_amiibo_keys">安裝 Amiibo 金鑰</string>
|
||||||
<string name="install_amiibo_keys_description">需要先安裝才能在遊戲中使用 Amiibo</string>
|
<string name="install_amiibo_keys_description">若要在遊戲中使用 Amiibo 得先安裝</string>
|
||||||
<string name="gpu_driver_fetcher">GPU 驅動程式下載器</string>
|
<string name="gpu_driver_fetcher">GPU驅動程式下載器</string>
|
||||||
<string name="gpu_driver_manager">GPU 驅動程式管理員</string>
|
<string name="gpu_driver_manager">GPU 驅動程式管理員</string>
|
||||||
<string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
|
<string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
|
||||||
<string name="post_processing">後製處理效果</string>
|
<string name="post_processing">後製處理效果</string>
|
||||||
@@ -299,7 +299,7 @@
|
|||||||
<string name="post_processing_open_list">開啟清單</string>
|
<string name="post_processing_open_list">開啟清單</string>
|
||||||
<string name="post_processing_close_list">收起清單</string>
|
<string name="post_processing_close_list">收起清單</string>
|
||||||
<string name="post_processing_remove_all">移除效果</string>
|
<string name="post_processing_remove_all">移除效果</string>
|
||||||
<string name="post_processing_preset_locked">濾鏡已啟用。請在開啟遊戲前於\"後製處理效果\"中調整</string>
|
<string name="post_processing_preset_locked">濾鏡已啟用。請在開啟遊戲前於 後製處理效果 中調整</string>
|
||||||
<string name="post_processing_preset_modified">數值已變更,與原始濾鏡設定不同</string>
|
<string name="post_processing_preset_modified">數值已變更,與原始濾鏡設定不同</string>
|
||||||
<string name="post_processing_presets">濾鏡</string>
|
<string name="post_processing_presets">濾鏡</string>
|
||||||
<string name="post_processing_preset_new">新增濾鏡</string>
|
<string name="post_processing_preset_new">新增濾鏡</string>
|
||||||
@@ -312,51 +312,42 @@
|
|||||||
<string name="post_processing_empty">找不到設定檔。請將濾鏡效果的 .fx 檔案放置於此資料夾:</string>
|
<string name="post_processing_empty">找不到設定檔。請將濾鏡效果的 .fx 檔案放置於此資料夾:</string>
|
||||||
<string name="frame_gen">影格生成</string>
|
<string name="frame_gen">影格生成</string>
|
||||||
<string name="frame_gen_per_game_description">調整此遊戲的影格生成設定</string>
|
<string name="frame_gen_per_game_description">調整此遊戲的影格生成設定</string>
|
||||||
<string name="frame_gen_description">使用Lossless Scaling在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用FIFO垂直同步</string>
|
<string name="frame_gen_description">使用 Lossless Scaling 在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用 FIFO 垂直同步</string>
|
||||||
<string name="frame_gen_multiplier">影格倍率</string>
|
<string name="frame_gen_multiplier">影格倍率</string>
|
||||||
<string name="frame_gen_multiplier_description">設定在每個已渲染的影格中要顯示的影格數,數值越高所需的GPU運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度</string>
|
<string name="frame_gen_multiplier_description">設定在每個已渲染的影格中要顯示的影格數。數值越高所需的 GPU 運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度</string>
|
||||||
<string name="frame_gen_multiplier_2x">2x</string>
|
<string name="frame_gen_multiplier_2x">2x</string>
|
||||||
<string name="frame_gen_multiplier_3x">3x</string>
|
<string name="frame_gen_multiplier_3x">3x</string>
|
||||||
<string name="frame_gen_multiplier_4x">4x</string>
|
<string name="frame_gen_multiplier_4x">4x</string>
|
||||||
<string name="frame_gen_target_rate">目標影格率</string>
|
<string name="frame_gen_target_rate">目標影格率</string>
|
||||||
<string name="frame_gen_target_rate_description">選擇裝置顯示器能實際呈現的影格率,之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定</string>
|
<string name="frame_gen_target_rate_description">選擇裝置顯示器能實際呈現的影格率。之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定</string>
|
||||||
<string name="frame_gen_target_rate_off">使用固定倍率</string>
|
<string name="frame_gen_target_rate_off">使用固定倍率</string>
|
||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_on">開啟</string>
|
|
||||||
<string name="frame_gen_off">關閉</string>
|
|
||||||
<string name="frame_gen_fixed">固定</string>
|
|
||||||
<string name="frame_gen_flow_auto">自動</string>
|
|
||||||
<string name="frame_gen_quick_description">開啟或關閉影格生成後選擇影格倍率</string>
|
|
||||||
<string name="frame_gen_target_rate_quick_description">選擇要生成的目標影格率,倍率器會自動調整</string>
|
|
||||||
<string name="frame_gen_flow_scale_quick_description">用來預測影格之間動態的解析度,較低的數值可以減少 GPU 運算時間</string>
|
|
||||||
<string name="frame_gen_queue_target">影格佇列目標</string>
|
<string name="frame_gen_queue_target">影格佇列目標</string>
|
||||||
<string name="frame_gen_queue_target_description">最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲</string>
|
<string name="frame_gen_queue_target_description">最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲</string>
|
||||||
<string name="frame_gen_queue_target_0">最低延遲(無緩衝)</string>
|
<string name="frame_gen_queue_target_0">最低延遲(無緩衝)</string>
|
||||||
<string name="frame_gen_queue_target_1">平衡(1 影格)</string>
|
<string name="frame_gen_queue_target_1">平衡(1影格)</string>
|
||||||
<string name="frame_gen_queue_target_2">最流暢(2 影格)</string>
|
<string name="frame_gen_queue_target_2">最流暢(2影格)</string>
|
||||||
<string name="frame_gen_flow_scale_auto">配合遊戲調整運動預測</string>
|
<string name="frame_gen_flow_scale_auto">配合遊戲調整運動預測</string>
|
||||||
<string name="frame_gen_flow_scale_auto_description">以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測,由於升頻後不會增加任何動態細節,因此不會影響準確度</string>
|
<string name="frame_gen_flow_scale_auto_description">以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度</string>
|
||||||
<string name="frame_gen_flow_scale">運動預測解析度</string>
|
<string name="frame_gen_flow_scale">運動預測解析度</string>
|
||||||
<string name="frame_gen_flow_scale_description">光流處理的解析度,以輸出解析度的比例表示,降低此設定值是減少效能負載最有效的方法</string>
|
<string name="frame_gen_flow_scale_description">光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法</string>
|
||||||
<string name="frame_gen_unsupported">無法使用影格生成</string>
|
<string name="frame_gen_unsupported">無法使用影格生成</string>
|
||||||
<string name="frame_gen_unsupported_description">此 GPU 驅動程式缺少 Lossless Scaling 著色器所需的 Vulkan 記憶體模型或半精度浮點數(float16)支援</string>
|
|
||||||
<string name="lossless_scaling_setup_description">可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能</string>
|
<string name="lossless_scaling_setup_description">可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能</string>
|
||||||
<string name="lossless_scaling_install">安裝 Lossless.dll</string>
|
<string name="lossless_scaling_install">安裝 Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能</string>
|
<string name="lossless_scaling_install_description">您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能</string>
|
||||||
<string name="lossless_scaling_replace_description">安裝不同的 Lossless.dll 檔案</string>
|
<string name="lossless_scaling_replace_description">安裝不同的 Lossless.dll 檔案</string>
|
||||||
<string name="frame_generation_support">影格生成</string>
|
<string name="frame_generation_support">影格生成</string>
|
||||||
<string name="frame_generation_supported">支援</string>
|
<string name="frame_generation_supported">支援</string>
|
||||||
<string name="frame_generation_unsupported">不支援(無 Vulkan 記憶體模型或 float16)</string>
|
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_description">安裝您擁有的 Lossless.dll 檔案以使用影格生成</string>
|
<string name="lossless_scaling_description">安裝您擁有的 Lossless.dll 檔案以使用影格生成</string>
|
||||||
<string name="lossless_scaling_installed">已安裝</string>
|
<string name="lossless_scaling_installed">已安裝</string>
|
||||||
<string name="lossless_scaling_not_installed">未安裝</string>
|
<string name="lossless_scaling_not_installed">未安裝</string>
|
||||||
<string name="lossless_scaling_replace">更換</string>
|
<string name="lossless_scaling_replace">替換</string>
|
||||||
<string name="lossless_scaling_remove">刪除</string>
|
<string name="lossless_scaling_remove">刪除</string>
|
||||||
<string name="lossless_scaling_remove_description">刪除已安裝的 Lossless.dll 及預先編譯的著色器</string>
|
<string name="lossless_scaling_remove_description">刪除已安裝的 Lossless.dll 及預先編譯的著色器</string>
|
||||||
<string name="lossless_scaling_remove_confirmation">影格生成功能會停止運作直到您重新安裝Lossless.dll,您的 Lossless.dll原始檔不會被 Eden 修改</string>
|
<string name="lossless_scaling_remove_confirmation">影格生成功能會停止運作直到您重新安裝 Lossless.dll 。您的 Lossless.dll 原始檔並不會被 Eden 修改</string>
|
||||||
<string name="lossless_scaling_missing">Lossless.dll 未安裝</string>
|
<string name="lossless_scaling_missing">Lossless.dll 未安裝</string>
|
||||||
<string name="lossless_scaling_missing_description">前往 設定 -> Lossless Scaling 安裝以使用影格生成功能</string>
|
<string name="lossless_scaling_missing_description">前往 設定 -> Lossless Scaling 安裝以使用影格生成功能</string>
|
||||||
<string name="lossless_scaling_locked">請先關閉遊戲</string>
|
<string name="lossless_scaling_locked">請先關閉遊戲</string>
|
||||||
@@ -369,33 +360,33 @@
|
|||||||
<string name="error_lossless_copy_failed">無法複製選取的檔案</string>
|
<string name="error_lossless_copy_failed">無法複製選取的檔案</string>
|
||||||
<string name="error_lossless_unreadable">無法讀取選取的檔案</string>
|
<string name="error_lossless_unreadable">無法讀取選取的檔案</string>
|
||||||
<string name="error_lossless_not_pe">選取的檔案並不是 Windows 程式庫。請在 Lossless Scaling 的安裝位置(資料夾)中選擇 Lossless.dll</string>
|
<string name="error_lossless_not_pe">選取的檔案並不是 Windows 程式庫。請在 Lossless Scaling 的安裝位置(資料夾)中選擇 Lossless.dll</string>
|
||||||
<string name="error_lossless_missing_shaders">這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後重試</string>
|
<string name="error_lossless_missing_shaders">這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後再試一次</string>
|
||||||
<string name="error_lossless_translation_failed">無法轉譯影格生成著色器,尚不支援此 Lossless Scaling 版本</string>
|
<string name="error_lossless_translation_failed">無法轉譯影格生成著色器。尚不支援此 Lossless Scaling 版本</string>
|
||||||
<string name="error_lossless_cache_failed">轉譯的著色器無法寫入到儲存空間,請確認手機容量是否充足</string>
|
<string name="error_lossless_cache_failed">轉譯的著色器無法寫入到儲存空間。請確認手機容量是否充足</string>
|
||||||
<string name="advanced_settings">進階設定</string>
|
<string name="advanced_settings">進階設定</string>
|
||||||
<string name="settings_description">調整模擬器設定</string>
|
<string name="settings_description">調整模擬器設定</string>
|
||||||
<string name="search_recently_played">最近遊玩</string>
|
<string name="search_recently_played">最近遊玩</string>
|
||||||
<string name="search_recently_added">最近新增</string>
|
<string name="search_recently_added">最近新增</string>
|
||||||
<string name="open_user_folder">開啟 Eden 資料夾</string>
|
<string name="open_user_folder">開啟 Eden 資料夾</string>
|
||||||
<string name="open_user_folder_description">管理 Eden 的內部檔案</string>
|
<string name="open_user_folder_description">管理 Eden 的內部檔案</string>
|
||||||
<string name="app_settings_description">自訂 Eden 的主題與介面</string>
|
<string name="app_settings_description">自訂Eden的主題與介面</string>
|
||||||
<string name="no_file_manager">找不到檔案管理員</string>
|
<string name="no_file_manager">找不到檔案管理員</string>
|
||||||
<string name="notification_no_directory_link">無法開啟 Eden 目錄</string>
|
<string name="notification_no_directory_link">無法開啟 Eden 目錄</string>
|
||||||
<string name="notification_no_directory_link_description">請使用檔案管理員的側邊面板手動定位到使用者資料夾</string>
|
<string name="notification_no_directory_link_description">請使用檔案管理員的側邊面板手動定位到使用者資料夾</string>
|
||||||
<string name="manage_save_data">管理儲存資料</string>
|
<string name="manage_save_data">管理儲存資料</string>
|
||||||
<string name="manage_save_data_description">匯入/匯出遊戲的儲存資料\n壓縮檔必須為.zip格式\n壓縮檔中首個子資料夾名稱必須為遊戲ID</string>
|
<string name="manage_save_data_description">導入/導出遊戲的儲存資料\n壓縮檔必須為.zip格式\n壓縮檔中首個子資料夾名稱必須為遊戲 ID</string>
|
||||||
<string name="import_save_warning">匯入儲存資料</string>
|
<string name="import_save_warning">導入儲存資料</string>
|
||||||
<string name="import_save_warning_description">這將會以提供的檔案覆蓋現有的該遊戲儲存資料,您確定要繼續嗎?</string>
|
<string name="import_save_warning_description">這將會以提供的檔案覆寫現有的該遊戲儲存資料,您確定要繼續嗎?</string>
|
||||||
<string name="save_files_importing">正在匯入儲存資料…</string>
|
<string name="save_files_importing">正在導入儲存資料…</string>
|
||||||
<string name="save_files_exporting">正在匯出儲存資料…</string>
|
<string name="save_files_exporting">正在導出儲存資料…</string>
|
||||||
<string name="save_file_imported_success">已成功匯入</string>
|
<string name="save_file_imported_success">已成功導入</string>
|
||||||
<string name="save_file_invalid_zip_structure">無效的儲存目錄結構</string>
|
<string name="save_file_invalid_zip_structure">無效的儲存目錄結構</string>
|
||||||
<string name="save_file_invalid_zip_structure_description">首個子資料夾名稱必須為遊戲 ID</string>
|
<string name="save_file_invalid_zip_structure_description">首個子資料夾名稱必須為遊戲 ID</string>
|
||||||
<string name="install_firmware">安裝韌體</string>
|
<string name="install_firmware">安裝韌體</string>
|
||||||
<string name="install_firmware_description">韌體必須為 ZIP 壓縮檔,將會用於部分遊戲的啟動</string>
|
<string name="install_firmware_description">韌體必須為 ZIP 壓縮檔,將會用於部分遊戲的啟動</string>
|
||||||
<string name="firmware_installing">正在安裝韌體</string>
|
<string name="firmware_installing">正在安裝韌體</string>
|
||||||
<string name="firmware_installed_failure">韌體安裝失敗</string>
|
<string name="firmware_installed_failure">韌體安裝失敗</string>
|
||||||
<string name="firmware_installed_failure_description">請確保韌體 nca 檔案位於 zip 壓縮檔的根目錄後再試一次</string>
|
<string name="firmware_installed_failure_description">請確保韌體 nca 檔案位於 zip 壓縮檔的根目錄,然後再試一次。</string>
|
||||||
<string name="firmware_uninstalled_failure">韌體解除安裝失敗</string>
|
<string name="firmware_uninstalled_failure">韌體解除安裝失敗</string>
|
||||||
<string name="share_log">分享偵錯記錄</string>
|
<string name="share_log">分享偵錯記錄</string>
|
||||||
<string name="share_log_description">分享 Eden 的記錄檔以便對相關問題進行偵錯</string>
|
<string name="share_log_description">分享 Eden 的記錄檔以便對相關問題進行偵錯</string>
|
||||||
@@ -415,7 +406,7 @@
|
|||||||
<string name="install_game_content_success_overwrite">%1$d 覆寫成功</string>
|
<string name="install_game_content_success_overwrite">%1$d 覆寫成功</string>
|
||||||
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
|
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
|
||||||
<string name="custom_driver_not_supported">您的裝置不支援自訂驅動程式</string>
|
<string name="custom_driver_not_supported">您的裝置不支援自訂驅動程式</string>
|
||||||
<string name="custom_driver_not_supported_description">此裝置不支援注入自訂驅動程式\n請以後再來查看是否已新增支援!</string>
|
<string name="custom_driver_not_supported_description">此裝置不支援注入自訂驅動程式。\n請以後再來查看是否已新增支援!</string>
|
||||||
<string name="manage_yuzu_data">管理 Eden 資料</string>
|
<string name="manage_yuzu_data">管理 Eden 資料</string>
|
||||||
<string name="manage_yuzu_data_description">安裝韌體、金鑰,導入/導出使用者資料及安裝其它項目!</string>
|
<string name="manage_yuzu_data_description">安裝韌體、金鑰,導入/導出使用者資料及安裝其它項目!</string>
|
||||||
<string name="game_folders">遊戲資料夾</string>
|
<string name="game_folders">遊戲資料夾</string>
|
||||||
@@ -446,12 +437,12 @@
|
|||||||
<string name="keys_failed">金鑰安裝失敗</string>
|
<string name="keys_failed">金鑰安裝失敗</string>
|
||||||
<string name="keys_install_success">金鑰安裝成功</string>
|
<string name="keys_install_success">金鑰安裝成功</string>
|
||||||
<string name="error_keys_copy_failed">一個或多個金鑰安裝失敗</string>
|
<string name="error_keys_copy_failed">一個或多個金鑰安裝失敗</string>
|
||||||
<string name="error_keys_invalid_filename">請確保金鑰檔案具有 .keys 副檔名後重試</string>
|
<string name="error_keys_invalid_filename">請確保金鑰檔案具有.keys副檔名後重試。</string>
|
||||||
<string name="error_keys_failed_init">金鑰初始化失敗,請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰</string>
|
<string name="error_keys_failed_init">金鑰初始化失敗。請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰。</string>
|
||||||
|
|
||||||
<!-- Applet launcher strings -->
|
<!-- Applet launcher strings -->
|
||||||
<string name="qlaunch_applet">Qlaunch</string>
|
<string name="qlaunch_applet">Qlaunch</string>
|
||||||
<string name="qlaunch_description">從 Switch 系統主畫面啟動應用程式(目前僅支援英文)</string>
|
<string name="qlaunch_description">從Switch系統主畫面啟動應用程式(目前僅支援英文)</string>
|
||||||
<string name="applets">小程式啟動器</string>
|
<string name="applets">小程式啟動器</string>
|
||||||
<string name="applets_description">使用已安裝的韌體啟動系統小程式</string>
|
<string name="applets_description">使用已安裝的韌體啟動系統小程式</string>
|
||||||
<string name="applets_error_firmware">未安裝韌體</string>
|
<string name="applets_error_firmware">未安裝韌體</string>
|
||||||
@@ -478,19 +469,19 @@
|
|||||||
<string name="licenses_description">這些專案使 Eden Android 版成為可能</string>
|
<string name="licenses_description">這些專案使 Eden Android 版成為可能</string>
|
||||||
<string name="build">組建版本</string>
|
<string name="build">組建版本</string>
|
||||||
<string name="user_data">使用者資料</string>
|
<string name="user_data">使用者資料</string>
|
||||||
<string name="user_data_description">匯入/匯出所有應用程式資料\n\n匯入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 匯入使用者資料可能會出現問題,建議手動匯入所有所需資料</string>
|
<string name="user_data_description">導入/導出所有應用程式資料。\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入使用者資料可能會出現問題,建議手動導入所有所需資料。</string>
|
||||||
<string name="exporting_user_data">正在匯出使用者資料…</string>
|
<string name="exporting_user_data">正在導出使用者資料…</string>
|
||||||
<string name="importing_user_data">正在匯入使用者資料…</string>
|
<string name="importing_user_data">正在導入使用者資料…</string>
|
||||||
<string name="invalid_yuzu_backup">無效的 Eden 備份</string>
|
<string name="invalid_yuzu_backup">無效的 Eden 備份</string>
|
||||||
<string name="user_data_export_success">使用者資料匯出成功</string>
|
<string name="user_data_export_success">使用者資料導出成功</string>
|
||||||
<string name="user_data_import_success">使用者資料匯入成功</string>
|
<string name="user_data_import_success">使用者資料導入成功</string>
|
||||||
<string name="user_data_export_cancelled">匯出已取消</string>
|
<string name="user_data_export_cancelled">導出已取消</string>
|
||||||
<string name="user_data_import_failed_description">請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案後重試</string>
|
<string name="user_data_import_failed_description">請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案,並再試一次</string>
|
||||||
<!-- General settings strings -->
|
<!-- General settings strings -->
|
||||||
<string name="frame_limit_enable">限制模擬速度</string>
|
<string name="frame_limit_enable">限制模擬速度</string>
|
||||||
<string name="frame_limit_enable_description">將模擬速度限制在標準速度的指定百分比</string>
|
<string name="frame_limit_enable_description">將模擬速度限制在標準速度的指定百分比</string>
|
||||||
<string name="frame_limit_slider">限制速度百分比</string>
|
<string name="frame_limit_slider">限制速度百分比</string>
|
||||||
<string name="frame_limit_slider_description">指定模擬速度的百分比,100% 為標準速度,更高或更低的值將會減少或增加速度限制</string>
|
<string name="frame_limit_slider_description">指定模擬速度的百分比。100% 為標準速度,更高或更低的值將會減少或增加速度限制</string>
|
||||||
<string name="turbo_speed_limit">加速模式</string>
|
<string name="turbo_speed_limit">加速模式</string>
|
||||||
<string name="turbo_speed_limit_description">當開啟加速模式時,模擬器將以此速度執行</string>
|
<string name="turbo_speed_limit_description">當開啟加速模式時,模擬器將以此速度執行</string>
|
||||||
<string name="slow_speed_limit">慢速模式</string>
|
<string name="slow_speed_limit">慢速模式</string>
|
||||||
@@ -517,19 +508,19 @@
|
|||||||
<!-- CPU -->
|
<!-- CPU -->
|
||||||
<string name="fast_cpu_time">CPU 時脈</string>
|
<string name="fast_cpu_time">CPU 時脈</string>
|
||||||
<string name="fast_cpu_time_description">提高模擬 CPU 回報的時脈,可以減少某些 FPS 限制。較弱的 CPU 可能會出現效能下降的情況,部分遊戲可能會出現異常</string>
|
<string name="fast_cpu_time_description">提高模擬 CPU 回報的時脈,可以減少某些 FPS 限制。較弱的 CPU 可能會出現效能下降的情況,部分遊戲可能會出現異常</string>
|
||||||
<string name="custom_cpu_ticks">自訂 CPU 時脈</string>
|
<string name="custom_cpu_ticks">自訂CPU時脈</string>
|
||||||
<string name="custom_cpu_ticks_description">自訂 CPU 時脈,更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為 77-21000</string>
|
<string name="custom_cpu_ticks_description">自訂CPU時脈。更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000。</string>
|
||||||
<string name="cpu_ticks">時脈</string>
|
<string name="cpu_ticks">時脈</string>
|
||||||
<string name="memory_layout">記憶體布局</string>
|
<string name="memory_layout">記憶體佈局</string>
|
||||||
<string name="memory_layout_description">(實驗性)更改模擬記憶體布局,此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在 RAM 為 8GB 或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的 CPU 後端改為 Dynarmic(JIT)</string>
|
<string name="memory_layout_description">(實驗性)更改模擬記憶體佈局。此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在 RAM 為 8GB 或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為 Dynarmic (JIT)</string>
|
||||||
|
|
||||||
<string name="generate">生成</string>
|
<string name="generate">生成</string>
|
||||||
|
|
||||||
<!-- Network settings strings -->
|
<!-- Network settings strings -->
|
||||||
<string name="web_token">網路令牌</string>
|
<string name="web_token">網路令牌</string>
|
||||||
<string name="web_token_description">用於建立公開大廳的網路令牌,由 48 個小寫字母 a-z 組成</string>
|
<string name="web_token_description">用於建立公開大廳的網路令牌。由48個小寫字母a-z組成</string>
|
||||||
<string name="web_username">網路使用者名稱</string>
|
<string name="web_username">網路使用者名稱</string>
|
||||||
<string name="web_username_description">多人遊戲房間中顯示的使用者名稱。必須為 4-20 個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
<string name="web_username_description">多人遊戲房間中顯示的使用者名稱。必須為4-20個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
||||||
<string name="network">網路</string>
|
<string name="network">網路</string>
|
||||||
|
|
||||||
<!-- Graphics settings strings -->
|
<!-- Graphics settings strings -->
|
||||||
@@ -544,64 +535,68 @@
|
|||||||
<string name="advanced">進階</string>
|
<string name="advanced">進階</string>
|
||||||
|
|
||||||
<string name="renderer_accuracy">GPU 模式</string>
|
<string name="renderer_accuracy">GPU 模式</string>
|
||||||
<string name="renderer_accuracy_description">設定 GPU 模擬的準確度,大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤</string>
|
<string name="renderer_accuracy_description">設定 GPU 模擬的準確度。大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤</string>
|
||||||
<string name="dma_accuracy">DMA 準確度</string>
|
<string name="dma_accuracy">DMA 準確度</string>
|
||||||
<string name="dma_accuracy_description">控制 DMA 準確度,將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設</string>
|
<string name="dma_accuracy_description">控制 DMA 準確度。將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設</string>
|
||||||
<string name="gpu_fence_behavior">GPU 同步柵欄模式</string>
|
<string name="gpu_fence_behavior">GPU 同步柵欄模式</string>
|
||||||
<string name="gpu_fence_behavior_description">控制 GPU 同步柵欄模式,即時是速度最快的選項,但可能會導致一些問題;使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤;準確則是在犧牲部分效能的情況下進一步提升相容性;嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題;預設則會依照 GPU 準確度設定</string>
|
<string name="gpu_fence_behavior_description">控制 GPU 同步柵欄模式。即時是速度最快的選項,但可能會導致一些問題。使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤。準確則是在犧牲部分效能的情況下進一步提升相容性。嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題。預設則會依照 GPU 準確度設定</string>
|
||||||
<string name="anisotropic_filtering">各向異性過濾</string>
|
<string name="anisotropic_filtering">各向異性過濾</string>
|
||||||
<string name="anisotropic_filtering_description">改善斜角檢視時的紋理品質</string>
|
<string name="anisotropic_filtering_description">改善斜角檢視時的紋理品質</string>
|
||||||
<string name="vram_usage_mode">VRAM 使用模式</string>
|
<string name="vram_usage_mode">VRAM使用模式</string>
|
||||||
<string name="vram_usage_mode_description">控制 GPU 記憶體的分配與釋放策略</string>
|
<string name="vram_usage_mode_description">控制GPU記憶體的分配與釋放策略</string>
|
||||||
<string name="accelerate_astc">ASTC 解碼方式</string>
|
<string name="accelerate_astc">ASTC解碼方式</string>
|
||||||
<string name="accelerate_astc_description">選擇 ASTC 壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或 CPU 非同步(無卡頓,可能導致問題)</string>
|
<string name="accelerate_astc_description">選擇ASTC壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或CPU非同步(無卡頓,可能導致問題)</string>
|
||||||
|
|
||||||
<string name="sync_memory_operations">同步記憶體操作</string>
|
<string name="sync_memory_operations">同步記憶體操作</string>
|
||||||
<string name="sync_memory_operations_description">確保計算和記憶體操作之間的資料一致性,此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。使用 Unreal Engine 4 的遊戲似乎受影響最大</string>
|
<string name="sync_memory_operations_description">確保計算和記憶體操作之間的資料一致性。 此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。 使用Unreal Engine 4的遊戲似乎受影響最大</string>
|
||||||
<string name="use_disk_shader_cache">磁碟著色器快取</string>
|
<string name="use_disk_shader_cache">磁碟著色器快取</string>
|
||||||
<string name="use_disk_shader_cache_description">將產生的著色器快取儲存至硬碟以減少中斷</string>
|
<string name="use_disk_shader_cache_description">將產生的著色器快取儲存至硬碟以減少中斷</string>
|
||||||
<string name="renderer_force_max_clock">強制使用最大時脈(僅限 Adreno)</string>
|
<string name="renderer_force_max_clock">強制使用最大時脈 (僅限Adreno)</string>
|
||||||
<string name="renderer_force_max_clock_description">強制GPU以可能的最大時脈運作(熱溫限制仍會被套用)</string>
|
<string name="renderer_force_max_clock_description">強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用)</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU 非同步模擬</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU 非同步模擬</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率</string>
|
||||||
|
<string name="renderer_async_presentation">非同步呈現</string>
|
||||||
|
<string name="renderer_async_presentation_description">此修改可以透過將渲染移至單獨的 CPU 執行緒來提升性能,但可能會導致圖形問題</string>
|
||||||
<string name="renderer_reactive_flushing">使用重新啟用排清</string>
|
<string name="renderer_reactive_flushing">使用重新啟用排清</string>
|
||||||
<string name="renderer_reactive_flushing_description">犧牲效能以改善部分遊戲的轉譯準確度</string>
|
<string name="renderer_reactive_flushing_description">犧牲效能,以改善部分遊戲的轉譯準確度</string>
|
||||||
<string name="enable_buffer_history">啟用緩衝區歷史</string>
|
<string name="enable_buffer_history">啟用緩衝區歷史</string>
|
||||||
<string name="enable_buffer_history_description">允許存取先前的緩衝區狀態,此選項可能會改善部分遊戲的渲染品質與效能穩定性</string>
|
<string name="enable_buffer_history_description">允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性</string>
|
||||||
|
<string name="enable_gpu_buffer_readback">啟用 GPU 緩衝區讀回</string>
|
||||||
|
<string name="enable_gpu_buffer_readback_description">透過在上傳之前先將 GPU 修改過的緩衝區資料讀回來保存資料,部分遊戲需要啟用此功能才能正常渲染遊戲特效。如果硬體無法負荷可能會導致錯誤</string>
|
||||||
<string name="use_optimized_vertex_buffers">最佳化頂點緩衝區</string>
|
<string name="use_optimized_vertex_buffers">最佳化頂點緩衝區</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">啟用最佳化的頂點緩衝區綁定,需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機(25.3 版或更低的版本)</string>
|
<string name="use_optimized_vertex_buffers_description">啟用最佳化的頂點緩衝區綁定。需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機 (25.3版和更低的版本)</string>
|
||||||
|
|
||||||
<string name="hacks">修改</string>
|
<string name="hacks">修改</string>
|
||||||
|
|
||||||
<string name="fast_gpu_time">GPU 時脈</string>
|
<string name="fast_gpu_time">GPU 時脈</string>
|
||||||
<string name="fast_gpu_time_description">讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離</string>
|
<string name="fast_gpu_time_description">讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離</string>
|
||||||
<string name="skip_cpu_inner_invalidation">跳過 CPU 內部失效處理</string>
|
<string name="skip_cpu_inner_invalidation">跳過CPU內部失效處理</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些 CPU 端快取的失效處理,減少 CPU 使用率並提高其性能。可能會導致某些遊戲出現故障或當機</string>
|
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機</string>
|
||||||
<string name="fix_bloom_effects">修正光暈特效</string>
|
<string name="fix_bloom_effects">修正光暈特效</string>
|
||||||
<string name="fix_bloom_effects_description">在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於 Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常</string>
|
<string name="fix_bloom_effects_description">在 薩爾達傳說:織夢島 和 薩爾達傳說:智慧的再現 中 減少光暈模糊的問題並移除 橫衝直撞:狂飆樂園重製版 中的光暈效果 (Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常</string>
|
||||||
<string name="emulate_bgr565">模擬 BGR565</string>
|
<string name="emulate_bgr565">模擬 BGR565</string>
|
||||||
<string name="emulate_bgr565_description">修正遊戲中出現的色彩反轉、圖形異常或陰影異常</string>
|
<string name="emulate_bgr565_description">修正遊戲中出現的顏色反轉、圖形異常或陰影異常</string>
|
||||||
<string name="rescale_hack">啟用舊版重新縮放處理</string>
|
<string name="rescale_hack">啟用舊版重新縮放處理</string>
|
||||||
<string name="rescale_hack_description">透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式</string>
|
<string name="rescale_hack_description">透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式</string>
|
||||||
<string name="renderer_asynchronous_shaders">使用非同步著色器</string>
|
<string name="renderer_asynchronous_shaders">使用非同步著色器</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">使用非同步編譯著色器,這可能會減少卡頓,但也可能導致圖形錯誤</string>
|
<string name="renderer_asynchronous_shaders_description">使用非同步編譯著色器。這可能會減少卡頓,但也可能導致圖形錯誤。</string>
|
||||||
<string name="gpu_unswizzle_settings">GPU Unswizzle 設定</string>
|
<string name="gpu_unswizzle_settings">GPU Unswizzle 設定</string>
|
||||||
<string name="gpu_unswizzle_settings_description">設定基於 GPU 的 Unswizzling 參數或完全停用此功能,調整此設定以在性能與紋理載入品質中取得平衡</string>
|
<string name="gpu_unswizzle_settings_description">設定基於 GPU 的 Unswizzling 參數或完全停用此功能。調整此設定以在性能與紋理載入品質中取得平衡</string>
|
||||||
<string name="gpu_unswizzle_enable">啟用 GPU Unswizzle</string>
|
<string name="gpu_unswizzle_enable">啟用 GPU Unswizzle</string>
|
||||||
<string name="gpu_unswizzle_disabled">停用</string>
|
<string name="gpu_unswizzle_disabled">停用</string>
|
||||||
<string name="gpu_unswizzle_texture_size">GPU Unswizzle 最大紋理尺寸</string>
|
<string name="gpu_unswizzle_texture_size">GPU Unswizzle 最大紋理尺寸</string>
|
||||||
<string name="gpu_unswizzle_texture_size_description">設定 GPU 紋理 Unswizzling 的最大值(MB),雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。調整此設定以在 GPU 加速與 CPU 負載之間取得平衡</string>
|
<string name="gpu_unswizzle_texture_size_description">設定 GPU 紋理 Unswizzling 的最大值 (MB)。雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。整此設定以在 GPU 加速與 CPU 負載之間取得平衡</string>
|
||||||
<string name="gpu_unswizzle_stream_size">GPU Unswizzle Stream 大小</string>
|
<string name="gpu_unswizzle_stream_size">GPU Unswizzle 流大小</string>
|
||||||
<string name="gpu_unswizzle_stream_size_description">設定每個影格處理大型紋理 Unswizzling 的資料上限,數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現</string>
|
<string name="gpu_unswizzle_stream_size_description">設定每個影格處理大型紋理 Unswizzling 的資料上限。數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現</string>
|
||||||
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle Chunk 大小</string>
|
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle 塊大小</string>
|
||||||
<string name="gpu_unswizzle_chunk_size_description">設定 3D 紋理每批次處理的深度切片數量,增加此數值可提升規格較佳 GPU 的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時</string>
|
<string name="gpu_unswizzle_chunk_size_description">設定 3D 紋理每批次處理的深度切片數量。增加此數值可提升規格較佳 GPU 的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時</string>
|
||||||
<string name="gpu_unswizzle_default_button">預設</string>
|
<string name="gpu_unswizzle_default_button">預設</string>
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">擴充功能</string>
|
<string name="extensions">擴充功能</string>
|
||||||
|
|
||||||
<string name="dyna_state">擴展動態狀態</string>
|
<string name="dyna_state">擴展動態狀態</string>
|
||||||
<string name="dyna_state_description">控制擴展動態狀態中可使用的功能數量,較高的數值可根據驅動程式支援的動態狀態減少管線編譯的次數</string>
|
<string name="dyna_state_description">控制擴展動態狀態中可使用的功能數量。較高的數值可根據驅動程式支援的動態狀態減少管線編譯的次數。</string>
|
||||||
<string name="disabled">停用</string>
|
<string name="disabled">停用</string>
|
||||||
<string name="vertex_input_dynamic_state">頂點輸入動態狀態</string>
|
<string name="vertex_input_dynamic_state">頂點輸入動態狀態</string>
|
||||||
<string name="vertex_input_dynamic_state_description">啟用此功能可提供更彈性的頂點輸入處理方式,並可能減少頂點/緩衝區的管線編譯時間</string>
|
<string name="vertex_input_dynamic_state_description">啟用此功能可提供更彈性的頂點輸入處理方式,並可能減少頂點/緩衝區的管線編譯時間</string>
|
||||||
@@ -617,25 +612,25 @@
|
|||||||
<string name="picture_in_picture">子母畫面</string>
|
<string name="picture_in_picture">子母畫面</string>
|
||||||
<string name="picture_in_picture_description">位於背景時最小化視窗</string>
|
<string name="picture_in_picture_description">位於背景時最小化視窗</string>
|
||||||
|
|
||||||
<string name="warning_resolution">解析度縮放到 2 倍或更高可能會導致問題,並可能顯著降低設備速度</string>
|
<string name="warning_resolution">解析度縮放到2倍或更高可能會導致問題,並可能顯著降低設備速度</string>
|
||||||
|
|
||||||
<!-- Debug settings strings -->
|
<!-- Debug settings strings -->
|
||||||
<string name="cpu">CPU</string>
|
<string name="cpu">CPU</string>
|
||||||
<string name="clocks">時脈</string>
|
<string name="clocks">時脈</string>
|
||||||
<string name="use_auto_stub">使用自動存根</string>
|
<string name="use_auto_stub">使用自動存根</string>
|
||||||
<string name="use_auto_stub_description">自動補上缺少的服務和功能,可提高相容性但可能導致當機和穩定性問題</string>
|
<string name="use_auto_stub_description">自動補上缺少的服務和功能。可提高相容性但可能導致當機和穩定性問題。</string>
|
||||||
|
|
||||||
<string name="gpu">GPU</string>
|
<string name="gpu">GPU</string>
|
||||||
<string name="renderer_api">API</string>
|
<string name="renderer_api">API</string>
|
||||||
<string name="renderer_debug">圖形偵錯</string>
|
<string name="renderer_debug">圖形偵錯</string>
|
||||||
<string name="renderer_debug_description">將圖形 API 設為慢速偵錯模式</string>
|
<string name="renderer_debug_description">將圖形 API 設為慢速偵錯模式</string>
|
||||||
<string name="patch_old_qcom_drivers">BCn 區塊壓縮紋理修補</string>
|
<string name="patch_old_qcom_drivers">BCn 區塊壓縮紋理修補</string>
|
||||||
<string name="patch_old_qcom_drivers_description">覆寫 Adreno GPU 的 BCn 紋理格式自動偵測。通常會根據 Android 版本自動偵測(會在 API 28 以上的裝置自動啟用)</string>
|
<string name="patch_old_qcom_drivers_description">覆寫 Adreno GPU 的 BCn 紋理格式自動偵測。通常會根據 Android 版本自動偵測(會在API 28 以上自動啟用)</string>
|
||||||
<string name="fastmem">Fastmem</string>
|
<string name="fastmem">Fastmem</string>
|
||||||
|
|
||||||
<string name="log">日誌</string>
|
<string name="log">日誌</string>
|
||||||
<string name="flush_by_line">按行寫入偵錯日誌</string>
|
<string name="flush_by_line">按行寫入偵錯日誌</string>
|
||||||
<string name="flush_by_line_description">寫入一行日誌就立刻更新偵錯記錄,讓程式在當機或畫面凍結時更容易偵錯</string>
|
<string name="flush_by_line_description">在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。</string>
|
||||||
<string name="extended_logging">啟用更詳細的日誌記錄</string>
|
<string name="extended_logging">啟用更詳細的日誌記錄</string>
|
||||||
<string name="extended_logging_description">將日誌檔的最大檔案限制從 100MB 提高到 1GB</string>
|
<string name="extended_logging_description">將日誌檔的最大檔案限制從 100MB 提高到 1GB</string>
|
||||||
<string name="log_filter">日誌過濾器</string>
|
<string name="log_filter">日誌過濾器</string>
|
||||||
@@ -644,21 +639,21 @@
|
|||||||
<!-- GPU Logging strings -->
|
<!-- GPU Logging strings -->
|
||||||
<string name="gpu_logging_header">GPU 日誌</string>
|
<string name="gpu_logging_header">GPU 日誌</string>
|
||||||
<string name="gpu_log_level">記錄層級</string>
|
<string name="gpu_log_level">記錄層級</string>
|
||||||
<string name="gpu_log_level_description">GPU 日誌的詳細層級(越高日誌越詳細,不過會更容易過熱)</string>
|
<string name="gpu_log_level_description">GPU 日誌的詳細層級 (越高日誌越詳細,不過會更容易過熱)</string>
|
||||||
<string name="gpu_log_vulkan_calls">記錄 Vulkan API 呼叫</string>
|
<string name="gpu_log_vulkan_calls">記錄 Vulkan API 呼叫</string>
|
||||||
<string name="gpu_log_vulkan_calls_description">在環形緩衝區中記錄所有 Vulkan API 呼叫</string>
|
<string name="gpu_log_vulkan_calls_description">在環形緩衝區中記錄所有 Vulkan API 呼叫</string>
|
||||||
<string name="gpu_log_shader_dumps">傾印 SPIR-V 著色器</string>
|
<string name="gpu_log_shader_dumps">傾印 SPIR-V 著色器</string>
|
||||||
<string name="gpu_log_shader_dumps_description">將重新編譯後的 SPIR-V 二進位檔案(.spv)儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查</string>
|
<string name="gpu_log_shader_dumps_description">將重新編譯後的 SPIR-V 二進位檔案 (.spv) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查</string>
|
||||||
<string name="dump_guest_shaders">傾印客體(Maxwell)著色器</string>
|
<string name="dump_guest_shaders">傾印客體(Maxwell)著色器</string>
|
||||||
<string name="dump_guest_shaders_description">將 Maxwell 客體著色器位元組碼檔案(.ash)儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 nvdisasm 進行檢查</string>
|
<string name="dump_guest_shaders_description">將 Maxwell 客體著色器位元組碼檔案 (.ash) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 nvdisasm 進行檢查</string>
|
||||||
<string name="dump_macros">傾印 Maxwell 巨集</string>
|
<string name="dump_macros">傾印 Maxwell 巨集</string>
|
||||||
<string name="dump_macros_description">將 Maxwell 巨集程式檔案(.macro)儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 envydis 進行檢查</string>
|
<string name="dump_macros_description">將 Maxwell 巨集程式檔案 (.macro) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 envydis 進行檢查</string>
|
||||||
<string name="gpu_log_memory_tracking">追蹤 GPU 記憶體</string>
|
<string name="gpu_log_memory_tracking">追蹤 GPU 記憶體</string>
|
||||||
<string name="gpu_log_memory_tracking_description">監控 GPU 記憶體的分配和釋放</string>
|
<string name="gpu_log_memory_tracking_description">監控 GPU 記憶體的分配和釋放</string>
|
||||||
<string name="gpu_log_driver_debug">驅動程式偵錯資料</string>
|
<string name="gpu_log_driver_debug">驅動程式偵錯資料</string>
|
||||||
<string name="gpu_log_driver_debug_description">擷取驅動程式的特定偵錯資料(例如 Turnip breadcrumbs)</string>
|
<string name="gpu_log_driver_debug_description">擷取驅動程式的特定偵錯資料(例如 Turnip breadcrumbs)</string>
|
||||||
<string name="gpu_log_ring_buffer_size">環形緩衝區大小</string>
|
<string name="gpu_log_ring_buffer_size">環形緩衝區大小</string>
|
||||||
<string name="gpu_log_ring_buffer_size_description">追蹤的近期 Vulkan 呼叫數量(預設為 512)</string>
|
<string name="gpu_log_ring_buffer_size_description">追蹤的近期 Vulkan 呼叫數量(預設為 512 )</string>
|
||||||
<string name="gpu_log_ring_buffer_size_hint">64 至 4096 個項目</string>
|
<string name="gpu_log_ring_buffer_size_hint">64 至 4096 個項目</string>
|
||||||
|
|
||||||
<string name="general">一般</string>
|
<string name="general">一般</string>
|
||||||
@@ -688,7 +683,7 @@
|
|||||||
<string name="range">靈敏度</string>
|
<string name="range">靈敏度</string>
|
||||||
<string name="deadzone">無感帶</string>
|
<string name="deadzone">無感帶</string>
|
||||||
<string name="modifier">用按鈕、按鍵來模擬搖桿</string>
|
<string name="modifier">用按鈕、按鍵來模擬搖桿</string>
|
||||||
<string name="modifier_range">修改按鈕模擬左/右搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為 50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑;模擬右搖桿時所使用的值則是會影響到轉視角的速度,數值越高代表使用的模擬值越大)</string>
|
<string name="modifier_range">修改按鈕模擬左/右搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑;模擬右搖桿時所使用的值則是會影響到轉視角的速度,數值越高代表使用的模擬值越大)</string>
|
||||||
<string name="triggers">肩部按鍵</string>
|
<string name="triggers">肩部按鍵</string>
|
||||||
<string name="button_sl_left">左 SL</string>
|
<string name="button_sl_left">左 SL</string>
|
||||||
<string name="button_sr_left">左 SR</string>
|
<string name="button_sr_left">左 SR</string>
|
||||||
@@ -738,7 +733,7 @@
|
|||||||
<string name="button_map_description">按下一個按鈕或肩部按鍵/移動搖桿</string>
|
<string name="button_map_description">按下一個按鈕或肩部按鍵/移動搖桿</string>
|
||||||
<string name="map_dpad_direction">將方向鍵配對到 %1$s</string>
|
<string name="map_dpad_direction">將方向鍵配對到 %1$s</string>
|
||||||
<string name="map_control">配對到 %1$s</string>
|
<string name="map_control">配對到 %1$s</string>
|
||||||
<string name="failed_to_load_profile">匯入設定檔失敗</string>
|
<string name="failed_to_load_profile">導入設定檔失敗</string>
|
||||||
<string name="failed_to_save_profile">儲存設定檔失敗</string>
|
<string name="failed_to_save_profile">儲存設定檔失敗</string>
|
||||||
<string name="reset_mapping">重設控制器配對</string>
|
<string name="reset_mapping">重設控制器配對</string>
|
||||||
<string name="reset_mapping_description">您確定要將此控制器的所有配對重設為預設值?此動作無法復原</string>
|
<string name="reset_mapping_description">您確定要將此控制器的所有配對重設為預設值?此動作無法復原</string>
|
||||||
@@ -759,21 +754,21 @@
|
|||||||
<string name="auto">自動</string>
|
<string name="auto">自動</string>
|
||||||
<string name="submit">提交</string>
|
<string name="submit">提交</string>
|
||||||
<string name="string_null">無</string>
|
<string name="string_null">無</string>
|
||||||
<string name="string_import">匯入</string>
|
<string name="string_import">導入</string>
|
||||||
<string name="export">匯出</string>
|
<string name="export">導出</string>
|
||||||
<string name="export_failed">匯出失敗</string>
|
<string name="export_failed">導出失敗</string>
|
||||||
<string name="import_failed">匯入失敗</string>
|
<string name="import_failed">導入失敗</string>
|
||||||
<string name="cancelling">正在取消</string>
|
<string name="cancelling">正在取消</string>
|
||||||
<string name="install">安裝</string>
|
<string name="install">安裝</string>
|
||||||
<string name="fetch">下載</string>
|
<string name="fetch">下載</string>
|
||||||
<string name="delete">刪除</string>
|
<string name="delete">刪除</string>
|
||||||
<string name="edit">編輯</string>
|
<string name="edit">編輯</string>
|
||||||
<string name="import_success">已成功匯入</string>
|
<string name="import_success">已成功導入</string>
|
||||||
<string name="export_success">已成功匯出</string>
|
<string name="export_success">已成功導出</string>
|
||||||
<string name="start">開始</string>
|
<string name="start">開始</string>
|
||||||
<string name="global">全域設定</string>
|
<string name="global">全域設定</string>
|
||||||
<string name="custom">個別遊戲設定</string>
|
<string name="custom">個別遊戲設定</string>
|
||||||
<string name="import_complete">匯入完成</string>
|
<string name="import_complete">導入完成</string>
|
||||||
<string name="use_global_setting">使用全域設定</string>
|
<string name="use_global_setting">使用全域設定</string>
|
||||||
<string name="operation_completed_successfully">操作已成功完成</string>
|
<string name="operation_completed_successfully">操作已成功完成</string>
|
||||||
<string name="confirm">確認</string>
|
<string name="confirm">確認</string>
|
||||||
@@ -804,9 +799,9 @@
|
|||||||
<string name="installing">安裝中…</string>
|
<string name="installing">安裝中…</string>
|
||||||
<string name="latest">最新</string>
|
<string name="latest">最新</string>
|
||||||
<string name="recommended_driver">推薦驅動程式:</string>
|
<string name="recommended_driver">推薦驅動程式:</string>
|
||||||
<string name="gpu_model">GPU 型號</string>
|
<string name="gpu_model">GPU型號</string>
|
||||||
<string name="unsupported_gpu">不支援的 GPU</string>
|
<string name="unsupported_gpu">不支援的GPU</string>
|
||||||
<string name="unsupported_gpu_warning">您的 GPU 不支援驅動程式注入,不建議嘗試設定自訂驅動程式</string>
|
<string name="unsupported_gpu_warning">您的GPU不支援驅動程式注入。不建議嘗試設定自訂驅動程式。</string>
|
||||||
|
|
||||||
<!-- Preferences Screen -->
|
<!-- Preferences Screen -->
|
||||||
<string name="preferences_settings">設定</string>
|
<string name="preferences_settings">設定</string>
|
||||||
@@ -836,13 +831,13 @@
|
|||||||
<string name="save_migration_complete">成功遷移儲存資料</string>
|
<string name="save_migration_complete">成功遷移儲存資料</string>
|
||||||
<string name="save_migration_failed">儲存資料遷移失敗</string>
|
<string name="save_migration_failed">儲存資料遷移失敗</string>
|
||||||
<string name="save_directory_set">存檔目錄設定完成</string>
|
<string name="save_directory_set">存檔目錄設定完成</string>
|
||||||
<string name="destination_has_saves">所選取的位置已有儲存資料,是否要取代該檔案?</string>
|
<string name="destination_has_saves">所選取的位置已有儲存資料。是否要取代該檔案?</string>
|
||||||
<string name="all_files_permission_required">若要自訂路徑必須授予所有檔案的存取權</string>
|
<string name="all_files_permission_required">若要自訂路徑必須授予所有檔案的存取權</string>
|
||||||
<string name="grant_permission">授予權限</string>
|
<string name="grant_permission">授予權限</string>
|
||||||
<string name="custom_nand_directory">NAND 路徑</string>
|
<string name="custom_nand_directory">NAND 路徑</string>
|
||||||
<string name="custom_nand_directory_description">設定 NAND 資料的自訂路徑</string>
|
<string name="custom_nand_directory_description">設定 NAND 資料的自訂路徑</string>
|
||||||
<string name="custom_sdmc_directory">虛擬SD卡路徑</string>
|
<string name="custom_sdmc_directory">虛擬 SD卡 路徑</string>
|
||||||
<string name="custom_sdmc_directory_description">設定虛擬SD卡儲存空間的自訂路徑</string>
|
<string name="custom_sdmc_directory_description">設定虛擬 SD卡 儲存空間的自訂路徑</string>
|
||||||
<string name="path_set">路徑設定成功</string>
|
<string name="path_set">路徑設定成功</string>
|
||||||
<string name="skip_migration">跳過</string>
|
<string name="skip_migration">跳過</string>
|
||||||
|
|
||||||
@@ -861,7 +856,7 @@
|
|||||||
<string name="add_ons_description">切換模組、更新及 DLC</string>
|
<string name="add_ons_description">切換模組、更新及 DLC</string>
|
||||||
<string name="playtime">遊玩時間:</string>
|
<string name="playtime">遊玩時間:</string>
|
||||||
<string name="reset_playtime">重設遊玩時間</string>
|
<string name="reset_playtime">重設遊玩時間</string>
|
||||||
<string name="reset_playtime_description">將此遊戲的遊玩時間重設為 0</string>
|
<string name="reset_playtime_description">將此遊戲的遊玩時間重設為0</string>
|
||||||
<string name="reset_playtime_warning_description">您確定要重設此遊戲的遊玩時間嗎?</string>
|
<string name="reset_playtime_warning_description">您確定要重設此遊戲的遊玩時間嗎?</string>
|
||||||
<string name="playtime_reset_successfully">遊玩時間已重設</string>
|
<string name="playtime_reset_successfully">遊玩時間已重設</string>
|
||||||
<string name="edit_playtime">修改遊玩時間</string>
|
<string name="edit_playtime">修改遊玩時間</string>
|
||||||
@@ -870,16 +865,16 @@
|
|||||||
<string name="hours_abbr">小時</string>
|
<string name="hours_abbr">小時</string>
|
||||||
<string name="minutes_abbr">分鐘</string>
|
<string name="minutes_abbr">分鐘</string>
|
||||||
<string name="seconds_abbr">秒</string>
|
<string name="seconds_abbr">秒</string>
|
||||||
<string name="hours_must_be_between_0_and_9999">必須介於 0 到 9999 小時之間</string>
|
<string name="hours_must_be_between_0_and_9999">必須介於0到9999小時之間</string>
|
||||||
<string name="minutes_must_be_between_0_and_59">必須介於 0 到 59 分鐘之間</string>
|
<string name="minutes_must_be_between_0_and_59">必須介於0到59分鐘之間</string>
|
||||||
<string name="seconds_must_be_between_0_and_59">必須介於 0 到 59 秒之間</string>
|
<string name="seconds_must_be_between_0_and_59">必須介於0到59秒之間</string>
|
||||||
<string name="playtime_updated_successfully">成功修改遊玩時間</string>
|
<string name="playtime_updated_successfully">成功更新遊玩時間</string>
|
||||||
<string name="clear_shader_cache">清除著色器快取</string>
|
<string name="clear_shader_cache">清除著色器快取</string>
|
||||||
<string name="clear_shader_cache_description">清除此遊戲所有已編譯的著色器快取</string>
|
<string name="clear_shader_cache_description">清除此遊戲所有已編譯的著色器快取</string>
|
||||||
<string name="clear_shader_cache_warning_description">重新編譯著色器快取的過程中可能會導致遊戲有些微卡頓</string>
|
<string name="clear_shader_cache_warning_description">重新編譯著色器快取的過程中可能會導致遊戲有些微卡頓</string>
|
||||||
<string name="cleared_shaders_successfully">著色器快取已成功清除</string>
|
<string name="cleared_shaders_successfully">著色器快取已成功清除</string>
|
||||||
<string name="driver_shader_wipe_dialog_title">已刪除著色器快取</string>
|
<string name="driver_shader_wipe_dialog_title">已刪除著色器快取</string>
|
||||||
<string name="driver_shader_wipe_dialog_message">為了維持Vulkan管線驗證,Eden 已自動清除所有著色器快取,若要預防閃退和圖形錯誤,這是必須的動作。因為著色器需要重新編譯,您在遊戲過程中可能會遇到些微卡頓的情況</string>
|
<string name="driver_shader_wipe_dialog_message">為了維持Vulkan管線驗證,Eden已自動清除所有著色器快取。為了預防閃退和圖形錯誤,這是必須的動作。因為著色器需要重新編譯,您在遊戲過程中可能會遇到些微卡頓的情況</string>
|
||||||
<string name="addons_game">附加元件:%1$s</string>
|
<string name="addons_game">附加元件:%1$s</string>
|
||||||
<string name="save_data">儲存資料</string>
|
<string name="save_data">儲存資料</string>
|
||||||
<string name="save_data_description">管理此遊戲的儲存資料</string>
|
<string name="save_data_description">管理此遊戲的儲存資料</string>
|
||||||
@@ -911,8 +906,8 @@
|
|||||||
<string name="verify_no_result_description">未完成文件完整性檢查</string>
|
<string name="verify_no_result_description">未完成文件完整性檢查</string>
|
||||||
<string name="verification_failed_for">以下文件的完整性驗證失敗:\n %1$s</string>
|
<string name="verification_failed_for">以下文件的完整性驗證失敗:\n %1$s</string>
|
||||||
<string name="share_game_settings">分享設定</string>
|
<string name="share_game_settings">分享設定</string>
|
||||||
<string name="import_config">匯入設定</string>
|
<string name="import_config">導入設定</string>
|
||||||
<string name="export_config">匯出設定</string>
|
<string name="export_config">導出設定</string>
|
||||||
<string name="share_config_failed">分享設定失敗</string>
|
<string name="share_config_failed">分享設定失敗</string>
|
||||||
|
|
||||||
<!-- ROM loading errors -->
|
<!-- ROM loading errors -->
|
||||||
@@ -928,12 +923,12 @@
|
|||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">正在搜尋遊戲...</string>
|
<string name="searching_for_game">正在搜尋遊戲...</string>
|
||||||
<string name="game_not_found_for_title_id">找不到標題 ID 的遊戲: %1$s</string>
|
<string name="game_not_found_for_title_id">找不到標題ID的遊戲: %1$s</string>
|
||||||
<string name="custom_settings_failed_title">自訂設定失敗</string>
|
<string name="custom_settings_failed_title">自訂設定失敗</string>
|
||||||
<string name="custom_settings_failed_message">無法套用自訂設定 %1$s: %2$s</string>
|
<string name="custom_settings_failed_message">無法套用自訂設定 %1$s: %2$s</string>
|
||||||
<string name="launch_with_default_settings">使用預設設定啟動</string>
|
<string name="launch_with_default_settings">使用預設設定啟動</string>
|
||||||
<string name="launch_cancelled">啟動已取消</string>
|
<string name="launch_cancelled">啟動已取消</string>
|
||||||
<string name="custom_settings_failure_reasons">無法套用請求的設定,這可能是由於缺少 GPU 驅動程式或設定問題</string>
|
<string name="custom_settings_failure_reasons">無法套用請求的設定。這可能是由於缺少GPU驅動程式或設定問題。</string>
|
||||||
<string name="custom_settings_applied">已套用自訂設定</string>
|
<string name="custom_settings_applied">已套用自訂設定</string>
|
||||||
<string name="launching_game">正在啟動 %1$s...</string>
|
<string name="launching_game">正在啟動 %1$s...</string>
|
||||||
<string name="failed_to_initialize_game">無法初始化遊戲</string>
|
<string name="failed_to_initialize_game">無法初始化遊戲</string>
|
||||||
@@ -954,10 +949,10 @@
|
|||||||
<!-- Driver strings -->
|
<!-- Driver strings -->
|
||||||
<string name="driver_not_found">未安裝所需的驅動程式: %s</string>
|
<string name="driver_not_found">未安裝所需的驅動程式: %s</string>
|
||||||
<string name="invalid_driver_file">無效的驅動程式檔案: %s</string>
|
<string name="invalid_driver_file">無效的驅動程式檔案: %s</string>
|
||||||
<string name="network_unavailable">無可用網路連線,請檢查您的網路連線並重試</string>
|
<string name="network_unavailable">無可用網路連線。請檢查您的網路連線並重試</string>
|
||||||
<string name="driver_missing_title">需要 GPU 驅動程式</string>
|
<string name="driver_missing_title">需要GPU驅動程式</string>
|
||||||
<string name="driver_missing_message">這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎?</string>
|
<string name="driver_missing_message">這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎?</string>
|
||||||
<string name="driver_download_cancelled">驅動程式下載已取消,沒有所需的驅動程式無法啟動遊戲</string>
|
<string name="driver_download_cancelled">驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。</string>
|
||||||
<string name="download">下載</string>
|
<string name="download">下載</string>
|
||||||
|
|
||||||
<!-- Emulation Menu -->
|
<!-- Emulation Menu -->
|
||||||
@@ -979,7 +974,7 @@
|
|||||||
<string name="emulation_pause">暫停模擬</string>
|
<string name="emulation_pause">暫停模擬</string>
|
||||||
<string name="emulation_unpause">繼續模擬</string>
|
<string name="emulation_unpause">繼續模擬</string>
|
||||||
<string name="emulation_input_overlay">疊加層/虛擬按鍵設定</string>
|
<string name="emulation_input_overlay">疊加層/虛擬按鍵設定</string>
|
||||||
<string name="load_amiibo">導入 Amiibo</string>
|
<string name="load_amiibo">導入Amiibo</string>
|
||||||
<string name="touchscreen">觸控螢幕</string>
|
<string name="touchscreen">觸控螢幕</string>
|
||||||
<string name="lock_drawer">鎖定側邊選單</string>
|
<string name="lock_drawer">鎖定側邊選單</string>
|
||||||
<string name="unlock_drawer">解鎖側邊選單</string>
|
<string name="unlock_drawer">解鎖側邊選單</string>
|
||||||
@@ -987,12 +982,12 @@
|
|||||||
|
|
||||||
<!-- Amiibo -->
|
<!-- Amiibo -->
|
||||||
<string name="amiibo_title">Amiibo</string>
|
<string name="amiibo_title">Amiibo</string>
|
||||||
<string name="amiibo_removed_message">該 amiibo 已被移除</string>
|
<string name="amiibo_removed_message">該amiibo已被移除</string>
|
||||||
<string name="amiibo_wrong_state">此遊戲目前沒有在尋找 amiibo</string>
|
<string name="amiibo_wrong_state">此遊戲目前沒有在尋找amiibo</string>
|
||||||
<string name="amiibo_not_valid">您所選擇的並不是正確的 amiibo 金鑰檔</string>
|
<string name="amiibo_not_valid">您所選擇的並不是正確的amiibo金鑰檔</string>
|
||||||
<string name="amiibo_in_use">選擇的檔案已在使用中</string>
|
<string name="amiibo_in_use">選擇的檔案已在使用中</string>
|
||||||
<string name="amiibo_unknown_error">發生未知的錯誤</string>
|
<string name="amiibo_unknown_error">發生未知的錯誤</string>
|
||||||
<string name="amiibo_load_success">Amiibo 已匯入</string>
|
<string name="amiibo_load_success">已導入Amiibo</string>
|
||||||
|
|
||||||
|
|
||||||
<!-- Software keyboard -->
|
<!-- Software keyboard -->
|
||||||
@@ -1021,44 +1016,13 @@
|
|||||||
<string name="region_taiwan">臺灣</string>
|
<string name="region_taiwan">臺灣</string>
|
||||||
|
|
||||||
<!-- Memory Layouts -->
|
<!-- Memory Layouts -->
|
||||||
<string name="memory_4gb">4GB(推薦)</string>
|
<string name="memory_4gb">4GB (推薦)</string>
|
||||||
<string name="memory_6gb">6GB(不穩定)</string>
|
<string name="memory_6gb">6GB (不穩定)</string>
|
||||||
<string name="memory_8gb">8GB(不穩定)</string>
|
<string name="memory_8gb">8GB (不穩定)</string>
|
||||||
|
|
||||||
<!-- CPU clock levels -->
|
|
||||||
<string name="clock_normal">正常</string>
|
|
||||||
<string name="clock_boost">加速</string>
|
|
||||||
<string name="clock_fast">超頻</string>
|
|
||||||
|
|
||||||
<!-- GPU clock levels -->
|
|
||||||
<string name="fast_gpu_normal">正常</string>
|
|
||||||
<string name="fast_gpu_medium">加速</string>
|
|
||||||
<string name="fast_gpu_high">超頻</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">極小 (16MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">小(32MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">正常(128MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">大(256MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">極大(512MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
|
||||||
<string name="gpu_swizzle_verylow">極小(4MB)</string>
|
|
||||||
<string name="gpu_swizzle_low">小(8MB)</string>
|
|
||||||
<string name="gpu_swizzle_normal">正常(16MB)</string>
|
|
||||||
<string name="gpu_swizzle_medium">中(32MB)</string>
|
|
||||||
<string name="gpu_swizzle_high">大(64MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
|
||||||
<string name="gpu_swizzlechunk_verylow">極小(32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">小(64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">正常(128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">中(256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">大(512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">攝氏</string>
|
<string name="temperature_celsius">攝氏度</string>
|
||||||
<string name="temperature_fahrenheit">華氏</string>
|
<string name="temperature_fahrenheit">華氏度</string>
|
||||||
|
|
||||||
<!-- Memory Sizes -->
|
<!-- Memory Sizes -->
|
||||||
<string name="memory_byte_shorthand">B</string>
|
<string name="memory_byte_shorthand">B</string>
|
||||||
@@ -1071,28 +1035,20 @@
|
|||||||
|
|
||||||
<string name="renderer_none">無</string>
|
<string name="renderer_none">無</string>
|
||||||
|
|
||||||
<!-- Renderer Accuracy -->
|
<string name="renderer_accuracy_high">準確</string>
|
||||||
<string name="renderer_accuracy_low">效能</string>
|
|
||||||
<string name="renderer_accuracy_high">品質</string>
|
|
||||||
|
|
||||||
<!-- DMA Accuracy -->
|
<!-- DMA Accuracy -->
|
||||||
<string name="dma_accuracy_default">預設</string>
|
<string name="dma_accuracy_default">預設</string>
|
||||||
<string name="dma_accuracy_unsafe">不穩定</string>
|
<string name="dma_accuracy_unsafe">不穩定</string>
|
||||||
<string name="dma_accuracy_safe">穩定</string>
|
<string name="dma_accuracy_safe">穩定</string>
|
||||||
|
|
||||||
<!-- GPU Fence Behavior -->
|
|
||||||
<string name="gpu_fence_behavior_default">預設</string>
|
|
||||||
<string name="gpu_fence_behavior_immediate">即時</string>
|
|
||||||
<string name="gpu_fence_behavior_balanced">平衡</string>
|
|
||||||
<string name="gpu_fence_behavior_accurate">準確</string>
|
|
||||||
|
|
||||||
<string name="vram_usage_conservative">保守</string>
|
<string name="vram_usage_conservative">保守</string>
|
||||||
<string name="vram_usage_aggressive">積極</string>
|
<string name="vram_usage_aggressive">積極</string>
|
||||||
|
|
||||||
<!-- Renderer VSync -->
|
<!-- Renderer VSync -->
|
||||||
<string name="renderer_vsync_immediate">即時(關閉)</string>
|
<string name="renderer_vsync_immediate">即時 (關閉)</string>
|
||||||
<string name="renderer_vsync_mailbox">Mailbox</string>
|
<string name="renderer_vsync_mailbox">Mailbox</string>
|
||||||
<string name="renderer_vsync_fifo">FIFO(開啟)</string>
|
<string name="renderer_vsync_fifo">FIFO (開啟)</string>
|
||||||
<string name="renderer_vsync_fifo_relaxed">FIFO 寬鬆</string>
|
<string name="renderer_vsync_fifo_relaxed">FIFO 寬鬆</string>
|
||||||
|
|
||||||
<!-- Anti-Aliasing -->
|
<!-- Anti-Aliasing -->
|
||||||
@@ -1114,18 +1070,6 @@
|
|||||||
<string name="cpu_accuracy_paranoid">不合理</string>
|
<string name="cpu_accuracy_paranoid">不合理</string>
|
||||||
<string name="cpu_accuracy_debugging">偵錯</string>
|
<string name="cpu_accuracy_debugging">偵錯</string>
|
||||||
|
|
||||||
<!-- Freedreno Settings -->
|
|
||||||
<string name="freedreno_settings_title">Freedreno 設定</string>
|
|
||||||
<string name="gpu_driver_settings">GPU 驅動程式設定</string>
|
|
||||||
<string name="freedreno_presets">預先提供的設定檔</string>
|
|
||||||
<string name="freedreno_current_settings">目前使用的設定</string>
|
|
||||||
<string name="freedreno_debug">進階設定</string>
|
|
||||||
<string name="freedreno_var_name">變數名稱 (例如: TU_DEBUG)</string>
|
|
||||||
<string name="freedreno_var_value">變數值</string>
|
|
||||||
<string name="freedreno_add_variable">新增變數</string>
|
|
||||||
<string name="freedreno_clear_all">全部清除</string>
|
|
||||||
<string name="freedreno_saved">Freedreno 設定已儲存</string>
|
|
||||||
<string name="freedreno_cleared_all">已清除所有 Freedreno 變數</string>
|
|
||||||
<!-- Gamepad Buttons -->
|
<!-- Gamepad Buttons -->
|
||||||
<string name="gamepad_d_pad">方向鍵</string>
|
<string name="gamepad_d_pad">方向鍵</string>
|
||||||
<string name="gamepad_left_stick">左搖桿</string>
|
<string name="gamepad_left_stick">左搖桿</string>
|
||||||
|
|||||||
@@ -558,6 +558,7 @@
|
|||||||
<item>@string/gpu_fence_behavior_immediate</item>
|
<item>@string/gpu_fence_behavior_immediate</item>
|
||||||
<item>@string/gpu_fence_behavior_balanced</item>
|
<item>@string/gpu_fence_behavior_balanced</item>
|
||||||
<item>@string/gpu_fence_behavior_accurate</item>
|
<item>@string/gpu_fence_behavior_accurate</item>
|
||||||
|
<item>@string/gpu_fence_behavior_strict</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<integer-array name="gpuFenceBehaviorValues">
|
<integer-array name="gpuFenceBehaviorValues">
|
||||||
<item>0</item>
|
<item>0</item>
|
||||||
|
|||||||
@@ -498,7 +498,7 @@
|
|||||||
<string name="user_data_import_failed_description">Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again.</string>
|
<string name="user_data_import_failed_description">Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again.</string>
|
||||||
<string name="discord_link" translatable="false">https://discord.gg/HstXbPch7X</string>
|
<string name="discord_link" translatable="false">https://discord.gg/HstXbPch7X</string>
|
||||||
<string name="stoat_link" translatable="false">https://stt.gg/qKgFEAbH</string>
|
<string name="stoat_link" translatable="false">https://stt.gg/qKgFEAbH</string>
|
||||||
<string name="x_link" translatable="false">https://x.com/edenemuofficial</string>
|
<string name="x_link" translatable="false">https://nitter.poast.org/edenemuofficial</string>
|
||||||
<string name="website_link" translatable="false">https://eden-emu.dev</string>
|
<string name="website_link" translatable="false">https://eden-emu.dev</string>
|
||||||
<string name="github_link" translatable="false">https://git.eden-emu.dev/eden-emu</string>
|
<string name="github_link" translatable="false">https://git.eden-emu.dev/eden-emu</string>
|
||||||
|
|
||||||
@@ -580,10 +580,14 @@
|
|||||||
<string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
|
<string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU async emulation</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU async emulation</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations.</string>
|
||||||
|
<string name="renderer_async_presentation">Asynchronous presentation</string>
|
||||||
|
<string name="renderer_async_presentation_description">This hack can increase performance by moving presentation to a separate CPU thread at the cost of graphical issues.</string>
|
||||||
<string name="renderer_reactive_flushing">Use reactive flushing</string>
|
<string name="renderer_reactive_flushing">Use reactive flushing</string>
|
||||||
<string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
|
<string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
|
||||||
<string name="enable_buffer_history">Enable buffer history</string>
|
<string name="enable_buffer_history">Enable buffer history</string>
|
||||||
<string name="enable_buffer_history_description">Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games.</string>
|
<string name="enable_buffer_history_description">Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games.</string>
|
||||||
|
<string name="enable_gpu_buffer_readback">Enable GPU Buffer Readback</string>
|
||||||
|
<string name="enable_gpu_buffer_readback_description">Preserves GPU-modified buffer data by reading it back before uploads. Some games require this to render certain effects properly. May cause issues if the hardware cannot handle the additional workload.</string>
|
||||||
<string name="use_optimized_vertex_buffers">Optimized Vertex Buffers</string>
|
<string name="use_optimized_vertex_buffers">Optimized Vertex Buffers</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers/ QCOM drivers. Will crash on older Turnip drivers (25.3 and below).</string>
|
<string name="use_optimized_vertex_buffers_description">Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers/ QCOM drivers. Will crash on older Turnip drivers (25.3 and below).</string>
|
||||||
|
|
||||||
@@ -594,7 +598,7 @@
|
|||||||
<string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
|
<string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
|
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
|
||||||
<string name="fix_bloom_effects">Fix Bloom Effects</string>
|
<string name="fix_bloom_effects">Fix Bloom Effects</string>
|
||||||
<string name="fix_bloom_effects_description">Removes bloom in Burnout.</string>
|
<string name="fix_bloom_effects_description">Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games.</string>
|
||||||
<string name="emulate_bgr565">Emulate BGR565</string>
|
<string name="emulate_bgr565">Emulate BGR565</string>
|
||||||
<string name="emulate_bgr565_description">Fixes problems with inverted colors in games or strange artifacts or strange shadows.</string>
|
<string name="emulate_bgr565_description">Fixes problems with inverted colors in games or strange artifacts or strange shadows.</string>
|
||||||
<string name="rescale_hack">Enable Legacy Rescale Pass</string>
|
<string name="rescale_hack">Enable Legacy Rescale Pass</string>
|
||||||
@@ -840,12 +844,6 @@
|
|||||||
<string name="preferences_graphics">Graphics</string>
|
<string name="preferences_graphics">Graphics</string>
|
||||||
<string name="preferences_graphics_description">Accuracy level, resolution, shader cache</string>
|
<string name="preferences_graphics_description">Accuracy level, resolution, shader cache</string>
|
||||||
<string name="quick_settings">Quick Settings</string>
|
<string name="quick_settings">Quick Settings</string>
|
||||||
<string name="cheats">Cheats</string>
|
|
||||||
<string name="enable_all_cheats">Enable All Cheats</string>
|
|
||||||
<string name="disable_all_cheats">Disable All Cheats</string>
|
|
||||||
<string name="unnamed_cheat">Unnamed Cheat</string>
|
|
||||||
<string name="enable_cheats_by_default">Enable cheats by default</string>
|
|
||||||
<string name="enable_cheats_by_default_description">Enable regular cheats when a game starts</string>
|
|
||||||
<string name="enable_quick_settings">Enable Quick Settings</string>
|
<string name="enable_quick_settings">Enable Quick Settings</string>
|
||||||
<string name="enable_quick_settings_description">Allow access to quick settings menu via swipe and menu button</string>
|
<string name="enable_quick_settings_description">Allow access to quick settings menu via swipe and menu button</string>
|
||||||
<string name="preferences_audio">Audio</string>
|
<string name="preferences_audio">Audio</string>
|
||||||
@@ -1140,6 +1138,7 @@
|
|||||||
<string name="gpu_fence_behavior_immediate">Immediate</string>
|
<string name="gpu_fence_behavior_immediate">Immediate</string>
|
||||||
<string name="gpu_fence_behavior_balanced">Balanced</string>
|
<string name="gpu_fence_behavior_balanced">Balanced</string>
|
||||||
<string name="gpu_fence_behavior_accurate">Accurate</string>
|
<string name="gpu_fence_behavior_accurate">Accurate</string>
|
||||||
|
<string name="gpu_fence_behavior_strict">Strict</string>
|
||||||
|
|
||||||
<!-- ASTC Decoding Method Choices -->
|
<!-- ASTC Decoding Method Choices -->
|
||||||
<string name="accelerate_astc_cpu" translatable="false">CPU</string>
|
<string name="accelerate_astc_cpu" translatable="false">CPU</string>
|
||||||
|
|||||||
@@ -14,6 +14,21 @@
|
|||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/hle/kernel/k_event.h"
|
#include "core/hle/kernel/k_event.h"
|
||||||
|
|
||||||
|
// See texture_cache/util.h
|
||||||
|
template<typename T, size_t N>
|
||||||
|
#if BOOST_VERSION >= 108100 || __GNUC__ > 12
|
||||||
|
[[nodiscard]] boost::container::static_vector<T, N> FixStaticVectorADL(const boost::container::static_vector<T, N>& v) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
[[nodiscard]] std::vector<T> FixStaticVectorADL(const boost::container::static_vector<T, N>& v) {
|
||||||
|
std::vector<T> u;
|
||||||
|
for (auto const& e : v)
|
||||||
|
u.push_back(e);
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace AudioCore::AudioIn {
|
namespace AudioCore::AudioIn {
|
||||||
|
|
||||||
System::System(Core::System& system_, Kernel::KEvent* event_, const size_t session_id_)
|
System::System(Core::System& system_, Kernel::KEvent* event_, const size_t session_id_)
|
||||||
@@ -95,7 +110,7 @@ Result System::Start() {
|
|||||||
|
|
||||||
boost::container::static_vector<AudioBuffer, BufferCount> buffers_to_flush{};
|
boost::container::static_vector<AudioBuffer, BufferCount> buffers_to_flush{};
|
||||||
buffers.RegisterBuffers(buffers_to_flush);
|
buffers.RegisterBuffers(buffers_to_flush);
|
||||||
session->AppendBuffers(buffers_to_flush);
|
session->AppendBuffers(FixStaticVectorADL(buffers_to_flush));
|
||||||
session->SetRingSize(static_cast<u32>(buffers_to_flush.size()));
|
session->SetRingSize(static_cast<u32>(buffers_to_flush.size()));
|
||||||
|
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
@@ -140,7 +155,7 @@ void System::RegisterBuffers() {
|
|||||||
if (state == State::Started) {
|
if (state == State::Started) {
|
||||||
boost::container::static_vector<AudioBuffer, BufferCount> registered_buffers{};
|
boost::container::static_vector<AudioBuffer, BufferCount> registered_buffers{};
|
||||||
buffers.RegisterBuffers(registered_buffers);
|
buffers.RegisterBuffers(registered_buffers);
|
||||||
session->AppendBuffers(registered_buffers);
|
session->AppendBuffers(FixStaticVectorADL(registered_buffers));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ add_library(
|
|||||||
logging.h
|
logging.h
|
||||||
lz4_compression.cpp
|
lz4_compression.cpp
|
||||||
lz4_compression.h
|
lz4_compression.h
|
||||||
|
make_unique_for_overwrite.h
|
||||||
math_util.h
|
math_util.h
|
||||||
memory_detect.cpp
|
memory_detect.cpp
|
||||||
memory_detect.h
|
memory_detect.h
|
||||||
@@ -109,6 +110,7 @@ add_library(
|
|||||||
socket_types.h
|
socket_types.h
|
||||||
sparse_large_vector.cpp
|
sparse_large_vector.cpp
|
||||||
sparse_large_vector.h
|
sparse_large_vector.h
|
||||||
|
spin_lock.h
|
||||||
stb.cpp
|
stb.cpp
|
||||||
stb.h
|
stb.h
|
||||||
steady_clock.cpp
|
steady_clock.cpp
|
||||||
@@ -137,8 +139,6 @@ add_library(
|
|||||||
uuid.cpp
|
uuid.cpp
|
||||||
uuid.h
|
uuid.h
|
||||||
vector_math.h
|
vector_math.h
|
||||||
zbic_compression.cpp
|
|
||||||
zbic_compression.h
|
|
||||||
zstd_compression.cpp
|
zstd_compression.cpp
|
||||||
zstd_compression.h
|
zstd_compression.h
|
||||||
fs/ryujinx_compat.h fs/ryujinx_compat.cpp
|
fs/ryujinx_compat.h fs/ryujinx_compat.cpp
|
||||||
@@ -149,10 +149,6 @@ add_library(
|
|||||||
net/net.h net/net.cpp
|
net/net.h net/net.cpp
|
||||||
container/unordered_map.h container/unordered_set.h)
|
container/unordered_map.h container/unordered_set.h)
|
||||||
|
|
||||||
set_source_files_properties(zbic_compression.cpp PROPERTIES
|
|
||||||
INCLUDE_DIRECTORIES "${ZBIC_INCLUDE_DIR}"
|
|
||||||
COMPILE_OPTIONS "$<$<CXX_COMPILER_ID:Clang,GNU>:-Wno-unused-function;-Wno-missing-declarations;-Wno-shadow>")
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_sources(common PRIVATE windows/timer_resolution.cpp
|
target_sources(common PRIVATE windows/timer_resolution.cpp
|
||||||
windows/timer_resolution.h)
|
windows/timer_resolution.h)
|
||||||
|
|||||||
@@ -244,8 +244,7 @@ WallClock::WallClock(bool invariant_, u64 rdtsc_frequency_) noexcept
|
|||||||
, ns_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(NsRatio::den, rdtsc_frequency_) : 0}
|
, ns_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(NsRatio::den, rdtsc_frequency_) : 0}
|
||||||
, us_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(UsRatio::den, rdtsc_frequency_) : 0}
|
, us_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(UsRatio::den, rdtsc_frequency_) : 0}
|
||||||
, ms_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(MsRatio::den, rdtsc_frequency_) : 0}
|
, ms_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(MsRatio::den, rdtsc_frequency_) : 0}
|
||||||
, rdtsc_ns_integer{invariant_ ? rdtsc_frequency_ / NsRatio::den : 1}
|
, rdtsc_ns_factor{invariant_ ? GetFixedPoint64Factor(rdtsc_frequency_, NsRatio::den) : 1}
|
||||||
, rdtsc_ns_factor{invariant_ ? GetFixedPoint64Factor(rdtsc_frequency_ % NsRatio::den, NsRatio::den) : 0}
|
|
||||||
, cntpct_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency_) : 0}
|
, cntpct_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency_) : 0}
|
||||||
, gputick_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency_) : 0}
|
, gputick_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency_) : 0}
|
||||||
, invariant{invariant_}
|
, invariant{invariant_}
|
||||||
@@ -292,7 +291,7 @@ bool WallClock::IsNative() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u64 WallClock::NsToTicks(std::chrono::nanoseconds ns) const {
|
u64 WallClock::NsToTicks(std::chrono::nanoseconds ns) const {
|
||||||
return ns.count() * rdtsc_ns_integer + MultiplyHigh(ns.count(), rdtsc_ns_factor);
|
return invariant ? MultiplyHigh(ns.count(), rdtsc_ns_factor) : ns.count();
|
||||||
}
|
}
|
||||||
#elif defined(HAS_NCE)
|
#elif defined(HAS_NCE)
|
||||||
namespace {
|
namespace {
|
||||||
@@ -417,7 +416,7 @@ u64 WallClock::NsToTicks(std::chrono::nanoseconds ns) const {
|
|||||||
const WallClock g_wall_clock = [] {
|
const WallClock g_wall_clock = [] {
|
||||||
#if defined(ARCHITECTURE_x86_64)
|
#if defined(ARCHITECTURE_x86_64)
|
||||||
auto const& caps = Common::g_cpu_caps;
|
auto const& caps = Common::g_cpu_caps;
|
||||||
return WallClock(caps.invariant_tsc && caps.tsc_frequency > std::nano::den, caps.tsc_frequency);
|
return WallClock(caps.invariant_tsc && caps.tsc_frequency >= std::nano::den, caps.tsc_frequency);
|
||||||
#elif defined(HAS_NCE)
|
#elif defined(HAS_NCE)
|
||||||
return WallClock(false, 1);
|
return WallClock(false, 1);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ public:
|
|||||||
u64 ns_rdtsc_factor;
|
u64 ns_rdtsc_factor;
|
||||||
u64 us_rdtsc_factor;
|
u64 us_rdtsc_factor;
|
||||||
u64 ms_rdtsc_factor;
|
u64 ms_rdtsc_factor;
|
||||||
u64 rdtsc_ns_integer;
|
|
||||||
u64 rdtsc_ns_factor;
|
u64 rdtsc_ns_factor;
|
||||||
u64 cntpct_rdtsc_factor;
|
u64 cntpct_rdtsc_factor;
|
||||||
u64 gputick_rdtsc_factor;
|
u64 gputick_rdtsc_factor;
|
||||||
|
|||||||
@@ -17,33 +17,36 @@
|
|||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
// glibc, mlibc, musl, and newlib all define their own variants of strerror_r
|
|
||||||
// We don't need to use the preprocessor, we can just select depending on return type
|
|
||||||
template<typename T> std::string HandleStrerrorR(T r, char *err_str);
|
|
||||||
template<> std::string HandleStrerrorR(char* r, char *) { return std::string{r}; }
|
|
||||||
template<> std::string HandleStrerrorR(const char* r, char *) { return std::string{r}; }
|
|
||||||
template<> std::string HandleStrerrorR(int r, char *err_str) {
|
|
||||||
return std::string{r != 0
|
|
||||||
? "(strerror_r failed to format error)"
|
|
||||||
: err_str};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string NativeErrorToString(int e) {
|
std::string NativeErrorToString(int e) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
LPSTR err_str;
|
LPSTR err_str;
|
||||||
|
|
||||||
DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
nullptr, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
nullptr, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
LPSTR(&err_str), 1, nullptr);
|
LPSTR(&err_str), 1, nullptr);
|
||||||
if (res) {
|
if (!res) {
|
||||||
|
return "(FormatMessageA failed to format error)";
|
||||||
|
}
|
||||||
std::string ret(err_str);
|
std::string ret(err_str);
|
||||||
LocalFree(err_str);
|
LocalFree(err_str);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
return "(FormatMessageA failed to format error)";
|
|
||||||
#else
|
#else
|
||||||
char err_str[255];
|
char err_str[256];
|
||||||
return HandleStrerrorR(strerror_r(e, err_str, sizeof(err_str)), err_str);
|
// See https://github.com/llvm/llvm-project/blob/c8fdb5f8b93c3e1da5e2ff3ba8b18627d6147b51/openmp/runtime/src/kmp_i18n.cpp#L711
|
||||||
|
// musl doesn't provide a macro gate but defines strerror_r() even if _GNU_SOURCE is defined
|
||||||
|
#if defined(__managarm__) || (defined(__GLIBC__) || defined(__BIONIC__)) || defined(_GNU_SOURCE)
|
||||||
|
// Thread safe (GNU-specific)
|
||||||
|
const char* str = strerror_r(e, err_str, sizeof(err_str));
|
||||||
|
return std::string(str);
|
||||||
|
#else
|
||||||
|
// Thread safe (XSI-compliant)
|
||||||
|
int second_err = strerror_r(e, err_str, sizeof(err_str));
|
||||||
|
if (second_err != 0) {
|
||||||
|
return "(strerror_r failed to format error)";
|
||||||
|
}
|
||||||
|
return std::string(err_str);
|
||||||
|
#endif // GLIBC etc.
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,25 +7,18 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/bit_util.h"
|
|
||||||
#include "common/fs/file.h"
|
#include "common/fs/file.h"
|
||||||
#include "common/fs/fs.h"
|
#include "common/fs/fs.h"
|
||||||
#include "common/fs/fs_types.h"
|
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
#include "common/fs/fs_android.h"
|
#include "common/fs/fs_android.h"
|
||||||
#endif
|
#endif
|
||||||
#include "common/logging.h"
|
#include "common/logging.h"
|
||||||
#include "common/literals.h"
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <share.h>
|
#include <share.h>
|
||||||
#include <windows.h>
|
|
||||||
#else
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
@@ -43,13 +36,13 @@ namespace {
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the file access mode and file type enums to a file access mode wide string.
|
* Converts the file access mode and file type enums to a file access mode wide string.
|
||||||
*
|
*
|
||||||
* @param mode File access mode
|
* @param mode File access mode
|
||||||
* @param type File type
|
* @param type File type
|
||||||
*
|
*
|
||||||
* @returns A pointer to a wide string representing the file access mode.
|
* @returns A pointer to a wide string representing the file access mode.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] constexpr const wchar_t* AccessModeToWStr(FileAccessMode mode, FileType type) {
|
[[nodiscard]] constexpr const wchar_t* AccessModeToWStr(FileAccessMode mode, FileType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case FileType::BinaryFile:
|
case FileType::BinaryFile:
|
||||||
@@ -86,12 +79,12 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the file-share access flag enum to a Windows defined file-share access flag.
|
* Converts the file-share access flag enum to a Windows defined file-share access flag.
|
||||||
*
|
*
|
||||||
* @param flag File-share access flag
|
* @param flag File-share access flag
|
||||||
*
|
*
|
||||||
* @returns Windows defined file-share access flag.
|
* @returns Windows defined file-share access flag.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] constexpr int ToWindowsFileShareFlag(FileShareFlag flag) {
|
[[nodiscard]] constexpr int ToWindowsFileShareFlag(FileShareFlag flag) {
|
||||||
switch (flag) {
|
switch (flag) {
|
||||||
case FileShareFlag::ShareNone:
|
case FileShareFlag::ShareNone:
|
||||||
@@ -109,13 +102,13 @@ namespace {
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the file access mode and file type enums to a file access mode string.
|
* Converts the file access mode and file type enums to a file access mode string.
|
||||||
*
|
*
|
||||||
* @param mode File access mode
|
* @param mode File access mode
|
||||||
* @param type File type
|
* @param type File type
|
||||||
*
|
*
|
||||||
* @returns A pointer to a string representing the file access mode.
|
* @returns A pointer to a string representing the file access mode.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] constexpr const char* AccessModeToStr(FileAccessMode mode, FileType type) {
|
[[nodiscard]] constexpr const char* AccessModeToStr(FileAccessMode mode, FileType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case FileType::BinaryFile:
|
case FileType::BinaryFile:
|
||||||
@@ -154,12 +147,12 @@ namespace {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the seek origin enum to a seek origin integer.
|
* Converts the seek origin enum to a seek origin integer.
|
||||||
*
|
*
|
||||||
* @param origin Seek origin
|
* @param origin Seek origin
|
||||||
*
|
*
|
||||||
* @returns Seek origin integer.
|
* @returns Seek origin integer.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] constexpr int ToSeekOrigin(SeekOrigin origin) {
|
[[nodiscard]] constexpr int ToSeekOrigin(SeekOrigin origin) {
|
||||||
switch (origin) {
|
switch (origin) {
|
||||||
case SeekOrigin::SetOrigin:
|
case SeekOrigin::SetOrigin:
|
||||||
@@ -251,162 +244,42 @@ FileType IOFile::GetType() const {
|
|||||||
return file_type;
|
return file_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__unix__)
|
|
||||||
static int PlatformMapReadOnly(IOFile& io, const char* path) {
|
|
||||||
io.mmap_fd = open(path, O_RDONLY);
|
|
||||||
if (io.mmap_fd > 0) {
|
|
||||||
struct stat st;
|
|
||||||
fstat(io.mmap_fd, &st);
|
|
||||||
io.mmap_size = st.st_size;
|
|
||||||
|
|
||||||
int map_flags = MAP_PRIVATE;
|
|
||||||
#ifdef MAP_PREFAULT_READ
|
|
||||||
// Prefaults reads so the final resulting pagetable from this big stupid mmap()
|
|
||||||
// isn't comically lazily loaded, we just coalesce everything in-place for our
|
|
||||||
// lovely mmap flags; if we didn't prefault the reads the page table will be
|
|
||||||
// constructed in-place (i.e on a read-by-read basis) causing lovely soft-faults
|
|
||||||
// which would nuke any performance gains.
|
|
||||||
//
|
|
||||||
// This of course incurs a cost in the initial mmap(2) call, but that is fine.
|
|
||||||
map_flags |= MAP_PREFAULT_READ;
|
|
||||||
#endif
|
|
||||||
#ifdef MAP_NOSYNC
|
|
||||||
// This causes physical media to not be synched to our file/memory
|
|
||||||
// This means that if the read-only file is written to, we won't see changes
|
|
||||||
// or we may see changes which are just funnily scattered, in any case
|
|
||||||
// this presumes the files won't be changed during execution
|
|
||||||
//
|
|
||||||
// Do not ever use this on write files (if we ever support that); this will create
|
|
||||||
// a fun amount of fragmentation on the disk.
|
|
||||||
map_flags |= MAP_NOSYNC;
|
|
||||||
#endif
|
|
||||||
#if defined(NDEBUG) && defined(MAP_NOCORE)
|
|
||||||
map_flags |= MAP_NOCORE;
|
|
||||||
#endif
|
|
||||||
#ifdef MAP_HUGE_2MB
|
|
||||||
map_flags |= MAP_HUGE_2MB; //2mb pages
|
|
||||||
#elif defined(MAP_ALIGNED)
|
|
||||||
// File must be big enough that it's worth to super align. We can't just super-align every
|
|
||||||
// file otherwise we will run out of alignments for actually important files :)
|
|
||||||
// System doesn't guarantee a super alignment, but if it's available it will delete
|
|
||||||
// about 3 layers(?) of the TLB tree for each read/write.
|
|
||||||
// Again the cost of faults may make this negligible gains, but hey, we gotta work
|
|
||||||
// what we gotta work with.
|
|
||||||
map_flags |= MAP_ALIGNED(21); //2^21 = 2mb use 2MB pages
|
|
||||||
#endif
|
|
||||||
io.mmap_base = (u8*)mmap(nullptr, io.mmap_size, PROT_READ, map_flags, io.mmap_fd, 0);
|
|
||||||
if (io.mmap_base == MAP_FAILED) {
|
|
||||||
close(io.mmap_fd);
|
|
||||||
io.mmap_fd = -1;
|
|
||||||
} else {
|
|
||||||
using namespace Common::Literals;
|
|
||||||
// For small files it is acceptable to use a full readahead
|
|
||||||
// See https://github.com/torvalds/linux/blob/e80d033851b3bc94c3d254ac66660ddd0a49d72c/include/linux/pagemap.h#L1392
|
|
||||||
if (u64(st.st_size) >= 256_MiB) {
|
|
||||||
posix_madvise(io.mmap_base, io.mmap_size, POSIX_MADV_RANDOM);
|
|
||||||
} else {
|
|
||||||
posix_madvise(io.mmap_base, io.mmap_size, POSIX_MADV_SEQUENTIAL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return io.mmap_fd;
|
|
||||||
}
|
|
||||||
static void PlatformUnmap(IOFile& io) {
|
|
||||||
if (io.mmap_fd != -1) {
|
|
||||||
munmap(io.mmap_base, io.mmap_size);
|
|
||||||
close(io.mmap_fd);
|
|
||||||
io.mmap_fd = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
// NO IMPLEMENTATION YET
|
|
||||||
#else
|
|
||||||
static int PlatformMapReadOnly(IOFile& io, const wchar_t* path) {
|
|
||||||
io.file_handle = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, nullptr);
|
|
||||||
if (HANDLE(io.file_handle) != INVALID_HANDLE_VALUE) {
|
|
||||||
io.mapping_handle = CreateFileMappingW(HANDLE(io.file_handle), nullptr, PAGE_READONLY, 0, 0, nullptr);
|
|
||||||
if (io.mapping_handle) {
|
|
||||||
io.mmap_base = (u8*)MapViewOfFile(HANDLE(io.mapping_handle), FILE_MAP_READ, 0, 0, 0);
|
|
||||||
if (io.mmap_base) {
|
|
||||||
_LARGE_INTEGER pvalue;
|
|
||||||
GetFileSizeEx(io.file_handle, &pvalue);
|
|
||||||
io.mmap_size = uint32_t(pvalue.QuadPart);
|
|
||||||
} else {
|
|
||||||
CloseHandle(io.mapping_handle);
|
|
||||||
CloseHandle(io.file_handle);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CloseHandle(io.file_handle);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
static void PlatformUnmap(IOFile& io) {
|
|
||||||
if(io.mapping_handle) {
|
|
||||||
if(io.mmap_base)
|
|
||||||
UnmapViewOfFile(HANDLE(io.mmap_base));
|
|
||||||
CloseHandle(HANDLE(io.mapping_handle));
|
|
||||||
}
|
|
||||||
if(io.file_handle != INVALID_HANDLE_VALUE)
|
|
||||||
CloseHandle(HANDLE(io.file_handle));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void IOFile::Open(const fs::path& path, FileAccessMode mode, FileType type, FileShareFlag flag) {
|
void IOFile::Open(const fs::path& path, FileAccessMode mode, FileType type, FileShareFlag flag) {
|
||||||
Close();
|
Close();
|
||||||
|
|
||||||
file_path = path;
|
file_path = path;
|
||||||
file_access_mode = mode;
|
file_access_mode = mode;
|
||||||
file_type = type;
|
file_type = type;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// TODO: this probably can use better logic but oh well I'm not a windowser
|
|
||||||
file_handle = nullptr;
|
|
||||||
if (type == FileType::BinaryFile && mode == FileAccessMode::Read) {
|
|
||||||
if (PlatformMapReadOnly(*this, path.c_str()) == -1) {
|
|
||||||
LOG_ERROR(Common_Filesystem, "Error mmap'ing file"); //: {}", path.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (file_handle == nullptr) {
|
|
||||||
if (flag != FileShareFlag::ShareNone) {
|
if (flag != FileShareFlag::ShareNone) {
|
||||||
file = _wfsopen(path.c_str(), AccessModeToWStr(mode, type), ToWindowsFileShareFlag(flag));
|
file = _wfsopen(path.c_str(), AccessModeToWStr(mode, type), ToWindowsFileShareFlag(flag));
|
||||||
} else {
|
} else {
|
||||||
_wfopen_s(&file, path.c_str(), AccessModeToWStr(mode, type));
|
_wfopen_s(&file, path.c_str(), AccessModeToWStr(mode, type));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#elif __ANDROID__
|
#elif __ANDROID__
|
||||||
if (Android::IsContentUri(path)) {
|
if (Android::IsContentUri(path)) {
|
||||||
ASSERT_MSG(mode == FileAccessMode::Read, "Content URI file access is for read-only!");
|
ASSERT_MSG(mode == FileAccessMode::Read, "Content URI file access is for read-only!");
|
||||||
if (PlatformMapReadOnly(*this, path.c_str()) == -1) {
|
const auto fd = Android::OpenContentUri(path, Android::OpenMode::Read);
|
||||||
LOG_ERROR(Common_Filesystem, "Error mmap'ing file: {}", path.c_str());
|
|
||||||
int const fd = Android::OpenContentUri(path, Android::OpenMode::Read);
|
|
||||||
if (fd != -1) {
|
if (fd != -1) {
|
||||||
file = fdopen(fd, "r");
|
file = fdopen(fd, "r");
|
||||||
if (errno != 0 && file == nullptr)
|
const auto error_num = errno;
|
||||||
LOG_ERROR(Common_Filesystem, "Error opening file: {}, error: {}", path.c_str(), strerror(errno));
|
if (error_num != 0 && file == nullptr) {
|
||||||
|
LOG_ERROR(Common_Filesystem, "Error opening file: {}, error: {}", path.c_str(),
|
||||||
|
strerror(error_num));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(Common_Filesystem, "Error opening file: {}", path.c_str());
|
LOG_ERROR(Common_Filesystem, "Error opening file: {}", path.c_str());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
file = std::fopen(path.c_str(), AccessModeToStr(mode, type));
|
file = std::fopen(path.c_str(), AccessModeToStr(mode, type));
|
||||||
}
|
}
|
||||||
#elif defined(__HAIKU__) || defined(__managarm__) || defined(__OPENORBIS__) || defined(__APPLE__)
|
|
||||||
file = std::fopen(path.c_str(), AccessModeToStr(mode, type));
|
|
||||||
#elif defined(__unix__)
|
|
||||||
if (type == FileType::BinaryFile && mode == FileAccessMode::Read) {
|
|
||||||
if (PlatformMapReadOnly(*this, path.c_str()) == -1) {
|
|
||||||
LOG_ERROR(Common_Filesystem, "Error mmap'ing file: {}", path.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mmap_fd == -1) {
|
|
||||||
file = std::fopen(path.c_str(), AccessModeToStr(mode, type)); // mmap(2) failed or simply we can't use it
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
// Some other fancy OS (ahem fucking Darwin/Mac OSX)
|
|
||||||
file = std::fopen(path.c_str(), AccessModeToStr(mode, type));
|
file = std::fopen(path.c_str(), AccessModeToStr(mode, type));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!IsOpen()) {
|
if (!IsOpen()) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to open the file at path={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem, "Failed to open the file at path={}, ec_message={}",
|
||||||
@@ -415,25 +288,25 @@ void IOFile::Open(const fs::path& path, FileAccessMode mode, FileType type, File
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IOFile::Close() {
|
void IOFile::Close() {
|
||||||
#if defined(__APPLE__)
|
if (!IsOpen()) {
|
||||||
// NO IMPLEMENTATION YET
|
return;
|
||||||
#else
|
}
|
||||||
PlatformUnmap(*this);
|
|
||||||
#endif
|
|
||||||
if (file) {
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
const auto close_result = std::fclose(file) == 0;
|
const auto close_result = std::fclose(file) == 0;
|
||||||
|
|
||||||
if (!close_result) {
|
if (!close_result) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to close the file at path={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem, "Failed to close the file at path={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), ec.message());
|
PathToUTF8String(file_path), ec.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
file = nullptr;
|
file = nullptr;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IOFile::IsOpen() const {
|
bool IOFile::IsOpen() const {
|
||||||
return file != nullptr || IsMappedFile();
|
return file != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string IOFile::ReadString(size_t length) const {
|
std::string IOFile::ReadString(size_t length) const {
|
||||||
@@ -450,65 +323,80 @@ size_t IOFile::WriteString(std::span<const char> string) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool IOFile::Flush() const {
|
bool IOFile::Flush() const {
|
||||||
ASSERT(!IsMappedFile());
|
if (!IsOpen()) {
|
||||||
if (file) {
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
auto const flush_result = std::fflush(file) == 0;
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
const auto flush_result = std::fflush(file) == 0;
|
||||||
|
#else
|
||||||
|
const auto flush_result = std::fflush(file) == 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!flush_result) {
|
if (!flush_result) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to flush the file at path={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem, "Failed to flush the file at path={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), ec.message());
|
PathToUTF8String(file_path), ec.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
return flush_result;
|
return flush_result;
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IOFile::Commit() const {
|
bool IOFile::Commit() const {
|
||||||
ASSERT(!IsMappedFile());
|
if (!IsOpen()) {
|
||||||
if (file) {
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
const auto commit_result = std::fflush(file) == 0 && _commit(fileno(file)) == 0;
|
const auto commit_result = std::fflush(file) == 0 && _commit(fileno(file)) == 0;
|
||||||
#else
|
#else
|
||||||
const auto commit_result = std::fflush(file) == 0 && fsync(fileno(file)) == 0;
|
const auto commit_result = std::fflush(file) == 0 && fsync(fileno(file)) == 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!commit_result) {
|
if (!commit_result) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to commit the file at path={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem, "Failed to commit the file at path={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), ec.message());
|
PathToUTF8String(file_path), ec.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
return commit_result;
|
return commit_result;
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IOFile::SetSize(u64 size) const {
|
bool IOFile::SetSize(u64 size) const {
|
||||||
ASSERT(!IsMappedFile());
|
if (!IsOpen()) {
|
||||||
if (file) {
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
const auto set_size_result = _chsize_s(fileno(file), s64(size)) == 0;
|
const auto set_size_result = _chsize_s(fileno(file), static_cast<s64>(size)) == 0;
|
||||||
#else
|
#else
|
||||||
const auto set_size_result = ftruncate(fileno(file), s64(size)) == 0;
|
const auto set_size_result = ftruncate(fileno(file), static_cast<s64>(size)) == 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!set_size_result) {
|
if (!set_size_result) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to resize the file at path={}, size={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem, "Failed to resize the file at path={}, size={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), size, ec.message());
|
PathToUTF8String(file_path), size, ec.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
return set_size_result;
|
return set_size_result;
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 IOFile::GetSize() const {
|
u64 IOFile::GetSize() const {
|
||||||
if (IsMappedFile())
|
if (!IsOpen()) {
|
||||||
return mmap_size;
|
return 0;
|
||||||
if (file) {
|
}
|
||||||
// Flush any unwritten buffered data into the file prior to retrieving the file mmap_size.
|
|
||||||
|
// Flush any unwritten buffered data into the file prior to retrieving the file size.
|
||||||
std::fflush(file);
|
std::fflush(file);
|
||||||
#if __ANDROID__
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
u64 file_size = 0;
|
u64 file_size = 0;
|
||||||
if (Android::IsContentUri(file_path)) {
|
if (Android::IsContentUri(file_path)) {
|
||||||
file_size = Android::GetSize(file_path);
|
file_size = Android::GetSize(file_path);
|
||||||
@@ -518,64 +406,54 @@ u64 IOFile::GetSize() const {
|
|||||||
file_size = fs::file_size(file_path, ec);
|
file_size = fs::file_size(file_path, ec);
|
||||||
|
|
||||||
if (ec) {
|
if (ec) {
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to retrieve the file mmap_size of path={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem,
|
||||||
|
"Failed to retrieve the file size of path={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), ec.message());
|
PathToUTF8String(file_path), ec.message());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
auto const file_size = fs::file_size(file_path, ec);
|
|
||||||
|
const auto file_size = fs::file_size(file_path, ec);
|
||||||
|
|
||||||
if (ec) {
|
if (ec) {
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to retrieve the file mmap_size of path={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem, "Failed to retrieve the file size of path={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), ec.message());
|
PathToUTF8String(file_path), ec.message());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return file_size;
|
return file_size;
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IOFile::Seek(s64 offset, SeekOrigin origin) const {
|
bool IOFile::Seek(s64 offset, SeekOrigin origin) const {
|
||||||
if (IsMappedFile()) {
|
if (!IsOpen()) {
|
||||||
// fuck you to whoever made this method const
|
return false;
|
||||||
switch (origin) {
|
|
||||||
case SeekOrigin::SetOrigin:
|
|
||||||
mmap_offset = s64(offset);
|
|
||||||
break;
|
|
||||||
case SeekOrigin::CurrentPosition:
|
|
||||||
mmap_offset += s64(offset);
|
|
||||||
break;
|
|
||||||
case SeekOrigin::End:
|
|
||||||
mmap_offset = s64(mmap_size) + s64(offset);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (file) {
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
const auto seek_result = fseeko(file, offset, ToSeekOrigin(origin)) == 0;
|
const auto seek_result = fseeko(file, offset, ToSeekOrigin(origin)) == 0;
|
||||||
|
|
||||||
if (!seek_result) {
|
if (!seek_result) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
LOG_ERROR(Common_Filesystem, "Failed to seek the file at path={}, offset={}, origin={}, ec_message={}",
|
LOG_ERROR(Common_Filesystem,
|
||||||
|
"Failed to seek the file at path={}, offset={}, origin={}, ec_message={}",
|
||||||
PathToUTF8String(file_path), offset, origin, ec.message());
|
PathToUTF8String(file_path), offset, origin, ec.message());
|
||||||
}
|
}
|
||||||
|
|
||||||
return seek_result;
|
return seek_result;
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 IOFile::Tell() const {
|
s64 IOFile::Tell() const {
|
||||||
if (IsMappedFile()) {
|
if (!IsOpen()) {
|
||||||
errno = 0;
|
|
||||||
return s64(mmap_offset);
|
|
||||||
}
|
|
||||||
if (file) {
|
|
||||||
errno = 0;
|
|
||||||
return ftello(file);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
return ftello(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Common::FS
|
} // namespace Common::FS
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@@ -25,12 +24,12 @@ enum class SeekOrigin {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a file stream at path with the specified open mode.
|
* Opens a file stream at path with the specified open mode.
|
||||||
*
|
*
|
||||||
* @param file_stream Reference to file stream
|
* @param file_stream Reference to file stream
|
||||||
* @param path Filesystem path
|
* @param path Filesystem path
|
||||||
* @param open_mode File stream open mode
|
* @param open_mode File stream open mode
|
||||||
*/
|
*/
|
||||||
template <typename FileStream>
|
template <typename FileStream>
|
||||||
void OpenFileStream(FileStream& file_stream, const std::filesystem::path& path,
|
void OpenFileStream(FileStream& file_stream, const std::filesystem::path& path,
|
||||||
std::ios_base::openmode open_mode) {
|
std::ios_base::openmode open_mode) {
|
||||||
@@ -49,14 +48,14 @@ void OpenFileStream(FileStream& file_stream, const Path& path, std::ios_base::op
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads an entire file at path and returns a string of the contents read from the file.
|
* Reads an entire file at path and returns a string of the contents read from the file.
|
||||||
* If the filesystem object at path is not a regular file, this function returns an empty string.
|
* If the filesystem object at path is not a regular file, this function returns an empty string.
|
||||||
*
|
*
|
||||||
* @param path Filesystem path
|
* @param path Filesystem path
|
||||||
* @param type File type
|
* @param type File type
|
||||||
*
|
*
|
||||||
* @returns A string of the contents read from the file.
|
* @returns A string of the contents read from the file.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::string ReadStringFromFile(const std::filesystem::path& path, FileType type);
|
[[nodiscard]] std::string ReadStringFromFile(const std::filesystem::path& path, FileType type);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -71,16 +70,16 @@ template <typename Path>
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a string to a file at path and returns the number of characters successfully written.
|
* Writes a string to a file at path and returns the number of characters successfully written.
|
||||||
* If a file already exists at path, its contents will be erased.
|
* If a file already exists at path, its contents will be erased.
|
||||||
* If a file does not exist at path, it creates and opens a new empty file for writing.
|
* If a file does not exist at path, it creates and opens a new empty file for writing.
|
||||||
* If the filesystem object at path exists and is not a regular file, this function returns 0.
|
* If the filesystem object at path exists and is not a regular file, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param path Filesystem path
|
* @param path Filesystem path
|
||||||
* @param type File type
|
* @param type File type
|
||||||
*
|
*
|
||||||
* @returns Number of characters successfully written.
|
* @returns Number of characters successfully written.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] size_t WriteStringToFile(const std::filesystem::path& path, FileType type,
|
[[nodiscard]] size_t WriteStringToFile(const std::filesystem::path& path, FileType type,
|
||||||
std::string_view string);
|
std::string_view string);
|
||||||
|
|
||||||
@@ -96,15 +95,15 @@ template <typename Path>
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Appends a string to a file at path and returns the number of characters successfully written.
|
* Appends a string to a file at path and returns the number of characters successfully written.
|
||||||
* If a file does not exist at path, it creates and opens a new empty file for appending.
|
* If a file does not exist at path, it creates and opens a new empty file for appending.
|
||||||
* If the filesystem object at path exists and is not a regular file, this function returns 0.
|
* If the filesystem object at path exists and is not a regular file, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param path Filesystem path
|
* @param path Filesystem path
|
||||||
* @param type File type
|
* @param type File type
|
||||||
*
|
*
|
||||||
* @returns Number of characters successfully written.
|
* @returns Number of characters successfully written.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] size_t AppendStringToFile(const std::filesystem::path& path, FileType type,
|
[[nodiscard]] size_t AppendStringToFile(const std::filesystem::path& path, FileType type,
|
||||||
std::string_view string);
|
std::string_view string);
|
||||||
|
|
||||||
@@ -187,6 +186,19 @@ public:
|
|||||||
FileType type = FileType::BinaryFile,
|
FileType type = FileType::BinaryFile,
|
||||||
FileShareFlag flag = FileShareFlag::ShareReadOnly);
|
FileShareFlag flag = FileShareFlag::ShareReadOnly);
|
||||||
|
|
||||||
|
// #ifdef _WIN32
|
||||||
|
// template <typename Path>
|
||||||
|
// void Open(const Path& path, FileAccessMode mode, FileType type = FileType::BinaryFile,
|
||||||
|
// FileShareFlag flag = FileShareFlag::ShareReadOnly) {
|
||||||
|
// using ValueType = typename Path::value_type;
|
||||||
|
// if constexpr (IsChar<ValueType>) {
|
||||||
|
// Open(ToU8String(path), mode, type, flag);
|
||||||
|
// } else {
|
||||||
|
// Open(std::filesystem::path{path}, mode, type, flag);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// #endif
|
||||||
|
|
||||||
/// Closes the file if it is opened.
|
/// Closes the file if it is opened.
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
@@ -216,7 +228,8 @@ public:
|
|||||||
[[nodiscard]] size_t Read(T& data) const {
|
[[nodiscard]] size_t Read(T& data) const {
|
||||||
if constexpr (IsContiguousContainer<T>) {
|
if constexpr (IsContiguousContainer<T>) {
|
||||||
using ContiguousType = typename T::value_type;
|
using ContiguousType = typename T::value_type;
|
||||||
static_assert(std::is_trivially_copyable_v<ContiguousType>, "Data type must be trivially copyable.");
|
static_assert(std::is_trivially_copyable_v<ContiguousType>,
|
||||||
|
"Data type must be trivially copyable.");
|
||||||
return ReadSpan<ContiguousType>(data);
|
return ReadSpan<ContiguousType>(data);
|
||||||
} else {
|
} else {
|
||||||
return ReadObject(data) ? 1 : 0;
|
return ReadObject(data) ? 1 : 0;
|
||||||
@@ -241,7 +254,8 @@ public:
|
|||||||
[[nodiscard]] size_t Write(const T& data) const {
|
[[nodiscard]] size_t Write(const T& data) const {
|
||||||
if constexpr (IsContiguousContainer<T>) {
|
if constexpr (IsContiguousContainer<T>) {
|
||||||
using ContiguousType = typename T::value_type;
|
using ContiguousType = typename T::value_type;
|
||||||
static_assert(std::is_trivially_copyable_v<ContiguousType>, "Data type must be trivially copyable.");
|
static_assert(std::is_trivially_copyable_v<ContiguousType>,
|
||||||
|
"Data type must be trivially copyable.");
|
||||||
return WriteSpan<ContiguousType>(data);
|
return WriteSpan<ContiguousType>(data);
|
||||||
} else {
|
} else {
|
||||||
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
||||||
@@ -268,11 +282,10 @@ public:
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
requires std::is_trivially_copyable_v<T>
|
requires std::is_trivially_copyable_v<T>
|
||||||
[[nodiscard]] size_t ReadSpan(std::span<T> data) const {
|
[[nodiscard]] size_t ReadSpan(std::span<T> data) const {
|
||||||
if (IsMappedFile()) {
|
if (!IsOpen()) {
|
||||||
std::memcpy(data.data(), mmap_base + mmap_offset, sizeof(T) * data.size());
|
return 0;
|
||||||
return data.size();
|
|
||||||
}
|
}
|
||||||
return IsOpen() ? std::fread(data.data(), sizeof(T), data.size(), file) : 0;
|
return std::fread(data.data(), sizeof(T), data.size(), file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -293,11 +306,12 @@ public:
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
[[nodiscard]] size_t WriteSpan(std::span<const T> data) const {
|
[[nodiscard]] size_t WriteSpan(std::span<const T> data) const {
|
||||||
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
||||||
if (IsMappedFile()) {
|
|
||||||
std::memcpy(mmap_base + mmap_offset, data.data(), sizeof(T) * data.size());
|
if (!IsOpen()) {
|
||||||
return data.size();
|
return 0;
|
||||||
}
|
}
|
||||||
return IsOpen() ? std::fwrite(data.data(), sizeof(T), data.size(), file) : 0;
|
|
||||||
|
return std::fwrite(data.data(), sizeof(T), data.size(), file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -320,15 +334,12 @@ public:
|
|||||||
[[nodiscard]] bool ReadObject(T& object) const {
|
[[nodiscard]] bool ReadObject(T& object) const {
|
||||||
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
||||||
static_assert(!std::is_pointer_v<T>, "T must not be a pointer to an object.");
|
static_assert(!std::is_pointer_v<T>, "T must not be a pointer to an object.");
|
||||||
if (IsMappedFile()) {
|
|
||||||
std::memcpy(&object, mmap_base + mmap_offset, sizeof(T));
|
if (!IsOpen()) {
|
||||||
#ifdef _WIN32
|
return false;
|
||||||
return bool(sizeof(T));
|
|
||||||
#else
|
|
||||||
return sizeof(T);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return IsOpen() ? std::fread(&object, sizeof(T), 1, file) == 1 : false;
|
|
||||||
|
return std::fread(&object, sizeof(T), 1, file) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -350,15 +361,12 @@ public:
|
|||||||
[[nodiscard]] bool WriteObject(const T& object) const {
|
[[nodiscard]] bool WriteObject(const T& object) const {
|
||||||
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
static_assert(std::is_trivially_copyable_v<T>, "Data type must be trivially copyable.");
|
||||||
static_assert(!std::is_pointer_v<T>, "T must not be a pointer to an object.");
|
static_assert(!std::is_pointer_v<T>, "T must not be a pointer to an object.");
|
||||||
if (IsMappedFile()) {
|
|
||||||
std::memcpy(mmap_base + mmap_offset, &object, sizeof(T));
|
if (!IsOpen()) {
|
||||||
#ifdef _WIN32
|
return false;
|
||||||
return sizeof(T) != 0;
|
|
||||||
#else
|
|
||||||
return sizeof(T);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return IsOpen() ? std::fwrite(&object, sizeof(T), 1, file) == 1 : false;
|
|
||||||
|
return std::fwrite(&object, sizeof(T), 1, file) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -441,28 +449,12 @@ public:
|
|||||||
*/
|
*/
|
||||||
[[nodiscard]] s64 Tell() const;
|
[[nodiscard]] s64 Tell() const;
|
||||||
|
|
||||||
#ifdef _WIN32
|
private:
|
||||||
inline bool IsMappedFile() const noexcept { return mapping_handle != nullptr; }
|
|
||||||
#else // POSIX
|
|
||||||
inline bool IsMappedFile() const noexcept { return mmap_fd != -1; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::filesystem::path file_path;
|
std::filesystem::path file_path;
|
||||||
FileAccessMode file_access_mode{};
|
FileAccessMode file_access_mode{};
|
||||||
FileType file_type{};
|
FileType file_type{};
|
||||||
|
|
||||||
std::FILE* file = nullptr;
|
std::FILE* file = nullptr;
|
||||||
// Any decent system should have mmap() for files
|
|
||||||
// Systems with artifical mmap() limitations should simply change the logic within file.cpp
|
|
||||||
// and reduce the threshold for which the mmap() is set to
|
|
||||||
#ifdef _WIN32
|
|
||||||
void *mapping_handle = nullptr;
|
|
||||||
void *file_handle = nullptr;
|
|
||||||
#else // POSIX
|
|
||||||
int mmap_fd = -1;
|
|
||||||
#endif
|
|
||||||
u8* mmap_base = nullptr;
|
|
||||||
size_t mmap_size = 0;
|
|
||||||
mutable s64 mmap_offset = 0; // fuck you
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Common::FS
|
} // namespace Common::FS
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "common/container/unordered_map.h"
|
#include "common/container/unordered_map.h"
|
||||||
@@ -481,80 +480,28 @@ std::string SanitizePath(std::string_view path_, DirectorySeparator directory_se
|
|||||||
[type2](char c1, char c2) { return c1 == type2 && c2 == type2; }),
|
[type2](char c1, char c2) { return c1 == type2 && c2 == type2; }),
|
||||||
path.end());
|
path.end());
|
||||||
|
|
||||||
std::string root;
|
const bool absolute = !path.empty() && path[0] == type2;
|
||||||
std::string_view components{path};
|
|
||||||
bool drive_relative = false;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
const bool network = path.size() > 1 && path[0] == type2 && path[1] == type2;
|
|
||||||
const bool drive =
|
|
||||||
path.size() > 1 && std::isalpha(static_cast<unsigned char>(path[0])) && path[1] == ':';
|
|
||||||
|
|
||||||
if (network) {
|
|
||||||
root.assign(2, type2);
|
|
||||||
components.remove_prefix(2);
|
|
||||||
} else if (drive) {
|
|
||||||
root.assign(path.data(), 2);
|
|
||||||
components.remove_prefix(2);
|
|
||||||
if (!components.empty() && components.front() == type2) {
|
|
||||||
root += type2;
|
|
||||||
components.remove_prefix(1);
|
|
||||||
} else {
|
|
||||||
drive_relative = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (root.empty() && !components.empty() && components.front() == type2) {
|
|
||||||
root += type2;
|
|
||||||
components.remove_prefix(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto path_parts = SplitPathComponents(components);
|
|
||||||
std::size_t root_component_count = 0;
|
|
||||||
#ifdef _WIN32
|
|
||||||
if (network) {
|
|
||||||
root_component_count = 2;
|
|
||||||
|
|
||||||
const auto is_unc = [](std::string_view part) {
|
|
||||||
return part.size() == 3 && (part[0] == 'U' || part[0] == 'u') &&
|
|
||||||
(part[1] == 'N' || part[1] == 'n') && (part[2] == 'C' || part[2] == 'c');
|
|
||||||
};
|
|
||||||
if (path_parts.size() >= 2 && path_parts[0] == "?" && is_unc(path_parts[1])) {
|
|
||||||
root_component_count = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<std::string_view> parts;
|
std::vector<std::string_view> parts;
|
||||||
for (std::size_t i = 0; i < path_parts.size(); ++i) {
|
|
||||||
const auto part = path_parts[i];
|
for (const auto part : SplitPathComponents(path))
|
||||||
if (i < root_component_count) {
|
{
|
||||||
parts.push_back(part);
|
if (part.empty() || part == ".")
|
||||||
} else if (part.empty() || part == ".") {
|
|
||||||
continue;
|
continue;
|
||||||
} else if (part == "..") {
|
if (part == ".." && !parts.empty() && parts.back() != "..")
|
||||||
if (parts.size() > root_component_count) {
|
|
||||||
parts.pop_back();
|
parts.pop_back();
|
||||||
}
|
else if (part != "..") parts.push_back(part);
|
||||||
} else {
|
|
||||||
parts.push_back(part);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::size_t root_length = root.size();
|
std::string resolved = absolute ? std::string(1, type2) : std::string{};
|
||||||
std::string resolved = std::move(root);
|
for (std::size_t i = 0; i < parts.size(); ++i)
|
||||||
for (std::size_t i = 0; i < parts.size(); ++i) {
|
{
|
||||||
if (i != 0 || (!resolved.empty() && resolved.back() != type2 && !drive_relative))
|
if (i != 0)
|
||||||
resolved += type2;
|
resolved += type2;
|
||||||
resolved.append(parts[i].data(), parts[i].size());
|
resolved.append(parts[i].data(), parts[i].size());
|
||||||
}
|
}
|
||||||
|
|
||||||
path = std::move(resolved);
|
path = std::move(resolved);
|
||||||
|
|
||||||
if (!path.empty() && path.size() == root_length) {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
return std::string(RemoveTrailingSlash(path));
|
return std::string(RemoveTrailingSlash(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -347,9 +347,8 @@ enum class DirectorySeparator {
|
|||||||
// i.e. "C:\Users\Yuzu\Documents\save.bin" becomes {"C:", "Users", "Yuzu", "Documents", "save.bin" }
|
// i.e. "C:\Users\Yuzu\Documents\save.bin" becomes {"C:", "Users", "Yuzu", "Documents", "save.bin" }
|
||||||
[[nodiscard]] std::vector<std::string> SplitPathComponentsCopy(std::string_view filename);
|
[[nodiscard]] std::vector<std::string> SplitPathComponentsCopy(std::string_view filename);
|
||||||
|
|
||||||
// Normalizes directory separators, removes duplicate and non-root trailing separators, and resolves
|
// Removes trailing slash, makes all '\\' into '/', and removes duplicate '/'. Makes '/' into '\\'
|
||||||
// '.' and '..' components without traversing above the path root. Windows drive and UNC roots are
|
// depending if directory_separator is BackwardSlash or PlatformDefault and running on windows
|
||||||
// preserved.
|
|
||||||
[[nodiscard]] std::string SanitizePath(
|
[[nodiscard]] std::string SanitizePath(
|
||||||
std::string_view path,
|
std::string_view path,
|
||||||
DirectorySeparator directory_separator = DirectorySeparator::ForwardSlash);
|
DirectorySeparator directory_separator = DirectorySeparator::ForwardSlash);
|
||||||
|
|||||||
@@ -418,10 +418,6 @@ void SetGlobalFilter(const Filter& filter) {
|
|||||||
logging_instance->filter = filter;
|
logging_instance->filter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsMessageEnabled(Class log_class, Level log_level) {
|
|
||||||
return logging_instance && logging_instance->filter.CheckMessage(log_class, log_level);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetColorConsoleBackendEnabled(bool enabled) {
|
void SetColorConsoleBackendEnabled(bool enabled) {
|
||||||
if (logging_instance)
|
if (logging_instance)
|
||||||
logging_instance->color_console_backend.enabled = enabled;
|
logging_instance->color_console_backend.enabled = enabled;
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ void Stop();
|
|||||||
|
|
||||||
/// The global filter will prevent any messages from even being processed if they are filtered.
|
/// The global filter will prevent any messages from even being processed if they are filtered.
|
||||||
void SetGlobalFilter(const Filter& filter);
|
void SetGlobalFilter(const Filter& filter);
|
||||||
[[nodiscard]] bool IsMessageEnabled(Class log_class, Level log_level);
|
|
||||||
void SetColorConsoleBackendEnabled(bool enabled);
|
void SetColorConsoleBackendEnabled(bool enabled);
|
||||||
|
|
||||||
} // namespace Common::Log
|
} // namespace Common::Log
|
||||||
|
|||||||