diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 00187ee1c5..8269e99363 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,8 @@ on: - master # For testing. - actions + tags: + - "v*.*.*" paths-ignore: - '*.{txt,md}' - 'Tools/**' @@ -165,7 +167,7 @@ jobs: extra: test cc: clang cxx: clang++ - args: ./b.sh --headless + args: ./b.sh --headless --fat --no-png --no-sdl2 - os: macos-latest extra: ios cc: clang @@ -178,6 +180,12 @@ jobs: with: submodules: recursive + - name: Fetch tags for macOS releases + if: runner.os == 'macOS' + # This is required for git describe --always to work for git-version.cpp. + run: | + git fetch --deepen=15000 --tags || exit 0 + - name: Cache Qt uses: actions/cache@v1 if: matrix.extra == 'qt' @@ -205,10 +213,11 @@ jobs: sudo apt-get update -y -qq sudo apt-get install libsdl2-dev libgl1-mesa-dev libglu1-mesa-dev - - name: Install macOS dependencies - if: runner.os == 'macOS' && matrix.extra != 'ios' + - name: Create macOS git-version.cpp for tagged release + if: startsWith(github.ref, 'refs/tags/') && runner.os == 'macOS' && matrix.extra == 'test' run: | - brew install sdl2 + echo "const char *PPSSPP_GIT_VERSION = \"${GITHUB_REF##*/}\";" > git-version.cpp + echo "#define PPSSPP_GIT_VERSION_NO_UPDATE 1" >> git-version.cpp - name: Execute build env: @@ -224,7 +233,12 @@ jobs: if [ -e build*/$BUILD_CONFIGURATION/PPSSPPSDL ]; then cp build*/$BUILD_CONFIGURATION/PPSSPPSDL ppsspp/ elif [ -e build*/PPSSPPSDL.app ]; then - cp -r build*/PPSSPPSDL.app ppsspp/ + cp -a build*/PPSSPPSDL.app ppsspp/ + # GitHub Actions zipping kills symlinks and permissions. + cd ppsspp + zip -qry PPSSPPSDL.zip PPSSPPSDL.app + rm -rf PPSSPPSDL.app + cd - elif [ -e build*/PPSSPPSDL ]; then cp build*/PPSSPPSDL ppsspp/ cp -r assets ppsspp/assets @@ -242,6 +256,24 @@ jobs: name: ${{ matrix.os }} build path: ppsspp/ + - name: Create macOS release + if: startsWith(github.ref, 'refs/tags/') && runner.os == 'macOS' && matrix.extra == 'test' + run: | + cd ppsspp || exit 1 + mv PPSSPPSDL.zip PPSSPPSDL-macOS-${GITHUB_REF##*/}.zip || exit 1 + + - name: Upload macOS release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') && runner.os == 'macOS' && matrix.extra == 'test' + with: + files: ppsspp/*.zip + body: > + PPSSPP is a cross-platform PSP emulator. + Visit PPSSPP [official website](https://ppsspp.org) + for a [full changelog](https://ppsspp.org/index.html#news) + as well as the [downloads section](https://ppsspp.org/downloads.html) + for other platforms. + test: strategy: fail-fast: false @@ -271,7 +303,7 @@ jobs: - name: Install macOS dependencies if: runner.os == 'macOS' run: | - brew install sdl2 + git submodule update --init SDL/macOS - name: Download build uses: actions/download-artifact@v2 diff --git a/.gitignore b/.gitignore index 2e210617ef..de91c34882 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,16 @@ debian/ppsspp/ # RenderDoc *.rdc +ui_atlas_luna.zim +ui_atlas_luna.meta +font_atlas_luna.meta +font_atlas_luna.zim +ui_atlas_luna.meta +ui_atlas_luna.zim +/font_atlas_luna.cpp +/font_atlas_luna.h +/font_atlas_luna.png +/ui_preview.png +/font_preview.png +ppge_atlas_luna.meta +ppge_atlas_luna.zim diff --git a/.gitmodules b/.gitmodules index 9b47b350a0..753fa6e7ab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,3 +34,10 @@ [submodule "zstd"] path = ext/zstd url = https://github.com/facebook/zstd.git +[submodule "SDL/macOS"] + path = SDL/macOS + url = https://github.com/hrydgard/ppsspp-mac-sdl +[submodule "ppsspp-debugger"] + path = assets/debugger + url = https://github.com/unknownbrackets/ppsspp-debugger.git + branch = bundled diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f6b8d105a..4c55b8797a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,15 @@ endif() # Detect CPU from CMAKE configuration. Toolchains should set this up if(CMAKE_SYSTEM_PROCESSOR) - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^aarch64") + if(CMAKE_OSX_ARCHITECTURES) + if("${CMAKE_OSX_ARCHITECTURES}" MATCHES ".*86.*") + set(X86_DEVICE ON) + set(X86_64_DEVICE ON) + endif() + if("${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm64") + set(ARM64 ON) + endif() + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^aarch64") set(ARM64 ON) elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm64") # M1 Mac @@ -94,10 +102,14 @@ if(ANDROID OR WIN32 OR (UNIX AND NOT ARM_NO_VULKAN)) endif() list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) -if(NOT ((ARM64 AND MACOSX) OR IOS)) +if(NOT IOS) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/sdl) endif() +if(MACOSX AND NOT USE_SYSTEM_LIBSDL2) + set(SDL2_LIBRARY ${CMAKE_SOURCE_DIR}/SDL/macOS/SDL2.framework) +endif() + include(ccache) include(GNUInstallDirs) @@ -139,6 +151,9 @@ option(USE_MINIUPNPC "Build with miniUPnPc support" ON) option(USE_SYSTEM_SNAPPY "Dynamically link against system snappy" ${USE_SYSTEM_SNAPPY}) option(USE_SYSTEM_FFMPEG "Dynamically link against system FFMPEG" ${USE_SYSTEM_FFMPEG}) option(USE_SYSTEM_LIBZIP "Dynamically link against system libzip" ${USE_SYSTEM_LIBZIP}) +option(USE_SYSTEM_LIBSDL2 "Dynamically link against system SDL2" ON) +option(USE_SYSTEM_LIBPNG "Dynamically link against system libpng" ON) +option(USE_SYSTEM_ZSTD "Dynamically link against system zstd" ${USE_SYSTEM_ZSTD}) option(USE_ASAN "Use address sanitizer" OFF) option(USE_UBSAN "Use undefined behaviour sanitizer" OFF) @@ -340,9 +355,8 @@ if(NOT MSVC) if(IOS) elseif(APPLE AND NOT CMAKE_CROSSCOMPILING) - set(MACOSX_VERSION_MIN "10.8") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=${MACOSX_VERSION_MIN}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${MACOSX_VERSION_MIN} -stdlib=libc++ -U__STRICT_ANSI__") + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -U__STRICT_ANSI__") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") elseif(NOT ANDROID) # TODO: See if we can get rid of no-psabi @@ -674,7 +688,6 @@ add_library(Common STATIC Common/LogManager.h Common/LogReporting.cpp Common/LogReporting.h - Common/MakeUnique.h Common/MemArenaAndroid.cpp Common/MemArenaDarwin.cpp Common/MemArenaPosix.cpp @@ -959,7 +972,9 @@ else() set(PNG_REQUIRED_VERSION 1.6) endif() +if(USE_SYSTEM_LIBPNG) find_package(PNG ${PNG_REQUIRED_VERSION}) +endif() if(PNG_FOUND) include_directories(${PNG_INCLUDE_DIRS}) else() @@ -1634,6 +1649,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Debugger/WebSocket/GPUBufferSubscriber.h Core/Debugger/WebSocket/GPURecordSubscriber.cpp Core/Debugger/WebSocket/GPURecordSubscriber.h + Core/Debugger/WebSocket/GPUStatsSubscriber.cpp + Core/Debugger/WebSocket/GPUStatsSubscriber.h Core/Debugger/WebSocket/HLESubscriber.cpp Core/Debugger/WebSocket/HLESubscriber.h Core/Debugger/WebSocket/InputBroadcaster.cpp @@ -1960,8 +1977,7 @@ if(ANDROID) endif() endif() -set(CoreExtraLibs ${CoreExtraLibs} armips libzstd_static) -include_directories(ext/zstd/lib) +set(CoreExtraLibs ${CoreExtraLibs} armips) # needed for VK_USE_PLATFORM_XCB_KHR only #if(VULKAN AND NOT WIN32) @@ -1979,7 +1995,18 @@ if(WIN32) endif() if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND AND NOT APPLE) - set(OPENGL_LIBRARIES OpenGL::OpenGL) + set(OPENGL_LIBRARIES OpenGL::OpenGL) +endif() + +if(USE_SYSTEM_ZSTD) + find_package(ZSTD REQUIRED) + target_include_directories(${CoreLibName} PRIVATE ${ZSTD_INCLUDE_DIR}) + target_link_libraries(${CoreLibName} ${ZSTD_LIBRARY}) +else() + set(ZSTD_BUILD_PROGRAMS OFF CACHE BOOL "we don't need zstd programs" FORCE) + add_subdirectory(ext/zstd/build/cmake EXCLUDE_FROM_ALL) + set(CoreExtraLibs ${CoreExtraLibs} libzstd_static) + include_directories(ext/zstd/lib) endif() target_link_libraries(${CoreLibName} Common native kirk cityhash sfmt19937 xbrz xxhash ${GlslangLibs} @@ -2103,7 +2130,6 @@ set(WindowsFiles Windows/WindowsAudio.h Windows/WASAPIStream.cpp Windows/WASAPIStream.h - Windows/Debugger/CPURegsInterface.h Windows/Debugger/BreakpointWindow.cpp Windows/Debugger/BreakpointWindow.h Windows/Debugger/DumpMemoryWindow.cpp @@ -2159,18 +2185,16 @@ set(WindowsFiles Windows/InputBox.h Windows/InputDevice.cpp Windows/InputDevice.h + Windows/W32Util/ContextMenu.h + Windows/W32Util/ContextMenu.h Windows/W32Util/DialogManager.cpp Windows/W32Util/DialogManager.h Windows/W32Util/Misc.cpp Windows/W32Util/Misc.h - Windows/W32Util/PropertySheet.cpp - Windows/W32Util/PropertySheet.h Windows/W32Util/ShellUtil.cpp Windows/W32Util/ShellUtil.h Windows/W32Util/TabControl.cpp Windows/W32Util/TabControl.h - Windows/W32Util/PropertySheet.cpp - Windows/W32Util/PropertySheet.h Windows/WindowsHost.cpp Windows/WindowsHost.h Windows/MainWindow.cpp @@ -2181,7 +2205,6 @@ set(WindowsFiles Windows/RawInput.h Windows/TouchInputHandler.cpp Windows/TouchInputHandler.h - Windows/XPTheme.h Windows/XinputDevice.cpp Windows/XinputDevice.h Windows/main.cpp @@ -2203,6 +2226,9 @@ endif() set(NativeAssets android/assets/ui_atlas_luna.zim android/assets/ui_atlas_luna.meta + android/assets/font_atlas_luna.zim + android/assets/font_atlas_luna.meta + assets/debugger assets/lang assets/shaders assets/Roboto-Condensed.ttf @@ -2300,6 +2326,8 @@ if(TargetBin) set(ICON_PATH_ABS ${CMAKE_CURRENT_SOURCE_DIR}/icons/ppsspp.icns) set(MACOSX_BUNDLE_ICON_FILE ppsspp.icns) set_source_files_properties(${ICON_PATH_ABS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + set(MACOSX_BUNDLE_BUNDLE_NAME PPSSPP) + set(MACOSX_BUNDLE_GUI_IDENTIFIER org.ppsspp.ppsspp) endif() # TODO: there must a native way to copy these. @@ -2308,19 +2336,22 @@ if(TargetBin) file(GLOB_RECURSE FLASH0_FILES assets/flash0/*) file(GLOB_RECURSE LANG_FILES assets/lang/*) file(GLOB_RECURSE SHADER_FILES assets/shaders/*) + file(GLOB_RECURSE DEBUGGER_FILES assets/debugger/*) if(NOT IOS) - set_source_files_properties(${NativeAssets} PROPERTIES MACOSX_PACKAGE_LOCATION "MacOS/assets") - set_source_files_properties(${FLASH0_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "MacOS/assets/flash0/font") - set_source_files_properties(${LANG_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "MacOS/assets/lang") - set_source_files_properties(${SHADER_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "MacOS/assets/shaders") + set_source_files_properties(${NativeAssets} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets") + set_source_files_properties(${FLASH0_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets/flash0/font") + set_source_files_properties(${LANG_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets/lang") + set_source_files_properties(${SHADER_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets/shaders") + set_source_files_properties(${DEBUGGER_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets/debugger") endif() if(IOS) - add_executable(${TargetBin} MACOSX_BUNDLE ${ICON_PATH_ABS} ${NativeAssets} ${SHADER_FILES} ${FLASH0_FILES} ${LANG_FILES} ${NativeAppSource} "ios/Settings.bundle" "ios/Launch Screen.storyboard" "MoltenVK/iOS/Frameworks") + add_executable(${TargetBin} MACOSX_BUNDLE ${ICON_PATH_ABS} ${NativeAssets} ${SHADER_FILES} ${DEBUGGER_FILES} ${FLASH0_FILES} ${LANG_FILES} ${NativeAppSource} "ios/Settings.bundle" "ios/Launch Screen.storyboard") + file(INSTALL "${CMAKE_SOURCE_DIR}/ext/vulkan/iOS/Frameworks/libMoltenVK.dylib" DESTINATION "${CMAKE_BINARY_DIR}/PPSSPP.app/Frameworks/") else() - add_executable(${TargetBin} MACOSX_BUNDLE ${ICON_PATH_ABS} ${NativeAssets} ${SHADER_FILES} ${FLASH0_FILES} ${LANG_FILES} ${NativeAppSource}) - file(INSTALL "${CMAKE_SOURCE_DIR}/MoltenVK/macOS/Frameworks/libMoltenVK.dylib" DESTINATION "${CMAKE_BINARY_DIR}/PPSSPPSDL.app/Contents/Frameworks/") + add_executable(${TargetBin} MACOSX_BUNDLE ${ICON_PATH_ABS} ${NativeAssets} ${SHADER_FILES} ${DEBUGGER_FILES} ${FLASH0_FILES} ${LANG_FILES} ${NativeAppSource}) + file(INSTALL "${CMAKE_SOURCE_DIR}/ext/vulkan/macOS/Frameworks/libMoltenVK.dylib" DESTINATION "${CMAKE_BINARY_DIR}/PPSSPPSDL.app/Contents/Frameworks/") if(TARGET SDL2::SDL2 AND NOT USING_QT_UI) add_custom_command(TARGET ${TargetBin} POST_BUILD COMMAND /bin/bash "${CMAKE_SOURCE_DIR}/SDL/macbundle.sh" "${CMAKE_BINARY_DIR}/PPSSPPSDL.app") elseif(USING_QT_UI) @@ -2379,7 +2410,7 @@ if(IOS) MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/ios/PPSSPP-Info.plist" RESOURCE "ios/Launch Screen.storyboard" RESOURCE "ios/Settings.bundle" - RESOURCE "MoltenVK/iOS/Frameworks" + RESOURCE "ext/vulkan/iOS/Frameworks" XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "iPhone/iPad" XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 73d28a1eb1..d6e3d241e0 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1659,6 +1659,7 @@ void ARMXEmitter::VMOV_neon(u32 Size, ARMReg Vd, ARMReg Rt, int lane) case I_16: opc1 = lane >> 1; opc2 = 1 | ((lane & 1) << 1); break; case I_32: case F_32: + _assert_msg_((Size & I_UNSIGNED) == 0, "Cannot use UNSIGNED for I_32 or F_32"); opc1 = lane & 1; break; default: @@ -1671,7 +1672,7 @@ void ARMXEmitter::VMOV_neon(u32 Size, ARMReg Vd, ARMReg Rt, int lane) ARMReg Src = Rt; ARMReg Dest = Vd; - _dbg_assert_msg_((Size & (I_UNSIGNED | I_SIGNED | F_32)) != 0, "Must specify I_SIGNED or I_UNSIGNED in VMOV, unless F_32"); + _dbg_assert_msg_((Size & (I_UNSIGNED | I_SIGNED | F_32 | I_32)) != 0, "Must specify I_SIGNED or I_UNSIGNED in VMOV, unless F_32/I_32"); int U = (Size & I_UNSIGNED) ? (1 << 23) : 0; Write32(condition | (0xE1 << 20) | U | (opc1 << 21) | EncodeVn(Src) | (Dest << 12) | (0xB << 8) | (opc2 << 5) | (1 << 4)); diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index ef63de1054..4bd66ab227 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -514,7 +514,6 @@ - diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index ddfbebd6e3..6de8798435 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -45,7 +45,6 @@ - diff --git a/Common/ConsoleListener.cpp b/Common/ConsoleListener.cpp index de957012a3..7a3ebd92d1 100644 --- a/Common/ConsoleListener.cpp +++ b/Common/ConsoleListener.cpp @@ -69,6 +69,10 @@ ConsoleListener::ConsoleListener() : bHidden(true) bUseColor = false; #elif defined(_MSC_VER) bUseColor = false; +#elif defined(__APPLE__) + // Xcode builtin terminal used for debugging does not support colours. + // Fortunately it can be detected with a TERM env variable. + bUseColor = isatty(fileno(stdout)) && getenv("TERM") != NULL; #else bUseColor = isatty(fileno(stdout)); #endif diff --git a/Common/Data/Text/Parsers.cpp b/Common/Data/Text/Parsers.cpp index b6ce78d958..f4ee6a97c7 100644 --- a/Common/Data/Text/Parsers.cpp +++ b/Common/Data/Text/Parsers.cpp @@ -3,11 +3,10 @@ #include #include "Common/Data/Text/Parsers.h" - #include "Common/StringUtils.h" // Not strictly a parser... -void NiceSizeFormat(size_t size, char *out, size_t bufSize) { +void NiceSizeFormat(uint64_t size, char *out, size_t bufSize) { const char *sizes[] = { "B","KB","MB","GB","TB","PB","EB" }; int s = 0; int frac = 0; @@ -23,6 +22,12 @@ void NiceSizeFormat(size_t size, char *out, size_t bufSize) { snprintf(out, bufSize, "%3.1f %s", f, sizes[s]); } +std::string NiceSizeFormat(uint64_t size) { + char buffer[16]; + NiceSizeFormat(size, buffer, sizeof(buffer)); + return std::string(buffer); +} + bool Version::ParseVersionString(std::string str) { if (str.empty()) return false; diff --git a/Common/Data/Text/Parsers.h b/Common/Data/Text/Parsers.h index 35b3839cfb..d30190b127 100644 --- a/Common/Data/Text/Parsers.h +++ b/Common/Data/Text/Parsers.h @@ -71,4 +71,6 @@ static bool TryParse(const std::string &str, N *const output) { return false; } -void NiceSizeFormat(size_t size, char *out, size_t bufSize); +void NiceSizeFormat(uint64_t size, char *out, size_t bufSize); + +std::string NiceSizeFormat(uint64_t size); diff --git a/Common/Data/Text/WrapText.cpp b/Common/Data/Text/WrapText.cpp index c88628acf5..8d661d285e 100644 --- a/Common/Data/Text/WrapText.cpp +++ b/Common/Data/Text/WrapText.cpp @@ -78,12 +78,15 @@ std::string WordWrapper::Wrapped() { bool WordWrapper::WrapBeforeWord() { if (flags_ & FLAG_WRAP_TEXT) { if (x_ + wordWidth_ > maxW_ && !out_.empty()) { - if (IsShy(out_[out_.size() - 1])) { + if (IsShy(lastChar_)) { // Soft hyphen, replace it with a real hyphen since we wrapped at it. // TODO: There's an edge case here where the hyphen might not fit. - out_[out_.size() - 1] = '-'; + out_[out_.size() - 2] = '-'; + out_[out_.size() - 1] = '\n'; + } else { + out_ += "\n"; } - out_ += "\n"; + lastChar_ = '\n'; lastLineStart_ = out_.size(); x_ = 0.0f; forceEarlyWrap_ = false; @@ -91,20 +94,32 @@ bool WordWrapper::WrapBeforeWord() { } } if (flags_ & FLAG_ELLIPSIZE_TEXT) { - if (x_ + wordWidth_ > maxW_) { - if (!out_.empty() && IsSpace(out_[out_.size() - 1])) { - out_[out_.size() - 1] = '.'; - out_ += ".."; - } else { - out_ += "..."; + const bool hasEllipsis = out_.size() > 3 && out_.substr(out_.size() - 3) == "..."; + if (x_ + wordWidth_ > maxW_ && !hasEllipsis) { + AddEllipsis(); + skipNextWord_ = true; + if ((flags_ & FLAG_WRAP_TEXT) == 0) { + scanForNewline_ = true; } - x_ = maxW_; } } return false; } -void WordWrapper::AppendWord(int endIndex, bool addNewline) { +void WordWrapper::AddEllipsis() { + if (!out_.empty() && IsSpaceOrShy(lastChar_)) { + UTF8 utf(out_.c_str(), (int)out_.size()); + utf.bwd(); + out_.resize(utf.byteIndex()); + out_ += "..."; + } else { + out_ += "..."; + } + lastChar_ = '.'; + x_ += ellipsisWidth_; +} + +void WordWrapper::AppendWord(int endIndex, int lastChar, bool addNewline) { int lastWordStartIndex = lastIndex_; if (WrapBeforeWord()) { // Advance to the first non-whitespace UTF-8 character in the following word (if any) to prevent starting the new line with a whitespace @@ -118,24 +133,47 @@ void WordWrapper::AppendWord(int endIndex, bool addNewline) { } } + lastEllipsisIndex_ = -1; + if (skipNextWord_) { + lastIndex_ = endIndex; + return; + } + // This will include the newline. - if (x_ < maxW_) { + if (x_ <= maxW_) { out_.append(str_ + lastWordStartIndex, str_ + endIndex); } else { scanForNewline_ = true; } if (addNewline && (flags_ & FLAG_WRAP_TEXT)) { out_ += "\n"; + lastChar_ = '\n'; lastLineStart_ = out_.size(); scanForNewline_ = false; + x_ = 0.0f; } else { // We may have appended a newline - check. - size_t pos = out_.substr(lastLineStart_).find_last_of("\n"); + size_t pos = out_.find_last_of("\n"); if (pos != out_.npos) { - lastLineStart_ += pos; + lastLineStart_ = pos + 1; + } + + if (lastChar == -1 && !out_.empty()) { + UTF8 utf(out_.c_str(), (int)out_.size()); + utf.bwd(); + lastChar = utf.next(); + } + lastChar_ = lastChar; + + if (lastLineStart_ != out_.size()) { + // To account for kerning around spaces, we recalculate the entire line width. + x_ = MeasureWidth(out_.c_str() + lastLineStart_, out_.size() - lastLineStart_); + } else { + x_ = 0.0f; } } lastIndex_ = endIndex; + wordWidth_ = 0.0f; } void WordWrapper::Wrap() { @@ -164,10 +202,12 @@ void WordWrapper::Wrap() { // Is this a newline character, hard wrapping? if (c == '\n') { + if (skipNextWord_) { + lastIndex_ = beforeIndex; + skipNextWord_ = false; + } // This will include the newline character. - AppendWord(afterIndex, false); - x_ = 0.0f; - wordWidth_ = 0.0f; + AppendWord(afterIndex, c, false); // We wrapped once, so stop forcing. forceEarlyWrap_ = false; scanForNewline_ = false; @@ -183,19 +223,47 @@ void WordWrapper::Wrap() { // Measure the entire word for kerning purposes. May not be 100% perfect. float newWordWidth = MeasureWidth(str_ + lastIndex_, afterIndex - lastIndex_); - // Is this the end of a word (space)? - if (wordWidth_ > 0.0f && IsSpace(c)) { - AppendWord(afterIndex, false); - // To account for kerning around spaces, we recalculate the entire line width. - x_ = MeasureWidth(out_.c_str() + lastLineStart_, out_.size() - lastLineStart_); - wordWidth_ = 0.0f; + // Is this the end of a word (space)? We'll also output up to a soft hyphen. + if (wordWidth_ > 0.0f && IsSpaceOrShy(c)) { + AppendWord(afterIndex, c, false); + skipNextWord_ = false; continue; } + // We're scanning for the next word. + if (skipNextWord_) + continue; + + if ((flags_ & FLAG_ELLIPSIZE_TEXT) != 0 && wordWidth_ > 0.0f && lastEllipsisIndex_ == -1) { + float checkX = x_; + // If we allow wrapping, assume we'll wrap as needed. + if ((flags_ & FLAG_WRAP_TEXT) != 0 && x_ >= maxW_) { + checkX = 0; + } + + // If we can only fit an ellipsis, time to output and skip ahead. + // Ignore x for newWordWidth, because we might wrap. + if (checkX + wordWidth_ + ellipsisWidth_ <= maxW_ && newWordWidth + ellipsisWidth_ > maxW_) { + lastEllipsisIndex_ = beforeIndex; + continue; + } + } + // Can the word fit on a line even all by itself so far? if (wordWidth_ > 0.0f && newWordWidth > maxW_) { - // Nope. Let's drop what's there so far onto its own line. - if (x_ > 0.0f && x_ + wordWidth_ > maxW_ && beforeIndex > lastIndex_) { + // If we had a good place for an ellipsis, let's do that. + if (lastEllipsisIndex_ != -1) { + AppendWord(lastEllipsisIndex_, -1, false); + AddEllipsis(); + skipNextWord_ = true; + if ((flags_ & FLAG_WRAP_TEXT) == 0) { + scanForNewline_ = true; + } + continue; + } + + // Doesn't fit. Let's drop what's there so far onto its own line. + if (x_ > 0.0f && x_ + wordWidth_ > maxW_ && beforeIndex > lastIndex_ && (flags_ & FLAG_WRAP_TEXT) != 0) { // Let's put as many characters as will fit on the previous line. // This word can't fit on one line even, so it's going to be cut into pieces anyway. // Better to avoid huge gaps, in that case. @@ -209,30 +277,22 @@ void WordWrapper::Wrap() { continue; } // Now, add the word so far (without this latest character) and break. - AppendWord(beforeIndex, true); - if (lastLineStart_ != out_.size()) { - x_ = MeasureWidth(out_.c_str() + lastLineStart_, out_.size() - lastLineStart_); - } else { - x_ = 0.0f; - } - wordWidth_ = 0.0f; + AppendWord(beforeIndex, -1, true); forceEarlyWrap_ = false; // The current character will be handled as part of the next word. continue; } if ((flags_ & FLAG_ELLIPSIZE_TEXT) && wordWidth_ > 0.0f && x_ + newWordWidth + ellipsisWidth_ > maxW_) { - if ((flags_ & FLAG_WRAP_TEXT) == 0) { + if ((flags_ & FLAG_WRAP_TEXT) == 0 && x_ + wordWidth_ + ellipsisWidth_ <= maxW_) { // Now, add the word so far (without this latest character) and show the ellipsis. - AppendWord(beforeIndex, true); - if (lastLineStart_ != out_.size()) { - x_ = MeasureWidth(out_.c_str() + lastLineStart_, out_.size() - lastLineStart_); - } else { - x_ = 0.0f; - } - wordWidth_ = 0.0f; + AppendWord(lastEllipsisIndex_ != -1 ? lastEllipsisIndex_ : beforeIndex, -1, false); + AddEllipsis(); forceEarlyWrap_ = false; - // The current character will be handled as part of the next word. + skipNextWord_ = true; + if ((flags_ & FLAG_WRAP_TEXT) == 0) { + scanForNewline_ = true; + } continue; } } @@ -242,12 +302,10 @@ void WordWrapper::Wrap() { // Is this the end of a word via punctuation / CJK? if (wordWidth_ > 0.0f && (IsCJK(c) || IsPunctuation(c) || forceEarlyWrap_)) { // CJK doesn't require spaces, so we treat each letter as its own word. - AppendWord(afterIndex, false); - x_ += wordWidth_; - wordWidth_ = 0.0f; + AppendWord(afterIndex, c, false); } } // Now insert the rest of the string - the last word. - AppendWord((int)len, false); + AppendWord((int)len, 0, false); } diff --git a/Common/Data/Text/WrapText.h b/Common/Data/Text/WrapText.h index 554210e3cf..bcdd19a6fd 100644 --- a/Common/Data/Text/WrapText.h +++ b/Common/Data/Text/WrapText.h @@ -14,12 +14,16 @@ protected: virtual float MeasureWidth(const char *str, size_t bytes) = 0; void Wrap(); bool WrapBeforeWord(); - void AppendWord(int endIndex, bool addNewline); + void AppendWord(int endIndex, int lastChar, bool addNewline); + void AddEllipsis(); static bool IsCJK(uint32_t c); static bool IsPunctuation(uint32_t c); static bool IsSpace(uint32_t c); static bool IsShy(uint32_t c); + static bool IsSpaceOrShy(uint32_t c) { + return IsSpace(c) || IsShy(c); + } const char *const str_; const float maxW_; @@ -28,8 +32,12 @@ protected: // Index of last output / start of current word. int lastIndex_ = 0; + // Ideal place to put an ellipsis if we run out of space. + int lastEllipsisIndex_ = -1; // Index of last line start. size_t lastLineStart_ = 0; + // Last character written to out_. + int lastChar_ = 0; // Position the current word starts at. float x_ = 0.0f; // Most recent width of word since last index. @@ -40,4 +48,6 @@ protected: bool forceEarlyWrap_ = false; // Skip all characters until the next newline. bool scanForNewline_ = false; + // Skip the next word, replaced with ellipsis. + bool skipNextWord_ = false; }; diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index a9b3498118..3202e3f3c6 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -753,6 +753,27 @@ bool Move(const Path &srcFilename, const Path &destFilename) { } } +bool MoveIfFast(const Path &srcFilename, const Path &destFilename) { + if (srcFilename.Type() == PathType::CONTENT_URI && destFilename.Type() == PathType::CONTENT_URI && srcFilename.CanNavigateUp() && destFilename.CanNavigateUp()) { + if (srcFilename.GetFilename() == destFilename.GetFilename()) { + Path srcParent = srcFilename.NavigateUp(); + Path dstParent = destFilename.NavigateUp(); + return Android_MoveFile(srcFilename.ToString(), srcParent.ToString(), dstParent.ToString()) == StorageError::SUCCESS; + // If failed, fall through and try other ways. + } else { + // We do not handle simultaneous renames here. + return false; + } + } + + if (srcFilename.Type() != destFilename.Type()) { + // No way it's gonna work. + return false; + } + + return Rename(srcFilename, destFilename); +} + // Returns the size of file (64bit) // TODO: Add a way to return an error. uint64_t GetFileSize(const Path &filename) { @@ -813,6 +834,8 @@ uint64_t GetFileSize(FILE *f) { // Should error here. return 0; } + if (size == -1) + return 0; return size; #else #ifdef _WIN32 @@ -835,6 +858,8 @@ uint64_t GetFileSize(FILE *f) { // Should error here. return 0; } + if (size == -1) + return 0; return size; #endif } @@ -1062,7 +1087,7 @@ bool ReadFileToString(bool text_file, const Path &filename, std::string &str) { // Warning: some files, like in /sys/, may return a fixed size like 4096. size_t len = (size_t)File::GetFileSize(f); bool success; - if (len == -1) { + if (len == 0) { size_t totalSize = 1024; size_t totalRead = 0; do { diff --git a/Common/File/FileUtil.h b/Common/File/FileUtil.h index ae77f859a1..af11e5035c 100644 --- a/Common/File/FileUtil.h +++ b/Common/File/FileUtil.h @@ -112,6 +112,9 @@ bool Copy(const Path &srcFilename, const Path &destFilename); // returns false, otherwise returns true. bool Move(const Path &srcFilename, const Path &destFilename); +// Move file, but only if it can be done quickly (rename or similar). +bool MoveIfFast(const Path &srcFilename, const Path &destFilename); + // creates an empty file filename, returns true on success bool CreateEmptyFile(const Path &filename); diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index 3a44c0c0f8..cbfc5f9099 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -87,7 +87,7 @@ Path Path::operator /(const std::string &subdir) const { return Path(path_); } std::string fullPath = path_; - if (subdir.front() != '/') { + if (subdir.front() != '/' && (fullPath.empty() || fullPath.back() != '/')) { fullPath += "/"; } fullPath += subdir; diff --git a/Common/File/PathBrowser.cpp b/Common/File/PathBrowser.cpp index 64dff74057..32487d4163 100644 --- a/Common/File/PathBrowser.cpp +++ b/Common/File/PathBrowser.cpp @@ -198,7 +198,7 @@ std::string PathBrowser::GetFriendlyPath() const { std::string root = GetSysDirectory(DIRECTORY_MEMSTICK_ROOT).ToVisualString(); if (startsWith(str, root)) { - return std::string("ms:/") + str.substr(root.size()); + return std::string("ms:") + str.substr(root.size()); } #if PPSSPP_PLATFORM(LINUX) || PPSSPP_PLATFORM(MAC) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 3c8e87b74d..f8625cef09 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -245,6 +245,9 @@ D3D11DrawContext::D3D11DrawContext(ID3D11Device *device, ID3D11DeviceContext *de // Seems like a fair approximation... caps_.dualSourceBlend = featureLevel_ >= D3D_FEATURE_LEVEL_10_0; caps_.depthClampSupported = featureLevel_ >= D3D_FEATURE_LEVEL_10_0; + // SV_ClipDistance# seems to be 10+. + caps_.clipDistanceSupported = featureLevel_ >= D3D_FEATURE_LEVEL_10_0; + caps_.cullDistanceSupported = featureLevel_ >= D3D_FEATURE_LEVEL_10_0; caps_.depthRangeMinusOneToOne = false; caps_.framebufferBlitSupported = false; @@ -1345,7 +1348,7 @@ void D3D11DrawContext::BindSamplerStates(int start, int count, SamplerState **st _assert_(start + count <= ARRAY_SIZE(samplers)); for (int i = 0; i < count; i++) { D3D11SamplerState *samp = (D3D11SamplerState *)states[i]; - samplers[i] = samp->ss; + samplers[i] = samp ? samp->ss : nullptr; } context_->PSSetSamplers(start, count, samplers); } diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index 449b74b05c..f277d6ae95 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -530,7 +530,8 @@ public: _assert_(start + count <= MAX_BOUND_TEXTURES); for (int i = 0; i < count; ++i) { D3D9SamplerState *s = static_cast(states[i]); - s->Apply(device_, start + i); + if (s) + s->Apply(device_, start + i); } } void BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) override { diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index ef78271525..6e15b3aa84 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -385,6 +385,7 @@ void CheckGLExtensions() { gl_extensions.OES_texture_float = g_set_gl_extensions.count("GL_OES_texture_float") != 0; gl_extensions.EXT_buffer_storage = g_set_gl_extensions.count("GL_EXT_buffer_storage") != 0; gl_extensions.EXT_clip_cull_distance = g_set_gl_extensions.count("GL_EXT_clip_cull_distance") != 0; + gl_extensions.APPLE_clip_distance = g_set_gl_extensions.count("GL_APPLE_clip_distance") != 0; #if defined(__ANDROID__) // On Android, incredibly, this is not consistently non-zero! It does seem to have the same value though. diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index 6a8f15beb0..8efd782a14 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -94,6 +94,9 @@ struct GLExtensions { // ARM bool ARM_shader_framebuffer_fetch; + // APPLE + bool APPLE_clip_distance; + // EGL bool EGL_NV_system_time; bool EGL_NV_coverage_sample; diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index a2d66b9a86..438a62ac21 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -17,6 +17,13 @@ #include "GLRenderManager.h" #include "DataFormatGL.h" +// These are the same value, alias for simplicity. +#if defined(GL_CLIP_DISTANCE0_EXT) && !defined(GL_CLIP_DISTANCE0) +#define GL_CLIP_DISTANCE0 GL_CLIP_DISTANCE0_EXT +#elif !defined(GL_CLIP_DISTANCE0) +#define GL_CLIP_DISTANCE0 0x3000 +#endif + static constexpr int TEXCACHE_NAME_CACHE_SIZE = 16; #if PPSSPP_PLATFORM(IOS) @@ -760,18 +767,6 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last #endif } - /* -#ifndef USING_GLES2 - if (g_Config.iInternalResolution == 0) { - glLineWidth(std::max(1, (int)(renderWidth_ / 480))); - glPointSize(std::max(1.0f, (float)(renderWidth_ / 480.f))); - } else { - glLineWidth(g_Config.iInternalResolution); - glPointSize((float)g_Config.iInternalResolution); - } -#endif - */ - if (first && gl_extensions.ARB_vertex_array_object) { glBindVertexArray(globalVAO_); } @@ -798,6 +793,7 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last int logicOp = -1; bool logicEnabled = false; #endif + bool clipDistance0Enabled = false; GLuint blendEqColor = (GLuint)-1; GLuint blendEqAlpha = (GLuint)-1; @@ -1106,6 +1102,13 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last { if (curProgram != c.program.program) { glUseProgram(c.program.program->program); + if (c.program.program->use_clip_distance0 != clipDistance0Enabled) { + if (c.program.program->use_clip_distance0) + glEnable(GL_CLIP_DISTANCE0); + else + glDisable(GL_CLIP_DISTANCE0); + clipDistance0Enabled = c.program.program->use_clip_distance0; + } curProgram = c.program.program; } CHECK_GL_ERROR_IF_DEBUG(); @@ -1116,7 +1119,7 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last // TODO: Add fast path for glBindVertexBuffer GLRInputLayout *layout = c.bindVertexBuffer.inputLayout; GLuint buf = c.bindVertexBuffer.buffer ? c.bindVertexBuffer.buffer->buffer_ : 0; - _dbg_assert_(!c.bindVertexBuffer.buffer->Mapped()); + _dbg_assert_(!c.bindVertexBuffer.buffer || !c.bindVertexBuffer.buffer->Mapped()); if (buf != curArrayBuffer) { glBindBuffer(GL_ARRAY_BUFFER, buf); curArrayBuffer = buf; @@ -1340,6 +1343,8 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last glDisable(GL_COLOR_LOGIC_OP); } #endif + if (clipDistance0Enabled) + glDisable(GL_CLIP_DISTANCE0); if ((colorMask & 15) != 15) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); CHECK_GL_ERROR_IF_DEBUG(); diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index b4c3378739..110704bab2 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -119,6 +119,7 @@ public: std::vector semantics_; std::vector queries_; std::vector initialize_; + bool use_clip_distance0 = false; struct UniformInfo { int loc_; @@ -422,13 +423,14 @@ public: // not be an active render pass. GLRProgram *CreateProgram( std::vector shaders, std::vector semantics, std::vector queries, - std::vector initalizers, bool supportDualSource) { + std::vector initalizers, bool supportDualSource, bool useClipDistance0) { GLRInitStep step{ GLRInitStepType::CREATE_PROGRAM }; _assert_(shaders.size() <= ARRAY_SIZE(step.create_program.shaders)); step.create_program.program = new GLRProgram(); step.create_program.program->semantics_ = semantics; step.create_program.program->queries_ = queries; step.create_program.program->initialize_ = initalizers; + step.create_program.program->use_clip_distance0 = useClipDistance0; step.create_program.support_dual_source = supportDualSource; _assert_msg_(shaders.size() > 0, "Can't create a program with zero shaders"); for (size_t i = 0; i < shaders.size(); i++) { diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 1c7a19792d..a9ab5151d0 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -534,6 +534,13 @@ OpenGLContext::OpenGLContext() { caps_.framebufferBlitSupported = gl_extensions.NV_framebuffer_blit || gl_extensions.ARB_framebuffer_object; caps_.framebufferDepthBlitSupported = caps_.framebufferBlitSupported; caps_.depthClampSupported = gl_extensions.ARB_depth_clamp; + if (gl_extensions.IsGLES) { + caps_.clipDistanceSupported = gl_extensions.EXT_clip_cull_distance || gl_extensions.APPLE_clip_distance; + caps_.cullDistanceSupported = gl_extensions.EXT_clip_cull_distance; + } else { + caps_.clipDistanceSupported = gl_extensions.VersionGEThan(3, 0); + caps_.cullDistanceSupported = gl_extensions.ARB_cull_distance; + } // Interesting potential hack for emulating GL_DEPTH_CLAMP (use a separate varying, force depth in fragment shader): // This will induce a performance penalty on many architectures though so a blanket enable of this @@ -1162,7 +1169,7 @@ bool OpenGLPipeline::LinkShaders() { std::vector initialize; for (int i = 0; i < MAX_TEXTURE_SLOTS; ++i) initialize.push_back({ &samplerLocs_[i], 0, i }); - program_ = render_->CreateProgram(linkShaders, semantics, queries, initialize, false); + program_ = render_->CreateProgram(linkShaders, semantics, queries, initialize, false, false); return true; } diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index 8d8c27c49d..9b6e64afac 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -56,6 +56,7 @@ const char *hlsl_preamble_vs = "#define vec4 float4\n" "#define ivec2 int2\n" "#define ivec4 int4\n" +"#define mat2 float2x2\n" "#define mat4 float4x4\n" "#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) vec3(x, x, x)\n" diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index c9c53b5503..dc6d6600a2 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -574,12 +574,12 @@ void VulkanContext::ChooseDevice(int physical_device) { deviceFeatures_.enabled = {}; // Enable a few safe ones if they are available. deviceFeatures_.enabled.dualSrcBlend = deviceFeatures_.available.dualSrcBlend; - deviceFeatures_.enabled.largePoints = deviceFeatures_.available.largePoints; - deviceFeatures_.enabled.wideLines = deviceFeatures_.available.wideLines; deviceFeatures_.enabled.logicOp = deviceFeatures_.available.logicOp; deviceFeatures_.enabled.depthClamp = deviceFeatures_.available.depthClamp; deviceFeatures_.enabled.depthBounds = deviceFeatures_.available.depthBounds; deviceFeatures_.enabled.samplerAnisotropy = deviceFeatures_.available.samplerAnisotropy; + deviceFeatures_.enabled.shaderClipDistance = deviceFeatures_.available.shaderClipDistance; + deviceFeatures_.enabled.shaderCullDistance = deviceFeatures_.available.shaderCullDistance; // For easy wireframe mode, someday. deviceFeatures_.enabled.fillModeNonSolid = deviceFeatures_.available.fillModeNonSolid; diff --git a/Common/GPU/Vulkan/VulkanImage.cpp b/Common/GPU/Vulkan/VulkanImage.cpp index 9ef3060ec9..e9ddee5f3b 100644 --- a/Common/GPU/Vulkan/VulkanImage.cpp +++ b/Common/GPU/Vulkan/VulkanImage.cpp @@ -138,7 +138,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, VulkanDeviceAllocator *all case VK_IMAGE_LAYOUT_GENERAL: TransitionImageLayout2(cmd, image_, 0, numMips, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, initialLayout, - VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT); break; default: @@ -207,48 +207,65 @@ void VulkanTexture::ClearMip(VkCommandBuffer cmd, int mip, uint32_t value) { } // Low-quality mipmap generation by bilinear blit, but works okay. -void VulkanTexture::GenerateMip(VkCommandBuffer cmd, int mip, VkImageLayout imageLayout) { - _assert_msg_(mip != 0, "Cannot generate the first level"); - _assert_msg_(mip < numMips_, "Cannot generate mipmaps past the maximum created (%d vs %d)", mip, numMips_); - VkImageBlit blit{}; - blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blit.srcSubresource.layerCount = 1; - blit.srcSubresource.mipLevel = mip - 1; - blit.srcOffsets[1].x = std::max(width_ >> (mip - 1), 1); - blit.srcOffsets[1].y = std::max(height_ >> (mip - 1), 1); - blit.srcOffsets[1].z = 1; +void VulkanTexture::GenerateMips(VkCommandBuffer cmd, int firstMipToGenerate, bool fromCompute) { + _assert_msg_(firstMipToGenerate > 0, "Cannot generate the first level"); - blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blit.dstSubresource.layerCount = 1; - blit.dstSubresource.mipLevel = mip; - blit.dstOffsets[1].x = std::max(width_ >> mip, 1); - blit.dstOffsets[1].y = std::max(height_ >> mip, 1); - blit.dstOffsets[1].z = 1; + // Transition the pre-set levels to GENERAL. + TransitionImageLayout2(cmd, image_, 0, firstMipToGenerate, VK_IMAGE_ASPECT_COLOR_BIT, + fromCompute ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_GENERAL, + fromCompute ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + fromCompute ? VK_ACCESS_SHADER_WRITE_BIT : VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_READ_BIT); - // TODO: We could do better with the image transitions - would be enough with one per level - // for the memory barrier, then one final one for the whole stack when done. This function - // currently doesn't have a global enough view, though. - // We should also coalesce barriers across multiple texture uploads in a frame and all kinds of other stuff, but... + // Do the same with the uninitialized levels. + TransitionImageLayout2(cmd, image_, firstMipToGenerate, numMips_ - firstMipToGenerate, + VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_GENERAL, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT); - TransitionImageLayout2(cmd, image_, mip - 1, 1, VK_IMAGE_ASPECT_COLOR_BIT, - imageLayout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); + // Now we can blit and barrier the whole pipeline. + for (int mip = firstMipToGenerate; mip < numMips_; mip++) { + VkImageBlit blit{}; + blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit.srcSubresource.layerCount = 1; + blit.srcSubresource.mipLevel = mip - 1; + blit.srcOffsets[1].x = std::max(width_ >> (mip - 1), 1); + blit.srcOffsets[1].y = std::max(height_ >> (mip - 1), 1); + blit.srcOffsets[1].z = 1; - vkCmdBlitImage(cmd, image_, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image_, imageLayout, 1, &blit, VK_FILTER_LINEAR); + blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit.dstSubresource.layerCount = 1; + blit.dstSubresource.mipLevel = mip; + blit.dstOffsets[1].x = std::max(width_ >> mip, 1); + blit.dstOffsets[1].y = std::max(height_ >> mip, 1); + blit.dstOffsets[1].z = 1; - TransitionImageLayout2(cmd, image_, mip - 1, 1, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, imageLayout, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); + // TODO: We could do better with the image transitions - would be enough with one per level + // for the memory barrier, then one final one for the whole stack when done. This function + // currently doesn't have a global enough view, though. + // We should also coalesce barriers across multiple texture uploads in a frame and all kinds of other stuff, but... + + vkCmdBlitImage(cmd, image_, VK_IMAGE_LAYOUT_GENERAL, image_, VK_IMAGE_LAYOUT_GENERAL, 1, &blit, VK_FILTER_LINEAR); + + TransitionImageLayout2(cmd, image_, mip, 1, VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); + } } -void VulkanTexture::EndCreate(VkCommandBuffer cmd, bool vertexTexture, VkImageLayout layout) { +void VulkanTexture::EndCreate(VkCommandBuffer cmd, bool vertexTexture, VkPipelineStageFlags prevStage, VkImageLayout layout) { TransitionImageLayout2(cmd, image_, 0, numMips_, VK_IMAGE_ASPECT_COLOR_BIT, layout, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, vertexTexture ? VK_PIPELINE_STAGE_VERTEX_SHADER_BIT : VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT); + prevStage, vertexTexture ? VK_PIPELINE_STAGE_VERTEX_SHADER_BIT : VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + prevStage == VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ? VK_ACCESS_SHADER_WRITE_BIT : VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT); } void VulkanTexture::Touch() { diff --git a/Common/GPU/Vulkan/VulkanImage.h b/Common/GPU/Vulkan/VulkanImage.h index be0367aee0..6d45c7ac63 100644 --- a/Common/GPU/Vulkan/VulkanImage.h +++ b/Common/GPU/Vulkan/VulkanImage.h @@ -21,8 +21,9 @@ public: bool CreateDirect(VkCommandBuffer cmd, VulkanDeviceAllocator *allocator, int w, int h, int numMips, VkFormat format, VkImageLayout initialLayout, VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, const VkComponentMapping *mapping = nullptr); void ClearMip(VkCommandBuffer cmd, int mip, uint32_t value); void UploadMip(VkCommandBuffer cmd, int mip, int mipWidth, int mipHeight, VkBuffer buffer, uint32_t offset, size_t rowLength); // rowLength is in pixels - void GenerateMip(VkCommandBuffer cmd, int mip, VkImageLayout imageLayout); - void EndCreate(VkCommandBuffer cmd, bool vertexTexture = false, VkImageLayout layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + + void GenerateMips(VkCommandBuffer cmd, int firstMipToGenerate, bool fromCompute); + void EndCreate(VkCommandBuffer cmd, bool vertexTexture, VkPipelineStageFlags prevStage, VkImageLayout layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // When loading mips from compute shaders, you need to pass VK_IMAGE_LAYOUT_GENERAL to the above function. // In addition, ignore UploadMip and GenerateMip, and instead use GetViewForMip. Make sure to delete the returned views when used. diff --git a/Common/GPU/Vulkan/VulkanLoader.cpp b/Common/GPU/Vulkan/VulkanLoader.cpp index 3666fc72e7..351668f0f8 100644 --- a/Common/GPU/Vulkan/VulkanLoader.cpp +++ b/Common/GPU/Vulkan/VulkanLoader.cpp @@ -62,7 +62,6 @@ PFN_vkBindImageMemory vkBindImageMemory; PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; -PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; PFN_vkQueueBindSparse vkQueueBindSparse; PFN_vkCreateFence vkCreateFence; PFN_vkDestroyFence vkDestroyFence; @@ -586,7 +585,6 @@ void VulkanLoadDeviceFunctions(VkDevice device, const VulkanExtensions &enabledE LOAD_DEVICE_FUNC(device, vkGetBufferMemoryRequirements); LOAD_DEVICE_FUNC(device, vkGetImageMemoryRequirements); LOAD_DEVICE_FUNC(device, vkGetImageSparseMemoryRequirements); - LOAD_DEVICE_FUNC(device, vkGetPhysicalDeviceSparseImageFormatProperties); LOAD_DEVICE_FUNC(device, vkQueueBindSparse); LOAD_DEVICE_FUNC(device, vkCreateFence); LOAD_DEVICE_FUNC(device, vkDestroyFence); diff --git a/Common/GPU/Vulkan/VulkanLoader.h b/Common/GPU/Vulkan/VulkanLoader.h index 5808ae8076..c91c896a82 100644 --- a/Common/GPU/Vulkan/VulkanLoader.h +++ b/Common/GPU/Vulkan/VulkanLoader.h @@ -68,7 +68,6 @@ extern PFN_vkBindImageMemory vkBindImageMemory; extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; -extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; extern PFN_vkQueueBindSparse vkQueueBindSparse; extern PFN_vkCreateFence vkCreateFence; extern PFN_vkDestroyFence vkDestroyFence; diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index e19c085b09..dd80120ade 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -158,7 +158,7 @@ void CreateImage(VulkanContext *vulkan, VkCommandBuffer cmd, VKRImage &img, int TransitionImageLayout2(cmd, img.image, 0, 1, aspects, VK_IMAGE_LAYOUT_UNDEFINED, initialLayout, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, dstStage, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, dstStage, 0, dstAccessMask); img.layout = initialLayout; @@ -178,7 +178,7 @@ VulkanRenderManager::VulkanRenderManager(VulkanContext *vulkan) : vulkan_(vulkan for (int i = 0; i < inflightFramesAtStart_; i++) { VkCommandPoolCreateInfo cmd_pool_info = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO }; cmd_pool_info.queueFamilyIndex = vulkan_->GetGraphicsQueueFamilyIndex(); - cmd_pool_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + cmd_pool_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT; VkResult res = vkCreateCommandPool(vulkan_->GetDevice(), &cmd_pool_info, nullptr, &frameData_[i].cmdPoolInit); _dbg_assert_(res == VK_SUCCESS); res = vkCreateCommandPool(vulkan_->GetDevice(), &cmd_pool_info, nullptr, &frameData_[i].cmdPoolMain); @@ -534,6 +534,7 @@ VkCommandBuffer VulkanRenderManager::GetInitCmd() { nullptr, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT }; + vkResetCommandPool(vulkan_->GetDevice(), frameData.cmdPoolInit, 0); VkResult res = vkBeginCommandBuffer(frameData.initCmd, &begin); if (res != VK_SUCCESS) { return VK_NULL_HANDLE; @@ -873,7 +874,8 @@ bool VulkanRenderManager::InitDepthStencilBuffer(VkCommandBuffer cmd) { TransitionImageLayout2(cmd, depth_.image, 0, 1, aspectMask, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, - VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 0, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); VkImageViewCreateInfo depth_view_info = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO }; @@ -1196,6 +1198,7 @@ void VulkanRenderManager::BeginSubmitFrame(int frame) { _assert_msg_(res == VK_SUCCESS, "vkAcquireNextImageKHR failed! result=%s", VulkanResultToString(res)); } + vkResetCommandPool(vulkan_->GetDevice(), frameData.cmdPoolMain, 0); VkCommandBufferBeginInfo begin{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; res = vkBeginCommandBuffer(frameData.mainCmd, &begin); @@ -1355,6 +1358,7 @@ void VulkanRenderManager::EndSyncFrame(int frame) { nullptr, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT }; + vkResetCommandPool(vulkan_->GetDevice(), frameData.cmdPoolMain, 0); VkResult res = vkBeginCommandBuffer(frameData.mainCmd, &begin); _assert_(res == VK_SUCCESS); diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 807d7ecebf..45f1eef7a0 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -545,6 +545,8 @@ private: VkDescriptorPool descriptorPool; }; + VkResult RecreateDescriptorPool(FrameData *frame); + FrameData frame_[VulkanContext::MAX_INFLIGHT_FRAMES]{}; VulkanPushBuffer *push_ = nullptr; @@ -650,7 +652,7 @@ VulkanTexture *VKContext::GetNullTexture() { } } nullTexture_->UploadMip(cmdInit, 0, w, h, bindBuf, bindOffset, w); - nullTexture_->EndCreate(cmdInit); + nullTexture_->EndCreate(cmdInit, false, VK_PIPELINE_STAGE_TRANSFER_BIT); } else { nullTexture_->Touch(); } @@ -735,6 +737,7 @@ bool VKTexture::Create(VkCommandBuffer cmd, VulkanPushBuffer *push, const Textur ERROR_LOG(G3D, "Failed to create VulkanTexture: %dx%dx%d fmt %d, %d levels", width_, height_, depth_, (int)vulkanFormat, mipLevels_); return false; } + VkImageLayout layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; if (desc.initData.size()) { int w = width_; int h = height_; @@ -758,11 +761,12 @@ bool VKTexture::Create(VkCommandBuffer cmd, VulkanPushBuffer *push, const Textur d = (d + 1) / 2; } // Generate the rest of the mips automatically. - for (; i < mipLevels_; i++) { - vkTex_->GenerateMip(cmd, i, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + if (i < mipLevels_) { + vkTex_->GenerateMips(cmd, i, false); + layout = VK_IMAGE_LAYOUT_GENERAL; } } - vkTex_->EndCreate(cmd, false); + vkTex_->EndCreate(cmd, false, VK_PIPELINE_STAGE_TRANSFER_BIT, layout); return true; } @@ -776,6 +780,8 @@ VKContext::VKContext(VulkanContext *vulkan, bool splitSubmit) caps_.multiViewport = vulkan->GetDeviceFeatures().enabled.multiViewport != 0; caps_.dualSourceBlend = vulkan->GetDeviceFeatures().enabled.dualSrcBlend != 0; caps_.depthClampSupported = vulkan->GetDeviceFeatures().enabled.depthClamp != 0; + caps_.clipDistanceSupported = vulkan->GetDeviceFeatures().enabled.shaderClipDistance != 0; + caps_.cullDistanceSupported = vulkan->GetDeviceFeatures().enabled.shaderCullDistance != 0; caps_.framebufferBlitSupported = true; caps_.framebufferCopySupported = true; caps_.framebufferDepthBlitSupported = false; // Can be checked for. @@ -812,6 +818,11 @@ VKContext::VKContext(VulkanContext *vulkan, bool splitSubmit) } else if (caps_.vendor == GPUVendor::VENDOR_INTEL) { // Workaround for Intel driver bug. TODO: Re-enable after some driver version bugs_.Infest(Bugs::DUAL_SOURCE_BLENDING_BROKEN); + } else if (caps_.vendor == GPUVendor::VENDOR_ARM) { + // These GPUs (up to some certain hardware version?) have a bug where draws where gl_Position.w == .z + // corrupt the depth buffer. This is easily worked around by simply scaling Z down a tiny bit when this case + // is detected. See: https://github.com/hrydgard/ppsspp/issues/11937 + bugs_.Infest(Bugs::EQUAL_WZ_CORRUPTS_DEPTH); } caps_.deviceID = deviceProps.deviceID; @@ -820,18 +831,6 @@ VKContext::VKContext(VulkanContext *vulkan, bool splitSubmit) queue_ = vulkan->GetGraphicsQueue(); queueFamilyIndex_ = vulkan->GetGraphicsQueueFamilyIndex(); - VkDescriptorPoolSize dpTypes[2]; - dpTypes[0].descriptorCount = 200; - dpTypes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; - dpTypes[1].descriptorCount = 200 * MAX_BOUND_TEXTURES; - dpTypes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - - VkDescriptorPoolCreateInfo dp{ VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO }; - dp.flags = 0; // Don't want to mess around with individually freeing these, let's go dynamic each frame. - dp.maxSets = 4096; // 200 textures per frame was not enough for the UI. - dp.pPoolSizes = dpTypes; - dp.poolSizeCount = ARRAY_SIZE(dpTypes); - VkCommandPoolCreateInfo p{ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO }; p.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT; p.queueFamilyIndex = vulkan->GetGraphicsQueueFamilyIndex(); @@ -839,7 +838,7 @@ VKContext::VKContext(VulkanContext *vulkan, bool splitSubmit) for (int i = 0; i < VulkanContext::MAX_INFLIGHT_FRAMES; i++) { VkBufferUsageFlags usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT; frame_[i].pushBuffer = new VulkanPushBuffer(vulkan_, 1024 * 1024, usage); - VkResult res = vkCreateDescriptorPool(device_, &dp, nullptr, &frame_[i].descriptorPool); + VkResult res = RecreateDescriptorPool(&frame_[i]); _assert_(res == VK_SUCCESS); } @@ -951,6 +950,28 @@ void VKContext::WipeQueue() { renderManager_.Wipe(); } +VkResult VKContext::RecreateDescriptorPool(FrameData *frame) { + if (frame->descriptorPool) { + WARN_LOG(G3D, "Reallocating Draw desc pool"); + vulkan_->Delete().QueueDeleteDescriptorPool(frame->descriptorPool); + frame->descSets_.clear(); + } + + VkDescriptorPoolSize dpTypes[2]; + dpTypes[0].descriptorCount = 200; + dpTypes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + dpTypes[1].descriptorCount = 200 * MAX_BOUND_TEXTURES; + dpTypes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + + VkDescriptorPoolCreateInfo dp{ VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO }; + dp.flags = 0; // Don't want to mess around with individually freeing these, let's go dynamic each frame. + dp.maxSets = 4096; // 200 textures per frame was not enough for the UI. + dp.pPoolSizes = dpTypes; + dp.poolSizeCount = ARRAY_SIZE(dpTypes); + + return vkCreateDescriptorPool(device_, &dp, nullptr, &frame->descriptorPool); +} + VkDescriptorSet VKContext::GetOrCreateDescriptorSet(VkBuffer buf) { DescriptorSetKey key; @@ -973,7 +994,17 @@ VkDescriptorSet VKContext::GetOrCreateDescriptorSet(VkBuffer buf) { alloc.pSetLayouts = &descriptorSetLayout_; alloc.descriptorSetCount = 1; VkResult res = vkAllocateDescriptorSets(device_, &alloc, &descSet); - _assert_(VK_SUCCESS == res); + if (res != VK_SUCCESS) { + // First, try to reallocate the pool. + res = RecreateDescriptorPool(frame); + alloc.descriptorPool = frame->descriptorPool; + + res = vkAllocateDescriptorSets(device_, &alloc, &descSet); + if (res != VK_SUCCESS) { + ERROR_LOG(G3D, "GetOrCreateDescriptorSet failed: %08x", res); + return VK_NULL_HANDLE; + } + } VkDescriptorBufferInfo bufferDesc; bufferDesc.buffer = buf; @@ -1324,6 +1355,10 @@ void VKContext::Draw(int vertexCount, int offset) { size_t vbBindOffset = push_->Push(vbuf->GetData(), vbuf->GetSize(), &vulkanVbuf); VkDescriptorSet descSet = GetOrCreateDescriptorSet(vulkanUBObuf); + if (descSet == VK_NULL_HANDLE) { + ERROR_LOG(G3D, "GetOrCreateDescriptorSet failed, skipping %s", __FUNCTION__); + return; + } BindCompatiblePipeline(); ApplyDynamicState(); @@ -1340,6 +1375,10 @@ void VKContext::DrawIndexed(int vertexCount, int offset) { size_t ibBindOffset = push_->Push(ibuf->GetData(), ibuf->GetSize(), &vulkanIbuf); VkDescriptorSet descSet = GetOrCreateDescriptorSet(vulkanUBObuf); + if (descSet == VK_NULL_HANDLE) { + ERROR_LOG(G3D, "GetOrCreateDescriptorSet failed, skipping %s", __FUNCTION__); + return; + } BindCompatiblePipeline(); ApplyDynamicState(); @@ -1352,6 +1391,10 @@ void VKContext::DrawUP(const void *vdata, int vertexCount) { uint32_t ubo_offset = (uint32_t)curPipeline_->PushUBO(push_, vulkan_, &vulkanUBObuf); VkDescriptorSet descSet = GetOrCreateDescriptorSet(vulkanUBObuf); + if (descSet == VK_NULL_HANDLE) { + ERROR_LOG(G3D, "GetOrCreateDescriptorSet failed, skipping %s", __FUNCTION__); + return; + } BindCompatiblePipeline(); ApplyDynamicState(); @@ -1413,8 +1456,6 @@ std::vector VKContext::GetFeatureList() const { AddFeature(features, "depthBounds", available.depthBounds, enabled.depthBounds); AddFeature(features, "depthClamp", available.depthClamp, enabled.depthClamp); AddFeature(features, "fillModeNonSolid", available.fillModeNonSolid, enabled.fillModeNonSolid); - AddFeature(features, "largePoints", available.largePoints, enabled.largePoints); - AddFeature(features, "wideLines", available.wideLines, enabled.wideLines); AddFeature(features, "pipelineStatisticsQuery", available.pipelineStatisticsQuery, enabled.pipelineStatisticsQuery); AddFeature(features, "samplerAnisotropy", available.samplerAnisotropy, enabled.samplerAnisotropy); AddFeature(features, "textureCompressionBC", available.textureCompressionBC, enabled.textureCompressionBC); diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index 312bd91312..fd5d056e7c 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -69,30 +69,20 @@ bool DataFormatIsDepthStencil(DataFormat fmt) { bool RefCountedObject::Release() { if (refcount_ > 0 && refcount_ < 10000) { - refcount_--; - if (refcount_ == 0) { + if (--refcount_ == 0) { delete this; return true; } - } - else { - _dbg_assert_msg_(false, "Refcount (%d) invalid for object %p - corrupt?", refcount_, this); + } else { + _dbg_assert_msg_(false, "Refcount (%d) invalid for object %p - corrupt?", refcount_.load(), this); } return false; } bool RefCountedObject::ReleaseAssertLast() { - _dbg_assert_msg_(refcount_ == 1, "RefCountedObject: Expected to be the last reference, but isn't!"); - if (refcount_ > 0 && refcount_ < 10000) { - refcount_--; - if (refcount_ == 0) { - delete this; - return true; - } - } else { - ERROR_LOG(G3D, "Refcount (%d) invalid for object %p - corrupt?", refcount_, this); - } - return false; + bool released = Release(); + _dbg_assert_msg_(released, "RefCountedObject: Expected to be the last reference, but isn't!"); + return released; } diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index f3454df2e7..9d3264e090 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -316,6 +317,7 @@ public: BROKEN_NAN_IN_CONDITIONAL = 4, COLORWRITEMASK_BROKEN_WITH_DEPTHTEST = 5, BROKEN_FLAT_IN_SHADER = 6, + EQUAL_WZ_CORRUPTS_DEPTH = 7, }; protected: @@ -324,7 +326,9 @@ protected: class RefCountedObject { public: - RefCountedObject() : refcount_(1) {} + RefCountedObject() { + refcount_ = 1; + } virtual ~RefCountedObject() {} void AddRef() { refcount_++; } @@ -332,7 +336,7 @@ public: bool ReleaseAssertLast(); private: - int refcount_; + std::atomic refcount_; }; template @@ -517,6 +521,8 @@ struct DeviceCaps { bool dualSourceBlend; bool logicOpSupported; bool depthClampSupported; + bool clipDistanceSupported; + bool cullDistanceSupported; bool framebufferCopySupported; bool framebufferBlitSupported; bool framebufferDepthCopySupported; diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index d762636c5b..969de62629 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -342,9 +342,9 @@ void RingbufferLogListener::Log(const LogMessage &message) { #ifdef _WIN32 void OutputDebugStringUTF8(const char *p) { - wchar_t temp[4096]; + wchar_t temp[16384*4]; - int len = std::min(4095, (int)strlen(p)); + int len = std::min(16383*4, (int)strlen(p)); int size = (int)MultiByteToWideChar(CP_UTF8, 0, p, len, NULL, 0); MultiByteToWideChar(CP_UTF8, 0, p, len, temp, size); temp[size] = 0; diff --git a/Common/MakeUnique.h b/Common/MakeUnique.h deleted file mode 100644 index 367e37f52b..0000000000 --- a/Common/MakeUnique.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include - -// Custom make_unique so that C++14 support will not be necessary for compilation -template::value, int>::type = 0> -std::unique_ptr make_unique(Args&&... args) -{ - return std::unique_ptr(new T(std::forward(args)...)); -} - -template::value && std::extent::value == 0, int>::type = 0> -std::unique_ptr make_unique(std::size_t size) -{ - return std::unique_ptr(new typename std::remove_extent::type[size]()); -} - -template::value != 0, int>::type = 0> -void make_unique(Args&&... args) = delete; - - -template::value, int>::type = 0> - std::unique_ptr make_unique_default_init() -{ - return std::unique_ptr(new T); -} - -template::value && std::extent::value == 0, int>::type = 0> - std::unique_ptr make_unique_default_init(std::size_t size) -{ - return std::unique_ptr(new typename std::remove_extent::type[size]); -} - -template::value != 0, int>::type = 0> - void make_unique_default_init(Args&&... args) = delete; diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index 142f41426d..fec31dabb8 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -597,9 +597,10 @@ std::shared_ptr Downloader::StartDownloadWithCallback( void Downloader::Update() { restart: for (size_t i = 0; i < downloads_.size(); i++) { - if (downloads_[i]->Progress() == 1.0f || downloads_[i]->Failed()) { - downloads_[i]->RunCallback(); - downloads_[i]->Join(); + auto &dl = downloads_[i]; + if (dl->Done()) { + dl->RunCallback(); + dl->Join(); downloads_.erase(downloads_.begin() + i); goto restart; } diff --git a/Common/Net/NetBuffer.cpp b/Common/Net/NetBuffer.cpp index 331f24b55e..4309f18d05 100644 --- a/Common/Net/NetBuffer.cpp +++ b/Common/Net/NetBuffer.cpp @@ -73,12 +73,16 @@ bool Buffer::ReadAllWithProgress(int fd, int knownSize, float *progress, float * return true; } else if (retval < 0) { #if PPSSPP_PLATFORM(WINDOWS) - if (WSAGetLastError() != WSAEWOULDBLOCK) + if (WSAGetLastError() != WSAEWOULDBLOCK) { #else - if (errno != EWOULDBLOCK) + if (errno != EWOULDBLOCK) { #endif ERROR_LOG(IO, "Error reading from buffer: %i", retval); - return false; + return false; + } + + // Just try again on a would block error, not a real error. + continue; } char *p = Append((size_t)retval); memcpy(p, &buf[0], retval); diff --git a/Common/Render/DrawBuffer.cpp b/Common/Render/DrawBuffer.cpp index f1e3e9baa8..92ee2d057d 100644 --- a/Common/Render/DrawBuffer.cpp +++ b/Common/Render/DrawBuffer.cpp @@ -14,11 +14,10 @@ #include "Common/Log.h" #include "Common/StringUtils.h" -DrawBuffer::DrawBuffer() : count_(0), atlas(0) { +DrawBuffer::DrawBuffer() { verts_ = new Vertex[MAX_VERTS]; fontscalex = 1.0f; fontscaley = 1.0f; - inited_ = false; } DrawBuffer::~DrawBuffer() { @@ -482,7 +481,9 @@ float AtlasWordWrapper::MeasureWidth(const char *str, size_t bytes) { } void DrawBuffer::MeasureTextCount(FontID font, const char *text, int count, float *w, float *h) { - const AtlasFont *atlasfont = atlas->getFont(font); + const AtlasFont *atlasfont = fontAtlas_->getFont(font); + if (!atlasfont) + atlasfont = atlas->getFont(font); if (!atlasfont) { *w = 0.0f; *h = 0.0f; @@ -533,7 +534,9 @@ void DrawBuffer::MeasureTextRect(FontID font_id, const char *text, int count, co std::string toMeasure = std::string(text, count); int wrap = align & (FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT); if (wrap) { - const AtlasFont *font = atlas->getFont(font_id); + const AtlasFont *font = fontAtlas_->getFont(font_id); + if (!font) + font = atlas->getFont(font_id); if (!font) { *w = 0.0f; *h = 0.0f; @@ -582,7 +585,9 @@ void DrawBuffer::DrawTextRect(FontID font, const char *text, float x, float y, f std::string toDraw = text; int wrap = align & (FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT); - const AtlasFont *atlasfont = atlas->getFont(font); + const AtlasFont *atlasfont = fontAtlas_->getFont(font); + if (!atlasfont) + atlasfont = atlas->getFont(font); if (wrap && atlasfont) { AtlasWordWrapper wrapper(*atlasfont, fontscalex, toDraw.c_str(), w, wrap); toDraw = wrapper.Wrapped(); @@ -624,7 +629,9 @@ void DrawBuffer::DrawText(FontID font, const char *text, float x, float y, Color } } - const AtlasFont *atlasfont = atlas->getFont(font); + const AtlasFont *atlasfont = fontAtlas_->getFont(font); + if (!atlasfont) + atlasfont = atlas->getFont(font); if (!atlasfont) return; unsigned int cval; diff --git a/Common/Render/DrawBuffer.h b/Common/Render/DrawBuffer.h index 6190f3ecba..8565b78a12 100644 --- a/Common/Render/DrawBuffer.h +++ b/Common/Render/DrawBuffer.h @@ -110,6 +110,10 @@ public: atlas = _atlas; } const Atlas *GetAtlas() const { return atlas; } + void SetFontAtlas(const Atlas *_atlas) { + fontAtlas_ = _atlas; + } + const Atlas *GetFontAtlas() const { return fontAtlas_; } bool MeasureImage(ImageID atlas_image, float *w, float *h); void DrawImage(ImageID atlas_image, float x, float y, float scale, Color color = COLOR(0xFFFFFF), int align = ALIGN_TOPLEFT); @@ -189,18 +193,18 @@ private: float alpha_ = 1.0f; std::vector alphaStack_; - Draw::DrawContext *draw_; - Draw::Buffer *vbuf_; - Draw::Pipeline *pipeline_; + Draw::DrawContext *draw_ = nullptr; + Draw::Buffer *vbuf_ = nullptr; + Draw::Pipeline *pipeline_ = nullptr; Vertex *verts_; - int count_; - const Atlas *atlas; + int count_ = 0; + const Atlas *atlas = nullptr; + const Atlas *fontAtlas_ = nullptr; - bool inited_; - float fontscalex; - float fontscaley; + bool inited_ = false; + float fontscalex = 1.0f; + float fontscaley = 1.0f; float curZ_ = 0.0f; }; - diff --git a/Common/Render/Text/draw_text_android.cpp b/Common/Render/Text/draw_text_android.cpp index 7d0a1e2623..2f55694c5a 100644 --- a/Common/Render/Text/draw_text_android.cpp +++ b/Common/Render/Text/draw_text_android.cpp @@ -125,8 +125,8 @@ void TextDrawerAndroid::MeasureStringRect(const char *str, size_t len, const Bou auto env = getEnv(); std::vector lines; SplitString(toMeasure, '\n', lines); - float total_w = 0.0f; - float total_h = 0.0f; + int total_w = 0; + int total_h = 0; for (size_t i = 0; i < lines.size(); i++) { CacheKey key{ lines[i], fontHash_ }; @@ -148,13 +148,13 @@ void TextDrawerAndroid::MeasureStringRect(const char *str, size_t len, const Bou } entry->lastUsedFrame = frameCount_; - if (total_w < entry->width * fontScaleX_) { - total_w = entry->width * fontScaleX_; + if (total_w < entry->width) { + total_w = entry->width; } - total_h += entry->height * fontScaleY_; + total_h += entry->height; } - *w = total_w * dpiScale_; - *h = total_h * dpiScale_; + *w = total_w * fontScaleX_ * dpiScale_; + *h = total_h * fontScaleY_ * dpiScale_; } void TextDrawerAndroid::DrawStringBitmap(std::vector &bitmapData, TextStringEntry &entry, Draw::DataFormat texFormat, const char *str, int align) { diff --git a/Common/Render/Text/draw_text_uwp.cpp b/Common/Render/Text/draw_text_uwp.cpp index d12a41275f..5d68e77610 100644 --- a/Common/Render/Text/draw_text_uwp.cpp +++ b/Common/Render/Text/draw_text_uwp.cpp @@ -264,8 +264,8 @@ void TextDrawerUWP::MeasureStringRect(const char *str, size_t len, const Bounds std::vector lines; SplitString(toMeasure, '\n', lines); - float total_w = 0.0f; - float total_h = 0.0f; + int total_w = 0; + int total_h = 0; for (size_t i = 0; i < lines.size(); i++) { CacheKey key{ lines[i], fontHash_ }; @@ -304,13 +304,13 @@ void TextDrawerUWP::MeasureStringRect(const char *str, size_t len, const Bounds } entry->lastUsedFrame = frameCount_; - if (total_w < entry->width * fontScaleX_) { - total_w = entry->width * fontScaleX_; + if (total_w < entry->width) { + total_w = entry->width; } - total_h += entry->height * fontScaleY_; + total_h += entry->height; } - *w = total_w * dpiScale_; - *h = total_h * dpiScale_; + *w = total_w * fontScaleX_ * dpiScale_; + *h = total_h * fontScaleY_ * dpiScale_; } void TextDrawerUWP::DrawStringBitmap(std::vector &bitmapData, TextStringEntry &entry, Draw::DataFormat texFormat, const char *str, int align) { diff --git a/Common/Render/Text/draw_text_win.cpp b/Common/Render/Text/draw_text_win.cpp index 1a79f6a192..d5af5af762 100644 --- a/Common/Render/Text/draw_text_win.cpp +++ b/Common/Render/Text/draw_text_win.cpp @@ -166,8 +166,8 @@ void TextDrawerWin32::MeasureStringRect(const char *str, size_t len, const Bound std::vector lines; SplitString(toMeasure, '\n', lines); - float total_w = 0.0f; - float total_h = 0.0f; + int total_w = 0; + int total_h = 0; for (size_t i = 0; i < lines.size(); i++) { CacheKey key{ lines[i], fontHash_ }; @@ -187,15 +187,15 @@ void TextDrawerWin32::MeasureStringRect(const char *str, size_t len, const Bound } entry->lastUsedFrame = frameCount_; - if (total_w < entry->width * fontScaleX_) { - total_w = entry->width * fontScaleX_; + if (total_w < entry->width) { + total_w = entry->width; } int h = i == lines.size() - 1 ? entry->height : metrics.tmHeight + metrics.tmExternalLeading; - total_h += h * fontScaleY_; + total_h += h; } - *w = total_w * dpiScale_; - *h = total_h * dpiScale_; + *w = total_w * fontScaleX_ * dpiScale_; + *h = total_h * fontScaleY_ * dpiScale_; } void TextDrawerWin32::DrawStringBitmap(std::vector &bitmapData, TextStringEntry &entry, Draw::DataFormat texFormat, const char *str, int align) { diff --git a/Common/Serialize/Serializer.cpp b/Common/Serialize/Serializer.cpp index 6000328a75..6b36fb2167 100644 --- a/Common/Serialize/Serializer.cpp +++ b/Common/Serialize/Serializer.cpp @@ -106,10 +106,19 @@ void PointerWrap::DoVoid(void *data, int size) { (*ptr) += size; } +// Not exactly sane but might catch some corrupt files. +const int MAX_SANE_STRING_LENGTH = 1024 * 1024; + void Do(PointerWrap &p, std::string &x) { int stringLen = (int)x.length() + 1; Do(p, stringLen); + if (stringLen < 0 || stringLen > MAX_SANE_STRING_LENGTH) { + WARN_LOG(SAVESTATE, "Savestate failure: bad stringLen %d", stringLen); + p.SetError(PointerWrap::ERROR_FAILURE); + return; + } + switch (p.mode) { case PointerWrap::MODE_READ: x = (char*)*p.ptr; break; case PointerWrap::MODE_WRITE: memcpy(*p.ptr, x.c_str(), stringLen); break; @@ -123,6 +132,12 @@ void Do(PointerWrap &p, std::wstring &x) { int stringLen = sizeof(wchar_t) * ((int)x.length() + 1); Do(p, stringLen); + if (stringLen < 0 || stringLen > MAX_SANE_STRING_LENGTH) { + WARN_LOG(SAVESTATE, "Savestate failure: bad stringLen %d", stringLen); + p.SetError(PointerWrap::ERROR_FAILURE); + return; + } + auto read = [&]() { std::wstring r; // In case unaligned, use memcpy. @@ -144,6 +159,12 @@ void Do(PointerWrap &p, std::u16string &x) { int stringLen = sizeof(char16_t) * ((int)x.length() + 1); Do(p, stringLen); + if (stringLen < 0 || stringLen > MAX_SANE_STRING_LENGTH) { + WARN_LOG(SAVESTATE, "Savestate failure: bad stringLen %d", stringLen); + p.SetError(PointerWrap::ERROR_FAILURE); + return; + } + auto read = [&]() { std::u16string r; // In case unaligned, use memcpy. diff --git a/Common/System/System.h b/Common/System/System.h index 09560191e0..bc9a340859 100644 --- a/Common/System/System.h +++ b/Common/System/System.h @@ -65,6 +65,7 @@ enum SystemProperty { SYSPROP_HAS_FOLDER_BROWSER, SYSPROP_HAS_IMAGE_BROWSER, SYSPROP_HAS_BACK_BUTTON, + SYSPROP_HAS_KEYBOARD, // Available as Int: SYSPROP_SYSTEMVERSION, diff --git a/Common/UI/Context.cpp b/Common/UI/Context.cpp index d1f9631c69..7bc97f5210 100644 --- a/Common/UI/Context.cpp +++ b/Common/UI/Context.cpp @@ -27,7 +27,7 @@ UIContext::~UIContext() { void UIContext::Init(Draw::DrawContext *thin3d, Draw::Pipeline *uipipe, Draw::Pipeline *uipipenotex, DrawBuffer *uidrawbuffer, DrawBuffer *uidrawbufferTop) { using namespace Draw; draw_ = thin3d; - sampler_ = draw_->CreateSamplerState({ TextureFilter::LINEAR, TextureFilter::LINEAR, TextureFilter::LINEAR }); + sampler_ = draw_->CreateSamplerState({ TextureFilter::LINEAR, TextureFilter::LINEAR, TextureFilter::LINEAR, 0.0, TextureAddressMode::CLAMP_TO_EDGE, TextureAddressMode::CLAMP_TO_EDGE, TextureAddressMode::CLAMP_TO_EDGE, }); ui_pipeline_ = uipipe; ui_pipeline_notex_ = uipipenotex; uidrawbuffer_ = uidrawbuffer; @@ -39,6 +39,11 @@ void UIContext::BeginFrame() { if (!uitexture_) { uitexture_ = CreateTextureFromFile(draw_, "ui_atlas_luna.zim", ImageFileType::ZIM, false); _dbg_assert_msg_(uitexture_, "Failed to load ui_atlas_luna.zim.\n\nPlace it in the directory \"assets\" under your PPSSPP directory."); + if (!fontTexture_) { + fontTexture_ = CreateTextureFromFile(draw_, "font_atlas_luna.zim", ImageFileType::ZIM, false); + if (!fontTexture_) + WARN_LOG(SYSTEM, "Failed to load font_atlas_luna.zim"); + } } uidrawbufferTop_->SetCurZ(0.0f); uidrawbuffer_->SetCurZ(0.0f); @@ -56,7 +61,11 @@ void UIContext::BeginNoTex() { void UIContext::BeginPipeline(Draw::Pipeline *pipeline, Draw::SamplerState *samplerState) { _assert_(pipeline != nullptr); - draw_->BindSamplerStates(0, 1, &samplerState); + // Also clear out any other textures bound. + Draw::SamplerState *samplers[3]{ samplerState }; + draw_->BindSamplerStates(0, 3, samplers); + Draw::Texture *textures[2]{}; + draw_->BindTextures(1, 2, textures); RebindTexture(); UIBegin(pipeline); } @@ -66,6 +75,14 @@ void UIContext::RebindTexture() const { draw_->BindTexture(0, uitexture_->GetTexture()); } +void UIContext::BindFontTexture() const { + // Fall back to the UI texture, in case they have an old atlas. + if (fontTexture_) + draw_->BindTexture(0, fontTexture_->GetTexture()); + else if (uitexture_) + draw_->BindTexture(0, uitexture_->GetTexture()); +} + void UIContext::Flush() { if (uidrawbuffer_) { uidrawbuffer_->Flush(); @@ -186,14 +203,22 @@ void UIContext::MeasureTextRect(const UI::FontStyle &style, float scaleX, float void UIContext::DrawText(const char *str, float x, float y, uint32_t color, int align) { if (!textDrawer_ || (align & FLAG_DYNAMIC_ASCII)) { + // Use the font texture if this font is in that texture instead. + bool useFontTexture = Draw()->GetFontAtlas()->getFont(fontStyle_->atlasFont) != nullptr; + if (useFontTexture) { + Flush(); + BindFontTexture(); + } float sizeFactor = (float)fontStyle_->sizePts / 24.0f; Draw()->SetFontScale(fontScaleX_ * sizeFactor, fontScaleY_ * sizeFactor); Draw()->DrawText(fontStyle_->atlasFont, str, x, y, color, align); + if (useFontTexture) + Flush(); } else { textDrawer_->SetFontScale(fontScaleX_, fontScaleY_); textDrawer_->DrawString(*Draw(), str, x, y, color, align); - RebindTexture(); } + RebindTexture(); } void UIContext::DrawTextShadow(const char *str, float x, float y, uint32_t color, int align) { @@ -204,17 +229,32 @@ void UIContext::DrawTextShadow(const char *str, float x, float y, uint32_t color void UIContext::DrawTextRect(const char *str, const Bounds &bounds, uint32_t color, int align) { if (!textDrawer_ || (align & FLAG_DYNAMIC_ASCII)) { + // Use the font texture if this font is in that texture instead. + bool useFontTexture = Draw()->GetFontAtlas()->getFont(fontStyle_->atlasFont) != nullptr; + if (useFontTexture) { + Flush(); + BindFontTexture(); + } float sizeFactor = (float)fontStyle_->sizePts / 24.0f; Draw()->SetFontScale(fontScaleX_ * sizeFactor, fontScaleY_ * sizeFactor); Draw()->DrawTextRect(fontStyle_->atlasFont, str, bounds.x, bounds.y, bounds.w, bounds.h, color, align); + if (useFontTexture) + Flush(); } else { textDrawer_->SetFontScale(fontScaleX_, fontScaleY_); Bounds rounded = bounds; rounded.x = floorf(rounded.x); rounded.y = floorf(rounded.y); textDrawer_->DrawStringRect(*Draw(), str, rounded, color, align); - RebindTexture(); } + RebindTexture(); +} + +void UIContext::DrawTextShadowRect(const char *str, const Bounds &bounds, uint32_t color, int align) { + uint32_t alpha = (color >> 1) & 0xFF000000; + Bounds shadowBounds(bounds.x+2, bounds.y+2, bounds.w, bounds.h); + DrawTextRect(str, shadowBounds, alpha, align); + DrawTextRect(str, bounds, color, align); } void UIContext::FillRect(const UI::Drawable &drawable, const Bounds &bounds) { diff --git a/Common/UI/Context.h b/Common/UI/Context.h index 29635b74fd..699935628d 100644 --- a/Common/UI/Context.h +++ b/Common/UI/Context.h @@ -59,6 +59,7 @@ public: void Flush(); void RebindTexture() const; + void BindFontTexture() const; // TODO: Support transformed bounds using stencil void PushScissor(const Bounds &bounds); @@ -84,6 +85,7 @@ public: void DrawText(const char *str, float x, float y, uint32_t color, int align = 0); void DrawTextShadow(const char *str, float x, float y, uint32_t color, int align = 0); void DrawTextRect(const char *str, const Bounds &bounds, uint32_t color, int align = 0); + void DrawTextShadowRect(const char *str, const Bounds &bounds, uint32_t color, int align = 0); void FillRect(const UI::Drawable &drawable, const Bounds &bounds); void DrawImageVGradient(ImageID image, uint32_t color1, uint32_t color2, const Bounds &bounds); @@ -111,6 +113,7 @@ private: Draw::Pipeline *ui_pipeline_ = nullptr; Draw::Pipeline *ui_pipeline_notex_ = nullptr; std::unique_ptr uitexture_; + std::unique_ptr fontTexture_; DrawBuffer *uidrawbuffer_ = nullptr; DrawBuffer *uidrawbufferTop_ = nullptr; diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index 33b49683a4..15215148af 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -460,42 +460,30 @@ void PopupMultiChoice::ChoiceCallback(int num) { } } -void PopupMultiChoice::Draw(UIContext &dc) { - Style style = dc.theme->itemStyle; - if (!IsEnabled()) { - style = dc.theme->itemDisabledStyle; - } - int paddingX = 12; - dc.SetFontStyle(dc.theme->uiFont); - - float ignore; - dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, valueText_.c_str(), &textPadding_.right, &ignore, ALIGN_RIGHT | ALIGN_VCENTER); - textPadding_.right += paddingX; - - Choice::Draw(dc); - dc.DrawText(valueText_.c_str(), bounds_.x2() - paddingX, bounds_.centerY(), style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER); +std::string PopupMultiChoice::ValueText() const { + return valueText_; } PopupSliderChoice::PopupSliderChoice(int *value, int minValue, int maxValue, const std::string &text, ScreenManager *screenManager, const std::string &units, LayoutParams *layoutParams) - : Choice(text, "", false, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(1), units_(units), screenManager_(screenManager) { + : AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(1), units_(units), screenManager_(screenManager) { fmt_ = "%i"; OnClick.Handle(this, &PopupSliderChoice::HandleClick); } PopupSliderChoice::PopupSliderChoice(int *value, int minValue, int maxValue, const std::string &text, int step, ScreenManager *screenManager, const std::string &units, LayoutParams *layoutParams) - : Choice(text, "", false, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(step), units_(units), screenManager_(screenManager) { + : AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(step), units_(units), screenManager_(screenManager) { fmt_ = "%i"; OnClick.Handle(this, &PopupSliderChoice::HandleClick); } PopupSliderChoiceFloat::PopupSliderChoiceFloat(float *value, float minValue, float maxValue, const std::string &text, ScreenManager *screenManager, const std::string &units, LayoutParams *layoutParams) - : Choice(text, "", false, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(1.0f), units_(units), screenManager_(screenManager) { + : AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(1.0f), units_(units), screenManager_(screenManager) { fmt_ = "%2.2f"; OnClick.Handle(this, &PopupSliderChoiceFloat::HandleClick); } PopupSliderChoiceFloat::PopupSliderChoiceFloat(float *value, float minValue, float maxValue, const std::string &text, float step, ScreenManager *screenManager, const std::string &units, LayoutParams *layoutParams) - : Choice(text, "", false, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(step), units_(units), screenManager_(screenManager) { + : AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue), step_(step), units_(units), screenManager_(screenManager) { fmt_ = "%2.2f"; OnClick.Handle(this, &PopupSliderChoiceFloat::HandleClick); } @@ -523,14 +511,7 @@ EventReturn PopupSliderChoice::HandleChange(EventParams &e) { return EVENT_DONE; } -void PopupSliderChoice::Draw(UIContext &dc) { - Style style = dc.theme->itemStyle; - if (!IsEnabled()) { - style = dc.theme->itemDisabledStyle; - } - int paddingX = 12; - dc.SetFontStyle(dc.theme->uiFont); - +std::string PopupSliderChoice::ValueText() const { // Always good to have space for Unicode. char temp[256]; if (zeroLabel_.size() && *value_ == 0) { @@ -541,12 +522,7 @@ void PopupSliderChoice::Draw(UIContext &dc) { sprintf(temp, fmt_, *value_); } - float ignore; - dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, temp, &textPadding_.right, &ignore, ALIGN_RIGHT | ALIGN_VCENTER); - textPadding_.right += paddingX; - - Choice::Draw(dc); - dc.DrawText(temp, bounds_.x2() - paddingX, bounds_.centerY(), style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER); + return temp; } EventReturn PopupSliderChoiceFloat::HandleClick(EventParams &e) { @@ -570,14 +546,7 @@ EventReturn PopupSliderChoiceFloat::HandleChange(EventParams &e) { return EVENT_DONE; } -void PopupSliderChoiceFloat::Draw(UIContext &dc) { - Style style = dc.theme->itemStyle; - if (!IsEnabled()) { - style = dc.theme->itemDisabledStyle; - } - int paddingX = 12; - dc.SetFontStyle(dc.theme->uiFont); - +std::string PopupSliderChoiceFloat::ValueText() const { char temp[256]; if (zeroLabel_.size() && *value_ == 0.0f) { strcpy(temp, zeroLabel_.c_str()); @@ -585,12 +554,7 @@ void PopupSliderChoiceFloat::Draw(UIContext &dc) { sprintf(temp, fmt_, *value_); } - float ignore; - dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, temp, &textPadding_.right, &ignore, ALIGN_RIGHT | ALIGN_VCENTER); - textPadding_.right += paddingX; - - Choice::Draw(dc); - dc.DrawText(temp, bounds_.x2() - paddingX, bounds_.centerY(), style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER); + return temp; } EventReturn SliderPopupScreen::OnDecrease(EventParams ¶ms) { @@ -776,7 +740,7 @@ void SliderFloatPopupScreen::OnCompleted(DialogResult result) { } PopupTextInputChoice::PopupTextInputChoice(std::string *value, const std::string &title, const std::string &placeholder, int maxLen, ScreenManager *screenManager, LayoutParams *layoutParams) -: Choice(title, "", false, layoutParams), screenManager_(screenManager), value_(value), placeHolder_(placeholder), maxLen_(maxLen) { +: AbstractChoiceWithValueDisplay(title, layoutParams), screenManager_(screenManager), value_(value), placeHolder_(placeholder), maxLen_(maxLen) { OnClick.Handle(this, &PopupTextInputChoice::HandleClick); } @@ -791,20 +755,8 @@ EventReturn PopupTextInputChoice::HandleClick(EventParams &e) { return EVENT_DONE; } -void PopupTextInputChoice::Draw(UIContext &dc) { - Style style = dc.theme->itemStyle; - if (!IsEnabled()) { - style = dc.theme->itemDisabledStyle; - } - int paddingX = 12; - dc.SetFontStyle(dc.theme->uiFont); - - float ignore; - dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, value_->c_str(), &textPadding_.right, &ignore, ALIGN_RIGHT | ALIGN_VCENTER); - textPadding_.right += paddingX; - - Choice::Draw(dc); - dc.DrawText(value_->c_str(), bounds_.x2() - 12, bounds_.centerY(), style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER); +std::string PopupTextInputChoice::ValueText() const { + return *value_; } EventReturn PopupTextInputChoice::HandleChange(EventParams &e) { @@ -841,7 +793,31 @@ void TextEditPopupScreen::OnCompleted(DialogResult result) { } } -void ChoiceWithValueDisplay::Draw(UIContext &dc) { +void AbstractChoiceWithValueDisplay::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { + const std::string valueText = ValueText(); + int paddingX = 12; + // Assume we want at least 20% of the size for the label, at a minimum. + float availWidth = (horiz.size - paddingX * 2) * 0.8f; + if (availWidth < 0) { + availWidth = 65535.0f; + } + float scale = CalculateValueScale(dc, valueText, availWidth); + Bounds availBounds(0, 0, availWidth, vert.size); + + float valueW, valueH; + dc.MeasureTextRect(dc.theme->uiFont, scale, scale, valueText.c_str(), (int)valueText.size(), availBounds, &valueW, &valueH, ALIGN_RIGHT | ALIGN_VCENTER | FLAG_WRAP_TEXT); + valueW += paddingX; + + // Give the choice itself less space to grow in, so it shrinks if needed. + MeasureSpec horizLabel = horiz; + horizLabel.size -= valueW; + Choice::GetContentDimensionsBySpec(dc, horiz, vert, w, h); + + w += valueW; + h = std::max(h, valueH); +} + +void AbstractChoiceWithValueDisplay::Draw(UIContext &dc) { Style style = dc.theme->itemStyle; if (!IsEnabled()) { style = dc.theme->itemDisabledStyle; @@ -849,6 +825,34 @@ void ChoiceWithValueDisplay::Draw(UIContext &dc) { int paddingX = 12; dc.SetFontStyle(dc.theme->uiFont); + const std::string valueText = ValueText(); + // Assume we want at least 20% of the size for the label, at a minimum. + float availWidth = (bounds_.w - paddingX * 2) * 0.8f; + float scale = CalculateValueScale(dc, valueText, availWidth); + + float w, h; + Bounds availBounds(0, 0, availWidth, bounds_.h); + dc.MeasureTextRect(dc.theme->uiFont, scale, scale, valueText.c_str(), (int)valueText.size(), availBounds, &w, &h, ALIGN_RIGHT | ALIGN_VCENTER | FLAG_WRAP_TEXT); + textPadding_.right = w + paddingX; + + Choice::Draw(dc); + dc.SetFontScale(scale, scale); + Bounds valueBounds(bounds_.x2() - textPadding_.right, bounds_.y, w, bounds_.h); + dc.DrawTextRect(valueText.c_str(), valueBounds, style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER | FLAG_WRAP_TEXT); + dc.SetFontScale(1.0f, 1.0f); +} + +float AbstractChoiceWithValueDisplay::CalculateValueScale(const UIContext &dc, const std::string &valueText, float availWidth) const { + float actualWidth, actualHeight; + Bounds availBounds(0, 0, availWidth, bounds_.h); + dc.MeasureTextRect(dc.theme->uiFont, 1.0f, 1.0f, valueText.c_str(), (int)valueText.size(), availBounds, &actualWidth, &actualHeight); + if (actualWidth > availWidth) { + return std::max(0.8f, availWidth / actualWidth); + } + return 1.0f; +} + +std::string ChoiceWithValueDisplay::ValueText() const { auto category = GetI18NCategory(category_); std::ostringstream valueText; if (translateCallback_ && sValue_) { @@ -862,12 +866,7 @@ void ChoiceWithValueDisplay::Draw(UIContext &dc) { valueText << *iValue_; } - float ignore; - dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, valueText.str().c_str(), &textPadding_.right, &ignore, ALIGN_RIGHT | ALIGN_VCENTER); - textPadding_.right += paddingX; - - Choice::Draw(dc); - dc.DrawText(valueText.str().c_str(), bounds_.x2() - paddingX, bounds_.centerY(), style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER); + return valueText.str(); } } // namespace UI diff --git a/Common/UI/UIScreen.h b/Common/UI/UIScreen.h index 9541309523..63e6440d28 100644 --- a/Common/UI/UIScreen.h +++ b/Common/UI/UIScreen.h @@ -246,12 +246,27 @@ private: int maxLen_; }; +class AbstractChoiceWithValueDisplay : public UI::Choice { +public: + AbstractChoiceWithValueDisplay(const std::string &text, LayoutParams *layoutParams = nullptr) + : Choice(text, layoutParams) { + } + + virtual void Draw(UIContext &dc) override; + void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const override; + +protected: + virtual std::string ValueText() const = 0; + + float CalculateValueScale(const UIContext &dc, const std::string &valueText, float availWidth) const; +}; + // Reads and writes value to determine the current selection. -class PopupMultiChoice : public UI::Choice { +class PopupMultiChoice : public AbstractChoiceWithValueDisplay { public: PopupMultiChoice(int *value, const std::string &text, const char **choices, int minVal, int numChoices, const char *category, ScreenManager *screenManager, UI::LayoutParams *layoutParams = nullptr) - : UI::Choice(text, "", false, layoutParams), value_(value), choices_(choices), minVal_(minVal), numChoices_(numChoices), + : AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), choices_(choices), minVal_(minVal), numChoices_(numChoices), category_(category), screenManager_(screenManager) { if (*value >= numChoices + minVal) *value = numChoices + minVal - 1; @@ -261,8 +276,7 @@ public: UpdateText(); } - virtual void Draw(UIContext &dc) override; - virtual void Update() override; + void Update() override; void HideChoice(int c) { hidden_.insert(c); @@ -271,6 +285,8 @@ public: UI::Event OnChoice; protected: + std::string ValueText() const override; + int *value_; const char **choices_; int minVal_; @@ -325,13 +341,11 @@ private: std::string *valueStr_; }; -class PopupSliderChoice : public Choice { +class PopupSliderChoice : public AbstractChoiceWithValueDisplay { public: PopupSliderChoice(int *value, int minValue, int maxValue, const std::string &text, ScreenManager *screenManager, const std::string &units = "", LayoutParams *layoutParams = 0); PopupSliderChoice(int *value, int minValue, int maxValue, const std::string &text, int step, ScreenManager *screenManager, const std::string &units = "", LayoutParams *layoutParams = 0); - virtual void Draw(UIContext &dc) override; - void SetFormat(const char *fmt) { fmt_ = fmt; } @@ -344,6 +358,9 @@ public: Event OnChange; +protected: + std::string ValueText() const override; + private: EventReturn HandleClick(EventParams &e); EventReturn HandleChange(EventParams &e); @@ -360,13 +377,11 @@ private: bool restoreFocus_; }; -class PopupSliderChoiceFloat : public Choice { +class PopupSliderChoiceFloat : public AbstractChoiceWithValueDisplay { public: PopupSliderChoiceFloat(float *value, float minValue, float maxValue, const std::string &text, ScreenManager *screenManager, const std::string &units = "", LayoutParams *layoutParams = 0); PopupSliderChoiceFloat(float *value, float minValue, float maxValue, const std::string &text, float step, ScreenManager *screenManager, const std::string &units = "", LayoutParams *layoutParams = 0); - virtual void Draw(UIContext &dc) override; - void SetFormat(const char *fmt) { fmt_ = fmt; } @@ -376,6 +391,9 @@ public: Event OnChange; +protected: + std::string ValueText() const override; + private: EventReturn HandleClick(EventParams &e); EventReturn HandleChange(EventParams &e); @@ -390,14 +408,15 @@ private: bool restoreFocus_; }; -class PopupTextInputChoice: public Choice { +class PopupTextInputChoice: public AbstractChoiceWithValueDisplay { public: PopupTextInputChoice(std::string *value, const std::string &title, const std::string &placeholder, int maxLen, ScreenManager *screenManager, LayoutParams *layoutParams = 0); - virtual void Draw(UIContext &dc) override; - Event OnChange; +protected: + std::string ValueText() const override; + private: EventReturn HandleClick(EventParams &e); EventReturn HandleChange(EventParams &e); @@ -409,21 +428,21 @@ private: bool restoreFocus_; }; -class ChoiceWithValueDisplay : public UI::Choice { +class ChoiceWithValueDisplay : public AbstractChoiceWithValueDisplay { public: ChoiceWithValueDisplay(int *value, const std::string &text, LayoutParams *layoutParams = 0) - : Choice(text, layoutParams), iValue_(value) {} + : AbstractChoiceWithValueDisplay(text, layoutParams), iValue_(value) {} ChoiceWithValueDisplay(std::string *value, const std::string &text, const char *category, LayoutParams *layoutParams = 0) - : Choice(text, layoutParams), sValue_(value), category_(category) {} + : AbstractChoiceWithValueDisplay(text, layoutParams), sValue_(value), category_(category) {} ChoiceWithValueDisplay(std::string *value, const std::string &text, std::string (*translateCallback)(const char *value), LayoutParams *layoutParams = 0) - : Choice(text, layoutParams), sValue_(value), translateCallback_(translateCallback) { + : AbstractChoiceWithValueDisplay(text, layoutParams), sValue_(value), translateCallback_(translateCallback) { } - virtual void Draw(UIContext &dc) override; - private: + std::string ValueText() const override; + int *iValue_ = nullptr; std::string *sValue_ = nullptr; const char *category_ = nullptr; diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index 435487b3f0..428eee7d65 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -431,21 +431,32 @@ void Choice::Click() { } void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { - if (atlasImage_.isValid()) { - dc.Draw()->GetAtlas()->measureImage(atlasImage_, &w, &h); - } else { + float totalW = 0.0f; + float totalH = 0.0f; + if (image_.isValid()) { + dc.Draw()->GetAtlas()->measureImage(image_, &w, &h); + totalW = w + 6; + totalH = h; + } + if (!text_.empty()) { const int paddingX = 12; - float availWidth = horiz.size - paddingX * 2 - textPadding_.horiz(); + float availWidth = horiz.size - paddingX * 2 - textPadding_.horiz() - totalW; if (availWidth < 0.0f) { // Let it have as much space as it needs. availWidth = MAX_ITEM_SIZE; } + if (horiz.type != EXACTLY && layoutParams_->width > 0.0f && availWidth > layoutParams_->width) + availWidth = layoutParams_->width; float scale = CalculateTextScale(dc, availWidth); Bounds availBounds(0, 0, availWidth, vert.size); - dc.MeasureTextRect(dc.theme->uiFont, scale, scale, text_.c_str(), (int)text_.size(), availBounds, &w, &h, FLAG_WRAP_TEXT); + float textW = 0.0f, textH = 0.0f; + dc.MeasureTextRect(dc.theme->uiFont, scale, scale, text_.c_str(), (int)text_.size(), availBounds, &textW, &textH, FLAG_WRAP_TEXT); + totalH = std::max(totalH, textH); + totalW += textW; } - w += 24; - h += 16; + + w = totalW + 24; + h = totalH + 16; h = std::max(h, ITEM_HEIGHT); } @@ -486,23 +497,31 @@ void Choice::Draw(UIContext &dc) { style = dc.theme->itemDisabledStyle; } - if (atlasImage_.isValid()) { - dc.Draw()->DrawImage(atlasImage_, bounds_.centerX(), bounds_.centerY(), 1.0f, style.fgColor, ALIGN_CENTER); + if (image_.isValid() && text_.empty()) { + dc.Draw()->DrawImageRotated(image_, bounds_.centerX(), bounds_.centerY(), imgScale_, imgRot_, style.fgColor, imgFlipH_); } else { dc.SetFontStyle(dc.theme->uiFont); - const int paddingX = 12; - const float availWidth = bounds_.w - paddingX * 2 - textPadding_.horiz(); + int paddingX = 12; + float availWidth = bounds_.w - paddingX * 2 - textPadding_.horiz(); + + if (image_.isValid()) { + const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(image_); + paddingX += image->w + 6; + availWidth -= image->w + 6; + // TODO: Use scale rotation and flip here as well (DrawImageRotated is always ALIGN_CENTER for now) + dc.Draw()->DrawImage(image_, bounds_.x + 6, bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_LEFT | ALIGN_VCENTER); + } + float scale = CalculateTextScale(dc, availWidth); dc.SetFontScale(scale, scale); if (centered_) { dc.DrawTextRect(text_.c_str(), bounds_, style.fgColor, ALIGN_CENTER | FLAG_WRAP_TEXT); } else { - if (iconImage_.isValid()) { - dc.Draw()->DrawImage(iconImage_, bounds_.x2() - 32 - paddingX, bounds_.centerY(), 0.5f, style.fgColor, ALIGN_CENTER); + if (rightIconImage_.isValid()) { + dc.Draw()->DrawImageRotated(rightIconImage_, bounds_.x2() - 32 - paddingX, bounds_.centerY(), rightIconScale_, rightIconRot_, style.fgColor, rightIconFlipH_); } - Bounds textBounds(bounds_.x + paddingX + textPadding_.left, bounds_.y, availWidth, bounds_.h); dc.DrawTextRect(text_.c_str(), textBounds, style.fgColor, ALIGN_VCENTER | FLAG_WRAP_TEXT); } @@ -533,6 +552,11 @@ void InfoItem::Draw(UIContext &dc) { UI::Style style = HasFocus() ? dc.theme->itemFocusedStyle : dc.theme->infoStyle; + if (choiceStyle_) { + style = HasFocus() ? dc.theme->buttonFocusedStyle : dc.theme->buttonStyle; + } + + if (style.background.type == DRAW_SOLID_COLOR) { // For a smoother fade, using the same color with 0 alpha. if ((style.background.color & 0xFF000000) == 0) @@ -593,6 +617,38 @@ std::string ItemHeader::DescribeText() const { return ReplaceAll(u->T("%1 heading"), "%1", text_); } +void BorderView::Draw(UIContext &dc) { + Color color = 0xFFFFFFFF; + if (style_ == BorderStyle::HEADER_FG) + color = dc.theme->headerStyle.fgColor; + else if (style_ == BorderStyle::ITEM_DOWN_BG) + color = dc.theme->itemDownStyle.background.color; + + if (borderFlags_ & BORDER_TOP) + dc.Draw()->DrawImageCenterTexel(dc.theme->whiteImage, bounds_.x, bounds_.y, bounds_.x2(), bounds_.y + size_, color); + if (borderFlags_ & BORDER_LEFT) + dc.Draw()->DrawImageCenterTexel(dc.theme->whiteImage, bounds_.x, bounds_.y, bounds_.x + size_, bounds_.y2(), color); + if (borderFlags_ & BORDER_BOTTOM) + dc.Draw()->DrawImageCenterTexel(dc.theme->whiteImage, bounds_.x, bounds_.y2() - size_, bounds_.x2(), bounds_.y2(), color); + if (borderFlags_ & BORDER_RIGHT) + dc.Draw()->DrawImageCenterTexel(dc.theme->whiteImage, bounds_.x2() - size_, bounds_.y, bounds_.x2(), bounds_.y2(), color); +} + +void BorderView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { + Bounds bounds(0, 0, layoutParams_->width, layoutParams_->height); + if (bounds.w < 0) { + // If there's no size, let's grow as big as we want. + bounds.w = horiz.size == 0 ? MAX_ITEM_SIZE : horiz.size; + } + if (bounds.h < 0) { + bounds.h = vert.size == 0 ? MAX_ITEM_SIZE : vert.size; + } + ApplyBoundsBySpec(bounds, horiz, vert); + // If we have vertical borders, grow to width so they're spaced apart. + w = (borderFlags_ & BORDER_VERT) != 0 ? bounds.w : 0; + h = (borderFlags_ & BORDER_HORIZ) != 0 ? bounds.h : 0; +} + void PopupHeader::Draw(UIContext &dc) { const float paddingHorizontal = 12; const float availableWidth = bounds_.w - paddingHorizontal * 2; @@ -730,8 +786,22 @@ void Button::GetContentDimensions(const UIContext &dc, float &w, float &h) const if (imageID_.isValid()) { dc.Draw()->GetAtlas()->measureImage(imageID_, &w, &h); } else { - dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), &w, &h); + w = 0.0f; + h = 0.0f; } + + if (!text_.empty() && !ignoreText_) { + float width = 0.0f; + float height = 0.0f; + dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), &width, &height); + + w += width; + if (imageID_.isValid()) { + w += paddingW_; + } + h = std::max(h, height); + } + // Add some internal padding to not look totally ugly w += paddingW_; h += paddingH_; @@ -772,13 +842,15 @@ void Button::Draw(UIContext &dc) { if (imageID_.isValid() && (ignoreText_ || text_.empty())) { dc.Draw()->DrawImage(imageID_, bounds_.centerX(), bounds_.centerY(), scale_, 0xFFFFFFFF, ALIGN_CENTER); } else if (!text_.empty()) { - dc.DrawText(text_.c_str(), bounds_.centerX(), bounds_.centerY(), style.fgColor, ALIGN_CENTER); + float textX = bounds_.centerX(); if (imageID_.isValid()) { const AtlasImage *img = dc.Draw()->GetAtlas()->getImage(imageID_); if (img) { - dc.Draw()->DrawImage(imageID_, bounds_.centerX() - tw / 2 - 5 - img->w / 2, bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER); + dc.Draw()->DrawImage(imageID_, bounds_.centerX() - tw / 2 - 5, bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER); + textX += img->w / 2.0f; } } + dc.DrawText(text_.c_str(), textX, bounds_.centerY(), style.fgColor, ALIGN_CENTER); } dc.SetFontScale(1.0f, 1.0f); @@ -787,6 +859,69 @@ void Button::Draw(UIContext &dc) { } } +void RadioButton::GetContentDimensions(const UIContext &dc, float &w, float &h) const { + w = 0.0f; + h = 0.0f; + + if (!text_.empty()) { + dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), &w, &h); + } + + // Add some internal padding to not look totally ugly + w += paddingW_ * 3.0f + radioRadius_ * 2.0f; + h = std::max(h, radioRadius_ * 2) + paddingH_ * 2; +} + +std::string RadioButton::DescribeText() const { + auto u = GetI18NCategory("UI Elements"); + return ReplaceAll(u->T("%1 radio button"), "%1", text_); +} + +void RadioButton::Click() { + Clickable::Click(); + UI::PlayUISound(UI::UISound::CONFIRM); + *value_ = thisButtonValue_; +} + +void RadioButton::Draw(UIContext &dc) { + Style style = dc.theme->buttonStyle; + + bool checked = *value_ == thisButtonValue_; + + if (HasFocus()) style = dc.theme->buttonFocusedStyle; + if (down_) style = dc.theme->buttonDownStyle; + if (!IsEnabled()) style = dc.theme->buttonDisabledStyle; + + DrawBG(dc, style); + + dc.Flush(); + dc.BeginNoTex(); + dc.Draw()->Circle(bounds_.x + paddingW_ + radioRadius_, bounds_.centerY(), radioRadius_, 2.5f, 36, 0, style.fgColor, 1.0f); + if (checked) { + dc.Draw()->FillCircle(bounds_.x + paddingW_ + radioRadius_, bounds_.centerY(), radioInnerRadius_, 36, style.fgColor); + } + dc.Flush(); + dc.Begin(); + + float tw, th; + dc.MeasureText(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), &tw, &th); + + if (tw > bounds_.w) { + dc.PushScissor(bounds_); + } + + dc.SetFontStyle(dc.theme->uiFont); + + if (!text_.empty()) { + float textX = bounds_.x + paddingW_ * 2.0f + radioRadius_ * 2.0f; + dc.DrawText(text_.c_str(), textX, bounds_.centerY(), style.fgColor, ALIGN_LEFT | ALIGN_VCENTER); + } + + if (tw > bounds_.w) { + dc.PopScissor(); + } +} + void ImageView::GetContentDimensions(const UIContext &dc, float &w, float &h) const { dc.Draw()->GetAtlas()->measureImage(atlasImage_, &w, &h); // TODO: involve sizemode @@ -813,6 +948,9 @@ void TextView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz bounds.h = vert.size == 0 ? MAX_ITEM_SIZE : vert.size; } ApplyBoundsBySpec(bounds, horiz, vert); + if (bullet_) { + bounds.w -= bulletOffset; + } dc.MeasureTextRect(small_ ? dc.theme->uiFontSmall : dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), (int)text_.length(), bounds, &w, &h, textAlign_); if (bullet_) { diff --git a/Common/UI/View.h b/Common/UI/View.h index 8f8cbd4167..c591573d9a 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -77,15 +77,14 @@ struct Style { }; struct FontStyle { - FontStyle() : atlasFont(0), sizePts(0), flags(0) {} - FontStyle(const char *name, int size) : atlasFont(0), fontName(name), sizePts(size), flags(0) {} - FontStyle(FontID atlasFnt, const char *name, int size) : atlasFont(atlasFnt), fontName(name), sizePts(size), flags(0) {} + FontStyle() {} + FontStyle(FontID atlasFnt, const char *name, int size) : atlasFont(atlasFnt), fontName(name), sizePts(size) {} - FontID atlasFont; + FontID atlasFont{ nullptr }; // For native fonts: std::string fontName; - int sizePts; - int flags; + int sizePts = 0; + int flags = 0; }; @@ -162,6 +161,24 @@ enum Gravity { G_VERTMASK = 3 << 2, }; +enum Borders { + BORDER_NONE = 0, + + BORDER_TOP = 0x0001, + BORDER_LEFT = 0x0002, + BORDER_BOTTOM = 0x0004, + BORDER_RIGHT = 0x0008, + + BORDER_HORIZ = BORDER_LEFT | BORDER_RIGHT, + BORDER_VERT = BORDER_TOP | BORDER_BOTTOM, + BORDER_ALL = BORDER_TOP | BORDER_LEFT | BORDER_BOTTOM | BORDER_RIGHT, +}; + +enum class BorderStyle { + HEADER_FG, + ITEM_DOWN_BG, +}; + typedef float Size; // can also be WRAP_CONTENT or FILL_PARENT. enum Orientation { @@ -522,6 +539,8 @@ protected: bool down_ = false; }; +// TODO: Very similar to Choice, should probably merge them. +// Right now more flexible image support though. class Button : public Clickable { public: Button(const std::string &text, LayoutParams *layoutParams = 0) @@ -544,12 +563,10 @@ public: void SetIgnoreText(bool ignore) { ignoreText_ = ignore; } - // Needed an extra small button... void SetScale(float f) { scale_ = f; } - private: Style style_; std::string text_; @@ -560,6 +577,26 @@ private: bool ignoreText_ = false; }; +class RadioButton : public Clickable { +public: + RadioButton(int *value, int thisButtonValue, const std::string &text, LayoutParams *layoutParams = 0) + : Clickable(layoutParams), value_(value), thisButtonValue_(thisButtonValue), text_(text) {} + void Click() override; + void Draw(UIContext &dc) override; + void GetContentDimensions(const UIContext &dc, float &w, float &h) const override; + std::string DescribeText() const override; + +private: + int *value_; + int thisButtonValue_; + std::string text_; + const float paddingW_ = 8; + const float paddingH_ = 4; + + const float radioRadius_ = 16.0f; + const float radioInnerRadius_ = 8.0f; +}; + class Slider : public Clickable { public: Slider(int *value, int minValue, int maxValue, LayoutParams *layoutParams = 0) @@ -669,10 +706,14 @@ class Choice : public ClickableItem { public: Choice(const std::string &text, LayoutParams *layoutParams = nullptr) : Choice(text, std::string(), false, layoutParams) {} + Choice(const std::string &text, ImageID image, LayoutParams *layoutParams = nullptr) + : ClickableItem(layoutParams), text_(text), image_(image) {} Choice(const std::string &text, const std::string &smallText, bool selected = false, LayoutParams *layoutParams = nullptr) - : ClickableItem(layoutParams), text_(text), smallText_(smallText), atlasImage_(ImageID::invalid()), iconImage_(ImageID::invalid()), centered_(false), highlighted_(false), selected_(selected) {} + : ClickableItem(layoutParams), text_(text), smallText_(smallText), image_(ImageID::invalid()) {} Choice(ImageID image, LayoutParams *layoutParams = nullptr) - : ClickableItem(layoutParams), atlasImage_(image), iconImage_(ImageID::invalid()), centered_(false), highlighted_(false), selected_(false) {} + : ClickableItem(layoutParams), image_(image), rightIconImage_(ImageID::invalid()) {} + Choice(ImageID image, float imgScale, float imgRot, bool imgFlipH = false, LayoutParams *layoutParams = nullptr) + : ClickableItem(layoutParams), image_(image), rightIconImage_(ImageID::invalid()), imgScale_(imgScale), imgRot_(imgRot), imgFlipH_(imgFlipH) {} void Click() override; virtual void HighlightChanged(bool highlighted); @@ -682,8 +723,11 @@ public: virtual void SetCentered(bool c) { centered_ = c; } - virtual void SetIcon(ImageID iconImage) { - iconImage_ = iconImage; + virtual void SetIcon(ImageID iconImage, float scale = 1.0f, float rot = 0.0f, bool flipH = false) { + rightIconScale_ = scale; + rightIconRot_ = rot; + rightIconFlipH_ = flipH; + rightIconImage_ = iconImage; } protected: @@ -693,14 +737,20 @@ protected: std::string text_; std::string smallText_; - ImageID atlasImage_; - ImageID iconImage_; // Only applies for text, non-centered + ImageID image_; // Centered if no text, on the left if text. + ImageID rightIconImage_ = ImageID::invalid(); // Shows in the right. + float rightIconScale_; + float rightIconRot_; + bool rightIconFlipH_; Padding textPadding_; - bool centered_; - bool highlighted_; + bool centered_ = false; + bool highlighted_ = false; + float imgScale_ = 1.0f; + float imgRot_ = 0.0f; + bool imgFlipH_ = false; private: - bool selected_; + bool selected_ = false; }; // Different key handling. @@ -743,6 +793,9 @@ public: void SetRightText(const std::string &text) { rightText_ = text; } + void SetChoiceStyle(bool choiceStyle) { + choiceStyle_ = choiceStyle; + } private: CallbackColorTween *bgColor_ = nullptr; @@ -750,6 +803,8 @@ private: std::string text_; std::string rightText_; + + bool choiceStyle_ = false; }; class ItemHeader : public Item { @@ -829,6 +884,21 @@ public: std::string DescribeText() const override { return ""; } private: + float size_ = 0.0f; +}; + +class BorderView : public InertView { +public: + BorderView(Borders borderFlags, BorderStyle style, float size = 2.0f, LayoutParams *layoutParams = nullptr) + : InertView(layoutParams), borderFlags_(borderFlags), style_(style), size_(size) { + } + void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const override; + void Draw(UIContext &dc) override; + std::string DescribeText() const override { return ""; } + +private: + Borders borderFlags_; + BorderStyle style_; float size_; }; diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index f73816c229..5974ed7d04 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -800,15 +800,17 @@ void ScrollView::Layout() { switch (orientation_) { case ORIENT_HORIZONTAL: if (scrolled.w != lastViewSize_) { - ScrollTo(0.0f); + if (rememberPos_) + scrollPos_ = *rememberPos_; lastViewSize_ = scrolled.w; } scrolled.x = bounds_.x - layoutScrollPos_; scrolled.y = bounds_.y + margins.top; break; case ORIENT_VERTICAL: - if (scrolled.h != lastViewSize_ && scrollToTopOnSizeChange_) { - ScrollTo(0.0f); + if (scrolled.h != lastViewSize_) { + if (rememberPos_) + scrollPos_ = *rememberPos_; lastViewSize_ = scrolled.h; } scrolled.x = bounds_.x + margins.left; @@ -1017,17 +1019,13 @@ void ScrollView::PersistData(PersistStatus status, std::string anonId, PersistMa void ScrollView::SetVisibility(Visibility visibility) { ViewGroup::SetVisibility(visibility); - if (visibility == V_GONE && !rememberPosition_) { + if (visibility == V_GONE && !rememberPos_) { // Since this is no longer shown, forget the scroll position. // For example, this happens when switching tabs. ScrollTo(0.0f); } } -float ScrollView::GetScrollPosition() { - return scrollPos_; -} - void ScrollView::ScrollTo(float newScrollPos) { scrollTarget_ = newScrollPos; scrollToTarget_ = true; @@ -1141,6 +1139,11 @@ void ScrollView::Update() { if (oldPos != scrollPos_) orientation_ == ORIENT_HORIZONTAL ? lastScrollPosX = scrollPos_ : lastScrollPosY = scrollPos_; + + // We load some lists asynchronously, so don't update the position until it's loaded. + if (rememberPos_ && ClampedScrollPos(scrollPos_) != ClampedScrollPos(*rememberPos_)) { + *rememberPos_ = scrollPos_; + } } void AnchorLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) { @@ -1502,11 +1505,17 @@ void ChoiceStrip::SetSelection(int sel, bool triggerClick) { } } -void ChoiceStrip::HighlightChoice(unsigned int choice){ - if (choice < (unsigned int)views_.size()){ +void ChoiceStrip::HighlightChoice(int choice) { + if (choice < (int)views_.size()) { Choice(choice)->HighlightChanged(true); } -}; +} + +void ChoiceStrip::EnableChoice(int choice, bool enabled) { + if (choice < (int)views_.size()) { + Choice(choice)->SetEnabled(enabled); + } +} bool ChoiceStrip::Key(const KeyInput &input) { bool ret = false; diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index 10ca2fbc09..ebb305252b 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -262,8 +262,8 @@ public: // A scrollview usually contains just a single child - a linear layout or similar. class ScrollView : public ViewGroup { public: - ScrollView(Orientation orientation, LayoutParams *layoutParams = 0, bool rememberPosition = false) - : ViewGroup(layoutParams), orientation_(orientation), rememberPosition_(rememberPosition) {} + ScrollView(Orientation orientation, LayoutParams *layoutParams = 0) + : ViewGroup(layoutParams), orientation_(orientation) {} ~ScrollView(); void Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) override; @@ -277,10 +277,14 @@ public: void ScrollTo(float newScrollPos); void ScrollToBottom(); void ScrollRelative(float distance); - float GetScrollPosition(); bool CanScroll() const; void Update() override; + void RememberPosition(float *pos) { + rememberPos_ = pos; + ScrollTo(*pos); + } + // Get the last moved scroll view position static void GetLastScrollPosition(float &x, float &y); @@ -291,9 +295,6 @@ public: NeighborResult FindScrollNeighbor(View *view, const Point &target, FocusDirection direction, NeighborResult best) override; - // Quick hack to prevent scrolling to top in some lists - void SetScrollToTop(bool t) { scrollToTopOnSizeChange_ = t; } - private: float ClampedScrollPos(float pos); @@ -308,8 +309,7 @@ private: float inertia_ = 0.0f; float pull_ = 0.0f; float lastViewSize_ = 0.0f; - bool scrollToTopOnSizeChange_ = false; - bool rememberPosition_; + float *rememberPos_ = nullptr; static float lastScrollPosX; static float lastScrollPosY; @@ -330,7 +330,8 @@ public: int GetSelection() const { return selected_; } void SetSelection(int sel, bool triggerClick); - void HighlightChoice(unsigned int choice); + void HighlightChoice(int choice); + void EnableChoice(int choice, bool enabled); bool Key(const KeyInput &input) override; @@ -360,6 +361,9 @@ public: AddTabContents(title, (View *)tabContents); return tabContents; } + void EnableTab(int tab, bool enabled) { + tabStrip_->EnableChoice(tab, enabled); + } void SetCurrentTab(int tab, bool skipTween = false); diff --git a/Core/Config.cpp b/Core/Config.cpp index 1668d59c55..adf83fbf1b 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -610,7 +610,6 @@ static bool DefaultSasThread() { static ConfigSetting cpuSettings[] = { ReportedConfigSetting("CPUCore", &g_Config.iCpuCore, &DefaultCpuCore, true, true), ReportedConfigSetting("SeparateSASThread", &g_Config.bSeparateSASThread, &DefaultSasThread, true, true), - ReportedConfigSetting("SeparateIOThread", &g_Config.bSeparateIOThread, true, true, true), ReportedConfigSetting("IOTimingMethod", &g_Config.iIOTimingMethod, IOTIMING_REALISTIC, true, true), ConfigSetting("FastMemoryAccess", &g_Config.bFastMemory, true, true, true), ReportedConfigSetting("FunctionReplacements", &g_Config.bFuncReplacements, true, true, true), @@ -821,8 +820,6 @@ typedef ConfigTranslator G static int FastForwardModeFromString(const std::string &s) { if (!strcasecmp(s.c_str(), "CONTINUOUS")) return (int)FastForwardMode::CONTINUOUS; - if (!strcasecmp(s.c_str(), "SKIP_DRAW")) - return (int)FastForwardMode::SKIP_DRAW; if (!strcasecmp(s.c_str(), "SKIP_FLIP")) return (int)FastForwardMode::SKIP_FLIP; return DefaultFastForwardMode(); @@ -832,8 +829,6 @@ std::string FastForwardModeToString(int v) { switch (FastForwardMode(v)) { case FastForwardMode::CONTINUOUS: return "CONTINUOUS"; - case FastForwardMode::SKIP_DRAW: - return "SKIP_DRAW"; case FastForwardMode::SKIP_FLIP: return "SKIP_FLIP"; } @@ -844,7 +839,7 @@ static ConfigSetting graphicsSettings[] = { ConfigSetting("EnableCardboardVR", &g_Config.bEnableCardboardVR, false, true, true), ConfigSetting("CardboardScreenSize", &g_Config.iCardboardScreenSize, 50, true, true), ConfigSetting("CardboardXShift", &g_Config.iCardboardXShift, 0, true, true), - ConfigSetting("CardboardYShift", &g_Config.iCardboardXShift, 0, true, true), + ConfigSetting("CardboardYShift", &g_Config.iCardboardYShift, 0, true, true), ConfigSetting("ShowFPSCounter", &g_Config.iShowFPSCounter, 0, true, true), ReportedConfigSetting("GraphicsBackend", &g_Config.iGPUBackend, &DefaultGPUBackend, &GPUBackendTranslator::To, &GPUBackendTranslator::From, true, false), ConfigSetting("FailedGraphicsBackends", &g_Config.sFailedGPUBackends, ""), @@ -900,6 +895,7 @@ static ConfigSetting graphicsSettings[] = { ReportedConfigSetting("ReplaceTextures", &g_Config.bReplaceTextures, true, true, true), ReportedConfigSetting("SaveNewTextures", &g_Config.bSaveNewTextures, false, true, true), ConfigSetting("IgnoreTextureFilenames", &g_Config.bIgnoreTextureFilenames, false, true, true), + ConfigSetting("ReplaceTexturesAllowLate", &g_Config.bReplaceTexturesAllowLate, true, true, true), ReportedConfigSetting("TexScalingLevel", &g_Config.iTexScalingLevel, 1, true, true), ReportedConfigSetting("TexScalingType", &g_Config.iTexScalingType, 0, true, true), @@ -1078,7 +1074,6 @@ static ConfigSetting networkSettings[] = { ConfigSetting("proAdhocServer", &g_Config.proAdhocServer, "localhost", true, true), ConfigSetting("PortOffset", &g_Config.iPortOffset, 10000, true, true), ConfigSetting("MinTimeout", &g_Config.iMinTimeout, 0, true, true), - ConfigSetting("TCPNoDelay", &g_Config.bTCPNoDelay, true, true, true), ConfigSetting("ForcedFirstConnect", &g_Config.bForcedFirstConnect, false, true, true), ConfigSetting("EnableUPnP", &g_Config.bEnableUPnP, false, true, true), ConfigSetting("UPnPUseOriginalPort", &g_Config.bUPnPUseOriginalPort, false, true, true), @@ -1455,6 +1450,16 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { g_Config.iGlobalVolume = 0; } + // Automatically switch away from deprecated setting value. + if (iTexScalingLevel <= 0) { + iTexScalingLevel = 1; + } + +#if PPSSPP_PLATFORM(ANDROID) + // The on path here is untested, since we don't expose it. + g_Config.bVSync = false; +#endif + INFO_LOG(LOADER, "Config loaded: '%s'", iniFilename_.c_str()); } @@ -1800,8 +1805,13 @@ bool Config::loadGameConfig(const std::string &pGameId, const std::string &title auto postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting")->ToMap(); mPostShaderSetting.clear(); - for (auto it : postShaderSetting) { - mPostShaderSetting[it.first] = std::stof(it.second); + for (const auto &it : postShaderSetting) { + float value = 0.0f; + if (sscanf(it.second.c_str(), "%f", &value)) { + mPostShaderSetting[it.first] = value; + } else { + WARN_LOG(LOADER, "Invalid float value string for param %s: '%s'", it.first.c_str(), it.second.c_str()); + } } auto postShaderChain = iniFile.GetOrCreateSection("PostShaderList")->ToMap(); diff --git a/Core/Config.h b/Core/Config.h index 8d5ef7a708..14e77278a1 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -124,7 +124,6 @@ public: bool bVulkanMultithreading; bool bSeparateSASThread; - bool bSeparateIOThread; int iIOTimingMethod; int iIOManualDelay; int iLockedCPUSpeed; @@ -206,6 +205,7 @@ public: bool bReplaceTextures; bool bSaveNewTextures; bool bIgnoreTextureFilenames; + bool bReplaceTexturesAllowLate; int iTexScalingLevel; // 0 = auto, 1 = off, 2 = 2x, ..., 5 = 5x int iTexScalingType; // 0 = xBRZ, 1 = Hybrid bool bTexDeposterize; @@ -456,7 +456,6 @@ public: std::string proAdhocServer; bool bEnableWlan; bool bEnableAdhocServer; - bool bTCPNoDelay; bool bEnableUPnP; bool bUPnPUseOriginalPort; bool bForcedFirstConnect; diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index 5f6ed413b0..44653a28fc 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -120,7 +120,6 @@ enum class AutoLoadSaveState { enum class FastForwardMode { CONTINUOUS = 0, - SKIP_DRAW = 1, SKIP_FLIP = 2, }; diff --git a/Core/Core.cpp b/Core/Core.cpp index b6af6456fd..1a469a0ca0 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -56,6 +57,8 @@ static std::condition_variable m_InactiveCond; static std::mutex m_hInactiveMutex; static bool singleStepPending = false; static int steppingCounter = 0; +static const char *steppingReason = ""; +static uint32_t steppingAddress = 0; static std::set lifecycleFuncs; static std::set stopFuncs; static bool windowHidden = false; @@ -358,11 +361,14 @@ void Core_Run(GraphicsContext *ctx) { } } -void Core_EnableStepping(bool step) { +void Core_EnableStepping(bool step, const char *reason, u32 relatedAddress) { if (step) { host->SetDebugMode(true); Core_UpdateState(CORE_STEPPING); steppingCounter++; + _assert_msg_(reason != nullptr, "No reason specified for break"); + steppingReason = reason; + steppingAddress = relatedAddress; } else { host->SetDebugMode(false); // Clear the exception if we resume. @@ -386,6 +392,13 @@ int Core_GetSteppingCounter() { return steppingCounter; } +SteppingReason Core_GetSteppingReason() { + SteppingReason r; + r.reason = steppingReason; + r.relatedAddress = steppingAddress; + return r; +} + const char *ExceptionTypeAsString(ExceptionType type) { switch (type) { case ExceptionType::MEMORY: return "Invalid Memory Access"; @@ -433,7 +446,7 @@ void Core_MemoryException(u32 address, u32 pc, MemoryExceptionType type) { e.memory_type = type; e.address = address; e.pc = pc; - Core_EnableStepping(true); + Core_EnableStepping(true, "memory.exception", address); host->SetDebugMode(true); } } @@ -455,14 +468,14 @@ void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std e.memory_type = type; e.address = address; e.pc = pc; - Core_EnableStepping(true); + Core_EnableStepping(true, "memory.exception", address); host->SetDebugMode(true); } } void Core_ExecException(u32 address, u32 pc, ExecExceptionType type) { const char *desc = ExecExceptionTypeAsString(type); - WARN_LOG(MEMMAP, "%s: Invalid destination %08x PC %08x LR %08x", desc, address, currentMIPS->pc, currentMIPS->r[MIPS_REG_RA]); + WARN_LOG(MEMMAP, "%s: Invalid destination %08x PC %08x LR %08x", desc, address, pc, currentMIPS->r[MIPS_REG_RA]); ExceptionInfo &e = g_exceptionInfo; e = {}; @@ -471,7 +484,7 @@ void Core_ExecException(u32 address, u32 pc, ExecExceptionType type) { e.exec_type = type; e.address = address; e.pc = pc; - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.exception", pc); host->SetDebugMode(true); } @@ -484,7 +497,7 @@ void Core_Break() { e.info = ""; if (!g_Config.bIgnoreBadMemAccess) { - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.breakInstruction", currentMIPS->pc); host->SetDebugMode(true); } } diff --git a/Core/Core.h b/Core/Core.h index a2acc66918..62018b832d 100644 --- a/Core/Core.h +++ b/Core/Core.h @@ -33,7 +33,7 @@ void Core_Stop(); void Core_SetGraphicsContext(GraphicsContext *ctx); // called from gui -void Core_EnableStepping(bool step); +void Core_EnableStepping(bool step, const char *reason = nullptr, u32 relatedAddress = 0); bool Core_NextFrame(); void Core_DoSingleStep(); @@ -41,6 +41,11 @@ void Core_UpdateSingleStep(); void Core_ProcessStepping(); // Changes every time we enter stepping. int Core_GetSteppingCounter(); +struct SteppingReason { + const char *reason = nullptr; + u32 relatedAddress = 0; +}; +SteppingReason Core_GetSteppingReason(); enum class CoreLifecycle { STARTING, diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index ee2b8a5f72..6533787460 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -519,6 +519,7 @@ + @@ -1076,6 +1077,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 3d3b1e9853..bbb85cbeb5 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1181,6 +1181,9 @@ Core + + Debugger\WebSocket + @@ -1904,6 +1907,9 @@ Core + + Debugger\WebSocket + diff --git a/Core/CoreTiming.cpp b/Core/CoreTiming.cpp index d7c725d4f7..006d7137e3 100644 --- a/Core/CoreTiming.cpp +++ b/Core/CoreTiming.cpp @@ -182,7 +182,7 @@ int RegisterEvent(const char *name, TimedCallback callback) { void AntiCrashCallback(u64 userdata, int cyclesLate) { ERROR_LOG(SAVESTATE, "Savestate broken: an unregistered event was called."); - Core_EnableStepping(true); + Core_EnableStepping(true, "savestate.crash", 0); } void RestoreRegisterEvent(int &event_type, const char *name, TimedCallback callback) { diff --git a/Core/CwCheat.cpp b/Core/CwCheat.cpp index d1a12f98d6..6f5dc789a2 100644 --- a/Core/CwCheat.cpp +++ b/Core/CwCheat.cpp @@ -782,7 +782,6 @@ CheatOperation CWCheatEngine::InterpretNextCwCheat(const CheatCode &cheat, size_ CheatOperation CWCheatEngine::InterpretNextTempAR(const CheatCode &cheat, size_t &i) { // TODO - _assert_(false); return { CheatOp::Invalid }; } diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index ddb2d2baf6..0eeed33210 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -68,7 +68,7 @@ BreakAction MemCheck::Action(u32 addr, bool write, int size, u32 pc, const char if (cond & mask) { Log(addr, write, size, pc, reason); if ((result & BREAK_ACTION_PAUSE) && coreState != CORE_POWERUP) { - Core_EnableStepping(true); + Core_EnableStepping(true, "memory.breakpoint", start); host->SetDebugMode(true); } @@ -93,7 +93,7 @@ void MemCheck::JitBeforeApply(u32 addr, bool write, int size, u32 pc) { void MemCheck::JitBeforeAction(u32 addr, bool write, int size, u32 pc) { if (lastAddr) { // We have to break to find out if it changed. - Core_EnableStepping(true); + Core_EnableStepping(true, "memory.breakpoint.check", start); } else { Action(addr, write, size, pc, "CPU"); } @@ -367,7 +367,7 @@ BreakAction CBreakPoints::ExecBreakPoint(u32 addr) { } } if ((info.result & BREAK_ACTION_PAUSE) && coreState != CORE_POWERUP) { - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.breakpoint", info.addr); host->SetDebugMode(true); } @@ -640,7 +640,7 @@ void CBreakPoints::Update(u32 addr) bool resume = false; if (Core_IsStepping() == false) { - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.breakpoint.update", addr); Core_WaitInactive(200); resume = true; } diff --git a/Core/Debugger/WebSocket.cpp b/Core/Debugger/WebSocket.cpp index 3d85f4b6fd..b71db06877 100644 --- a/Core/Debugger/WebSocket.cpp +++ b/Core/Debugger/WebSocket.cpp @@ -55,6 +55,7 @@ #include "Core/Debugger/WebSocket/GameSubscriber.h" #include "Core/Debugger/WebSocket/GPUBufferSubscriber.h" #include "Core/Debugger/WebSocket/GPURecordSubscriber.h" +#include "Core/Debugger/WebSocket/GPUStatsSubscriber.h" #include "Core/Debugger/WebSocket/HLESubscriber.h" #include "Core/Debugger/WebSocket/InputSubscriber.h" #include "Core/Debugger/WebSocket/MemoryInfoSubscriber.h" @@ -70,6 +71,7 @@ static const std::vector subscribers({ &WebSocketGameInit, &WebSocketGPUBufferInit, &WebSocketGPURecordInit, + &WebSocketGPUStatsInit, &WebSocketHLEInit, &WebSocketInputInit, &WebSocketMemoryInfoInit, diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp index 6f371e5b85..4a83788ef8 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp @@ -70,7 +70,7 @@ void WebSocketCPUStepping(DebuggerRequest &req) { return req.Fail("CPU not started"); } if (!Core_IsStepping() && Core_IsActive()) { - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.stepping", 0); } } diff --git a/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp b/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp new file mode 100644 index 0000000000..11ee4dca8d --- /dev/null +++ b/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp @@ -0,0 +1,202 @@ +// Copyright (c) 2021- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include +#include +#include "Core/Debugger/WebSocket/GPUStatsSubscriber.h" +#include "Core/HLE/sceDisplay.h" +#include "Core/System.h" + +struct CollectedStats { + float vps; + float fps; + float actual_fps; + char statbuf[4096]; + std::vector frameTimes; + std::vector sleepTimes; + int frameTimePos; +}; + +struct DebuggerGPUStatsEvent { + const CollectedStats &s; + const std::string &ticket; + + operator std::string() { + JsonWriter j; + j.begin(); + j.writeString("event", "gpu.stats.get"); + if (!ticket.empty()) + j.writeRaw("ticket", ticket); + j.pushDict("fps"); + j.writeFloat("actual", s.actual_fps); + j.writeFloat("target", s.fps); + j.pop(); + j.pushDict("vblanksPerSecond"); + j.writeFloat("actual", s.vps); + j.writeFloat("target", 60.0 / 1.001); + j.pop(); + j.writeString("info", s.statbuf); + j.pushDict("timing"); + j.pushArray("frames"); + for (double t : s.frameTimes) + j.writeFloat(t); + j.pop(); + j.pushArray("sleep"); + for (double t : s.sleepTimes) + j.writeFloat(t); + j.pop(); + j.writeInt("pos", s.frameTimePos); + j.pop(); + j.end(); + return j.str(); + } +}; + +struct WebSocketGPUStatsState : public DebuggerSubscriber { + WebSocketGPUStatsState(); + ~WebSocketGPUStatsState() override; + void Get(DebuggerRequest &req); + void Feed(DebuggerRequest &req); + + void Broadcast(net::WebSocketServer *ws) override; + + static void FlipForwarder(void *thiz); + void FlipListener(); + +protected: + bool forced_ = false; + bool sendNext_ = false; + bool sendFeed_ = false; + + std::string lastTicket_; + std::mutex pendingLock_; + std::vector pendingStats_; +}; + +DebuggerSubscriber *WebSocketGPUStatsInit(DebuggerEventHandlerMap &map) { + auto p = new WebSocketGPUStatsState(); + map["gpu.stats.get"] = std::bind(&WebSocketGPUStatsState::Get, p, std::placeholders::_1); + map["gpu.stats.feed"] = std::bind(&WebSocketGPUStatsState::Feed, p, std::placeholders::_1); + + return p; +} + +WebSocketGPUStatsState::WebSocketGPUStatsState() { + __DisplayListenFlip(&WebSocketGPUStatsState::FlipForwarder, this); +} + +WebSocketGPUStatsState::~WebSocketGPUStatsState() { + if (forced_) + Core_ForceDebugStats(false); + __DisplayForgetFlip(&WebSocketGPUStatsState::FlipForwarder, this); +} + +void WebSocketGPUStatsState::FlipForwarder(void *thiz) { + WebSocketGPUStatsState *p = (WebSocketGPUStatsState *)thiz; + p->FlipListener(); +} + +void WebSocketGPUStatsState::FlipListener() { + if (!sendNext_ && !sendFeed_) + return; + + // Okay, collect the data (we'll actually send at next Broadcast.) + std::lock_guard guard(pendingLock_); + pendingStats_.resize(pendingStats_.size() + 1); + CollectedStats &stats = pendingStats_[pendingStats_.size() - 1]; + + __DisplayGetFPS(&stats.vps, &stats.fps, &stats.actual_fps); + __DisplayGetDebugStats(stats.statbuf, sizeof(stats.statbuf)); + + int valid; + double *sleepHistory; + double *history = __DisplayGetFrameTimes(&valid, &stats.frameTimePos, &sleepHistory); + + stats.frameTimes.resize(valid); + stats.sleepTimes.resize(valid); + memcpy(&stats.frameTimes[0], history, sizeof(double) * valid); + memcpy(&stats.sleepTimes[0], sleepHistory, sizeof(double) * valid); + + sendNext_ = false; +} + +// Get next GPU stats (gpu.stats.get) +// +// No parameters. +// +// Response (same event name): +// - fps: object with "actual" and "target" properties, representing frames per second. +// - vblanksPerSecond: object with "actual" and "target" properties, for vblank cycles. +// - info: string, representation of backend-dependent statistics. +// - timing: object with properties: +// - frames: array of numbers, each representing the time taken for a frame. +// - sleep: array of numbers, each representing the delay time waiting for next frame. +// - pos: number, index of the current frame (not always last.) +// +// Note: stats are returned after the next flip completes (paused if CPU or GPU in break.) +// Note: info and timing may not be accurate if certain settings are disabled. +void WebSocketGPUStatsState::Get(DebuggerRequest &req) { + if (!PSP_IsInited()) + return req.Fail("CPU not started"); + + std::lock_guard guard(pendingLock_); + sendNext_ = true; + + const JsonNode *value = req.data.get("ticket"); + lastTicket_ = value ? json_stringify(value) : ""; +} + +// Setup GPU stats feed (gpu.stats.feed) +// +// Parameters: +// - enable: optional boolean, pass false to stop the feed. +// +// No immediate response. Events sent each frame (as gpu.stats.get.) +// +// Note: info and timing will be accurate after the first frame. +void WebSocketGPUStatsState::Feed(DebuggerRequest &req) { + if (!PSP_IsInited()) + return req.Fail("CPU not started"); + bool enable = true; + if (!req.ParamBool("enable", &enable, DebuggerParamType::OPTIONAL)) + return; + + std::lock_guard guard(pendingLock_); + sendFeed_ = enable; + if (forced_ != enable) { + Core_ForceDebugStats(enable); + forced_ = enable; + } +} + +void WebSocketGPUStatsState::Broadcast(net::WebSocketServer *ws) { + std::lock_guard guard(pendingLock_); + if (lastTicket_.empty() && !sendFeed_) { + pendingStats_.clear(); + return; + } + + // To be safe, make sure we only send one if we're doing a get. + if (!sendFeed_ && pendingStats_.size() > 1) + pendingStats_.resize(1); + + for (size_t i = 0; i < pendingStats_.size(); ++i) { + ws->Send(DebuggerGPUStatsEvent{ pendingStats_[i], lastTicket_ }); + lastTicket_.clear(); + } + pendingStats_.clear(); +} diff --git a/Core/Debugger/WebSocket/GPUStatsSubscriber.h b/Core/Debugger/WebSocket/GPUStatsSubscriber.h new file mode 100644 index 0000000000..d9d517a086 --- /dev/null +++ b/Core/Debugger/WebSocket/GPUStatsSubscriber.h @@ -0,0 +1,22 @@ +// Copyright (c) 2021- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#pragma once + +#include "Core/Debugger/WebSocket/WebSocketUtils.h" + +DebuggerSubscriber *WebSocketGPUStatsInit(DebuggerEventHandlerMap &map); diff --git a/Core/Debugger/WebSocket/MemorySubscriber.cpp b/Core/Debugger/WebSocket/MemorySubscriber.cpp index 2d7741fad8..815eeba161 100644 --- a/Core/Debugger/WebSocket/MemorySubscriber.cpp +++ b/Core/Debugger/WebSocket/MemorySubscriber.cpp @@ -53,12 +53,12 @@ struct AutoDisabledReplacements { }; // Important: Only use keepReplacements when reading, not writing. -static AutoDisabledReplacements LockMemoryAndCPU(bool keepReplacements) { +static AutoDisabledReplacements LockMemoryAndCPU(uint32_t addr, bool keepReplacements) { AutoDisabledReplacements result; if (Core_IsStepping()) { result.wasStepping = true; } else { - Core_EnableStepping(true); + Core_EnableStepping(true, "memory.access", addr); Core_WaitInactive(); } @@ -92,15 +92,15 @@ AutoDisabledReplacements::~AutoDisabledReplacements() { // Response (same event name): // - value: unsigned integer void WebSocketMemoryReadU8(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr; if (!req.ParamU32("address", &addr, false)) { return; } + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + if (!Memory::IsValidAddress(addr)) { req.Fail("Invalid address"); return; @@ -118,15 +118,15 @@ void WebSocketMemoryReadU8(DebuggerRequest &req) { // Response (same event name): // - value: unsigned integer void WebSocketMemoryReadU16(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr; if (!req.ParamU32("address", &addr, false)) { return; } + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + if (!Memory::IsValidAddress(addr)) { req.Fail("Invalid address"); return; @@ -144,15 +144,15 @@ void WebSocketMemoryReadU16(DebuggerRequest &req) { // Response (same event name): // - value: unsigned integer void WebSocketMemoryReadU32(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr; if (!req.ParamU32("address", &addr, false)) { return; } + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + if (!Memory::IsValidAddress(addr)) { req.Fail("Invalid address"); return; @@ -182,7 +182,7 @@ void WebSocketMemoryRead(DebuggerRequest &req) { if (!req.ParamBool("replacements", &replacements, DebuggerParamType::OPTIONAL)) return; - auto memLock = LockMemoryAndCPU(replacements); + auto memLock = LockMemoryAndCPU(addr, replacements); if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) return req.Fail("CPU not started"); @@ -219,13 +219,14 @@ void WebSocketMemoryRead(DebuggerRequest &req) { // Response (same event name) for 'base64': // - base64: base64 encode of binary data, not including NUL. void WebSocketMemoryReadString(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr; if (!req.ParamU32("address", &addr)) return; + + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + std::string type = "utf-8"; if (!req.ParamString("type", &type, DebuggerParamType::OPTIONAL)) return; @@ -257,10 +258,6 @@ void WebSocketMemoryReadString(DebuggerRequest &req) { // Response (same event name): // - value: new value, unsigned integer void WebSocketMemoryWriteU8(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr, val; if (!req.ParamU32("address", &addr, false)) { return; @@ -269,6 +266,10 @@ void WebSocketMemoryWriteU8(DebuggerRequest &req) { return; } + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + if (!Memory::IsValidAddress(addr)) { req.Fail("Invalid address"); return; @@ -289,10 +290,6 @@ void WebSocketMemoryWriteU8(DebuggerRequest &req) { // Response (same event name): // - value: new value, unsigned integer void WebSocketMemoryWriteU16(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr, val; if (!req.ParamU32("address", &addr, false)) { return; @@ -301,6 +298,10 @@ void WebSocketMemoryWriteU16(DebuggerRequest &req) { return; } + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + if (!Memory::IsValidAddress(addr)) { req.Fail("Invalid address"); return; @@ -321,10 +322,6 @@ void WebSocketMemoryWriteU16(DebuggerRequest &req) { // Response (same event name): // - value: new value, unsigned integer void WebSocketMemoryWriteU32(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr, val; if (!req.ParamU32("address", &addr, false)) { return; @@ -333,6 +330,10 @@ void WebSocketMemoryWriteU32(DebuggerRequest &req) { return; } + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + if (!Memory::IsValidAddress(addr)) { req.Fail("Invalid address"); return; @@ -352,10 +353,6 @@ void WebSocketMemoryWriteU32(DebuggerRequest &req) { // // Response (same event name) with no extra data. void WebSocketMemoryWrite(DebuggerRequest &req) { - auto memLock = LockMemoryAndCPU(true); - if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) - return req.Fail("CPU not started"); - uint32_t addr; if (!req.ParamU32("address", &addr)) return; @@ -363,6 +360,10 @@ void WebSocketMemoryWrite(DebuggerRequest &req) { if (!req.ParamString("base64", &encoded)) return; + auto memLock = LockMemoryAndCPU(addr, true); + if (!currentDebugMIPS->isAlive() || !Memory::IsActive()) + return req.Fail("CPU not started"); + std::vector value = Base64Decode(&encoded[0], encoded.size()); uint32_t size = (uint32_t)value.size(); diff --git a/Core/Debugger/WebSocket/SteppingBroadcaster.cpp b/Core/Debugger/WebSocket/SteppingBroadcaster.cpp index 7d9b224928..5d255d4f8e 100644 --- a/Core/Debugger/WebSocket/SteppingBroadcaster.cpp +++ b/Core/Debugger/WebSocket/SteppingBroadcaster.cpp @@ -23,6 +23,9 @@ #include "Core/System.h" struct CPUSteppingEvent { + CPUSteppingEvent(const SteppingReason &reason) : reason_(reason) { + } + operator std::string() { JsonWriter j; j.begin(); @@ -30,9 +33,14 @@ struct CPUSteppingEvent { j.writeUint("pc", currentMIPS->pc); // A double ought to be good enough for a 156 day debug session. j.writeFloat("ticks", CoreTiming::GetTicks()); + j.writeString("reason", reason_.reason); + j.writeUint("relatedAddress", reason_.relatedAddress); j.end(); return j.str(); } + +private: + const SteppingReason &reason_; }; // CPU has begun stepping (cpu.stepping) @@ -49,7 +57,7 @@ void SteppingBroadcaster::Broadcast(net::WebSocketServer *ws) { int steppingCounter = Core_GetSteppingCounter(); // We ignore CORE_POWERDOWN as a stepping state. if (coreState == CORE_STEPPING && steppingCounter != lastCounter_) { - ws->Send(CPUSteppingEvent()); + ws->Send(CPUSteppingEvent(Core_GetSteppingReason())); } else if (prevState_ == CORE_STEPPING && coreState != CORE_STEPPING && Core_IsActive()) { ws->Send(R"({"event":"cpu.resume"})"); } diff --git a/Core/Debugger/WebSocket/SteppingSubscriber.cpp b/Core/Debugger/WebSocket/SteppingSubscriber.cpp index 19c545de86..fcb9296985 100644 --- a/Core/Debugger/WebSocket/SteppingSubscriber.cpp +++ b/Core/Debugger/WebSocket/SteppingSubscriber.cpp @@ -93,7 +93,7 @@ void WebSocketSteppingState::Into(DebuggerRequest &req) { if (!currentDebugMIPS->isAlive()) return req.Fail("CPU not started"); if (!Core_IsStepping()) { - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.stepInto", 0); return; } diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index c8c0670339..e8cbf0ed64 100755 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -942,8 +942,10 @@ int PSPOskDialog::Update(int animSpeed) { #if defined(USING_WIN_UI) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) // Windows: Fall back to the OSK/continue normally if we're in fullscreen. // The dialog box doesn't work right if in fullscreen. - if (g_Config.bBypassOSKWithKeyboard && !g_Config.bFullScreen) - return NativeKeyboard(); + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { + if (g_Config.bBypassOSKWithKeyboard && !g_Config.bFullScreen) + return NativeKeyboard(); + } #endif UpdateFade(animSpeed); diff --git a/Core/ELF/ParamSFO.cpp b/Core/ELF/ParamSFO.cpp index af5a0ce812..71d07dcaca 100644 --- a/Core/ELF/ParamSFO.cpp +++ b/Core/ELF/ParamSFO.cpp @@ -103,26 +103,37 @@ bool ParamSFOData::ReadSFO(const u8 *paramsfo, size_t size) { const IndexTable *indexTables = (const IndexTable *)(paramsfo + sizeof(Header)); - const u8 *key_start = paramsfo + header->key_table_start; + if (header->key_table_start > size || header->data_table_start > size) { + return false; + } + const u8 *data_start = paramsfo + header->data_table_start; for (u32 i = 0; i < header->index_table_entries; i++) { - const char *key = (const char *)(key_start + indexTables[i].key_table_offset); + size_t key_offset = header->key_table_start + indexTables[i].key_table_offset; + if (key_offset >= size) { + return false; + } + size_t data_offset = header->data_table_start + indexTables[i].data_table_offset; + if (data_offset >= size) { + return false; + } + const char *key = (const char *)(paramsfo + key_offset); switch (indexTables[i].param_fmt) { case 0x0404: { // Unsigned int - const u32_le *data = (const u32_le *)(data_start + indexTables[i].data_table_offset); - SetValue(key,*data,indexTables[i].param_max_len); + const u32_le *data = (const u32_le *)(paramsfo + data_offset); + SetValue(key, *data, indexTables[i].param_max_len); VERBOSE_LOG(LOADER, "%s %08x", key, *data); } break; case 0x0004: // Special format UTF-8 { - const u8 *utfdata = (const u8 *)(data_start + indexTables[i].data_table_offset); + const u8 *utfdata = (const u8 *)(paramsfo + data_offset); VERBOSE_LOG(LOADER, "%s %s", key, utfdata); SetValue(key, utfdata, indexTables[i].param_len, indexTables[i].param_max_len); } @@ -130,9 +141,9 @@ bool ParamSFOData::ReadSFO(const u8 *paramsfo, size_t size) { case 0x0204: // Regular UTF-8 { - const char *utfdata = (const char *)(data_start + indexTables[i].data_table_offset); + const char *utfdata = (const char *)(paramsfo + data_offset); VERBOSE_LOG(LOADER, "%s %s", key, utfdata); - SetValue(key,std::string(utfdata /*, indexTables[i].param_len*/), indexTables[i].param_max_len); + SetValue(key, std::string(utfdata /*, indexTables[i].param_len*/), indexTables[i].param_max_len); } break; } diff --git a/Core/ELF/ParamSFO.h b/Core/ELF/ParamSFO.h index b0fee3cece..6548638ef6 100644 --- a/Core/ELF/ParamSFO.h +++ b/Core/ELF/ParamSFO.h @@ -56,7 +56,11 @@ public: bool WriteSFO(u8 **paramsfo, size_t *size); bool ReadSFO(const std::vector ¶msfo) { - return ReadSFO(¶msfo[0], paramsfo.size()); + if (!paramsfo.empty()) { + return ReadSFO(¶msfo[0], paramsfo.size()); + } else { + return false; + } } int GetDataOffset(const u8 *paramsfo, std::string dataName); diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 9a3bb74cfb..9769563de8 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -311,11 +311,13 @@ size_t DirectoryFileHandle::Read(u8* pointer, s64 size) size = needsTrunc_ - off; } } + if (size > 0) { #ifdef _WIN32 - ::ReadFile(hFile, (LPVOID)pointer, (DWORD)size, (LPDWORD)&bytesRead, 0); + ::ReadFile(hFile, (LPVOID)pointer, (DWORD)size, (LPDWORD)&bytesRead, 0); #else - bytesRead = read(hFile, pointer, size); + bytesRead = read(hFile, pointer, size); #endif + } return replay_ ? ReplayApplyDiskRead(pointer, (uint32_t)bytesRead, (uint32_t)size, inGameDir_, CoreTiming::GetGlobalTimeUs()) : bytesRead; } diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index be27e632c5..1c0957e20d 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -68,6 +68,7 @@ static int delayedResultEvent = -1; static int hleAfterSyscall = HLE_AFTER_NOTHING; static const char *hleAfterSyscallReschedReason; static const HLEFunction *latestSyscall = nullptr; +static uint32_t latestSyscallPC = 0; static int idleOp; struct HLEMipsCallInfo { @@ -128,6 +129,7 @@ void HLEDoState(PointerWrap &p) { // Can't be inside a syscall, reset this so errors aren't misleading. latestSyscall = nullptr; + latestSyscallPC = 0; Do(p, delayedResultEvent); CoreTiming::RestoreRegisterEvent(delayedResultEvent, "HLEDelayedResult", hleDelayResultFinish); @@ -153,6 +155,7 @@ void HLEDoState(PointerWrap &p) { void HLEShutdown() { hleAfterSyscall = HLE_AFTER_NOTHING; latestSyscall = nullptr; + latestSyscallPC = 0; moduleDB.clear(); enqueuedMipsCalls.clear(); for (auto p : mipsCallActions) { @@ -360,7 +363,7 @@ bool hleExecuteDebugBreak(const HLEFunction &func) return false; } - Core_EnableStepping(true); + Core_EnableStepping(true, "hle.step", latestSyscallPC); host->SetDebugMode(true); return true; } @@ -625,6 +628,7 @@ static void updateSyscallStats(int modulenum, int funcnum, double total) inline void CallSyscallWithFlags(const HLEFunction *info) { latestSyscall = info; + latestSyscallPC = currentMIPS->pc; const u32 flags = info->flags; if (flags & HLE_CLEAR_STACK_BYTES) { @@ -651,6 +655,7 @@ inline void CallSyscallWithFlags(const HLEFunction *info) inline void CallSyscallWithoutFlags(const HLEFunction *info) { latestSyscall = info; + latestSyscallPC = currentMIPS->pc; info->func(); if (hleAfterSyscall != HLE_AFTER_NOTHING) diff --git a/Core/HLE/ReplaceTables.cpp b/Core/HLE/ReplaceTables.cpp index efde566c56..91d172e991 100644 --- a/Core/HLE/ReplaceTables.cpp +++ b/Core/HLE/ReplaceTables.cpp @@ -160,6 +160,13 @@ static int Replace_memcpy() { NotifyMemInfo(MemBlockFlags::READ, srcPtr, bytes, tag.c_str(), tag.size()); NotifyMemInfo(MemBlockFlags::WRITE, destPtr, bytes, tag.c_str(), tag.size()); + // It's pretty common that games will copy video data. + if (tag == "ReplaceMemcpy/VideoDecode" || tag == "ReplaceMemcpy/VideoDecodeRange") { + if (bytes == 512 * 272 * 4) { + gpu->NotifyVideoUpload(destPtr, bytes, 512, GE_FORMAT_8888); + } + } + return 10 + bytes / 4; // approximation } @@ -203,6 +210,13 @@ static int Replace_memcpy_jak() { NotifyMemInfo(MemBlockFlags::READ, srcPtr, bytes, tag.c_str(), tag.size()); NotifyMemInfo(MemBlockFlags::WRITE, destPtr, bytes, tag.c_str(), tag.size()); + // It's pretty common that games will copy video data. + if (tag == "ReplaceMemcpy/VideoDecode" || tag == "ReplaceMemcpy/VideoDecodeRange") { + if (bytes == 512 * 272 * 4) { + gpu->NotifyVideoUpload(destPtr, bytes, 512, GE_FORMAT_8888); + } + } + return 5 + bytes * 8 + 2; // approximation. This is a slow memcpy - a byte copy loop.. } diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index f751037dd9..ba92142d7a 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -81,7 +81,7 @@ SceNetAdhocMatchingContext * contexts = NULL; char* dummyPeekBuf64k = NULL; int dummyPeekBuf64kSize = 65536; int one = 1; -bool friendFinderRunning = false; +std::atomic friendFinderRunning(false); SceNetAdhocctlPeerInfo * friends = NULL; SceNetAdhocctlScanInfo * networks = NULL; SceNetAdhocctlScanInfo * newnetworks = NULL; @@ -99,6 +99,7 @@ GameModeArea masterGameModeArea; std::vector replicaGameModeAreas; std::vector requiredGameModeMacs; std::vector gameModeMacs; +std::map gameModePeerPorts; int actionAfterAdhocMipsCall; int actionAfterMatchingMipsCall; @@ -106,7 +107,7 @@ int actionAfterMatchingMipsCall; // Broadcast MAC uint8_t broadcastMAC[ETHER_ADDR_LEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; -int metasocket = (int)INVALID_SOCKET; +std::atomic metasocket((int)INVALID_SOCKET); SceNetAdhocctlParameter parameter; SceNetAdhocctlAdhocId product_code; std::thread friendFinderThread; @@ -666,6 +667,9 @@ s32_le countChildren(SceNetAdhocMatchingContext * context, const bool excludeTim */ SceNetAdhocMatchingMemberInternal * findPeer(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac) { + if (mac == NULL) + return NULL; + // Iterate Peer List for Matching Target SceNetAdhocMatchingMemberInternal * peer = context->peerlist; for (; peer != NULL; peer = peer->next) @@ -1296,8 +1300,8 @@ void sendChat(std::string chatString) { std::string message = chatString.substr(0, 60); // 64 return chat variable corrupted is it out of memory? strcpy(chat.message, message.c_str()); //Send Chat Messages - if (IsSocketReady(metasocket, false, true) > 0) { - int chatResult = send(metasocket, (const char*)&chat, sizeof(chat), MSG_NOSIGNAL); + if (IsSocketReady((int)metasocket, false, true) > 0) { + int chatResult = send((int)metasocket, (const char*)&chat, sizeof(chat), MSG_NOSIGNAL); NOTICE_LOG(SCENET, "Send Chat %s to Adhoc Server", chat.message); std::string name = g_Config.sNickName.c_str(); @@ -1330,6 +1334,7 @@ int GetChatMessageCount() { return chatMessageCount; } +// TODO: We should probably change this thread into PSPThread (or merging it into the existing AdhocThread PSPThread) as there are too many global vars being used here which also being used within some HLEs int friendFinder(){ SetCurrentThreadName("FriendFinder"); auto n = GetI18NCategory("Networking"); @@ -1356,7 +1361,7 @@ int friendFinder(){ addrinfo* resolved = nullptr; std::string err; g_adhocServerIP.in.sin_addr.s_addr = INADDR_NONE; - if (!net::DNSResolve(g_Config.proAdhocServer, "", &resolved, err)) { + if (g_Config.bEnableWlan && !net::DNSResolve(g_Config.proAdhocServer, "", &resolved, err)) { ERROR_LOG(SCENET, "DNS Error Resolving %s\n", g_Config.proAdhocServer.c_str()); host->NotifyUserMessage(n->T("DNS Error Resolving ") + g_Config.proAdhocServer, 2.0f, 0x0000ff); } @@ -1373,6 +1378,7 @@ int friendFinder(){ g_adhocServerIP.in.sin_port = htons(SERVER_PORT); // Finder Loop + friendFinderRunning = true; while (friendFinderRunning) { // Acquire Network Lock //_acquireNetworkLock(); @@ -1390,8 +1396,8 @@ int friendFinder(){ } else { networkInited = false; - shutdown(metasocket, SD_BOTH); - closesocket(metasocket); + shutdown((int)metasocket, SD_BOTH); + closesocket((int)metasocket); metasocket = (int)INVALID_SOCKET; } } @@ -1408,20 +1414,22 @@ int friendFinder(){ uint8_t opcode = OPCODE_PING; // Send Ping to Server, may failed with socket error 10054/10053 if someone else with the same IP already connected to AdHoc Server (the server might need to be modified to differentiate MAC instead of IP) - if (IsSocketReady(metasocket, false, true) > 0) { - int iResult = send(metasocket, (const char*)&opcode, 1, MSG_NOSIGNAL); + if (IsSocketReady((int)metasocket, false, true) > 0) { + int iResult = send((int)metasocket, (const char*)&opcode, 1, MSG_NOSIGNAL); int error = errno; // KHBBS seems to be getting error 10053 often if (iResult == SOCKET_ERROR) { ERROR_LOG(SCENET, "FriendFinder: Socket Error (%i) when sending OPCODE_PING", error); if (error != EAGAIN && error != EWOULDBLOCK) { networkInited = false; - shutdown(metasocket, SD_BOTH); - closesocket(metasocket); + shutdown((int)metasocket, SD_BOTH); + closesocket((int)metasocket); metasocket = (int)INVALID_SOCKET; host->NotifyUserMessage(std::string(n->T("Disconnected from AdhocServer")) + " (" + std::string(n->T("Error")) + ": " + std::to_string(error) + ")", 2.0, 0x0000ff); // Mark all friends as timedout since we won't be able to detects disconnected friends anymore without being connected to Adhoc Server + peerlock.lock(); timeoutFriendsRecursive(friends); + peerlock.unlock(); } } else { @@ -1433,8 +1441,8 @@ int friendFinder(){ } // Check for Incoming Data - if (IsSocketReady(metasocket, true, false) > 0) { - int received = recv(metasocket, (char*)(rx + rxpos), sizeof(rx) - rxpos, MSG_NOSIGNAL); + if (IsSocketReady((int)metasocket, true, false) > 0) { + int received = recv((int)metasocket, (char*)(rx + rxpos), sizeof(rx) - rxpos, MSG_NOSIGNAL); // Free Network Lock //_freeNetworkLock(); @@ -1744,6 +1752,7 @@ int friendFinder(){ // Prevent the games from having trouble to reInitiate Adhoc (the next NetInit -> PdpCreate after NetTerm) adhocctlState = ADHOCCTL_STATE_DISCONNECTED; + friendFinderRunning = false; // Log Shutdown INFO_LOG(SCENET, "FriendFinder: End of Friend Finder Thread"); @@ -1786,7 +1795,7 @@ int getLocalIp(sockaddr_in* SocketAddress) { struct sockaddr_in localAddr; localAddr.sin_addr.s_addr = INADDR_ANY; socklen_t addrLen = sizeof(localAddr); - int ret = getsockname(metasocket, (struct sockaddr*)&localAddr, &addrLen); + int ret = getsockname((int)metasocket, (struct sockaddr*)&localAddr, &addrLen); if (SOCKET_ERROR != ret) { SocketAddress->sin_addr = localAddr.sin_addr; return 0; @@ -2143,23 +2152,23 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ ERROR_LOG(SCENET, "Invalid socket"); return SOCKET_ERROR; } - setSockKeepAlive(metasocket, true); + setSockKeepAlive((int)metasocket, true); // Disable Nagle Algo to prevent delaying small packets - setSockNoDelay(metasocket, 1); + setSockNoDelay((int)metasocket, 1); // Switch to Nonblocking Behaviour - changeBlockingMode(metasocket, 1); + changeBlockingMode((int)metasocket, 1); // If Server is at localhost Try to Bind socket to specific adapter before connecting to prevent 2nd instance being recognized as already existing 127.0.0.1 by AdhocServer // (may not works in WinXP/2003 for IPv4 due to "Weak End System" model) if (isLoopbackIP(g_adhocServerIP.in.sin_addr.s_addr)) { int on = 1; // Not sure what is this SO_DONTROUTE supposed to fix, but i do remembered there were issue related to multiple-instances without SO_DONTROUTE, but forgot how to reproduce it :( - setsockopt(metasocket, SOL_SOCKET, SO_DONTROUTE, (const char*)&on, sizeof(on)); - setSockReuseAddrPort(metasocket); + setsockopt((int)metasocket, SOL_SOCKET, SO_DONTROUTE, (const char*)&on, sizeof(on)); + setSockReuseAddrPort((int)metasocket); g_localhostIP.in.sin_port = 0; // Bind Local Address to Socket - iResult = bind(metasocket, &g_localhostIP.addr, sizeof(g_localhostIP.addr)); + iResult = bind((int)metasocket, &g_localhostIP.addr, sizeof(g_localhostIP.addr)); if (iResult == SOCKET_ERROR) { ERROR_LOG(SCENET, "Bind to alternate localhost[%s] failed(%i).", ip2str(g_localhostIP.in.sin_addr).c_str(), iResult); host->NotifyUserMessage(std::string(n->T("Failed to Bind Localhost IP")) + " " + ip2str(g_localhostIP.in.sin_addr).c_str(), 2.0, 0x0000ff); @@ -2190,18 +2199,18 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ // Connect to Adhoc Server int errorcode = 0; int cnt = 0; - iResult = connect(metasocket, &g_adhocServerIP.addr, sizeof(g_adhocServerIP)); + iResult = connect((int)metasocket, &g_adhocServerIP.addr, sizeof(g_adhocServerIP)); errorcode = errno; if (iResult == SOCKET_ERROR && errorcode != EISCONN) { u64 startTime = (u64)(time_now_d() * 1000000.0); - while (IsSocketReady(metasocket, false, true) <= 0) { + while (IsSocketReady((int)metasocket, false, true) <= 0) { u64 now = (u64)(time_now_d() * 1000000.0); if (coreState == CORE_POWERDOWN) return iResult; if (now - startTime > adhocDefaultTimeout) break; sleep_ms(10); } - if (IsSocketReady(metasocket, false, true) <= 0) { + if (IsSocketReady((int)metasocket, false, true) <= 0) { ERROR_LOG(SCENET, "Socket error (%i) when connecting to AdhocServer [%s/%s:%u]", errorcode, g_Config.proAdhocServer.c_str(), ip2str(g_adhocServerIP.in.sin_addr).c_str(), ntohs(g_adhocServerIP.in.sin_port)); host->NotifyUserMessage(std::string(n->T("Failed to connect to Adhoc Server")) + " (" + std::string(n->T("Error")) + ": " + std::to_string(errorcode) + ")", 1.0f, 0x0000ff); return iResult; @@ -2218,12 +2227,12 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ packet.name.data[ADHOCCTL_NICKNAME_LEN - 1] = 0; memcpy(packet.game.data, adhoc_id->data, ADHOCCTL_ADHOCID_LEN); - IsSocketReady(metasocket, false, true, nullptr, adhocDefaultTimeout); - int sent = send(metasocket, (char*)&packet, sizeof(packet), MSG_NOSIGNAL); + IsSocketReady((int)metasocket, false, true, nullptr, adhocDefaultTimeout); + int sent = send((int)metasocket, (char*)&packet, sizeof(packet), MSG_NOSIGNAL); if (sent > 0) { socklen_t addrLen = sizeof(LocalIP); memset(&LocalIP, 0, addrLen); - getsockname(metasocket, &LocalIP, &addrLen); + getsockname((int)metasocket, &LocalIP, &addrLen); host->NotifyUserMessage(n->T("Network Initialized"), 1.0); return 0; } @@ -2251,7 +2260,7 @@ bool resolveIP(uint32_t ip, SceNetEtherAddr * mac) { } // Multithreading Lock - peerlock.lock(); + std::lock_guard peer_guard(peerlock); // Peer Reference SceNetAdhocctlPeerInfo * peer = friends; @@ -2263,17 +2272,11 @@ bool resolveIP(uint32_t ip, SceNetEtherAddr * mac) { // Copy Data *mac = peer->mac_addr; - // Multithreading Unlock - peerlock.unlock(); - // Return Success return true; } } - // Multithreading Unlock - peerlock.unlock(); - // Peer not found return false; } @@ -2292,7 +2295,7 @@ bool resolveMAC(SceNetEtherAddr * mac, uint32_t * ip) { } // Multithreading Lock - std::lock_guard guard(peerlock); + std::lock_guard peer_guard(peerlock); // Peer Reference SceNetAdhocctlPeerInfo * peer = friends; diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index d2f52cb62d..127b79d455 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -40,6 +40,7 @@ #include #include +#include #include "Common/Net/Resolve.h" #include "Common/Serialize/Serializer.h" @@ -221,6 +222,19 @@ typedef struct SceNetEtherAddr { uint8_t data[ETHER_ADDR_LEN]; } PACK SceNetEtherAddr; +inline bool operator<(const SceNetEtherAddr& lhs, const SceNetEtherAddr& rhs) { + uint64_t l = 0; + uint64_t r = 0; + const uint8_t* lp = lhs.data; + const uint8_t* rp = rhs.data; + for (int8_t i = 5; i >= 0; i--) { + int8_t sb = (CHAR_BIT * i); + l |= (uint64_t)*lp++ << sb; + r |= (uint64_t)*rp++ << sb; + } + return (l < r); +} + // Broadcast MAC extern uint8_t broadcastMAC[ETHER_ADDR_LEN]; @@ -486,12 +500,15 @@ typedef struct SceNetAdhocMatchingContext { // Maximum Number of Peers (for HOST, P2P) s32_le maxpeers; - // Local MAC Address - SceNetEtherAddr mac; - // Peer List for Connectees SceNetAdhocMatchingMemberInternal *peerlist; // SceNetAdhocMatchingMemberInfo[Emu] + // Peer Port list + std::map *peerPort; + + // Local MAC Address + SceNetEtherAddr mac; + // Local PDP Port u16_le port; @@ -898,7 +915,7 @@ extern int actionAfterMatchingMipsCall; #define SOCK_PDP 1 #define SOCK_PTP 2 // Aux vars -extern int metasocket; +extern std::atomic metasocket; extern SceNetAdhocctlParameter parameter; extern SceNetAdhocctlAdhocId product_code; extern std::thread friendFinderThread; @@ -928,7 +945,7 @@ extern SceNetAdhocMatchingContext * contexts; extern char* dummyPeekBuf64k; extern int dummyPeekBuf64kSize; extern int one; -extern bool friendFinderRunning; +extern std::atomic friendFinderRunning; extern SceNetAdhocctlPeerInfo * friends; extern SceNetAdhocctlScanInfo * networks; extern u64 adhocctlStartTime; @@ -945,6 +962,7 @@ extern GameModeArea masterGameModeArea; extern std::vector replicaGameModeAreas; extern std::vector requiredGameModeMacs; extern std::vector gameModeMacs; +extern std::map gameModePeerPorts; // End of Aux vars enum AdhocConnectionType : int diff --git a/Core/HLE/proAdhocServer.cpp b/Core/HLE/proAdhocServer.cpp index bead86c49c..c1b8f36b8a 100644 --- a/Core/HLE/proAdhocServer.cpp +++ b/Core/HLE/proAdhocServer.cpp @@ -80,8 +80,7 @@ SceNetAdhocctlUserNode * _db_user = NULL; SceNetAdhocctlGameNode * _db_game = NULL; // Server Status -//int _status = 0; -bool adhocServerRunning = false; +std::atomic adhocServerRunning(false); std::thread adhocServerThread; // Crosslink database for cross region Adhoc play diff --git a/Core/HLE/proAdhocServer.h b/Core/HLE/proAdhocServer.h index 3773749eea..63a2897652 100644 --- a/Core/HLE/proAdhocServer.h +++ b/Core/HLE/proAdhocServer.h @@ -369,5 +369,5 @@ void update_status(); int proAdhocServerThread(int port); // (int argc, char * argv[]) //extern int _status; -extern bool adhocServerRunning; +extern std::atomic adhocServerRunning; extern std::thread adhocServerThread; diff --git a/Core/HLE/sceAudiocodec.cpp b/Core/HLE/sceAudiocodec.cpp index 21d643e1fc..ed4dc42aa3 100644 --- a/Core/HLE/sceAudiocodec.cpp +++ b/Core/HLE/sceAudiocodec.cpp @@ -156,7 +156,7 @@ const HLEFunction sceAudiocodec[] = { {0X3A20A200, &WrapI_UI, "sceAudiocodecGetEDRAM", 'i', "xi"}, {0X29681260, &WrapI_UI, "sceAudiocodecReleaseEDRAM", 'i', "xi"}, {0X9D3F790C, &WrapI_UI, "sceAudiocodecCheckNeedMem", 'i', "xi"}, - {0X59176A0F, nullptr, "sceAudiocodec_59176A0F", '?', "" }, + {0X59176A0F, nullptr, "sceAudiocodecAlcExtendParameter", '?', "" }, }; void Register_sceAudiocodec() diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 522e330b05..ce83a611ef 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -15,10 +15,11 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. -#include -#include -#include #include +#include +#include +#include +#include // TODO: Move this somewhere else, cleanup. #ifndef _WIN32 @@ -130,7 +131,10 @@ std::map vblankPausedWaits; // STATE END // Called when vblank happens (like an internal interrupt.) Not part of state, should be static. -std::vector vblankListeners; +static std::mutex listenersLock; +static std::vector vblankListeners; +typedef std::pair FlipListener; +static std::vector flipListeners; // The vblank period is 731.5 us (0.7315 ms) const double vblankMs = 0.7315; @@ -343,21 +347,51 @@ void __DisplayDoState(PointerWrap &p) { } void __DisplayShutdown() { + std::lock_guard guard(listenersLock); vblankListeners.clear(); + flipListeners.clear(); vblankWaitingThreads.clear(); } void __DisplayListenVblank(VblankCallback callback) { + std::lock_guard guard(listenersLock); vblankListeners.push_back(callback); } -static void __DisplayFireVblank() { - for (std::vector::iterator iter = vblankListeners.begin(), end = vblankListeners.end(); iter != end; ++iter) { - VblankCallback cb = *iter; +void __DisplayListenFlip(FlipCallback callback, void *userdata) { + std::lock_guard guard(listenersLock); + flipListeners.push_back(std::make_pair(callback, userdata)); +} + +void __DisplayForgetFlip(FlipCallback callback, void *userdata) { + std::lock_guard guard(listenersLock); + flipListeners.erase(std::remove_if(flipListeners.begin(), flipListeners.end(), [&](FlipListener item) { + return item.first == callback && item.second == userdata; + }), flipListeners.end()); +} + +static void DisplayFireVblank() { + std::vector toCall = []{ + std::lock_guard guard(listenersLock); + return vblankListeners; + }(); + + for (VblankCallback cb : toCall) { cb(); } } +static void DisplayFireFlip() { + std::vector toCall = [] { + std::lock_guard guard(listenersLock); + return flipListeners; + }(); + + for (FlipListener cb : toCall) { + cb.first(cb.second); + } +} + void __DisplayVblankBeginCallback(SceUID threadID, SceUID prevCallbackId) { SceUID pauseKey = prevCallbackId == 0 ? threadID : prevCallbackId; @@ -471,7 +505,7 @@ static void CalculateFPS() { } } - if (g_Config.bDrawFrameGraph) { + if (g_Config.bDrawFrameGraph || coreCollectDebugStats) { frameTimeHistory[frameTimeHistoryPos++] = now - lastFrameTimeHistory; lastFrameTimeHistory = now; frameTimeHistoryPos = frameTimeHistoryPos % frameTimeHistorySize; @@ -557,16 +591,6 @@ static void DoFrameTiming(bool &throttle, bool &skipFrame, float timestep) { // Check if the frameskipping code should be enabled. If neither throttling or frameskipping is on, // we have nothing to do here. bool doFrameSkip = g_Config.iFrameSkip != 0; - - bool fastForwardNeedsSkip = g_Config.iFastForwardMode == (int)FastForwardMode::SKIP_DRAW; - if (!throttle && fastForwardNeedsSkip) { - skipFrame = true; - if (numSkippedFrames >= 7) { - skipFrame = false; - } - return; - } - if (!throttle && !doFrameSkip) return; @@ -591,16 +615,12 @@ static void DoFrameTiming(bool &throttle, bool &skipFrame, float timestep) { } // Auto-frameskip automatically if speed limit is set differently than the default. - bool forceFrameskip = fpsLimit > 60 && fastForwardNeedsSkip; int frameSkipNum = CalculateFrameSkip(); - if (g_Config.bAutoFrameSkip || forceFrameskip) { + if (g_Config.bAutoFrameSkip) { // autoframeskip // Argh, we are falling behind! Let's skip a frame and see if we catch up. if (curFrameTime > nextFrameTime && doFrameSkip) { skipFrame = true; - if (forceFrameskip) { - throttle = false; - } } } else if (frameSkipNum >= 1) { // fixed frameskip @@ -670,7 +690,7 @@ static void DoFrameIdleTiming() { #endif } - if (g_Config.bDrawFrameGraph) { + if (g_Config.bDrawFrameGraph || coreCollectDebugStats) { frameSleepHistory[frameTimeHistoryPos] += time_now_d() - before; } } @@ -741,15 +761,13 @@ void __DisplayFlip(int cyclesLate) { bool duplicateFrames = g_Config.bRenderDuplicateFrames && g_Config.iFrameSkip == 0; - bool fastForwardNeedsSkip = g_Config.iFastForwardMode != (int)FastForwardMode::CONTINUOUS; - bool fastForwardSkipFlip = g_Config.iFastForwardMode == (int)FastForwardMode::SKIP_FLIP; + bool fastForwardSkipFlip = g_Config.iFastForwardMode != (int)FastForwardMode::CONTINUOUS; if (g_Config.bVSync && GetGPUBackend() == GPUBackend::VULKAN) { // Vulkan doesn't support the interval setting, so we force skipping the flip. fastForwardSkipFlip = true; } - // postEffectRequiresFlip is not compatible with frameskip fast-forward, see #12325. - if (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE && !(fastForwardNeedsSkip && !FrameTimingThrottled())) { + if (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE) { postEffectRequiresFlip = duplicateFrames || g_Config.bShaderChainRequires60FPS; } @@ -758,6 +776,7 @@ void __DisplayFlip(int cyclesLate) { if (fbDirty || noRecentFlip || postEffectRequiresFlip) { int frameSleepPos = frameTimeHistoryPos; CalculateFPS(); + DisplayFireFlip(); // Let the user know if we're running slow, so they know to adjust settings. // Sometimes users just think the sound emulation is broken. @@ -779,9 +798,11 @@ void __DisplayFlip(int cyclesLate) { bool forceNoFlip = false; float refreshRate = System_GetPropertyFloat(SYSPROP_DISPLAY_REFRESH_RATE); + // Avoid skipping on devices that have 58 or 59 FPS, except when alternate speed is set. + bool refreshRateNeedsSkip = FrameTimingLimit() != 60 && FrameTimingLimit() > refreshRate; // Alternative to frameskip fast-forward, where we draw everything. // Useful if skipping a frame breaks graphics or for checking drawing speed. - if (fastForwardSkipFlip && (!FrameTimingThrottled() || FrameTimingLimit() > refreshRate)) { + if (fastForwardSkipFlip && (!FrameTimingThrottled() || refreshRateNeedsSkip)) { static double lastFlip = 0; double now = time_now_d(); if ((now - lastFlip) < 1.0f / refreshRate) { @@ -835,7 +856,7 @@ void __DisplayFlip(int cyclesLate) { CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); numVBlanksSinceFlip = 0; - if (g_Config.bDrawFrameGraph) { + if (g_Config.bDrawFrameGraph || coreCollectDebugStats) { // Track how long we sleep (whether vsync or sleep_ms.) frameSleepHistory[frameSleepPos] += time_now_d() - lastFrameTimeHistory; } @@ -862,7 +883,7 @@ void hleLeaveVblank(u64 userdata, int cyclesLate) { CoreTiming::ScheduleEvent(msToCycles(frameMs - vblankMs) - cyclesLate, enterVblankEvent, userdata); // Fire the vblank listeners after the vblank completes. - __DisplayFireVblank(); + DisplayFireVblank(); } void hleLagSync(u64 userdata, int cyclesLate) { @@ -900,7 +921,7 @@ void hleLagSync(u64 userdata, int cyclesLate) { const int over = (int)((now - goal) * 1000000); ScheduleLagSync(over - emuOver); - if (g_Config.bDrawFrameGraph) { + if (g_Config.bDrawFrameGraph || coreCollectDebugStats) { frameSleepHistory[frameTimeHistoryPos] += now - before; } } diff --git a/Core/HLE/sceDisplay.h b/Core/HLE/sceDisplay.h index 47294c56d7..ab0871894e 100644 --- a/Core/HLE/sceDisplay.h +++ b/Core/HLE/sceDisplay.h @@ -25,16 +25,16 @@ void __DisplayShutdown(); void Register_sceDisplay(); -// will return true once after every end-of-frame. -bool __DisplayFrameDone(); - // Get information about the current framebuffer. bool __DisplayGetFramebuf(PSPPointer *topaddr, u32 *linesize, u32 *pixelFormat, int mode); void __DisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync); typedef void (*VblankCallback)(); -// Listen for vblank events. Only register during init. +// Listen for vblank events. void __DisplayListenVblank(VblankCallback callback); +typedef void (*FlipCallback)(void *userdata); +void __DisplayListenFlip(FlipCallback callback, void *userdata); +void __DisplayForgetFlip(FlipCallback callback, void *userdata); void __DisplayGetDebugStats(char stats[], size_t bufsize); void __DisplayGetFPS(float *out_vps, float *out_fps, float *out_actual_fps); diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 37eda68a42..7382373c63 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -665,12 +665,10 @@ void __IoInit() { memset(fds, 0, sizeof(fds)); - ioManagerThreadEnabled = g_Config.bSeparateIOThread; - ioManager.SetThreadEnabled(ioManagerThreadEnabled); - if (ioManagerThreadEnabled) { - Core_ListenLifecycle(&__IoWakeManager); - ioManagerThread = new std::thread(&__IoManagerThread); - } + ioManagerThreadEnabled = true; + ioManager.SetThreadEnabled(true); + Core_ListenLifecycle(&__IoWakeManager); + ioManagerThread = new std::thread(&__IoManagerThread); __KernelRegisterWaitTypeFuncs(WAITTYPE_ASYNCIO, __IoAsyncBeginCallback, __IoAsyncEndCallback); @@ -1962,7 +1960,7 @@ static u32 sceIoDevctl(const char *name, int cmd, u32 argAddr, int argLen, u32 o switch (cmd) { case 1: // EMULATOR_DEVCTL__GET_HAS_DISPLAY if (Memory::IsValidAddress(outPtr)) - Memory::Write_U32(0, outPtr); // TODO: Make a headless mode for running tests! + Memory::Write_U32(PSP_CoreParameter().headLess ? 0 : 1, outPtr); return 0; case 2: // EMULATOR_DEVCTL__SEND_OUTPUT { diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index d4b4619878..3e970aa1a9 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -965,8 +965,8 @@ void Register_LoadExecForUser() const HLEFunction LoadExecForKernel[] = { {0x4AC57943, &WrapI_I, "sceKernelRegisterExitCallback", 'i', "i", HLE_KERNEL_SYSCALL }, - {0XA3D5E142, nullptr, "LoadExecForKernel_a3d5e142", '?', "" }, - {0X28D0D249, &WrapI_CU, "sceKernelLoadExec_28D0D249", 'i', "sx" }, + {0XA3D5E142, nullptr, "sceKernelExitVSHVSH", '?', "" }, + {0X28D0D249, &WrapI_CU, "sceKernelLoadExecVSHMs2", 'i', "sx" }, {0x6D302D3D, &WrapV_V, "sceKernelExitVSHKernel", 'v', "x", HLE_KERNEL_SYSCALL },// when called in game mode it will have the same effect that sceKernelExitGame }; diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index fe3da314ea..84be05710b 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -96,7 +96,7 @@ static const int MPEG_HEADER_BUFFER_MINIMUM_SIZE = 2048; // For PMP media static u32 pmp_videoSource = 0; //pointer to the video source (SceMpegLLi structure) -static int pmp_nBlocks = 0; //number of blocks received in the last sceMpegbase_BEA18F91 call +static int pmp_nBlocks = 0; //number of blocks received in the last sceMpegBasePESpacketCopy call static std::list pmp_queue; //list of pmp video frames have been decoded and will be played static std::list pmp_ContextList; //list of pmp media contexts static bool pmp_oldStateLoaded = false; // for dostate @@ -2405,7 +2405,7 @@ void Register_sceMpeg() // This function is currently only been used for PMP videos // p pointing to a SceMpegLLI structure consists of video frame blocks. -static u32 sceMpegbase_BEA18F91(u32 p) +static u32 sceMpegBasePESpacketCopy(u32 p) { pmp_videoSource = p; pmp_nBlocks = 0; @@ -2420,13 +2420,13 @@ static u32 sceMpegbase_BEA18F91(u32 p) p = p + sizeof(SceMpegLLI); } - DEBUG_LOG(ME, "sceMpegbase_BEA18F91(%08x), received %d block(s)", pmp_videoSource, pmp_nBlocks); + DEBUG_LOG(ME, "sceMpegBasePESpacketCopy(%08x), received %d block(s)", pmp_videoSource, pmp_nBlocks); return 0; } const HLEFunction sceMpegbase[] = { - {0XBEA18F91, &WrapU_U, "sceMpegbase_BEA18F91", 'x', "x" }, + {0XBEA18F91, &WrapU_U, "sceMpegBasePESpacketCopy", 'x', "x" }, {0X492B5E4B, nullptr, "sceMpegBaseCscInit", '?', "" }, {0X0530BE4E, nullptr, "sceMpegbase_0530BE4E", '?', "" }, {0X91929A21, nullptr, "sceMpegBaseCscAvc", '?', "" }, diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index d792b16cc6..37339d251b 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -66,6 +66,13 @@ bool netAdhocInited; bool netAdhocctlInited; bool networkInited = false; +#define DISCOVER_DURATION_US 2000000 // 2 seconds is probably the normal time it takes for PSP to connect to a group (ie. similar to NetconfigDialog time) +u64 netAdhocDiscoverStartTime = 0; +s32 netAdhocDiscoverStatus = NET_ADHOC_DISCOVER_STATUS_NONE; +bool netAdhocDiscoverIsStopping = false; +SceNetAdhocDiscoverParam* netAdhocDiscoverParam = nullptr; +u32 netAdhocDiscoverBufAddr = 0; + bool netAdhocGameModeEntered = false; int netAdhocEnterGameModeTimeout = 15000000; // 15 sec as default timeout, to wait for all players to join @@ -118,12 +125,11 @@ static int sceNetAdhocPdpRecv(int id, void* addr, void* port, void* buf, void* d void __NetAdhocShutdown() { // Kill AdhocServer Thread - if (adhocServerRunning) { - adhocServerRunning = false; - if (adhocServerThread.joinable()) { - adhocServerThread.join(); - } + adhocServerRunning = false; + if (adhocServerThread.joinable()) { + adhocServerThread.join(); } + // Checks to avoid confusing logspam if (netAdhocMatchingInited) { NetAdhocMatching_Term(); @@ -184,7 +190,12 @@ static void __GameModeNotify(u64 userdata, int cyclesLate) { int sentcount = 0; for (auto& gma : replicaGameModeAreas) { if (!gma.dataSent && IsSocketReady(sock->data.pdp.id, false, true) > 0) { - int sent = sceNetAdhocPdpSend(gameModeSocket, (const char*)&gma.mac, ADHOC_GAMEMODE_PORT, masterGameModeArea.data, masterGameModeArea.size, 0, ADHOC_F_NONBLOCK); + u16_le port = ADHOC_GAMEMODE_PORT; + auto it = gameModePeerPorts.find(gma.mac); + if (it != gameModePeerPorts.end()) + port = it->second; + + int sent = sceNetAdhocPdpSend(gameModeSocket, (const char*)&gma.mac, port, masterGameModeArea.data, masterGameModeArea.size, 0, ADHOC_F_NONBLOCK); if (sent != ERROR_NET_ADHOC_WOULD_BLOCK) { gma.dataSent = 1; DEBUG_LOG(SCENET, "GameMode: Master data Sent %d bytes to Area #%d [%s]", masterGameModeArea.size, gma.id, mac2str(&gma.mac).c_str()); @@ -209,7 +220,12 @@ static void __GameModeNotify(u64 userdata, int cyclesLate) { recvd++; // Since we're able to receive data, now we're certain that remote player is listening and ready to receive data, so we send initial data one more time in case they're not listening yet on previous attempt (ie. Pocket Pool) if (gma.dataUpdated) { - sceNetAdhocPdpSend(gameModeSocket, (const char*)&gma.mac, ADHOC_GAMEMODE_PORT, masterGameModeArea.data, masterGameModeArea.size, 0, ADHOC_F_NONBLOCK); + u16_le port = ADHOC_GAMEMODE_PORT; + auto it = gameModePeerPorts.find(gma.mac); + if (it != gameModePeerPorts.end()) + port = it->second; + + sceNetAdhocPdpSend(gameModeSocket, (const char*)&gma.mac, port, masterGameModeArea.data, masterGameModeArea.size, 0, ADHOC_F_NONBLOCK); } } } @@ -244,6 +260,21 @@ static void __GameModeNotify(u64 userdata, int cyclesLate) { s32_le bufsz = gameModeBuffSize; int ret = sceNetAdhocPdpRecv(gameModeSocket, &sendermac, &senderport, gameModeBuffer, &bufsz, 0, ADHOC_F_NONBLOCK); if (ret >= 0 && bufsz > 0) { + // Shows a warning if the sender/source port is different than what it supposed to be. + if (senderport != ADHOC_GAMEMODE_PORT && senderport != gameModePeerPorts[sendermac]) { + char name[9] = {}; + auto n = GetI18NCategory("Networking"); + peerlock.lock(); + SceNetAdhocctlPeerInfo* peer = findFriend(&sendermac); + if (peer != NULL) + truncate_cpy(name, sizeof(name), (const char*)peer->nickname.data); + WARN_LOG(SCENET, "GameMode: Unknown Source Port from [%s][%s:%u -> %u] (Result=%i, Size=%i)", name, mac2str(&sendermac).c_str(), senderport, ADHOC_GAMEMODE_PORT, ret, bufsz); + host->NotifyUserMessage(std::string(n->T("GM: Data from Unknown Port")) + std::string(" [") + std::string(name) + std::string("]:") + std::to_string(senderport) + std::string(" -> ") + std::to_string(ADHOC_GAMEMODE_PORT) + std::string(" (") + std::to_string(portOffset) + std::string(")"), 2.0, 0x0080ff); + peerlock.unlock(); + } + // Keeping track of the source port for further communication, in case it was re-mapped by router or ISP for some reason. + gameModePeerPorts[sendermac] = senderport; + for (auto& gma : replicaGameModeAreas) { if (IsMatch(gma.mac, sendermac)) { DEBUG_LOG(SCENET, "GameMode: Replica data Received %d bytes for Area #%d [%s]", bufsz, gma.id, mac2str(&sendermac).c_str()); @@ -312,8 +343,8 @@ static void __AdhocctlNotify(u64 userdata, int cyclesLate) { ret = SOCKET_ERROR; sockerr = EAGAIN; // Don't send anything yet if connection to Adhoc Server is still in progress - if (!isAdhocctlNeedLogin && IsSocketReady(metasocket, false, true) > 0) { - ret = send(metasocket, (const char*)&packet, len, MSG_NOSIGNAL); + if (!isAdhocctlNeedLogin && IsSocketReady((int)metasocket, false, true) > 0) { + ret = send((int)metasocket, (const char*)&packet, len, MSG_NOSIGNAL); sockerr = errno; // Successfully Sent or Connection has been closed or Connection failure occurred if (ret >= 0 || (ret == SOCKET_ERROR && sockerr != EAGAIN && sockerr != EWOULDBLOCK)) { @@ -379,7 +410,7 @@ static void __AdhocctlState(u64 userdata, int cyclesLate) { // Used to simulate blocking on metasocket when send OP code to AdhocServer int WaitBlockingAdhocctlSocket(AdhocctlRequest request, int usec, const char* reason) { - int uid = (metasocket <= 0) ? 1 : metasocket; + int uid = (metasocket <= 0) ? 1 : (int)metasocket; if (adhocctlRequests.find(uid) != adhocctlRequests.end()) { WARN_LOG(SCENET, "sceNetAdhocctl - WaitID[%d] already existed, Socket is busy!", uid); @@ -771,11 +802,12 @@ int DoBlockingPtpConnect(int uid, AdhocSocketRequest& req, s64& result) { if (sock->nonblocking) result = ERROR_NET_ADHOC_WOULD_BLOCK; else - result = ERROR_NET_ADHOC_TIMEOUT; + result = ERROR_NET_ADHOC_TIMEOUT; // FIXME: PSP never returned ERROR_NET_ADHOC_TIMEOUT on PtpConnect? or only returned ERROR_NET_ADHOC_TIMEOUT when the host is too busy? Seems to be returning ERROR_NET_ADHOC_CONNECTION_REFUSED on timedout instead (if the other side in not listening yet). } } + // Select was interrupted or contains invalid args? else - result = ERROR_NET_ADHOC_CONNECTION_REFUSED; // ERROR_NET_ADHOC_TIMEOUT; + result = ERROR_NET_ADHOC_EXCEPTION_EVENT; // ERROR_NET_ADHOC_INVALID_ARG; if (ret == SOCKET_ERROR) DEBUG_LOG(SCENET, "sceNetAdhocPtpConnect[%i]: Socket Error (%i)", req.id, sockerr); @@ -1155,8 +1187,8 @@ void __NetAdhocInit() { __AdhocServerInit(); // Create built-in AdhocServer Thread + adhocServerRunning = false; if (g_Config.bEnableWlan && g_Config.bEnableAdhocServer) { - adhocServerRunning = true; adhocServerThread = std::thread(proAdhocServerThread, SERVER_PORT); } } @@ -1206,7 +1238,6 @@ static u32 sceNetAdhocctlInit(int stackSize, int prio, u32 productAddr) { // TODO: Merging friendFinder (real) thread to AdhocThread (fake) thread on PSP side if (!friendFinderRunning) { - friendFinderRunning = true; friendFinderThread = std::thread(friendFinder); } @@ -1784,7 +1815,8 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * return WaitBlockingAdhocSocket(threadSocketId, PDP_RECV, id, buf, len, timeout, saddr, sport, "pdp recv"); } - return hleLogSuccessVerboseX(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); + VERBOSE_LOG(SCENET, "%08x=sceNetAdhocPdpRecv: would block", ERROR_NET_ADHOC_WOULD_BLOCK); // Temporary fix to avoid a crash on the Logs due to trying to Logs syscall's argument from another thread (ie. AdhocMatchingInput thread) + return ERROR_NET_ADHOC_WOULD_BLOCK; // hleLogSuccessVerboseX(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); } hleEatMicro(50); @@ -2338,7 +2370,7 @@ u32 NetAdhocctl_Disconnect() { int us = adhocDefaultDelay * 3; hleEatMicro(1000); - if (isAdhocctlBusy) { + if (isAdhocctlBusy && CoreTiming::IsScheduled(adhocctlNotifyEvent)) { return ERROR_NET_ADHOCCTL_BUSY; } @@ -2359,7 +2391,7 @@ u32 NetAdhocctl_Disconnect() { //_acquireNetworkLock(); // Send Disconnect Request Packet - iResult = send(metasocket, (const char*)&opcode, 1, MSG_NOSIGNAL); + iResult = send((int)metasocket, (const char*)&opcode, 1, MSG_NOSIGNAL); error = errno; // Sending may get socket error 10053 if the AdhocServer is already shutted down @@ -2476,8 +2508,8 @@ int NetAdhocctl_Term() { adhocctlHandlers.clear(); // Free stuff here networkInited = false; - shutdown(metasocket, SD_BOTH); - closesocket(metasocket); + shutdown((int)metasocket, SD_BOTH); + closesocket((int)metasocket); metasocket = (int)INVALID_SOCKET; // Delete fake PSP Thread. // kernelObjects may already been cleared early during a Shutdown, thus trying to access it may generates Warning/Error in the log @@ -2783,6 +2815,7 @@ int NetAdhocctl_CreateEnterGameMode(const char* group_name, int game_type, int n return ERROR_NET_ADHOCCTL_INVALID_ARG; deleteAllGMB(); + gameModePeerPorts.clear(); SceNetEtherAddr* addrs = PSPPointer::Create(membersAddr); // List of participating MAC addresses (started from host) for (int i = 0; i < num_members; i++) { @@ -3589,9 +3622,13 @@ int NetAdhocPtp_Connect(int id, int timeout, int flag, bool allowForcedConnect) return hleLogDebug(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); } } - // No connection could be made because the target device actively refused it. + // No connection could be made because the target device actively refused it (on Windows/Linux/Android), or no one listening on the remote address (on Linux/Android). else if (errorcode == ECONNREFUSED) { - return hleLogError(SCENET, ERROR_NET_ADHOC_CONNECTION_REFUSED, "connection refused"); + // Workaround for ERROR_NET_ADHOC_CONNECTION_REFUSED to be more cross-platform, since there is no way to simulate ERROR_NET_ADHOC_CONNECTION_REFUSED properly on Windows + if (flag) + return hleLogError(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "connection refused workaround"); + else + return hleLogError(SCENET, ERROR_NET_ADHOC_TIMEOUT, "connection refused workaround"); } } } @@ -4303,6 +4340,7 @@ int NetAdhocGameMode_DeleteMaster() { free(masterGameModeArea.data); } //NetAdhocPdp_Delete(masterGameModeArea.socket, 0); + gameModePeerPorts.erase(masterGameModeArea.mac); masterGameModeArea = { 0 }; if (replicaGameModeAreas.size() <= 0) { @@ -4378,6 +4416,7 @@ static int sceNetAdhocGameModeDeleteReplica(int id) { it->data = nullptr; } //sceNetAdhocPdpDelete(it->socket, 0); + gameModePeerPorts.erase(it->mac); replicaGameModeAreas.erase(it); if (replicaGameModeAreas.size() <= 0 && isZeroMAC(&masterGameModeArea.mac)) { @@ -4488,6 +4527,8 @@ int NetAdhocMatching_Delete(int matchingId) { free(item->hello); free(item->rxbuf); clearPeerList(item); //deleteAllMembers(item); + (*item->peerPort).clear(); + delete item->peerPort; // Destroy locks item->eventlock->lock(); // Make sure it's not locked when being deleted item->eventlock->unlock(); @@ -4638,6 +4679,7 @@ static int sceNetAdhocMatchingCreate(int mode, int maxnum, int port, int rxbufle context->timeout = (((u64)(keepalive_int)+(u64)rexmt_int) * (u64)init_count); context->timeout += adhocDefaultTimeout; // For internet play we need higher timeout than what the game wanted context->handler = handler; + context->peerPort = new std::map(); // Fill in Selfpeer context->mac = localmac; @@ -5359,6 +5401,9 @@ int sceNetAdhocMatchingSendData(int matchingId, const char *mac, int dataLen, u3 void* data = NULL; if (Memory::IsValidAddress(dataAddr)) data = Memory::GetPointer(dataAddr); + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find Target Peer SceNetAdhocMatchingMemberInternal* peer = findPeer(context, (SceNetEtherAddr*)mac); @@ -5468,16 +5513,16 @@ int sceNetAdhocMatchingAbortSendData(int matchingId, const char *mac) { // Get the maximum memory usage by the matching library static int sceNetAdhocMatchingGetPoolMaxAlloc() { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocMatchingGetPoolMaxAlloc()"); + ERROR_LOG(SCENET, "UNIMPL sceNetAdhocMatchingGetPoolMaxAlloc() at %08x", currentMIPS->pc); if (!g_Config.bEnableWlan) return -1; // Lazy way out - hardcoded return value - return fakePoolSize/2; // (50 * 1024); + return hleLogDebug(SCENET, fakePoolSize/2, "faked value"); } int sceNetAdhocMatchingGetPoolStat(u32 poolstatPtr) { - DEBUG_LOG(SCENET, "UNTESTED sceNetAdhocMatchingGetPoolStat(%08x)", poolstatPtr); + DEBUG_LOG(SCENET, "UNTESTED sceNetAdhocMatchingGetPoolStat(%08x) at %08x", poolstatPtr, currentMIPS->pc); if (!g_Config.bEnableWlan) return -1; @@ -5500,11 +5545,11 @@ int sceNetAdhocMatchingGetPoolStat(u32 poolstatPtr) { } // Invalid Argument - return ERROR_NET_ADHOC_MATCHING_INVALID_ARG; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_INVALID_ARG, "adhocmatching invalid arg"); } // Uninitialized Library - return ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED, "adhocmatching not initialized"); } void __NetTriggerCallbacks() @@ -5682,6 +5727,7 @@ int NetAdhocctl_ExitGameMode() { } deleteAllGMB(); + gameModePeerPorts.clear(); adhocctlCurrentMode = ADHOCCTL_MODE_NONE; netAdhocGameModeEntered = false; @@ -5953,39 +5999,172 @@ const HLEFunction sceNetAdhocctl[] = { {0XB0B80E80, &WrapI_CIIIUUI, "sceNetAdhocctlCreateEnterGameModeMin", 'i', "siiixxi" }, // ?? }; -int sceNetAdhocDiscoverInitStart() { - ERROR_LOG_REPORT_ONCE(sceNetAdhocDiscoverInitStart, SCENET, "UNIMPL sceNetAdhocDiscoverInitStart() at %08x", currentMIPS->pc); - return 0; +// Return value: 0/0x80410005/0x80411301/error returned from sceNetAdhocctl_lib_F8BABD85[/error returned from sceUtilityGetSystemParamInt?] +int sceNetAdhocDiscoverInitStart(u32 paramAddr) { + WARN_LOG_REPORT_ONCE(sceNetAdhocDiscoverInitStart, SCENET, "UNIMPL sceNetAdhocDiscoverInitStart(%08x) at %08x", paramAddr, currentMIPS->pc); + // FIXME: Most AdhocDiscover syscalls will return 0x80410005 if (sceKernelCheckThreadStack_user() < 0x00000FE0), AdhocDiscover seems to be storing some data in the stack, while we use global variables for these + if (sceKernelCheckThreadStack() < 0x00000FE0) + return 0x80410005; + // TODO: Allocate internal buffer/struct (on the stack?) to be returned on sceNetAdhocDiscoverUpdate (the struct may contains WLAN channel from sceUtilityGetSystemParamInt at offset 0xA0 ?), setup adhocctl state callback handler to detects state change (using sceNetAdhocctl_lib_F8BABD85(stateCallbackFunction=0x09F436F8, adhocctlStateCallbackArg=0x0) on JPCSP+prx) + u32 bufSize = 256; // dummy size, not sure how large it supposed to be, may be at least 0x3c bytes like in param->unknown2 ? + if (netAdhocDiscoverBufAddr == 0) { + netAdhocDiscoverBufAddr = userMemory.Alloc(bufSize, true, "AdhocDiscover"); // The address returned on DiscoverUpdate seems to be much higher than the param address, closer to the internal stateCallbackFunction address + if (!Memory::IsValidAddress(netAdhocDiscoverBufAddr)) + return 0x80410005; + Memory::Memset(netAdhocDiscoverBufAddr, 0, bufSize); + } + // FIME: Not sure what is this address 0x000010B0 used for (current Step may be?), but return 0x80411301 if (*((int *) 0x000010B0) != 0) + //if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) != 0) //if (*((int*)Memory::GetPointer(0x000010B0)) != 0) + // return 0x80411301; // Already Initialized/Started? + // TODO: Need to findout whether using invalid params or param address will return an error code or not + netAdhocDiscoverParam = (SceNetAdhocDiscoverParam*)Memory::GetPointer(paramAddr); + if (!netAdhocDiscoverParam) + return hleLogError(SCENET, -1, "invalid param?"); + // FIXME: paramAddr seems to be stored at 0x000010D8 without validating the value first + //*((int*)Memory::GetPointer(0x000010D8)) = paramAddr; + + // Based on Legend Of The Dragon: + // The 1st 24 x 32bit(addr) seems to be pointers to subroutine containings sceNetAdhocctlCreate/sceNetAdhocctlJoin/sceNetAdhocctlDisconnect/sceNetAdhocctlScan/sceNetRand/sceKernelGetSystemTimeWide/etc. + // Offset 0x60: 10 00 06 06 + // Offset 0x70: FF FF FF FF (before Init) -> 00 00 00 00 (after Init) -> FF FF FF FF (after Term) // Seems to be value returned from sceNetAdhocctl_lib_F8BABD85, and the address (0x000010A0) seems to be the lowest one for storing data + // Offset 0x80: 00 -> 0B/0C/0D/13 -> 00 // This seems to be (current step?) at address at 0x000010B0 (ie. *((int *) 0x000010B0) = 0x0000000B), something todo with param->unknown1(sleep mode?) + // Offset 0x84: 00 -> 03 -> 03 // somekind of State? Something todo with param->unknown1(sleep mode?) along with data at 0x000010B0 (current step?) + // Offset 0x98: 0000 -> 0000/0200 -> 0000 // This seems to be somekind of flags at 0x000010C8 (ie. *((int *) 0x000010C8) = (var4 | 0x00000080)), something todo with data at 0x000010B0 (current step?) + // Offset 0xA0: WLAN channel from sceUtilityGetSystemParamInt (ie. sceUtilityGetSystemParamInt(0x00000002, 0x000010D0) on decompiled prx, but on JPCSP+prx Logs it's sceUtilityGetSystemParamInt(0x00000002, 0x09F43FD0)) + // Offset 0xA4: Seems to be at 0x000010D4 and related to RequestSuspend + // Offset 0xA8: paramAddr // This seems to be a fixed address at 0x000010D8 (ie. *((int *) 0x000010D8) = paramAddr) + // The rest are zeroed + Memory::Write_U32(0x06060010, netAdhocDiscoverBufAddr + 0x60); + Memory::Write_U32(0xffffffff, netAdhocDiscoverBufAddr + 0x70); + if (netAdhocDiscoverParam->unknown1 == 0) { + Memory::Write_U32(0x0B, netAdhocDiscoverBufAddr + 0x80); + Memory::Write_U32(0x03, netAdhocDiscoverBufAddr + 0x84); + } + else if (netAdhocDiscoverParam->unknown1 == 1) { + Memory::Write_U32(0x0F, netAdhocDiscoverBufAddr + 0x80); + Memory::Write_U32(0x04, netAdhocDiscoverBufAddr + 0x84); + } + Memory::Write_U32(0, netAdhocDiscoverBufAddr + 0x98); + Memory::Write_U32(g_Config.iWlanAdhocChannel, netAdhocDiscoverBufAddr + 0xA0); + Memory::Write_U32(0, netAdhocDiscoverBufAddr + 0xA4); + Memory::Write_U32(paramAddr, netAdhocDiscoverBufAddr + 0xA8); + + char grpName[ADHOCCTL_GROUPNAME_LEN + 1] = { 0 }; + memcpy(grpName, netAdhocDiscoverParam->groupName, ADHOCCTL_GROUPNAME_LEN); // For logging purpose, must not be truncated + DEBUG_LOG(SCENET, "sceNetAdhocDiscoverInitStart - Param.Unknown1 : %08x", netAdhocDiscoverParam->unknown1); + DEBUG_LOG(SCENET, "sceNetAdhocDiscoverInitStart - Param.GroupName: [%s]", grpName); + DEBUG_LOG(SCENET, "sceNetAdhocDiscoverInitStart - Param.Unknown2 : %08x", netAdhocDiscoverParam->unknown2); + DEBUG_LOG(SCENET, "sceNetAdhocDiscoverInitStart - Param.Result : %08x", netAdhocDiscoverParam->result); + + // TODO: Check whether we're already in the correct group and change the status and result accordingly + netAdhocDiscoverIsStopping = false; + netAdhocDiscoverStatus = NET_ADHOC_DISCOVER_STATUS_IN_PROGRESS; + netAdhocDiscoverParam->result = NET_ADHOC_DISCOVER_RESULT_NO_PEER_FOUND; + netAdhocDiscoverStartTime = CoreTiming::GetGlobalTimeUsScaled(); + return hleLogSuccessInfoX(SCENET, 0); } +// Note1: When canceling the progress, Legend Of The Dragon will use DiscoverStop -> AdhocctlDisconnect -> DiscoverTerm (when status changed to 2) +// Note2: When result = NO_PEER_FOUND or PEER_FOUND the progress can no longer be canceled on Legend Of The Dragon int sceNetAdhocDiscoverStop() { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverStop()"); + WARN_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverStop()"); + if (sceKernelCheckThreadStack() < 0x00000FF0) + return 0x80410005; + + if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) > 0 && (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80)^0x13) > 0) { + Memory::Write_U32(Memory::Read_U32(netAdhocDiscoverBufAddr + 0x98) | 0x20, netAdhocDiscoverBufAddr + 0x98); + Memory::Write_U32(0, netAdhocDiscoverBufAddr + 0xA4); + } + // FIXME: Doesn't seems to be immediately changed the status, may be waiting until Disconnected from Adhocctl before changing the status to Completed? + netAdhocDiscoverIsStopping = true; + //netAdhocDiscoverStatus = NET_ADHOC_DISCOVER_STATUS_COMPLETED; + //if (netAdhocDiscoverParam) netAdhocDiscoverParam->result = NET_ADHOC_DISCOVER_RESULT_CANCELED; return 0; } int sceNetAdhocDiscoverTerm() { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverTerm()"); - return 0; -} + WARN_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverTerm() at %08x", currentMIPS->pc); + /* + if (sceKernelCheckThreadStack() < 0x00000FF0) + return 0x80410005; -int sceNetAdhocDiscoverUpdate() { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverUpdate() at %08x", currentMIPS->pc); + if (!(Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) > 0 && (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) ^ 0x13) > 0)) + return 0x80411301; // Not Initialized/Started yet? + */ + // TODO: Use sceNetAdhocctl_lib_1C679240 to remove adhocctl state callback handler setup in sceNetAdhocDiscoverInitStart + /*if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x70) >= 0) { + LinkDiscoverSkip(Memory::Read_U32(netAdhocDiscoverBufAddr + 0x70)); //sceNetAdhocctl_lib_1C679240 + Memory::Write_U32(0xffffffff, netAdhocDiscoverBufAddr + 0x70); + } + Memory::Write_U32(0, netAdhocDiscoverBufAddr + 0x80); + Memory::Write_U32(0, netAdhocDiscoverBufAddr + 0xA8); + */ + netAdhocDiscoverStatus = NET_ADHOC_DISCOVER_STATUS_NONE; + //if (netAdhocDiscoverParam) netAdhocDiscoverParam->result = NET_ADHOC_DISCOVER_RESULT_NO_PEER_FOUND; // Test: Using result = NET_ADHOC_DISCOVER_RESULT_NO_PEER_FOUND will trigger Legend Of The Dragon to call sceNetAdhocctlGetPeerList after DiscoverTerm + if (Memory::IsValidAddress(netAdhocDiscoverBufAddr)) { + userMemory.Free(netAdhocDiscoverBufAddr); + netAdhocDiscoverBufAddr = 0; + } + netAdhocDiscoverIsStopping = false; return 0; } int sceNetAdhocDiscoverGetStatus() { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverGetStatus()"); - return 0; // returning 2 will trigger Legend Of The Dragon to call sceNetAdhocctlGetPeerList + DEBUG_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverGetStatus() at %08x", currentMIPS->pc); + if (sceKernelCheckThreadStack() < 0x00000FF0) + return 0x80410005; + /* + if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) <= 0) + return 0; + if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) <= 0x13) + return 1; + if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) == 0x13) + return 2; + */ + return hleLogDebug(SCENET, netAdhocDiscoverStatus); // Returning 2 will trigger Legend Of The Dragon to call sceNetAdhocctlGetPeerList (only happened if it was the first sceNetAdhocDiscoverGetStatus after sceNetAdhocDiscoverInitStart) } int sceNetAdhocDiscoverRequestSuspend() { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverRequestSuspend()"); - return 0; + ERROR_LOG_REPORT_ONCE(sceNetAdhocDiscoverRequestSuspend, SCENET, "UNIMPL sceNetAdhocDiscoverRequestSuspend() at %08x", currentMIPS->pc); + // FIXME: Not sure what is this syscall used for, may be related to Sleep Mode and can be triggered by using Power/Hold Switch? (based on what's written on Dissidia 012) + if (sceKernelCheckThreadStack() < 0x00000FF0) + return 0x80410005; + /* + if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0xA4) == 0) + return 0x80411303; // Already Suspended? + if (Memory::Read_U32(netAdhocDiscoverBufAddr + 0x80) != 0) + return 0x80411303; // Already Suspended? + int ret = sceNetAdhocctl_lib_1572422C(); + if (ret >= 0) + Memory::Write_U32(0, netAdhocDiscoverBufAddr + 0xA4); + return ret; + */ + // Since we don't know what this supposed to do, and we currently don't have a working AdhocDiscover yet, may be we should cancel the progress for now? + netAdhocDiscoverIsStopping = true; + return hleLogError(SCENET, 0); +} + +int sceNetAdhocDiscoverUpdate() { + DEBUG_LOG(SCENET, "UNIMPL sceNetAdhocDiscoverUpdate() at %08x", currentMIPS->pc); + if (sceKernelCheckThreadStack() < 0x00000FF0) + return 0x80410005; + + // TODO: Use switch case for each Step + if (netAdhocDiscoverStatus == NET_ADHOC_DISCOVER_STATUS_IN_PROGRESS) { + //u64 now = CoreTiming::GetGlobalTimeUsScaled(); + if (netAdhocDiscoverIsStopping /*|| now >= netAdhocDiscoverStartTime + DISCOVER_DURATION_US*/) { + // Fake a successful completion after some time (or when detecting another player in the same Group?) + netAdhocDiscoverStatus = NET_ADHOC_DISCOVER_STATUS_COMPLETED; + if (netAdhocDiscoverParam) + netAdhocDiscoverParam->result = NET_ADHOC_DISCOVER_RESULT_CANCELED; // netAdhocDiscoverIsStopping ? NET_ADHOC_DISCOVER_RESULT_CANCELED : NET_ADHOC_DISCOVER_RESULT_PEER_FOUND; + } + } + return hleDelayResult(hleLogDebug(SCENET, 0/*netAdhocDiscoverBufAddr*/), "adhoc discover update", 300); // FIXME: Based on JPCSP+prx, it seems to be returning a pointer to the internal buffer/struct (only when status = 1 ?), But when i stepped the code it returns 0 (might be a bug on JPCSP LLE Logging?) } const HLEFunction sceNetAdhocDiscover[] = { - {0X941B3877, &WrapI_V, "sceNetAdhocDiscoverInitStart", 'i', "" }, + {0X941B3877, &WrapI_U, "sceNetAdhocDiscoverInitStart", 'i', "x" }, {0X52DE1B97, &WrapI_V, "sceNetAdhocDiscoverUpdate", 'i', "" }, {0X944DDBC6, &WrapI_V, "sceNetAdhocDiscoverGetStatus", 'i', "" }, {0XA2246614, &WrapI_V, "sceNetAdhocDiscoverTerm", 'i', "" }, @@ -6010,9 +6189,24 @@ void broadcastPingMessage(SceNetAdhocMatchingContext * context) uint8_t ping = PSP_ADHOC_MATCHING_PACKET_PING; // Send Broadcast - context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)(SceNetEtherAddr *)broadcastMAC, context->port, &ping, sizeof(ping), 0, ADHOC_F_NONBLOCK); - context->socketlock->unlock(); + // FIXME: Not sure whether this PING supposed to be sent only to AdhocMatching members or to everyone in Adhocctl Group, since we already pinging the AdhocServer to avoid getting kicked out of Adhocctl Group + peerlock.lock(); + auto peer = friends; // Use context->peerlist if only need to send to AdhocMatching members + for (; peer != NULL; peer = peer->next) { + // Skipping soon to be removed peer + if (peer->last_recv == 0) + continue; + + u16_le port = context->port; + auto it = (*context->peerPort).find(peer->mac_addr); + if (it != (*context->peerPort).end()) + port = it->second; + + context->socketlock->lock(); + sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac_addr, port, &ping, sizeof(ping), 0, ADHOC_F_NONBLOCK); + context->socketlock->unlock(); + } + peerlock.unlock(); } /** @@ -6053,10 +6247,24 @@ void broadcastHelloMessage(SceNetAdhocMatchingContext * context) DataToHexString(10, 0, context->hello, context->hellolen, &hellohex); DEBUG_LOG(SCENET, "HELLO Dump (%d bytes):\n%s", context->hellolen, hellohex.c_str()); - // Send Broadcast - context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)(SceNetEtherAddr *)broadcastMAC, context->port, hello, 5 + context->hellolen, 0, ADHOC_F_NONBLOCK); - context->socketlock->unlock(); + // Send Broadcast, so everyone know we have a room here + peerlock.lock(); + SceNetAdhocctlPeerInfo* peer = friends; + for (; peer != NULL; peer = peer->next) { + // Skipping soon to be removed peer + if (peer->last_recv == 0) + continue; + + u16_le port = context->port; + auto it = (*context->peerPort).find(peer->mac_addr); + if (it != (*context->peerPort).end()) + port = it->second; + + context->socketlock->lock(); + sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac_addr, port, hello, 5 + context->hellolen, 0, ADHOC_F_NONBLOCK); + context->socketlock->unlock(); + } + peerlock.unlock(); // Free Memory, not needed since it may be reused again later //free(hello); @@ -6072,6 +6280,9 @@ void broadcastHelloMessage(SceNetAdhocMatchingContext * context) */ void sendAcceptPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac, int optlen, void * opt) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find Peer SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac); @@ -6132,7 +6343,7 @@ void sendAcceptPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma // Send Data context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)mac, context->port, accept, 9 + optlen + siblingbuflen, 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], accept, 9 + optlen + siblingbuflen, 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); // Free Memory @@ -6153,6 +6364,9 @@ void sendAcceptPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma */ void sendJoinPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac, int optlen, void * opt) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find Peer SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac); @@ -6176,7 +6390,7 @@ void sendJoinPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac, // Send Data context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)mac, context->port, join, 5 + optlen, 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], join, 5 + optlen, 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); // Free Memory @@ -6194,6 +6408,9 @@ void sendJoinPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac, */ void sendCancelPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac, int optlen, void * opt) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Allocate Cancel Message Buffer uint8_t * cancel = (uint8_t *)malloc(5LL + optlen); @@ -6211,14 +6428,13 @@ void sendCancelPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma // Send Data context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)mac, context->port, cancel, 5 + optlen, 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], cancel, 5 + optlen, 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); // Free Memory free(cancel); } - peerlock.lock(); // Find Peer SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac); @@ -6235,7 +6451,6 @@ void sendCancelPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma // Delete Peer else deletePeer(context, peer); } - peerlock.unlock(); } /** @@ -6247,6 +6462,9 @@ void sendCancelPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma */ void sendBulkDataPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac, int datalen, void * data) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find Peer SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac); @@ -6273,7 +6491,7 @@ void sendBulkDataPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * // Send Data context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)mac, context->port, send, 5 + datalen, 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], send, 5 + datalen, 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); // Free Memory @@ -6295,6 +6513,9 @@ void sendBulkDataPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * */ void sendBirthPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find Newborn Child SceNetAdhocMatchingMemberInternal * newborn = findPeer(context, mac); @@ -6322,7 +6543,7 @@ void sendBirthPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac { // Send Packet context->socketlock->lock(); - int sent = sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, context->port, packet, sizeof(packet), 0, ADHOC_F_NONBLOCK); + int sent = sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet), 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); // Log Send Success @@ -6342,6 +6563,9 @@ void sendBirthPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac */ void sendDeathPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Find abandoned Child SceNetAdhocMatchingMemberInternal * deadkid = findPeer(context, mac); @@ -6365,7 +6589,7 @@ void sendDeathPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac // Send Bye Packet context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, context->port, packet, sizeof(packet[0]), 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet[0]), 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); } else @@ -6377,7 +6601,7 @@ void sendDeathPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac // Send Death Packet context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, context->port, packet, sizeof(packet), 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet), 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); } } @@ -6393,6 +6617,9 @@ void sendDeathPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac */ void sendByePacket(SceNetAdhocMatchingContext * context) { + // Lock the peer + std::lock_guard peer_guard(peerlock); + // Iterate Peers SceNetAdhocMatchingMemberInternal * peer = context->peerlist; for (; peer != NULL; peer = peer->next) @@ -6405,7 +6632,7 @@ void sendByePacket(SceNetAdhocMatchingContext * context) // Send Bye Packet context->socketlock->lock(); - sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, context->port, &opcode, sizeof(opcode), 0, ADHOC_F_NONBLOCK); + sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], &opcode, sizeof(opcode), 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); } } @@ -7144,7 +7371,7 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi u64_le now; static SceNetEtherAddr sendermac; - static uint16_t senderport; + static u32_le senderport; static int rxbuflen; // Log Startup @@ -7245,12 +7472,16 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi // FIXME: When using JPCSP + prx files, the "SceNetAdhocMatchingInput" thread is using blocking PdpRecv with infinite(0) timeout, which can be stopped/aborted using SetSocketAlert, while "SceNetAdhocMatchingEvent" thread is using non-blocking for sending rxbuflen = context->rxbuflen; senderport = 0; + // Lock the peer first before locking the socket to avoid race condiion + peerlock.lock(); context->socketlock->lock(); int recvresult = sceNetAdhocPdpRecv(context->socket, &sendermac, &senderport, context->rxbuf, &rxbuflen, 0, ADHOC_F_NONBLOCK); context->socketlock->unlock(); + peerlock.unlock(); // Received Data from a Sender that interests us - if (recvresult == 0 && rxbuflen > 0 && context->port == senderport) + // Note: There are cases where the sender port might be re-mapped by router or ISP, so we shouldn't check the source port. + if (recvresult == 0 && rxbuflen > 0) { // Log Receive Success if (context->rxbuf[0] > 1) { @@ -7269,6 +7500,19 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi else { WARN_LOG(SCENET, "InputLoop[%d]: Unknown Peer[%s:%u] (Recved=%i, Length=%i)", matchingId, mac2str(&sendermac).c_str(), senderport, recvresult, rxbuflen); } + + // Show a warning if other player is having their port being re-mapped, thus that other player may have issue with the communication. + // Note: That other player may need to switch side between host and join, or reboot their router to solve this issue. + if (context->port != senderport && senderport != (*context->peerPort)[sendermac]) { + char name[9] = {}; + if (peer != NULL) + truncate_cpy(name, sizeof(name), (const char*)peer->nickname.data); + WARN_LOG(SCENET, "InputLoop[%d]: Unknown Source Port from [%s][%s:%u -> %u] (Recved=%i, Length=%i)", matchingId, name, mac2str(&sendermac).c_str(), senderport, context->port, recvresult, rxbuflen); + host->NotifyUserMessage(std::string(n->T("AM: Data from Unknown Port")) + std::string(" [") + std::string(name) + std::string("]:") + std::to_string(senderport) + std::string(" -> ") + std::to_string(context->port) + std::string(" (") + std::to_string(portOffset) + std::string(")"), 2.0, 0x0080ff); + } + // Keep tracks of re-mapped peer's ports for further communication. + // Note: This will only works if this player were able to receives data on normal port from other players (ie. this player's port wasn't remapped) + (*context->peerPort)[sendermac] = senderport; peerlock.unlock(); // Ping Packet @@ -7303,10 +7547,6 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi // Ignore Incoming Trash Data } - else if (recvresult == 0 && rxbuflen > 0) { - WARN_LOG(SCENET, "InputLoop[%d]: Unknown Port[%s:%u] (Recved=%i, Length=%i)", matchingId, mac2str(&sendermac).c_str(), senderport, recvresult, rxbuflen); - host->NotifyUserMessage(std::string(n->T("Data from incorrect Port")) + std::string(" [") + mac2str(&sendermac) + std::string("]:") + std::to_string(senderport) + std::string(" -> ") + std::to_string(context->port) + std::string(" (") + std::to_string(portOffset) + std::string(")"), 1.0, 0x0080ff); - } // Handle Peer Timeouts handleTimeout(context); diff --git a/Core/HLE/sceNetAdhoc.h b/Core/HLE/sceNetAdhoc.h index 73016cc20d..9027012b85 100644 --- a/Core/HLE/sceNetAdhoc.h +++ b/Core/HLE/sceNetAdhoc.h @@ -26,6 +26,13 @@ typedef struct MatchingArgs { u32_le data[6]; //ContextID, Opcode, bufAddr[ to MAC], OptLen, OptAddr[, EntryPoint] } PACK MatchingArgs; + +typedef struct SceNetAdhocDiscoverParam { + u32_le unknown1; // SleepMode? (ie. 0 on on Legend Of The Dragon, 1 on Dissidia 012) + char groupName[ADHOCCTL_GROUPNAME_LEN]; + u32_le unknown2; // size of something? (ie. 0x3c on Legend Of The Dragon, 0x14 on Dissidia 012) // Note: the param size is 0x14 may be it can contains extra data too? + u32_le result; // inited to 0? +} PACK SceNetAdhocDiscoverParam; #ifdef _MSC_VER #pragma pack(pop) #endif @@ -69,6 +76,22 @@ enum AdhocSocketRequestType : int ADHOC_POLL_SOCKET = 7, }; +enum AdhocDiscoverStatus : int +{ + NET_ADHOC_DISCOVER_STATUS_NONE = 0, + NET_ADHOC_DISCOVER_STATUS_IN_PROGRESS = 1, + NET_ADHOC_DISCOVER_STATUS_COMPLETED = 2, +}; + +enum AdhocDiscoverResult : int +{ + NET_ADHOC_DISCOVER_RESULT_NO_PEER_FOUND = 0, // Initial value + NET_ADHOC_DISCOVER_RESULT_CANCELED = 1, // CANCELED or STOPPED? + NET_ADHOC_DISCOVER_RESULT_PEER_FOUND = 2, + NET_ADHOC_DISCOVER_RESULT_ABORTED = 3, // Internal Error occured? +}; + + class PointerWrap; void Register_sceNetAdhoc(); diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index 1fea3b6c51..2fd7259e70 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -563,7 +563,7 @@ static const HLEFunction scePower[] = { {0X7F30B3B1, nullptr, "scePowerIdleTimerEnable", '?', "" }, {0X972CE941, nullptr, "scePowerIdleTimerDisable", '?', "" }, {0X27F3292C, nullptr, "scePowerBatteryUpdateInfo", '?', "" }, - {0XE8E4E204, nullptr, "scePower_E8E4E204", '?', "" }, + {0XE8E4E204, nullptr, "scePowerGetForceSuspendCapacity", '?', "" }, {0XB999184C, nullptr, "scePowerGetLowBatteryCapacity", '?', "" }, {0X87440F5E, &WrapI_V, "scePowerIsPowerOnline", 'i', "" }, {0X0AFD0D8B, &WrapI_V, "scePowerIsBatteryExist", 'i', "" }, @@ -603,7 +603,7 @@ static const HLEFunction scePower[] = { {0X737486F2, &WrapU_UUU, "scePowerSetClockFrequency", 'x', "xxx"}, {0X34F9C463, &WrapU_V, "scePowerGetPllClockFrequencyInt", 'x', "" }, {0XEA382A27, &WrapF_V, "scePowerGetPllClockFrequencyFloat", 'f', "" }, - {0XEBD177D6, &WrapU_UUU, "scePower_EBD177D6", 'x', "xxx"}, // This is also the same as SetClockFrequency + {0XEBD177D6, &WrapU_UUU, "scePowerSetClockFrequency350", 'x', "xxx"}, // This is also the same as SetClockFrequency {0X469989AD, &WrapU_UUU, "scePower_469989ad", 'x', "xxx"}, // This is also the same as SetClockFrequency {0X545A7F3C, nullptr, "scePower_545A7F3C", '?', "" }, // TODO: Supposedly the same as SetClockFrequency also? {0XA4E93389, nullptr, "scePower_A4E93389", '?', "" }, // TODO: Supposedly the same as SetClockFrequency also? diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index fde4d5ca3c..f3b473fc92 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -136,29 +136,44 @@ static int oldStatus = -1; static std::map currentlyLoadedModules; static int volatileUnlockEvent = -1; static HLEHelperThread *accessThread = nullptr; +static bool accessThreadFinished = true; +static const char *accessThreadState = "initial"; -static void CleanupDialogThreads() { - if (accessThread && accessThread->Stopped()) { - delete accessThread; - accessThread = nullptr; +static void CleanupDialogThreads(bool force = false) { + if (accessThread) { + if (accessThread->Stopped() || accessThreadFinished) { + delete accessThread; + accessThread = nullptr; + accessThreadState = "cleaned up"; + } else if (force) { + ERROR_LOG_REPORT(SCEUTILITY, "Utility access thread still running, state: %s, dialog=%d/%d", accessThreadState, currentDialogType, currentDialogActive); + + // Try to force shutdown anyway. + accessThread->Terminate(); + delete accessThread; + accessThread = nullptr; + accessThreadState = "force terminated"; + // Try to unlock in case other dialog was shutting down. + KernelVolatileMemUnlock(0); + } } } static void ActivateDialog(UtilityDialogType type) { + CleanupDialogThreads(); if (!currentDialogActive) { currentDialogType = type; currentDialogActive = true; // So that we log the next one. oldStatus = -1; } - CleanupDialogThreads(); } static void DeactivateDialog() { + CleanupDialogThreads(); if (currentDialogActive) { currentDialogActive = false; } - CleanupDialogThreads(); } static PSPDialog *CurrentDialog(UtilityDialogType type) { @@ -205,7 +220,7 @@ void __UtilityInit() { } void __UtilityDoState(PointerWrap &p) { - auto s = p.Section("sceUtility", 1, 4); + auto s = p.Section("sceUtility", 1, 5); if (!s) { return; } @@ -241,15 +256,21 @@ void __UtilityDoState(PointerWrap &p) { Do(p, hasAccessThread); if (hasAccessThread) { Do(p, accessThread); + if (p.mode == p.MODE_READ) + accessThreadState = "from save state"; } } else { hasAccessThread = false; } + if (s >= 5) + Do(p, accessThreadFinished); + if (!hasAccessThread && accessThread) { accessThread->Forget(); delete accessThread; accessThread = nullptr; + accessThreadState = "cleared from save state"; } } @@ -264,7 +285,9 @@ void __UtilityShutdown() { if (accessThread) { delete accessThread; accessThread = nullptr; + accessThreadState = "shutdown"; } + accessThreadFinished = true; delete saveDialog; delete msgDialog; @@ -299,10 +322,11 @@ void UtilityDialogInitialize(UtilityDialogType type, int delayUs, int priority) (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityInitDialog"), }; - CleanupDialogThreads(); - _assert_(accessThread == nullptr); + CleanupDialogThreads(true); accessThread = new HLEHelperThread("ScePafJob", insts, (uint32_t)ARRAY_SIZE(insts), priority, 0x200); accessThread->Start(partDelay, 0); + accessThreadFinished = false; + accessThreadState = "initializing"; } void UtilityDialogShutdown(UtilityDialogType type, int delayUs, int priority) { @@ -325,12 +349,13 @@ void UtilityDialogShutdown(UtilityDialogType type, int delayUs, int priority) { (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityFinishDialog"), }; - CleanupDialogThreads(); - _assert_(accessThread == nullptr); + CleanupDialogThreads(true); bool prevInterrupts = __InterruptsEnabled(); __DisableInterrupts(); accessThread = new HLEHelperThread("ScePafJob", insts, (uint32_t)ARRAY_SIZE(insts), priority, 0x200); accessThread->Start(partDelay, 0); + accessThreadFinished = false; + accessThreadState = "shutting down"; if (prevInterrupts) __EnableInterrupts(); } @@ -349,6 +374,8 @@ static int UtilityWorkUs(int us) { static int UtilityInitDialog(int type) { PSPDialog *dialog = CurrentDialog((UtilityDialogType)type); + accessThreadFinished = true; + accessThreadState = "init finished"; if (dialog) return hleLogSuccessI(SCEUTILITY, dialog->FinishInit()); return hleLogError(SCEUTILITY, 0, "invalid dialog type?"); @@ -356,6 +383,8 @@ static int UtilityInitDialog(int type) { static int UtilityFinishDialog(int type) { PSPDialog *dialog = CurrentDialog((UtilityDialogType)type); + accessThreadFinished = true; + accessThreadState = "shutdown finished"; if (dialog) return hleLogSuccessI(SCEUTILITY, dialog->FinishShutdown()); return hleLogError(SCEUTILITY, 0, "invalid dialog type?"); @@ -367,6 +396,10 @@ static int sceUtilitySavedataInitStart(u32 paramAddr) { WARN_LOG(SCEUTILITY, "Yugioh Savedata Correction"); if (accessThread) { accessThread->Terminate(); + delete accessThread; + accessThread = nullptr; + accessThreadFinished = true; + accessThreadState = "terminated"; // Try to unlock in case other dialog was shutting down. KernelVolatileMemUnlock(0); } diff --git a/Core/HW/StereoResampler.cpp b/Core/HW/StereoResampler.cpp index 1705191eef..1a8a033821 100644 --- a/Core/HW/StereoResampler.cpp +++ b/Core/HW/StereoResampler.cpp @@ -118,7 +118,8 @@ inline void ClampBufferToS16(s16 *out, const s32 *in, size_t size, s8 volShift) size -= 8; } #elif PPSSPP_ARCH(ARM_NEON) - int16x4_t signedVolShift = vdup_n_s16 (-volShift); // Can only dynamic-shift right, but by a signed integer + // Dynamic shifts can only be left, but it's signed - negate to shift right. + int16x4_t signedVolShift = vdup_n_s16(-volShift); while (size >= 8) { int32x4_t in1 = vld1q_s32(in); int32x4_t in2 = vld1q_s32(in + 4); @@ -281,10 +282,11 @@ void StereoResampler::PushSamples(const s32 *samples, unsigned int numSamples) { return; } - int over_bytes = numSamples * 4 - (m_maxBufsize * 2 - (indexW & INDEX_MASK)) * sizeof(short); - if (over_bytes > 0) { - ClampBufferToS16WithVolume(&m_buffer[indexW & INDEX_MASK], samples, (numSamples * 4 - over_bytes) / 2); - ClampBufferToS16WithVolume(&m_buffer[0], samples + (numSamples * 4 - over_bytes) / sizeof(short), over_bytes / 2); + // Check if we need to roll over to the start of the buffer during the copy. + unsigned int indexW_left_samples = m_maxBufsize * 2 - (indexW & INDEX_MASK); + if (numSamples * 2 > indexW_left_samples) { + ClampBufferToS16WithVolume(&m_buffer[indexW & INDEX_MASK], samples, indexW_left_samples); + ClampBufferToS16WithVolume(&m_buffer[0], samples + indexW_left_samples, numSamples * 2 - indexW_left_samples); } else { ClampBufferToS16WithVolume(&m_buffer[indexW & INDEX_MASK], samples, numSamples * 2); } diff --git a/Core/Instance.cpp b/Core/Instance.cpp index e8a5590dbd..b8ecfd8d41 100644 --- a/Core/Instance.cpp +++ b/Core/Instance.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #endif @@ -145,7 +146,7 @@ void InitInstanceCounter() { // TODO : replace shm_open & shm_unlink with ashmem or android-shmem #else // Create shared memory object - hIDMapFile = shm_open(ID_SHM_NAME, O_CREAT | O_RDWR, 0); + hIDMapFile = shm_open(ID_SHM_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); BUF_SIZE = (BUF_SIZE < sysconf(_SC_PAGE_SIZE)) ? sysconf(_SC_PAGE_SIZE) : BUF_SIZE; if (hIDMapFile < 0 || (ftruncate(hIDMapFile, BUF_SIZE)) == -1) { // Set the size diff --git a/Core/MIPS/ARM64/Arm64CompBranch.cpp b/Core/MIPS/ARM64/Arm64CompBranch.cpp index c1218607b8..43a7709f99 100644 --- a/Core/MIPS/ARM64/Arm64CompBranch.cpp +++ b/Core/MIPS/ARM64/Arm64CompBranch.cpp @@ -438,7 +438,7 @@ void Arm64Jit::BranchVFPUFlag(MIPSOpcode op, CCFlags cc, bool likely) { ptr = TBNZ(ar, imm3); } } else { - TSTI2R(gpr.R(MIPS_REG_VFPUCC), 1 << imm3, SCRATCH1); + TSTI2R(gpr.R(MIPS_REG_VFPUCC), 1ULL << imm3, SCRATCH1); CompileDelaySlot(DELAYSLOT_SAFE_FLUSH); ptr = B(cc); } diff --git a/Core/MIPS/ARM64/Arm64CompVFPU.cpp b/Core/MIPS/ARM64/Arm64CompVFPU.cpp index b03d7ef3a9..0a636dcb39 100644 --- a/Core/MIPS/ARM64/Arm64CompVFPU.cpp +++ b/Core/MIPS/ARM64/Arm64CompVFPU.cpp @@ -1627,10 +1627,10 @@ namespace MIPSComp { if (n == 1) { MOVI2R(SCRATCH1, 0x31); } else { - MOVI2R(SCRATCH1, 1 << i); + MOVI2R(SCRATCH1, 1ULL << i); } } else { - ORRI2R(SCRATCH1, SCRATCH1, 1 << i); + ORRI2R(SCRATCH1, SCRATCH1, 1ULL << i); } break; @@ -1723,7 +1723,7 @@ namespace MIPSComp { MOVI2R(SCRATCH1, 1); // 1 << i, but i == 0 } } else { - ORRI2R(SCRATCH1, SCRATCH1, 1 << i); + ORRI2R(SCRATCH1, SCRATCH1, 1ULL << i); } SetJumpTarget(b); } @@ -1779,7 +1779,7 @@ namespace MIPSComp { fpr.MapRegsAndSpillLockV(dregs, sz, MAP_DIRTY); fpr.MapRegsAndSpillLockV(sregs, sz, 0); gpr.MapReg(MIPS_REG_VFPUCC); - TSTI2R(gpr.R(MIPS_REG_VFPUCC), 1 << imm3); + TSTI2R(gpr.R(MIPS_REG_VFPUCC), 1ULL << imm3); // TODO: Use fsel? FixupBranch b = B(tf ? CC_NEQ : CC_EQ); for (int i = 0; i < n; i++) { diff --git a/Core/MIPS/MIPSDisVFPU.cpp b/Core/MIPS/MIPSDisVFPU.cpp index 6c21fb2988..7efe6a7dd9 100644 --- a/Core/MIPS/MIPSDisVFPU.cpp +++ b/Core/MIPS/MIPSDisVFPU.cpp @@ -138,12 +138,20 @@ namespace MIPSDis sprintf(out, "%s%s\t%s, %s",name,vr>127?"c":"", RN(rt), VN(vr, V_Single)); } - void Dis_Vmftvc(MIPSOpcode op, char *out) + void Dis_Vmfvc(MIPSOpcode op, char *out) { - int vr = op & 0xFF; + int vd = _VD; + int vr = (op >> 8) & 0x7F; + const char* name = MIPSGetName(op); + sprintf(out, "%s\t%s, %s", name, VN(vd, V_Single), VN(vr + 128, V_Single)); + } + + void Dis_Vmtvc(MIPSOpcode op, char *out) + { + int vr = op & 0x7F; int vs = _VS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %s", name, VN(vs, V_Single), VN(vr, V_Single)); + sprintf(out, "%s\t%s, %s", name, VN(vs, V_Single), VN(vr + 128, V_Single)); } void Dis_VPFXST(MIPSOpcode op, char *out) @@ -224,6 +232,7 @@ namespace MIPSDis { int conNum = (op>>16) & 0x1f; int vd = _VD; + VectorSize sz = GetVecSizeSafe(op); static const char *constants[32] = { "(undef)", @@ -250,7 +259,7 @@ namespace MIPSDis const char *name = MIPSGetName(op); const char *c = constants[conNum]; if (c==0) c = constants[0]; - sprintf(out,"%s%s\t%s, %s",name,VSuff(op),VN(vd,V_Single), c); + sprintf(out,"%s%s\t%s, %s",name,VSuff(op),VN(vd,sz), c); } diff --git a/Core/MIPS/MIPSDisVFPU.h b/Core/MIPS/MIPSDisVFPU.h index 3ccabeea8c..8890ed29b1 100644 --- a/Core/MIPS/MIPSDisVFPU.h +++ b/Core/MIPS/MIPSDisVFPU.h @@ -24,7 +24,8 @@ extern u32 disPC; namespace MIPSDis { void Dis_Mftv(MIPSOpcode op, char *out); - void Dis_Vmftvc(MIPSOpcode op, char *out); + void Dis_Vmfvc(MIPSOpcode op, char *out); + void Dis_Vmtvc(MIPSOpcode op, char *out); void Dis_SV(MIPSOpcode op, char *out); void Dis_SVQ(MIPSOpcode op, char *out); diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 166f0cc969..6a411f42ba 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -576,14 +576,14 @@ const MIPSInstruction tableVFPU4Jump[32] = // 110100 xxxxx ..... . ....... . ... INVALID, INVALID, //24 - 110100 11 ........ . ....... . ....... - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), - INSTR("vwbn.s", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), + INSTR("vwbn", JITFUNC(Comp_Generic), Dis_Vwbn, Int_Vwbn, IN_OTHER|OUT_OTHER|IS_VFPU|OUT_EAT_PREFIX), }; const MIPSInstruction tableVFPU7[32] = // 110100 00001 xxxxx . ....... . ....... @@ -746,8 +746,8 @@ const MIPSInstruction tableVFPU9[32] = // 110100 00010 xxxxx . ....... . ....... INVALID, //16 - INSTR("vmfvc", JITFUNC(Comp_Vmfvc), Dis_Vmftvc, Int_Vmfvc, IN_OTHER|IN_VFPU_CC|OUT_OTHER|IS_VFPU), - INSTR("vmtvc", JITFUNC(Comp_Vmtvc), Dis_Vmftvc, Int_Vmtvc, IN_OTHER|OUT_VFPU_CC|OUT_OTHER|IS_VFPU), + INSTR("vmfvc", JITFUNC(Comp_Vmfvc), Dis_Vmfvc, Int_Vmfvc, IN_OTHER|IN_VFPU_CC|OUT_OTHER|IS_VFPU), + INSTR("vmtvc", JITFUNC(Comp_Vmtvc), Dis_Vmtvc, Int_Vmtvc, IN_OTHER|OUT_VFPU_CC|OUT_OTHER|IS_VFPU), INVALID, INVALID, @@ -981,7 +981,7 @@ int MIPSInterpret_RunUntil(u64 globalTicks) auto cond = CBreakPoints::GetBreakPointCondition(currentMIPS->pc); if (!cond || cond->Evaluate()) { - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.breakpoint", curMips->pc); if (CBreakPoints::IsTempBreakPoint(curMips->pc)) CBreakPoints::RemoveBreakPoint(curMips->pc); break; diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index 73a6a8e746..0b14eeb843 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -187,7 +187,6 @@ void InitMemoryForGamePBP(FileLoader *fileLoader) { UseLargeMem(paramSFO.GetValueInt("MEMSIZE")); // Take this moment to bring over the title, if set. - bool updateTitle = false; std::string title = paramSFO.GetValueString("TITLE"); if (g_paramSFO.GetValueString("TITLE").empty() && !title.empty()) { g_paramSFO.SetValue("TITLE", title, (int)title.size()); @@ -378,7 +377,6 @@ bool Load_PSP_ELF_PBP(FileLoader *fileLoader, std::string *error_string) { Path full_path = fileLoader->GetPath(); std::string path = full_path.GetDirectory(); - std::string extension = full_path.GetFileExtension(); std::string file = full_path.GetFilename(); size_t pos = path.find("PSP/GAME/"); diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 54299f2435..3877f5f991 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -337,14 +337,14 @@ namespace SaveState void Load(const Path &filename, int slot, Callback callback, void *cbUserData) { if (coreState == CoreState::CORE_RUNTIME_ERROR) - Core_EnableStepping(true); + Core_EnableStepping(true, "savestate.load", 0); Enqueue(Operation(SAVESTATE_LOAD, filename, slot, callback, cbUserData)); } void Save(const Path &filename, int slot, Callback callback, void *cbUserData) { if (coreState == CoreState::CORE_RUNTIME_ERROR) - Core_EnableStepping(true); + Core_EnableStepping(true, "savestate.save", 0); Enqueue(Operation(SAVESTATE_SAVE, filename, slot, callback, cbUserData)); } @@ -356,7 +356,7 @@ namespace SaveState void Rewind(Callback callback, void *cbUserData) { if (coreState == CoreState::CORE_RUNTIME_ERROR) - Core_EnableStepping(true); + Core_EnableStepping(true, "savestate.rewind", 0); Enqueue(Operation(SAVESTATE_REWIND, Path(), -1, callback, cbUserData)); } diff --git a/Core/System.cpp b/Core/System.cpp index 04070c614e..ea752d2aae 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -98,7 +98,7 @@ static std::string loadingReason; bool audioInitialized; bool coreCollectDebugStats = false; -bool coreCollectDebugStatsForced = false; +static int coreCollectDebugStatsCounter = 0; // This can be read and written from ANYWHERE. volatile CoreState coreState = CORE_STEPPING; @@ -385,8 +385,9 @@ void Core_UpdateState(CoreState newState) { } void Core_UpdateDebugStats(bool collectStats) { - if (coreCollectDebugStats != collectStats) { - coreCollectDebugStats = collectStats; + bool newState = collectStats || coreCollectDebugStatsCounter > 0; + if (coreCollectDebugStats != newState) { + coreCollectDebugStats = newState; mipsr4k.ClearJitCache(); } @@ -394,6 +395,15 @@ void Core_UpdateDebugStats(bool collectStats) { gpuStats.ResetFrame(); } +void Core_ForceDebugStats(bool enable) { + if (enable) { + coreCollectDebugStatsCounter++; + } else { + coreCollectDebugStatsCounter--; + } + _assert_(coreCollectDebugStatsCounter >= 0); +} + bool PSP_InitStart(const CoreParameter &coreParam, std::string *error_string) { if (pspIsIniting || pspIsQuitting) { return false; diff --git a/Core/System.h b/Core/System.h index 380c9e00f3..f28681e6d3 100644 --- a/Core/System.h +++ b/Core/System.h @@ -94,6 +94,8 @@ struct PSP_LoadingLock { // Call before PSP_BeginHostFrame() in order to not miss any GPU stats. void Core_UpdateDebugStats(bool collectStats); +// Increments or decrements an internal counter. Intended to be used by debuggers. +void Core_ForceDebugStats(bool enable); void Audio_Init(); void Audio_Shutdown(); diff --git a/Core/TextureReplacer.cpp b/Core/TextureReplacer.cpp index 356228038b..3d40e302d0 100644 --- a/Core/TextureReplacer.cpp +++ b/Core/TextureReplacer.cpp @@ -17,6 +17,7 @@ #include "ppsspp_config.h" #include +#include #include #include #include @@ -31,6 +32,7 @@ #include "Common/File/FileUtil.h" #include "Common/StringUtils.h" #include "Common/Thread/ParallelLoop.h" +#include "Common/TimeUtil.h" #include "Core/Config.h" #include "Core/Host.h" #include "Core/System.h" @@ -455,7 +457,7 @@ bool TextureReplacer::PopulateLevel(ReplacedTextureLevel &level) { auto imageType = Identify(fp); if (imageType == ReplacedImageType::ZIM) { fseek(fp, 4, SEEK_SET); - good = good && fread(&level.w, 4, 1, fp) == 1; + good = fread(&level.w, 4, 1, fp) == 1; good = good && fread(&level.h, 4, 1, fp) == 1; int flags; if (good && fread(&flags, 4, 1, fp) == 1) { @@ -621,6 +623,15 @@ void TextureReplacer::NotifyTextureDecoded(const ReplacedTextureDecodeInfo &repl savedCache_[replacementKey] = saved; } +void TextureReplacer::Decimate(bool forcePressure) { + // Allow replacements to be cached for a long time, although they're large. + const double age = forcePressure ? 90.0 : 1800.0; + const double threshold = time_now_d() - age; + for (auto &item : cache_) { + item.second.PurgeIfOlder(threshold); + } +} + template static typename std::unordered_map::const_iterator LookupWildcard(const std::unordered_map &map, Key &key, u64 cachekey, u32 hash, bool ignoreAddress) { auto alias = map.find(key); @@ -733,36 +744,153 @@ float TextureReplacer::LookupReduceHashRange(int& w, int& h) { } } -void ReplacedTexture::Load(int level, void *out, int rowPitch) { +class LimitedWaitable : public Waitable { +public: + LimitedWaitable() { + triggered_ = false; + } + + void Wait() override { + if (!triggered_) { + std::unique_lock lock(mutex_); + cond_.wait(lock, [&] { return !triggered_; }); + } + } + + bool WaitFor(double budget) { + uint32_t us = budget > 0 ? (uint32_t)(budget * 1000000.0) : 0; + if (!triggered_) { + if (us == 0) + return false; + std::unique_lock lock(mutex_); + cond_.wait_for(lock, std::chrono::microseconds(us), [&] { return !triggered_; }); + } + return triggered_; + } + + void Notify() { + std::unique_lock lock(mutex_); + triggered_ = true; + cond_.notify_all(); + } + +private: + std::condition_variable cond_; + std::mutex mutex_; + std::atomic triggered_; +}; + +class ReplacedTextureTask : public Task { +public: + ReplacedTextureTask(ReplacedTexture &tex, LimitedWaitable *w) : tex_(tex), waitable_(w) { + } + + void Run() override { + tex_.Prepare(); + waitable_->Notify(); + } + +private: + ReplacedTexture &tex_; + LimitedWaitable *waitable_; +}; + +bool ReplacedTexture::IsReady(double budget) { + lastUsed_ = time_now_d(); + if (threadWaitable_) { + if (!threadWaitable_->WaitFor(budget)) { + return false; + } else { + threadWaitable_->WaitAndRelease(); + threadWaitable_ = nullptr; + } + } + + // Loaded already, or not yet on a thread? + if (!levelData_.empty()) + return true; + // Let's not even start a new texture if we're already behind. + if (budget < 0.0) + return false; + + if (g_Config.bReplaceTexturesAllowLate) { + threadWaitable_ = new LimitedWaitable(); + g_threadManager.EnqueueTask(new ReplacedTextureTask(*this, threadWaitable_), TaskType::IO_BLOCKING); + + if (threadWaitable_->WaitFor(budget)) { + threadWaitable_->WaitAndRelease(); + threadWaitable_ = nullptr; + + // If we finished all the levels, we're done. + return !levelData_.empty(); + } + } else { + Prepare(); + return true; + } + + // Still pending on thread. + return false; +} + +void ReplacedTexture::Prepare() { + levelData_.resize(MaxLevel() + 1); + for (int i = 0; i <= MaxLevel(); ++i) { + if (cancelPrepare_) + break; + PrepareData(i); + } +} + +void ReplacedTexture::PrepareData(int level) { _assert_msg_((size_t)level < levels_.size(), "Invalid miplevel"); - _assert_msg_(out != nullptr && rowPitch > 0, "Invalid out/pitch"); const ReplacedTextureLevel &info = levels_[level]; + std::vector &out = levelData_[level]; FILE *fp = File::OpenCFile(info.file, "rb"); + if (!fp) { + // Leaving the data sized at zero means failure. + return; + } + auto imageType = Identify(fp); if (imageType == ReplacedImageType::ZIM) { size_t zimSize = File::GetFileSize(fp); std::unique_ptr zim(new uint8_t[zimSize]); + if (!zim) { + ERROR_LOG(G3D, "Failed to allocate memory for texture replacement"); + fclose(fp); + return; + } + if (fread(&zim[0], 1, zimSize, fp) != zimSize) { ERROR_LOG(G3D, "Could not load texture replacement: %s - failed to read ZIM", info.file.c_str()); + fclose(fp); return; } int w, h, f; uint8_t *image; - const int MIN_LINES_PER_THREAD = 4; if (LoadZIMPtr(&zim[0], zimSize, &w, &h, &f, &image)) { - ParallelRangeLoop(&g_threadManager, [&](int l, int h) { - for (int y = l; y < h; ++y) { - memcpy((uint8_t *)out + rowPitch * y, image + w * 4 * y, w * 4); + if (w > info.w || h > info.h) { + ERROR_LOG(G3D, "Texture replacement changed since header read: %s", info.file.c_str()); + fclose(fp); + return; + } + + out.resize(info.w * info.h * 4); + if (w == info.w) { + memcpy(&out[0], image, info.w * 4 * info.h); + } else { + for (int y = 0; y < h; ++y) { + memcpy(&out[info.w * 4 * y], image + w * 4 * y, w * 4); } - }, 0, h, MIN_LINES_PER_THREAD); + } free(image); } - // This will only check the hashed bits. - CheckAlphaResult res = CheckAlphaRGBA8888Basic((u32 *)out, rowPitch / sizeof(u32), w, h); + CheckAlphaResult res = CheckAlphaRGBA8888Basic((u32 *)&out[0], info.w, w, h); if (res == CHECKALPHA_ANY || level == 0) { alphaStatus_ = ReplacedTextureAlpha(res); } @@ -772,6 +900,12 @@ void ReplacedTexture::Load(int level, void *out, int rowPitch) { if (!png_image_begin_read_from_stdio(&png, fp)) { ERROR_LOG(G3D, "Could not load texture replacement info: %s - %s", info.file.c_str(), png.message); + fclose(fp); + return; + } + if (png.width > (uint32_t)info.w || png.height > (uint32_t)info.h) { + ERROR_LOG(G3D, "Texture replacement changed since header read: %s", info.file.c_str()); + fclose(fp); return; } @@ -785,15 +919,18 @@ void ReplacedTexture::Load(int level, void *out, int rowPitch) { } png.format = PNG_FORMAT_RGBA; - if (!png_image_finish_read(&png, nullptr, out, rowPitch, nullptr)) { + out.resize(info.w * info.h * 4); + if (!png_image_finish_read(&png, nullptr, &out[0], info.w * 4, nullptr)) { ERROR_LOG(G3D, "Could not load texture replacement: %s - %s", info.file.c_str(), png.message); + fclose(fp); + out.resize(0); return; } png_image_free(&png); if (!checkedAlpha) { // This will only check the hashed bits. - CheckAlphaResult res = CheckAlphaRGBA8888Basic((u32 *)out, rowPitch / sizeof(u32), png.width, png.height); + CheckAlphaResult res = CheckAlphaRGBA8888Basic((u32 *)&out[0], info.w, png.width, png.height); if (res == CHECKALPHA_ANY || level == 0) { alphaStatus_ = ReplacedTextureAlpha(res); } @@ -803,6 +940,48 @@ void ReplacedTexture::Load(int level, void *out, int rowPitch) { fclose(fp); } +void ReplacedTexture::PurgeIfOlder(double t) { + if (lastUsed_ < t && !threadWaitable_) { + levelData_.clear(); + } +} + +ReplacedTexture::~ReplacedTexture() { + if (threadWaitable_) { + cancelPrepare_ = true; + threadWaitable_->WaitAndRelease(); + threadWaitable_ = nullptr; + } +} + +bool ReplacedTexture::Load(int level, void *out, int rowPitch) { + _assert_msg_((size_t)level < levels_.size(), "Invalid miplevel"); + _assert_msg_(out != nullptr && rowPitch > 0, "Invalid out/pitch"); + + if (levelData_.empty()) + return false; + + const ReplacedTextureLevel &info = levels_[level]; + const std::vector &data = levelData_[level]; + + if (data.empty()) + return false; + _assert_msg_(data.size() == info.w * info.h * 4, "Data has wrong size"); + + if (rowPitch == info.w * 4) { + ParallelMemcpy(&g_threadManager, out, &data[0], info.w * 4 * info.h); + } else { + const int MIN_LINES_PER_THREAD = 4; + ParallelRangeLoop(&g_threadManager, [&](int l, int h) { + for (int y = l; y < h; ++y) { + memcpy((uint8_t *)out + rowPitch * y, &data[0] + info.w * 4 * y, info.w * 4); + } + }, 0, info.h, MIN_LINES_PER_THREAD); + } + + return true; +} + bool TextureReplacer::GenerateIni(const std::string &gameID, Path &generatedFilename) { if (gameID.empty()) return false; diff --git a/Core/TextureReplacer.h b/Core/TextureReplacer.h index 1410389157..6deefe8daf 100644 --- a/Core/TextureReplacer.h +++ b/Core/TextureReplacer.h @@ -32,6 +32,8 @@ class IniFile; class TextureCacheCommon; class TextureReplacer; +class ReplacedTextureTask; +class LimitedWaitable; enum class ReplacedTextureFormat { F_5650, @@ -125,6 +127,8 @@ namespace std { } struct ReplacedTexture { + ~ReplacedTexture(); + inline bool Valid() { return !levels_.empty(); } @@ -153,13 +157,24 @@ struct ReplacedTexture { return (u8)alphaStatus_; } - void Load(int level, void *out, int rowPitch); + bool IsReady(double budget); + + bool Load(int level, void *out, int rowPitch); protected: + void Prepare(); + void PrepareData(int level); + void PurgeIfOlder(double t); + std::vector levels_; + std::vector> levelData_; ReplacedTextureAlpha alphaStatus_; + double lastUsed_ = 0.0; + LimitedWaitable *threadWaitable_ = nullptr; + bool cancelPrepare_ = false; friend TextureReplacer; + friend ReplacedTextureTask; }; struct ReplacedTextureDecodeInfo { @@ -188,9 +203,14 @@ public: ReplacedTexture &FindReplacement(u64 cachekey, u32 hash, int w, int h); bool FindFiltering(u64 cachekey, u32 hash, TextureFiltering *forceFiltering); + ReplacedTexture &FindNone() { + return none_; + } void NotifyTextureDecoded(const ReplacedTextureDecodeInfo &replacedInfo, const void *data, int pitch, int level, int w, int h); + void Decimate(bool forcePressure); + static bool GenerateIni(const std::string &gameID, Path &generatedFilename); protected: diff --git a/Core/Util/GameManager.cpp b/Core/Util/GameManager.cpp index bb658b2219..6733962486 100644 --- a/Core/Util/GameManager.cpp +++ b/Core/Util/GameManager.cpp @@ -290,7 +290,7 @@ bool GameManager::InstallGame(Path url, Path fileName, bool deleteAfter) { std::string extension = url.GetFileExtension(); // Examine the URL to guess out what we're installing. - if (extension == "cso" || extension == "iso") { + if (extension == ".cso" || extension == ".iso") { // It's a raw ISO or CSO file. We just copy it to the destination. std::string shortFilename = url.GetFilename(); return InstallRawISO(fileName, shortFilename, deleteAfter); @@ -597,12 +597,12 @@ bool GameManager::InstallMemstickGame(struct zip *z, const Path &zipfile, const zip_close(z); z = nullptr; installProgress_ = 1.0f; - installInProgress_ = false; installError_ = ""; if (deleteAfter) { File::Delete(zipfile); } InstallDone(); + installInProgress_ = false; return true; bail: @@ -647,9 +647,9 @@ bool GameManager::InstallZippedISO(struct zip *z, int isoFileIndex, const Path & z = 0; installProgress_ = 1.0f; - installInProgress_ = false; installError_ = ""; InstallDone(); + installInProgress_ = false; return true; } @@ -670,9 +670,9 @@ bool GameManager::InstallRawISO(const Path &file, const std::string &originalNam } } installProgress_ = 1.0f; - installInProgress_ = false; installError_ = ""; InstallDone(); + installInProgress_ = false; return true; } diff --git a/Core/WebServer.cpp b/Core/WebServer.cpp index e84de770f1..a55b298ed2 100644 --- a/Core/WebServer.cpp +++ b/Core/WebServer.cpp @@ -26,6 +26,7 @@ #include "Common/Log.h" #include "Common/File/FileUtil.h" #include "Common/File/FileDescriptor.h" +#include "Common/File/VFS/VFS.h" #include "Common/TimeUtil.h" #include "Common/StringUtils.h" #include "Core/Config.h" @@ -227,6 +228,46 @@ static void HandleListing(const http::Request &request) { } } +static bool ServeDebuggerFile(const http::Request &request) { + // Skip the slash at the start of the resource path. + const char *filename = request.resource() + 1; + if (strstr(filename, "..") != nullptr) + return false; + + size_t size; + uint8_t *data = VFSReadFile(filename, &size); + if (!data) + return false; + + std::string ext = Path(filename).GetFileExtension(); + const char *mimeType = "text/plain"; + if (ext == ".html") { + mimeType = "text/html"; + } else if (ext == ".ico") { + mimeType = "image/x-icon"; + } else if (ext == ".js") { + mimeType = "application/javascript"; + } else if (ext == ".svg") { + mimeType = "image/svg"; + } else if (ext == ".png") { + mimeType = "image/png"; + } else if (ext == ".css") { + mimeType = "text/css"; + } + + request.WriteHttpResponseHeader("1.0", 200, (int)size, mimeType); + request.Out()->Push((char *)data, size); + + delete[] data; + return true; +} + +static void RedirectToDebugger(const http::Request &request) { + static const std::string payload = "Redirecting to debugger UI...\r\n"; + request.WriteHttpResponseHeader("1.0", 301, (int)payload.size(), "text/plain", "Location: /debugger/index.html\r\n"); + request.Out()->Push(payload); +} + static void HandleFallback(const http::Request &request) { if (serverFlags & (int)WebServerFlags::DISCS) { Path filename = LocalFromRemotePath(request.resource()); @@ -236,6 +277,16 @@ static void HandleFallback(const http::Request &request) { } } + if ((serverFlags & (int)WebServerFlags::DEBUGGER) != 0) { + if (!strcmp(request.resource(), "/debugger/")) { + RedirectToDebugger(request); + return; + } + + if (startsWith(request.resource(), "/debugger/") && ServeDebuggerFile(request)) + return; + } + static const std::string payload = "404 not found\r\n"; request.WriteHttpResponseHeader("1.0", 404, (int)payload.size(), "text/plain"); request.Out()->Push(payload); @@ -243,7 +294,18 @@ static void HandleFallback(const http::Request &request) { static void ForwardDebuggerRequest(const http::Request &request) { if (serverFlags & (int)WebServerFlags::DEBUGGER) { - HandleDebuggerRequest(request); + // Check if this is a websocket request... + std::string upgrade; + if (!request.GetHeader("upgrade", &upgrade)) { + upgrade = ""; + } + + // Yes - proceed with the socket. + if (strcasecmp(upgrade.c_str(), "websocket") == 0) { + HandleDebuggerRequest(request); + } else { + RedirectToDebugger(request); + } } else { HandleFallback(request); } diff --git a/GPU/Common/DrawEngineCommon.cpp b/GPU/Common/DrawEngineCommon.cpp index 595cc31297..87dc9cb626 100644 --- a/GPU/Common/DrawEngineCommon.cpp +++ b/GPU/Common/DrawEngineCommon.cpp @@ -704,7 +704,7 @@ void DrawEngineCommon::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, *bytesRead = vertexCount * dec_->VertexSize(); // Check that we have enough vertices to form the requested primitive. - if ((vertexCount < 2 && prim > 0) || (vertexCount < 3 && prim > 2 && prim != GE_PRIM_RECTANGLES)) + if ((vertexCount < 2 && prim > 0) || (vertexCount < 3 && prim > GE_PRIM_LINE_STRIP && prim != GE_PRIM_RECTANGLES)) return; if (g_Config.bVertexCache) { @@ -750,7 +750,7 @@ void DrawEngineCommon::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, bool DrawEngineCommon::CanUseHardwareTransform(int prim) { if (!useHWTransform_) return false; - return !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES; + return !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP; } bool DrawEngineCommon::CanUseHardwareTessellation(GEPatchPrimType prim) { diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 9d0d7a169a..4a168857fb 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -377,6 +377,11 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame ResizeFramebufFBO(vfb, drawing_width, drawing_height, true); NotifyRenderFramebufferCreated(vfb); + // We might already want to copy depth, in case this is a temp buffer. See #7810. + if (currentRenderVfb_ && !params.isClearingDepth) { + BlitFramebufferDepth(currentRenderVfb_, vfb); + } + SetColorUpdated(vfb, skipDrawReason); INFO_LOG(FRAMEBUF, "Creating FBO for %08x (z: %08x) : %i x %i x %i", vfb->fb_address, vfb->z_address, vfb->width, vfb->height, vfb->format); @@ -389,7 +394,7 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame if (useBufferedRendering_ && !g_Config.bDisableSlowFramebufEffects) { gpu->PerformMemoryUpload(params.fb_address, byteSize); NotifyStencilUpload(params.fb_address, byteSize, StencilUpload::STENCIL_IS_ZERO); - // TODO: Is it worth trying to upload the depth buffer? + // TODO: Is it worth trying to upload the depth buffer (only if it wasn't copied above..?) } // Let's check for depth buffer overlap. Might be interesting. @@ -471,6 +476,22 @@ void FramebufferManagerCommon::DestroyFramebuf(VirtualFramebuffer *v) { } void FramebufferManagerCommon::BlitFramebufferDepth(VirtualFramebuffer *src, VirtualFramebuffer *dst) { + _dbg_assert_(src && dst); + + // Check that the depth address is even the same before actually blitting. + bool matchingDepthBuffer = src->z_address == dst->z_address && src->z_stride != 0 && dst->z_stride != 0; + bool matchingSize = src->width == dst->width && src->height == dst->height; + if (!matchingDepthBuffer || !matchingSize) + return; + + // Copy depth value from the previously bound framebuffer to the current one. + bool hasNewerDepth = src->last_frame_depth_render != 0 && src->last_frame_depth_render >= dst->last_frame_depth_updated; + if (!src->fbo || !dst->fbo || !useBufferedRendering_ || !hasNewerDepth) { + // If depth wasn't updated, then we're at least "two degrees" away from the data. + // This is an optimization: it probably doesn't need to be copied in this case. + return; + } + int w = std::min(src->renderWidth, dst->renderWidth); int h = std::min(src->renderHeight, dst->renderHeight); @@ -689,21 +710,9 @@ void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffe textureCache_->ForgetLastTexture(); shaderManager_->DirtyLastShader(); - if (prevVfb) { - // Copy depth value from the previously bound framebuffer to the current one. - // We check that the address is the same within BlitFramebufferDepth before actually blitting. - - bool hasNewerDepth = prevVfb->last_frame_depth_render != 0 && prevVfb->last_frame_depth_render >= vfb->last_frame_depth_updated; - if (!prevVfb->fbo || !vfb->fbo || !useBufferedRendering_ || !hasNewerDepth || isClearingDepth) { - // If depth wasn't updated, then we're at least "two degrees" away from the data. - // This is an optimization: it probably doesn't need to be copied in this case. - } else { - bool matchingDepthBuffer = prevVfb->z_address == vfb->z_address && prevVfb->z_stride != 0 && vfb->z_stride != 0; - bool matchingSize = prevVfb->width == vfb->width && prevVfb->height == vfb->height; - if (matchingDepthBuffer && matchingSize) { - BlitFramebufferDepth(prevVfb, vfb); - } - } + // Copy depth between the framebuffers, if the z_address is the same (checked inside.) + if (prevVfb && !isClearingDepth) { + BlitFramebufferDepth(prevVfb, vfb); } if (vfb->drawnFormat != vfb->format) { diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index b174b78191..6a682481e7 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -28,6 +28,7 @@ #include "Common/File/DirListing.h" #include "Common/File/VFS/VFS.h" #include "Common/GPU/OpenGL/GLFeatures.h" +#include "Common/GPU/thin3d.h" #include "Common/StringUtils.h" #include "Core/Config.h" @@ -40,9 +41,14 @@ static std::vector textureShaderInfo; // Scans the directories for shader ini files and collects info about all the shaders found. -void LoadPostShaderInfo(const std::vector &directories) { +void LoadPostShaderInfo(Draw::DrawContext *draw, const std::vector &directories) { std::vector notVisible; + Draw::GPUVendor gpuVendor = Draw::GPUVendor::VENDOR_UNKNOWN; + if (draw) { + gpuVendor = draw->GetDeviceCaps().vendor; + } + shaderInfo.clear(); ShaderInfo off{}; off.visible = true; @@ -112,11 +118,45 @@ void LoadPostShaderInfo(const std::vector &directories) { std::string shaderType; section.Get("Type", &shaderType, "render"); + std::vector vendorBlacklist; + section.Get("VendorBlacklist", vendorBlacklist); + bool skipped = false; + for (auto &item : vendorBlacklist) { + Draw::GPUVendor blacklistedVendor = Draw::GPUVendor::VENDOR_UNKNOWN; + // TODO: This should probably be a function somewhere. + if (item == "ARM") { + blacklistedVendor = Draw::GPUVendor::VENDOR_ARM; + } else if (item == "Qualcomm") { + blacklistedVendor = Draw::GPUVendor::VENDOR_QUALCOMM; + } else if (item == "IMGTEC") { + blacklistedVendor = Draw::GPUVendor::VENDOR_IMGTEC; + } else if (item == "NVIDIA") { + blacklistedVendor = Draw::GPUVendor::VENDOR_NVIDIA; + } else if (item == "AMD") { + blacklistedVendor = Draw::GPUVendor::VENDOR_AMD; + } else if (item == "Broadcom") { + blacklistedVendor = Draw::GPUVendor::VENDOR_BROADCOM; + } else if (item == "Apple") { + blacklistedVendor = Draw::GPUVendor::VENDOR_APPLE; + } else if (item == "Intel") { + blacklistedVendor = Draw::GPUVendor::VENDOR_INTEL; + } + if (blacklistedVendor == gpuVendor && blacklistedVendor != Draw::GPUVendor::VENDOR_UNKNOWN) { + skipped = true; + break; + } + } + + if (skipped) { + continue; + } + if (section.Exists("Fragment") && section.Exists("Vertex") && strncasecmp(shaderType.c_str(), "render", shaderType.size()) == 0) { // Valid shader! ShaderInfo info; std::string temp; info.section = section.name(); + section.Get("Name", &info.name, section.name().c_str()); section.Get("Parent", &info.parent, ""); section.Get("Visible", &info.visible, true); @@ -168,10 +208,11 @@ void LoadPostShaderInfo(const std::vector &directories) { info.section = section.name(); section.Get("Name", &info.name, section.name().c_str()); section.Get("Compute", &temp, ""); - section.Get("MaxScale", &info.maxScale, 255); + section.Get("Scale", &info.scaleFactor, 0); info.computeShaderFile = path / temp; - - appendTextureShader(info); + if (info.scaleFactor >= 2 && info.scaleFactor < 8) { + appendTextureShader(info); + } } } } @@ -184,11 +225,11 @@ void LoadPostShaderInfo(const std::vector &directories) { } // Scans the directories for shader ini files and collects info about all the shaders found. -void ReloadAllPostShaderInfo() { +void ReloadAllPostShaderInfo(Draw::DrawContext *draw) { std::vector directories; directories.push_back(Path("shaders")); // For VFS directories.push_back(GetSysDirectory(DIRECTORY_CUSTOM_SHADERS)); - LoadPostShaderInfo(directories); + LoadPostShaderInfo(draw, directories); } const ShaderInfo *GetPostShaderInfo(const std::string &name) { diff --git a/GPU/Common/PostShader.h b/GPU/Common/PostShader.h index 5dfad5c03f..5226638078 100644 --- a/GPU/Common/PostShader.h +++ b/GPU/Common/PostShader.h @@ -72,7 +72,9 @@ struct TextureShaderInfo { std::string name; Path computeShaderFile; - int maxScale; + + // Upscaling shaders have a fixed scale factor. + int scaleFactor; bool operator == (const std::string &other) { return name == other; @@ -82,7 +84,7 @@ struct TextureShaderInfo { } }; -void ReloadAllPostShaderInfo(); +void ReloadAllPostShaderInfo(Draw::DrawContext *draw); const ShaderInfo *GetPostShaderInfo(const std::string &name); std::vector GetPostShaderChain(const std::string &name); diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 2827988531..abc19f2851 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -218,7 +218,7 @@ static std::string ReadShaderSrc(const Path &filename) { bool PresentationCommon::UpdatePostShader() { std::vector shaderInfo; if (!g_Config.vPostShaderNames.empty()) { - ReloadAllPostShaderInfo(); + ReloadAllPostShaderInfo(draw_); shaderInfo = GetFullPostShadersChain(g_Config.vPostShaderNames); } @@ -810,7 +810,7 @@ void PresentationCommon::CalculateRenderResolution(int *width, int *height, int // Check if postprocessing shader is doing upscaling as it requires native resolution std::vector shaderInfo; if (!g_Config.vPostShaderNames.empty()) { - ReloadAllPostShaderInfo(); + ReloadAllPostShaderInfo(draw_); shaderInfo = GetFullPostShadersChain(g_Config.vPostShaderNames); } diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index d137ac5b9f..3bd5bd71f6 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -92,15 +92,15 @@ void ComputeVertexShaderID(VShaderID *id_out, u32 vertType, bool useHWTransform, if (doTexture) { id.SetBit(VS_BIT_DO_TEXTURE); + + // UV generation mode. doShadeMapping is implicitly stored here. + id.SetBits(VS_BIT_UVGEN_MODE, 2, gstate.getUVGenMode()); } if (useHWTransform) { id.SetBit(VS_BIT_USE_HW_TRANSFORM); id.SetBit(VS_BIT_HAS_NORMAL, hasNormal); - // UV generation mode. doShadeMapping is implicitly stored here. - id.SetBits(VS_BIT_UVGEN_MODE, 2, gstate.getUVGenMode()); - // The next bits are used differently depending on UVgen mode if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX) { id.SetBits(VS_BIT_UVPROJ_MODE, 2, gstate.getUVProjMode()); diff --git a/GPU/Common/ShaderUniforms.cpp b/GPU/Common/ShaderUniforms.cpp index 8ca4bacff6..b07d4d1fdc 100644 --- a/GPU/Common/ShaderUniforms.cpp +++ b/GPU/Common/ShaderUniforms.cpp @@ -43,29 +43,12 @@ void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bo float pspViewport = (y - gstate.getViewportYCenter()) * (1.0f / gstate.getViewportYScale()); return (pspViewport * heightScale) - yOffset; }; - auto reverseViewportZ = [hasNegZ](float z) { - float vpZScale = gstate.getViewportZScale(); - float vpZCenter = gstate.getViewportZCenter(); - - float scale, center; - if (gstate_c.Supports(GPU_SUPPORTS_ACCURATE_DEPTH)) { - // These are just the reverse of the formulas in GPUStateUtils. - float halfActualZRange = vpZScale * (1.0f / gstate_c.vpDepthScale); - float minz = -((gstate_c.vpZOffset * halfActualZRange) - vpZCenter) - halfActualZRange; - - // In accurate depth mode, we're comparing against a value scaled to (minz, maxz). - // And minz might be very negative, (e.g. if we're clamping in that direction.) - scale = halfActualZRange; - center = minz + halfActualZRange; - } else { - // In old-style depth mode, we're comparing against a value scaled to viewport. - // (and possibly incorrectly clipped against it.) - scale = vpZScale; - center = vpZCenter; + auto transformZ = [hasNegZ](float z) { + // Z culling ignores the viewport, so we just redo the projection matrix adjustments. + if (hasNegZ) { + return (z * gstate_c.vpDepthScale) + gstate_c.vpZOffset; } - - float realViewport = (z - center) * (1.0f / scale); - return hasNegZ ? realViewport : (realViewport * 0.5f + 0.5f); + return (z * gstate_c.vpDepthScale * 0.5f) + gstate_c.vpZOffset * 0.5f + 0.5f; }; auto sortPair = [](float a, float b) { return a > b ? std::make_pair(b, a) : std::make_pair(a, b); @@ -75,7 +58,7 @@ void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bo // Any vertex outside this range (unless depth clamp enabled) is discarded. auto x = sortPair(reverseViewportX(0.0f), reverseViewportX(4096.0f)); auto y = sortPair(reverseViewportY(0.0f), reverseViewportY(4096.0f)); - auto z = sortPair(reverseViewportZ(0.0f), reverseViewportZ(65535.5f)); + auto z = sortPair(transformZ(-1.000030517578125f), transformZ(1.000030517578125f)); // Since we have space in w, use it to pass the depth clamp flag. We also pass NAN for w "discard". float clampEnable = gstate.isDepthClampEnabled() ? 1.0f : 0.0f; @@ -151,6 +134,7 @@ void BaseUpdateUniforms(UB_VS_FS_Base *ub, uint64_t dirtyUniforms, bool flipView flippedMatrix = flippedMatrix * g_display_rot_matrix; } CopyMatrix4x4(ub->proj, flippedMatrix.getReadPtr()); + ub->rotation = useBufferedRendering ? 0 : (float)g_display_rotation; } if (dirtyUniforms & DIRTY_PROJTHROUGHMATRIX) { @@ -164,6 +148,7 @@ void BaseUpdateUniforms(UB_VS_FS_Base *ub, uint64_t dirtyUniforms, bool flipView proj_through = proj_through * g_display_rot_matrix; } CopyMatrix4x4(ub->proj_through, proj_through.getReadPtr()); + ub->rotation = useBufferedRendering ? 0 : (float)g_display_rotation; } // Transform @@ -243,18 +228,11 @@ void BaseUpdateUniforms(UB_VS_FS_Base *ub, uint64_t dirtyUniforms, bool flipView float viewZScale = halfActualZRange * 2.0f; // Account for the half pixel offset. float viewZCenter = minz + (DepthSliceFactor() / 256.0f) * 0.5f; - float viewZInvScale; - - if (viewZScale != 0.0) { - viewZInvScale = 1.0f / viewZScale; - } else { - viewZInvScale = 0.0; - } ub->depthRange[0] = viewZScale; ub->depthRange[1] = viewZCenter; - ub->depthRange[2] = viewZCenter; - ub->depthRange[3] = viewZInvScale; + ub->depthRange[2] = gstate_c.vpZOffset * 0.5f + 0.5f; + ub->depthRange[3] = 2.0f * (1.0f / gstate_c.vpDepthScale); } if (dirtyUniforms & DIRTY_CULLRANGE) { diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index 5292a10494..1195af4547 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -28,7 +28,8 @@ struct UB_VS_FS_Base { float tex[12]; float uvScaleOffset[4]; float depthRange[4]; - float fogCoef[2]; float stencil; float pad0; + // Rotation is used only for software transform. + float fogCoef[2]; float stencil; float rotation; float matAmbient[4]; float cullRangeMin[4]; float cullRangeMax[4]; @@ -55,6 +56,7 @@ R"( mat4 u_proj; vec4 u_depthRange; vec2 u_fogcoef; float u_stencilReplaceValue; + float u_rotation; vec4 u_matambientalpha; vec4 u_cullRangeMin; vec4 u_cullRangeMax; diff --git a/GPU/Common/SoftwareTransformCommon.cpp b/GPU/Common/SoftwareTransformCommon.cpp index ccadf1f188..2061154dc9 100644 --- a/GPU/Common/SoftwareTransformCommon.cpp +++ b/GPU/Common/SoftwareTransformCommon.cpp @@ -64,22 +64,14 @@ static void SwapUVs(TransformedVertex &a, TransformedVertex &b) { // Note: 0 is BR and 2 is TL. -static void RotateUV(TransformedVertex v[4], float flippedMatrix[16], bool flippedY) { - // Transform these two coordinates to figure out whether they're flipped or not. - Vec4f tl; - Vec3ByMatrix44(tl.AsArray(), v[2].pos, flippedMatrix); - - Vec4f br; - Vec3ByMatrix44(br.AsArray(), v[0].pos, flippedMatrix); - +static void RotateUV(TransformedVertex v[4], bool flippedY) { + // We use the transformed tl/br coordinates to figure out whether they're flipped or not. float ySign = flippedY ? -1.0 : 1.0; - const float invtlw = 1.0f / tl.w; - const float invbrw = 1.0f / br.w; - const float x1 = tl.x * invtlw; - const float x2 = br.x * invbrw; - const float y1 = tl.y * invtlw * ySign; - const float y2 = br.y * invbrw * ySign; + const float x1 = v[2].x; + const float x2 = v[0].x; + const float y1 = v[2].y * ySign; + const float y2 = v[0].y * ySign; if ((x1 < x2 && y1 < y2) || (x1 > x2 && y1 > y2)) SwapUVs(v[1], v[3]); @@ -157,6 +149,25 @@ static int ColorIndexOffset(int prim, GEShadeMode shadeMode, bool clearMode) { return 0; } +void SoftwareTransform::SetProjMatrix(float mtx[14], bool invertedX, bool invertedY, const Lin::Vec3 &trans, const Lin::Vec3 &scale) { + memcpy(&projMatrix_.m, mtx, 16 * sizeof(float)); + + if (invertedY) { + projMatrix_.xy = -projMatrix_.xy; + projMatrix_.yy = -projMatrix_.yy; + projMatrix_.zy = -projMatrix_.zy; + projMatrix_.wy = -projMatrix_.wy; + } + if (invertedX) { + projMatrix_.xx = -projMatrix_.xx; + projMatrix_.yx = -projMatrix_.yx; + projMatrix_.zx = -projMatrix_.zx; + projMatrix_.wx = -projMatrix_.wx; + } + + projMatrix_.translateAndScale(trans, scale); +} + void SoftwareTransform::Decode(int prim, u32 vertType, const DecVtxFormat &decVtxFormat, int maxIndex, SoftwareTransformResult *result) { u8 *decoded = params_.decoded; TransformedVertex *transformed = params_.transformed; @@ -202,6 +213,7 @@ void SoftwareTransform::Decode(int prim, u32 vertType, const DecVtxFormat &decVt // TODO: Write to a flexible buffer, we don't always need all four components. TransformedVertex &vert = transformed[index]; reader.ReadPos(vert.pos); + vert.pos_w = 1.0f; if (reader.hasColor0()) { if (provokeIndOffset != 0 && index + provokeIndOffset < maxIndex) { @@ -224,6 +236,7 @@ void SoftwareTransform::Decode(int prim, u32 vertType, const DecVtxFormat &decVt vert.u = 0.0f; vert.v = 0.0f; } + vert.uv_w = 1.0f; // Ignore color1 and fog, never used in throughmode anyway. // The w of uv is also never used (hardcoded to 1.0.) @@ -418,14 +431,13 @@ void SoftwareTransform::Decode(int prim, u32 vertType, const DecVtxFormat &decVt fogCoef = (v[2] + fog_end) * fog_slope; // TODO: Write to a flexible buffer, we don't always need all four components. - memcpy(&transformed[index].x, v, 3 * sizeof(float)); + Vec3ByMatrix44(transformed[index].pos, v, projMatrix_.m); transformed[index].fog = fogCoef; - memcpy(&transformed[index].u, uv, 3 * sizeof(float)); + memcpy(&transformed[index].uv, uv, 3 * sizeof(float)); transformed[index].color0_32 = c0.ToRGBA(); transformed[index].color1_32 = c1.ToRGBA(); - // The multiplication by the projection matrix is still performed in the vertex shader. - // So is vertex depth rounding, to simulate the 16-bit depth buffer. + // Vertex depth rounding is done in the shader, to simulate the 16-bit depth buffer. } } @@ -434,11 +446,10 @@ void SoftwareTransform::Decode(int prim, u32 vertType, const DecVtxFormat &decVt // // An alternative option is to simply ditch all the verts except the first and last to create a single // rectangle out of many. Quite a small optimization though. - // Experiment: Disable on PowerVR (see issue #6290) // TODO: This bleeds outside the play area in non-buffered mode. Big deal? Probably not. // TODO: Allow creating a depth clear and a color draw. bool reallyAClear = false; - if (maxIndex > 1 && prim == GE_PRIM_RECTANGLES && gstate.isModeClear()) { + if (maxIndex > 1 && prim == GE_PRIM_RECTANGLES && gstate.isModeClear() && throughmode) { int scissorX2 = gstate.getScissorX2() + 1; int scissorY2 = gstate.getScissorY2() + 1; reallyAClear = IsReallyAClear(transformed, maxIndex, scissorX2, scissorY2); @@ -465,7 +476,7 @@ void SoftwareTransform::Decode(int prim, u32 vertType, const DecVtxFormat &decVt } // Detect full screen "clears" that might not be so obvious, to set the safe size if possible. - if (!result->setSafeSize && prim == GE_PRIM_RECTANGLES && maxIndex == 2) { + if (!result->setSafeSize && prim == GE_PRIM_RECTANGLES && maxIndex == 2 && throughmode) { bool clearingColor = gstate.isModeClear() && (gstate.isClearModeColorMask() || gstate.isClearModeAlphaMask()); bool writingColor = gstate.getColorMask() != 0xFFFFFFFF; bool startsZeroX = transformed[0].x <= 0.0f && transformed[1].x > 0.0f && transformed[1].x > transformed[0].x; @@ -554,100 +565,16 @@ void SoftwareTransform::BuildDrawingParams(int prim, int vertexCount, u32 vertTy TransformedVertex *transformedExpanded = params_.transformedExpanded; bool throughmode = (vertType & GE_VTYPE_THROUGH_MASK) != 0; - // Step 2: expand rectangles. + // Step 2: expand and process primitives. result->drawBuffer = transformed; int numTrans = 0; FramebufferManagerCommon *fbman = params_.fbman; bool useBufferedRendering = fbman->UseBufferedRendering(); - bool flippedY = g_Config.iGPUBackend == (int)GPUBackend::OPENGL && !useBufferedRendering; - - if (prim != GE_PRIM_RECTANGLES) { - // We can simply draw the unexpanded buffer. - numTrans = vertexCount; - result->drawIndexed = true; - } else { - // Pretty bad hackery where we re-do the transform (in RotateUV) to see if the vertices are flipped in screen space. - // Since we've already got API-specific assumptions (Y direction, etc) baked into the projMatrix (which we arguably shouldn't), - // this gets nasty and very hard to understand. - - float flippedMatrix[16]; - if (!throughmode) { - memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float)); - - const bool invertedY = flippedY ? (gstate_c.vpHeight < 0) : (gstate_c.vpHeight > 0); - if (invertedY) { - flippedMatrix[1] = -flippedMatrix[1]; - flippedMatrix[5] = -flippedMatrix[5]; - flippedMatrix[9] = -flippedMatrix[9]; - flippedMatrix[13] = -flippedMatrix[13]; - } - const bool invertedX = gstate_c.vpWidth < 0; - if (invertedX) { - flippedMatrix[0] = -flippedMatrix[0]; - flippedMatrix[4] = -flippedMatrix[4]; - flippedMatrix[8] = -flippedMatrix[8]; - flippedMatrix[12] = -flippedMatrix[12]; - } - } - - //rectangles always need 2 vertices, disregard the last one if there's an odd number - vertexCount = vertexCount & ~1; - numTrans = 0; + if (prim == GE_PRIM_RECTANGLES) { + ExpandRectangles(vertexCount, maxIndex, inds, transformed, transformedExpanded, numTrans, throughmode); result->drawBuffer = transformedExpanded; - TransformedVertex *trans = &transformedExpanded[0]; - const u16 *indsIn = (const u16 *)inds; - u16 *newInds = inds + vertexCount; - u16 *indsOut = newInds; - maxIndex = 4 * (vertexCount / 2); - for (int i = 0; i < vertexCount; i += 2) { - const TransformedVertex &transVtxTL = transformed[indsIn[i + 0]]; - const TransformedVertex &transVtxBR = transformed[indsIn[i + 1]]; - - // We have to turn the rectangle into two triangles, so 6 points. - // This is 4 verts + 6 indices. - - // bottom right - trans[0] = transVtxBR; - - // top right - trans[1] = transVtxBR; - trans[1].y = transVtxTL.y; - trans[1].v = transVtxTL.v; - - // top left - trans[2] = transVtxBR; - trans[2].x = transVtxTL.x; - trans[2].y = transVtxTL.y; - trans[2].u = transVtxTL.u; - trans[2].v = transVtxTL.v; - - // bottom left - trans[3] = transVtxBR; - trans[3].x = transVtxTL.x; - trans[3].u = transVtxTL.u; - - // That's the four corners. Now process UV rotation. - if (throughmode) - RotateUVThrough(trans); - else - RotateUV(trans, flippedMatrix, flippedY); - - // Triangle: BR-TR-TL - indsOut[0] = i * 2 + 0; - indsOut[1] = i * 2 + 1; - indsOut[2] = i * 2 + 2; - // Triangle: BL-BR-TL - indsOut[3] = i * 2 + 3; - indsOut[4] = i * 2 + 0; - indsOut[5] = i * 2 + 2; - trans += 4; - indsOut += 6; - - numTrans += 6; - } - inds = newInds; result->drawIndexed = true; // We don't know the color until here, so we have to do it now, instead of in StateMapping. @@ -658,11 +585,80 @@ void SoftwareTransform::BuildDrawingParams(int prim, int vertexCount, u32 vertTy // Take the bottom right alpha value of the first rect as the stencil value. // Technically, each rect could individually fill its stencil, but most of the // time they use the same one. - result->stencilValue = transformed[indsIn[1]].color0[3]; + result->stencilValue = transformed[inds[1]].color0[3]; } else { result->stencilValue = 0; } } + } else if (prim == GE_PRIM_POINTS) { + ExpandPoints(vertexCount, maxIndex, inds, transformed, transformedExpanded, numTrans, throughmode); + result->drawBuffer = transformedExpanded; + result->drawIndexed = true; + } else if (prim == GE_PRIM_LINES) { + ExpandLines(vertexCount, maxIndex, inds, transformed, transformedExpanded, numTrans, throughmode); + result->drawBuffer = transformedExpanded; + result->drawIndexed = true; + } else { + // We can simply draw the unexpanded buffer. + numTrans = vertexCount; + result->drawIndexed = true; + + // If we don't support custom cull in the shader, process it here. + if (!gstate_c.Supports(GPU_SUPPORTS_CULL_DISTANCE) && vertexCount > 0 && !throughmode) { + const u16 *indsIn = (const u16 *)inds; + u16 *newInds = inds + vertexCount; + u16 *indsOut = newInds; + + float minZValue, maxZValue; + CalcCullParams(minZValue, maxZValue); + + std::vector outsideZ; + outsideZ.resize(vertexCount); + + // First, check inside/outside directions for each index. + for (int i = 0; i < vertexCount; ++i) { + float z = transformed[indsIn[i]].z / transformed[indsIn[i]].pos_w; + if (z >= maxZValue) + outsideZ[i] = 1; + else if (z <= minZValue) + outsideZ[i] = -1; + else + outsideZ[i] = 0; + } + + // Now, for each primitive type, throw away the indices if: + // - Depth clamp on, and ALL verts are outside *in the same direction*. + // - Depth clamp off, and ANY vert is outside. + if (prim == GE_PRIM_TRIANGLES && gstate.isDepthClampEnabled()) { + numTrans = 0; + for (int i = 0; i < vertexCount - 2; i += 3) { + if (outsideZ[i + 0] != 0 && outsideZ[i + 0] == outsideZ[i + 1] && outsideZ[i + 0] == outsideZ[i + 2]) { + // All outside, and all the same direction. Nuke this triangle. + continue; + } + + memcpy(indsOut, indsIn + i, 3 * sizeof(uint16_t)); + indsOut += 3; + numTrans += 3; + } + + inds = newInds; + } else if (prim == GE_PRIM_TRIANGLES) { + numTrans = 0; + for (int i = 0; i < vertexCount - 2; i += 3) { + if (outsideZ[i + 0] != 0 || outsideZ[i + 1] != 0 || outsideZ[i + 2] != 0) { + // Even one outside, and we cull. + continue; + } + + memcpy(indsOut, indsIn + i, 3 * sizeof(uint16_t)); + indsOut += 3; + numTrans += 3; + } + + inds = newInds; + } + } } if (gstate.isModeClear()) { @@ -672,3 +668,265 @@ void SoftwareTransform::BuildDrawingParams(int prim, int vertexCount, u32 vertTy result->action = SW_DRAW_PRIMITIVES; result->drawNumTrans = numTrans; } + +void SoftwareTransform::CalcCullParams(float &minZValue, float &maxZValue) { + // The projected Z can be up to 0x3F8000FF, which is where this constant is from. + // It seems like it may only maintain 15 mantissa bits (excluding implied.) + maxZValue = 1.000030517578125f * gstate_c.vpDepthScale; + minZValue = -maxZValue; + // Scale and offset the Z appropriately, since we baked that into a projection transform. + if (params_.usesHalfZ) { + maxZValue = maxZValue * 0.5f + 0.5f + gstate_c.vpZOffset * 0.5f; + minZValue = minZValue * 0.5f + 0.5f + gstate_c.vpZOffset * 0.5f; + } else { + maxZValue += gstate_c.vpZOffset; + minZValue += gstate_c.vpZOffset; + } + // In case scale was negative, flip. + if (minZValue > maxZValue) + std::swap(minZValue, maxZValue); +} + +void SoftwareTransform::ExpandRectangles(int vertexCount, int &maxIndex, u16 *&inds, TransformedVertex *transformed, TransformedVertex *transformedExpanded, int &numTrans, bool throughmode) { + // Rectangles always need 2 vertices, disregard the last one if there's an odd number. + vertexCount = vertexCount & ~1; + numTrans = 0; + TransformedVertex *trans = &transformedExpanded[0]; + + const u16 *indsIn = (const u16 *)inds; + u16 *newInds = inds + vertexCount; + u16 *indsOut = newInds; + + float minZValue, maxZValue; + CalcCullParams(minZValue, maxZValue); + + maxIndex = 4 * (vertexCount / 2); + for (int i = 0; i < vertexCount; i += 2) { + const TransformedVertex &transVtxTL = transformed[indsIn[i + 0]]; + const TransformedVertex &transVtxBR = transformed[indsIn[i + 1]]; + + // We have to turn the rectangle into two triangles, so 6 points. + // This is 4 verts + 6 indices. + + // bottom right + trans[0] = transVtxBR; + + // top right + trans[1] = transVtxBR; + trans[1].y = transVtxTL.y; + trans[1].v = transVtxTL.v; + + // top left + trans[2] = transVtxBR; + trans[2].x = transVtxTL.x; + trans[2].y = transVtxTL.y; + trans[2].u = transVtxTL.u; + trans[2].v = transVtxTL.v; + + // bottom left + trans[3] = transVtxBR; + trans[3].x = transVtxTL.x; + trans[3].u = transVtxTL.u; + + // That's the four corners. Now process UV rotation. + if (throughmode) { + RotateUVThrough(trans); + } else { + float tlz = transVtxTL.z / transVtxTL.pos_w; + float brz = transVtxBR.z / transVtxBR.pos_w; + if (!gstate.isDepthClampEnabled()) { + // If both transformed verts are outside Z the same way, cull entirely. + if (tlz >= maxZValue || brz >= maxZValue) + continue; + if (tlz <= minZValue || brz <= minZValue) + continue; + } else { + // If any Z is outside, cull right away. + if (tlz >= maxZValue && brz >= maxZValue) + continue; + if (tlz <= minZValue && brz <= minZValue) + continue; + } + + RotateUV(trans, params_.flippedY); + } + + // Triangle: BR-TR-TL + indsOut[0] = i * 2 + 0; + indsOut[1] = i * 2 + 1; + indsOut[2] = i * 2 + 2; + // Triangle: BL-BR-TL + indsOut[3] = i * 2 + 3; + indsOut[4] = i * 2 + 0; + indsOut[5] = i * 2 + 2; + trans += 4; + indsOut += 6; + + numTrans += 6; + } + inds = newInds; +} + +void SoftwareTransform::ExpandLines(int vertexCount, int &maxIndex, u16 *&inds, TransformedVertex *transformed, TransformedVertex *transformedExpanded, int &numTrans, bool throughmode) { + // Lines always need 2 vertices, disregard the last one if there's an odd number. + vertexCount = vertexCount & ~1; + numTrans = 0; + TransformedVertex *trans = &transformedExpanded[0]; + + const u16 *indsIn = (const u16 *)inds; + u16 *newInds = inds + vertexCount; + u16 *indsOut = newInds; + + float dx = 1.0f * gstate_c.vpWidthScale * (1.0f / gstate.getViewportXScale()); + float dy = 1.0f * gstate_c.vpHeightScale * (1.0f / gstate.getViewportYScale()); + float du = 1.0f / gstate_c.curTextureWidth; + float dv = 1.0f / gstate_c.curTextureHeight; + + if (throughmode) { + dx = 1.0f; + dy = 1.0f; + } + + float minZValue, maxZValue; + CalcCullParams(minZValue, maxZValue); + + maxIndex = 4 * (vertexCount / 2); + for (int i = 0; i < vertexCount; i += 2) { + const TransformedVertex &transVtx1 = transformed[indsIn[i + 0]]; + const TransformedVertex &transVtx2 = transformed[indsIn[i + 1]]; + + const TransformedVertex &transVtxT = transVtx1.y <= transVtx2.y ? transVtx1 : transVtx2; + const TransformedVertex &transVtxB = transVtx1.y <= transVtx2.y ? transVtx2 : transVtx1; + const TransformedVertex &transVtxL = transVtx1.x <= transVtx2.x ? transVtx1 : transVtx2; + const TransformedVertex &transVtxR = transVtx1.x <= transVtx2.x ? transVtx2 : transVtx1; + + // Sort the points so our perpendicular will bias the right direction. + const TransformedVertex &transVtxTL = transVtxT.y != transVtxB.y || transVtxT.x > transVtxB.x ? transVtxT : transVtxB; + const TransformedVertex &transVtxBL = transVtxT.y != transVtxB.y || transVtxT.x > transVtxB.x ? transVtxB : transVtxT; + + // Okay, let's calculate the perpendicular. + float horizontal = transVtxTL.x - transVtxBL.x; + float vertical = transVtxTL.y - transVtxBL.y; + Vec2f addWidth = Vec2f(-vertical, horizontal).Normalized(); + + // bottom right + trans[0] = transVtxBL; + trans[0].x += addWidth.x * dx; + trans[0].y += addWidth.y * dy; + trans[0].u += addWidth.x * du; + trans[0].v += addWidth.y * dv; + + // top right + trans[1] = transVtxTL; + trans[1].x += addWidth.x * dx; + trans[1].y += addWidth.y * dy; + trans[1].u += addWidth.x * du; + trans[1].v += addWidth.y * dv; + + // top left + trans[2] = transVtxTL; + + // bottom left + trans[3] = transVtxBL; + + if (!throughmode) { + float tlz = transVtxTL.z / transVtxTL.pos_w; + float brz = transVtxBL.z / transVtxBL.pos_w; + if (!gstate.isDepthClampEnabled()) { + // If both transformed verts are outside Z the same way, cull entirely. + if (tlz >= maxZValue || brz >= maxZValue) + continue; + if (tlz <= minZValue || brz <= minZValue) + continue; + } else { + // If any Z is outside, cull right away. + if (tlz >= maxZValue && brz >= maxZValue) + continue; + if (tlz <= minZValue && brz <= minZValue) + continue; + } + } + + // Triangle: BR-TR-TL + indsOut[0] = i * 2 + 0; + indsOut[1] = i * 2 + 1; + indsOut[2] = i * 2 + 2; + // Triangle: BL-BR-TL + indsOut[3] = i * 2 + 3; + indsOut[4] = i * 2 + 0; + indsOut[5] = i * 2 + 2; + trans += 4; + indsOut += 6; + + numTrans += 6; + } + inds = newInds; +} + +void SoftwareTransform::ExpandPoints(int vertexCount, int &maxIndex, u16 *&inds, TransformedVertex *transformed, TransformedVertex *transformedExpanded, int &numTrans, bool throughmode) { + numTrans = 0; + TransformedVertex *trans = &transformedExpanded[0]; + + const u16 *indsIn = (const u16 *)inds; + u16 *newInds = inds + vertexCount; + u16 *indsOut = newInds; + + float dx = 1.0f * gstate_c.vpWidthScale * (1.0f / gstate.getViewportXScale()); + float dy = 1.0f * gstate_c.vpHeightScale * (1.0f / gstate.getViewportYScale()); + float du = 1.0f / gstate_c.curTextureWidth; + float dv = 1.0f / gstate_c.curTextureHeight; + + if (throughmode) { + dx = 1.0f; + dy = 1.0f; + } + + maxIndex = 4 * vertexCount; + for (int i = 0; i < vertexCount; ++i) { + const TransformedVertex &transVtxTL = transformed[indsIn[i]]; + + // Create the bottom right version. + TransformedVertex transVtxBR = transVtxTL; + transVtxBR.x += dx * transVtxTL.pos_w; + transVtxBR.y += dy * transVtxTL.pos_w; + transVtxBR.u += du * transVtxTL.uv_w; + transVtxBR.v += dv * transVtxTL.uv_w; + + // We have to turn the rectangle into two triangles, so 6 points. + // This is 4 verts + 6 indices. + + // bottom right + trans[0] = transVtxBR; + + // top right + trans[1] = transVtxBR; + trans[1].y = transVtxTL.y; + trans[1].v = transVtxTL.v; + + // top left + trans[2] = transVtxBR; + trans[2].x = transVtxTL.x; + trans[2].y = transVtxTL.y; + trans[2].u = transVtxTL.u; + trans[2].v = transVtxTL.v; + + // bottom left + trans[3] = transVtxBR; + trans[3].x = transVtxTL.x; + trans[3].u = transVtxTL.u; + + // Triangle: BR-TR-TL + indsOut[0] = i * 4 + 0; + indsOut[1] = i * 4 + 1; + indsOut[2] = i * 4 + 2; + // Triangle: BL-BR-TL + indsOut[3] = i * 4 + 3; + indsOut[4] = i * 4 + 0; + indsOut[5] = i * 4 + 2; + trans += 4; + indsOut += 6; + + numTrans += 6; + } + inds = newInds; +} diff --git a/GPU/Common/SoftwareTransformCommon.h b/GPU/Common/SoftwareTransformCommon.h index 98250afbea..37dbca399b 100644 --- a/GPU/Common/SoftwareTransformCommon.h +++ b/GPU/Common/SoftwareTransformCommon.h @@ -18,8 +18,8 @@ #pragma once #include "Common/CommonTypes.h" - -#include "VertexDecoderCommon.h" +#include "Common/Math/lin/matrix4x4.h" +#include "GPU/Common/VertexDecoderCommon.h" class FramebufferManagerCommon; class TextureCacheCommon; @@ -56,6 +56,8 @@ struct SoftwareTransformParams { bool allowClear; bool allowSeparateAlphaClear; bool provokeFlatFirst; + bool flippedY; + bool usesHalfZ; }; class SoftwareTransform { @@ -63,10 +65,17 @@ public: SoftwareTransform(SoftwareTransformParams ¶ms) : params_(params) { } + void SetProjMatrix(float mtx[14], bool invertedX, bool invertedY, const Lin::Vec3 &trans, const Lin::Vec3 &scale); void Decode(int prim, u32 vertexType, const DecVtxFormat &decVtxFormat, int maxIndex, SoftwareTransformResult *result); void DetectOffsetTexture(int maxIndex); void BuildDrawingParams(int prim, int vertexCount, u32 vertType, u16 *&inds, int &maxIndex, SoftwareTransformResult *result); protected: + void CalcCullParams(float &minZValue, float &maxZValue); + void ExpandRectangles(int vertexCount, int &maxIndex, u16 *&inds, TransformedVertex *transformed, TransformedVertex *transformedExpanded, int &numTrans, bool throughmode); + void ExpandLines(int vertexCount, int &maxIndex, u16 *&inds, TransformedVertex *transformed, TransformedVertex *transformedExpanded, int &numTrans, bool throughmode); + void ExpandPoints(int vertexCount, int &maxIndex, u16 *&inds, TransformedVertex *transformed, TransformedVertex *transformedExpanded, int &numTrans, bool throughmode); + const SoftwareTransformParams ¶ms_; + Lin::Matrix4x4 projMatrix_; }; diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 80d9caa772..3b427f7295 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -22,6 +22,7 @@ #include "Common/Profiler/Profiler.h" #include "Common/MemoryUtil.h" #include "Common/StringUtils.h" +#include "Common/TimeUtil.h" #include "Core/Config.h" #include "Core/Debugger/MemBlockInfo.h" #include "Core/Reporting.h" @@ -472,6 +473,15 @@ TexCacheEntry *TextureCacheCommon::SetTexture() { reason = "scaling"; } } + if (match && (entry->status & TexCacheEntry::STATUS_TO_REPLACE) && replacementTimeThisFrame_ < replacementFrameBudget_) { + int w0 = gstate.getTextureWidth(0); + int h0 = gstate.getTextureHeight(0); + ReplacedTexture &replaced = FindReplacement(entry, w0, h0); + if (replaced.Valid()) { + match = false; + reason = "replacing"; + } + } if (match) { // got one! @@ -539,7 +549,7 @@ TexCacheEntry *TextureCacheCommon::SetTexture() { if (PPGeIsFontTextureAddress(texaddr)) { // It's the builtin font texture. entry->status = TexCacheEntry::STATUS_RELIABLE; - } else if (g_Config.bTextureBackoffCache) { + } else if (g_Config.bTextureBackoffCache && !IsVideo(texaddr)) { entry->status = TexCacheEntry::STATUS_HASHING; } else { entry->status = TexCacheEntry::STATUS_UNRELIABLE; @@ -720,6 +730,7 @@ void TextureCacheCommon::Decimate(bool forcePressure) { } DecimateVideos(); + replacer_.Decimate(forcePressure); } void TextureCacheCommon::DecimateVideos() { @@ -1082,24 +1093,7 @@ bool TextureCacheCommon::SetOffsetTexture(u32 yOffset) { } void TextureCacheCommon::NotifyConfigChanged() { - int scaleFactor; - - // 0 means automatic texture scaling, up to 5x, based on resolution. - if (g_Config.iTexScalingLevel == 0) { - scaleFactor = g_Config.iInternalResolution; - // Automatic resolution too? Okay. - if (scaleFactor == 0) { - if (!g_Config.IsPortrait()) { - scaleFactor = (PSP_CoreParameter().pixelWidth + 479) / 480; - } else { - scaleFactor = (PSP_CoreParameter().pixelHeight + 479) / 480; - } - } - - scaleFactor = std::min(5, scaleFactor); - } else { - scaleFactor = g_Config.iTexScalingLevel; - } + int scaleFactor = g_Config.iTexScalingLevel; if (!gstate_c.Supports(GPU_SUPPORTS_TEXTURE_NPOT)) { // Reduce the scale factor to a power of two (e.g. 2 or 4) if textures must be a power of two. @@ -1280,6 +1274,29 @@ u32 TextureCacheCommon::EstimateTexMemoryUsage(const TexCacheEntry *entry) { return pixelSize << (dimW + dimH); } +ReplacedTexture &TextureCacheCommon::FindReplacement(TexCacheEntry *entry, int &w, int &h) { + // Allow some delay to reduce pop-in. + constexpr double MAX_BUDGET_PER_TEX = 0.25 / 60.0; + + double replaceStart = time_now_d(); + u64 cachekey = replacer_.Enabled() ? entry->CacheKey() : 0; + ReplacedTexture &replaced = replacer_.FindReplacement(cachekey, entry->fullhash, w, h); + if (replaced.IsReady(std::min(MAX_BUDGET_PER_TEX, replacementFrameBudget_ - replacementTimeThisFrame_))) { + if (replaced.GetSize(0, w, h)) { + replacementTimeThisFrame_ += time_now_d() - replaceStart; + + // Consider it already "scaled" and remove any delayed replace flag. + entry->status |= TexCacheEntry::STATUS_IS_SCALED; + entry->status &= ~TexCacheEntry::STATUS_TO_REPLACE; + return replaced; + } + } else if (replaced.Valid()) { + entry->status |= TexCacheEntry::STATUS_TO_REPLACE; + } + replacementTimeThisFrame_ += time_now_d() - replaceStart; + return replacer_.FindNone(); +} + static void ReverseColors(void *dstBuf, const void *srcBuf, GETextureFormat fmt, int numPixels, bool useBGRA) { switch (fmt) { case GE_TFMT_4444: @@ -1724,6 +1741,15 @@ void TextureCacheCommon::DeleteTexture(TexCache::iterator it) { bool TextureCacheCommon::CheckFullHash(TexCacheEntry *entry, bool &doDelete) { int w = gstate.getTextureWidth(0); int h = gstate.getTextureHeight(0); + bool isVideo = IsVideo(entry->addr); + + // Don't even check the texture, just assume it has changed. + if (isVideo && g_Config.bTextureBackoffCache) { + // Attempt to ensure the hash doesn't incorrectly match in if the video stops. + entry->fullhash = (entry->fullhash + 0xA535A535) * 11 + (entry->fullhash & 4); + return false; + } + u32 fullhash; { PROFILE_THIS_SCOPE("texhash"); @@ -1731,7 +1757,7 @@ bool TextureCacheCommon::CheckFullHash(TexCacheEntry *entry, bool &doDelete) { } if (fullhash == entry->fullhash) { - if (g_Config.bTextureBackoffCache) { + if (g_Config.bTextureBackoffCache && !isVideo) { if (entry->GetHashStatus() != TexCacheEntry::STATUS_HASHING && entry->numFrames > TexCacheEntry::FRAMES_REGAIN_TRUST) { // Reset to STATUS_HASHING. entry->SetHashStatus(TexCacheEntry::STATUS_HASHING); diff --git a/GPU/Common/TextureCacheCommon.h b/GPU/Common/TextureCacheCommon.h index 58439e2889..1669a3d33b 100644 --- a/GPU/Common/TextureCacheCommon.h +++ b/GPU/Common/TextureCacheCommon.h @@ -123,16 +123,17 @@ struct TexCacheEntry { STATUS_CLUT_RECHECK = 0x20, // Another texture with same addr had a hashfail. STATUS_TO_SCALE = 0x80, // Pending texture scaling in a later frame. STATUS_IS_SCALED = 0x100, // Has been scaled (can't be replaceImages'd.) + STATUS_TO_REPLACE = 0x0200, // Pending texture replacement. // When hashing large textures, we optimize 512x512 down to 512x272 by default, since this // is commonly the only part accessed. If access is made above 272, we hash the entire // texture, and set this flag to allow scaling the texture just once for the new hash. - STATUS_FREE_CHANGE = 0x200, // Allow one change before marking "frequent". + STATUS_FREE_CHANGE = 0x0400, // Allow one change before marking "frequent". - STATUS_BAD_MIPS = 0x400, // Has bad or unusable mipmap levels. + STATUS_BAD_MIPS = 0x0800, // Has bad or unusable mipmap levels. - STATUS_FRAMEBUFFER_OVERLAP = 0x800, + STATUS_FRAMEBUFFER_OVERLAP = 0x1000, - STATUS_FORCE_REBUILD = 0x1000, + STATUS_FORCE_REBUILD = 0x2000, }; // Status, but int so we can zero initialize. @@ -278,6 +279,7 @@ protected: void DecodeTextureLevel(u8 *out, int outPitch, GETextureFormat format, GEPaletteFormat clutformat, uint32_t texaddr, int level, int bufw, bool reverseColors, bool useBGRA, bool expandTo32Bit); void UnswizzleFromMem(u32 *dest, u32 destPitch, const u8 *texptr, u32 bufw, u32 height, u32 bytesPerPixel); void ReadIndexedTex(u8 *out, int outPitch, int level, const u8 *texptr, int bytesPerIndex, int bufw, bool expandTo32Bit); + ReplacedTexture &FindReplacement(TexCacheEntry *entry, int &w, int &h); template inline const T *GetCurrentClut() { @@ -335,6 +337,9 @@ protected: int decimationCounter_; int texelsScaledThisFrame_ = 0; int timesInvalidatedAllThisFrame_ = 0; + double replacementTimeThisFrame_ = 0; + // TODO: Maybe vary by FPS... + double replacementFrameBudget_ = 0.5 / 60.0; TexCache cache_; u32 cacheSizeEstimate_ = 0; diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index f2d3152ec5..9dd928f2c2 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -105,6 +105,8 @@ const char *boneWeightAttrInitHLSL[9] = { // to 0 and 65535 if a depth clamping/clipping flag is set (x/y clipping is performed only if depth // needs to be clamped.) // +// Additionally, depth is clipped to negative z based on vec.z (before viewport), at -1. +// // All this above is for full transform mode. // In through mode, the Z coordinate just goes straight through and there is no perspective division. // We simulate this of course with pretty much an identity matrix. Rounding Z becomes very easy. @@ -139,6 +141,15 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag if (gl_extensions.EXT_gpu_shader4) { gl_exts.push_back("#extension GL_EXT_gpu_shader4 : enable"); } + if (gl_extensions.EXT_clip_cull_distance && id.Bit(VS_BIT_VERTEX_RANGE_CULLING)) { + gl_exts.push_back("#extension GL_EXT_clip_cull_distance : enable"); + } + if (gl_extensions.APPLE_clip_distance && id.Bit(VS_BIT_VERTEX_RANGE_CULLING)) { + gl_exts.push_back("#extension GL_APPLE_clip_distance : enable"); + } + if (gl_extensions.ARB_cull_distance && id.Bit(VS_BIT_VERTEX_RANGE_CULLING)) { + gl_exts.push_back("#extension GL_ARB_cull_distance : enable"); + } } ShaderWriter p(buffer, compat, ShaderStage::Vertex, gl_exts.data(), gl_exts.size()); @@ -154,6 +165,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag bool doShadeMapping = uvGenMode == GE_TEXMAP_ENVIRONMENT_MAP; bool flatBug = bugs.Has(Draw::Bugs::BROKEN_FLAT_IN_SHADER) && g_Config.bVendorBugChecksEnabled; + bool needsZWHack = bugs.Has(Draw::Bugs::EQUAL_WZ_CORRUPTS_DEPTH) && g_Config.bVendorBugChecksEnabled; bool doFlatShading = id.Bit(VS_BIT_FLATSHADE) && !flatBug; bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM); @@ -227,11 +239,12 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag if (useHWTransform) WRITE(p, "layout (location = %d) in vec3 position;\n", (int)PspAttributeLocation::POSITION); else - // we pass the fog coord in w WRITE(p, "layout (location = %d) in vec4 position;\n", (int)PspAttributeLocation::POSITION); if (useHWTransform && hasNormal) WRITE(p, "layout (location = %d) in vec3 normal;\n", (int)PspAttributeLocation::NORMAL); + if (!useHWTransform && enableFog) + WRITE(p, "layout (location = %d) in float fog;\n", (int)PspAttributeLocation::NORMAL); if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureTransform && !isModeThrough) { @@ -269,9 +282,10 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, "#pragma warning( disable : 3571 )\n"); if (isModeThrough) { WRITE(p, "mat4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); - } else { + } else if (useHWTransform) { WRITE(p, "mat4 u_proj : register(c%i);\n", CONST_VS_PROJ); - // Add all the uniforms we'll need to transform properly. + } else { + WRITE(p, "float u_rotation : register(c%i);\n", CONST_VS_ROTATION); } if (enableFog) { @@ -332,10 +346,8 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } } - if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, "vec4 u_depthRange : register(c%i);\n", CONST_VS_DEPTHRANGE); - } if (!isModeThrough) { + WRITE(p, "vec4 u_depthRange : register(c%i);\n", CONST_VS_DEPTHRANGE); WRITE(p, "vec4 u_cullRangeMin : register(c%i);\n", CONST_VS_CULLRANGEMIN); WRITE(p, "vec4 u_cullRangeMax : register(c%i);\n", CONST_VS_CULLRANGEMAX); } @@ -378,6 +390,9 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag if (lmode) { WRITE(p, " vec3 color1 : COLOR1;\n"); } + if (enableFog) { + WRITE(p, " float fog : NORMAL;\n"); + } WRITE(p, "};\n"); } @@ -397,6 +412,12 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " vec4 gl_Position : POSITION;\n"); } else { WRITE(p, " vec4 gl_Position : SV_Position;\n"); + if (vertexRangeCulling && gstate_c.Supports(GPU_SUPPORTS_CLIP_DISTANCE)) { + WRITE(p, " float gl_ClipDistance : SV_ClipDistance0;\n"); + } + if (vertexRangeCulling && gstate_c.Supports(GPU_SUPPORTS_CULL_DISTANCE)) { + WRITE(p, " float2 gl_CullDistance : SV_CullDistance0;\n"); + } } WRITE(p, "};\n"); } else { @@ -421,6 +442,10 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, "%s mediump vec3 normal;\n", compat.attribute); *attrMask |= 1 << ATTR_NORMAL; } + if (!useHWTransform && enableFog) { + WRITE(p, "%s highp float fog;\n", compat.attribute); + *attrMask |= 1 << ATTR_NORMAL; + } if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureTransform && !isModeThrough) { @@ -443,10 +468,9 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag if (isModeThrough) { WRITE(p, "uniform mat4 u_proj_through;\n"); *uniformMask |= DIRTY_PROJTHROUGHMATRIX; - } else { + } else if (useHWTransform) { WRITE(p, "uniform mat4 u_proj;\n"); *uniformMask |= DIRTY_PROJMATRIX; - // Add all the uniforms we'll need to transform properly. } if (useHWTransform) { @@ -506,6 +530,8 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, "uniform lowp vec3 u_matemissive;\n"); *uniformMask |= DIRTY_MATSPECULAR | DIRTY_MATEMISSIVE; } + } else { + WRITE(p, "uniform lowp float u_rotation;\n"); } if (useHWTransform || !hasColor) { @@ -517,15 +543,11 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag *uniformMask |= DIRTY_FOGCOEF; } - if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, "uniform highp vec4 u_depthRange;\n"); - *uniformMask |= DIRTY_DEPTHRANGE; - } - if (!isModeThrough) { + WRITE(p, "uniform highp vec4 u_depthRange;\n"); WRITE(p, "uniform highp vec4 u_cullRangeMin;\n"); WRITE(p, "uniform highp vec4 u_cullRangeMax;\n"); - *uniformMask |= DIRTY_CULLRANGE; + *uniformMask |= DIRTY_DEPTHRANGE | DIRTY_CULLRANGE; } WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying_vs); @@ -554,7 +576,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " float z = v.z / v.w;\n"); WRITE(p, " z = z * u_depthRange.x + u_depthRange.y;\n"); WRITE(p, " z = floor(z);\n"); - WRITE(p, " z = (z - u_depthRange.z) * u_depthRange.w;\n"); + WRITE(p, " z = (z - u_depthRange.y) / u_depthRange.x;\n"); WRITE(p, " return vec4(v.x, v.y, z * v.w, v.w);\n"); WRITE(p, "}\n\n"); } @@ -754,6 +776,9 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } else { WRITE(p, " vec4 position = In.position;\n"); } + if (!useHWTransform && enableFog) { + WRITE(p, " float fog = In.fog;\n"); + } if (enableBones) { WRITE(p, "%s", boneWeightAttrInitHLSL[numBoneWeights]); } @@ -778,16 +803,30 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } if (enableFog) { - WRITE(p, " %sv_fogdepth = position.w;\n", compat.vsOutPrefix); + WRITE(p, " %sv_fogdepth = fog;\n", compat.vsOutPrefix); } if (isModeThrough) { + // The proj_through matrix already has the rotation, if needed. WRITE(p, " vec4 outPos = mul(u_proj_through, vec4(position.xyz, 1.0));\n"); } else { + if (compat.shaderLanguage == GLSL_VULKAN || compat.shaderLanguage == HLSL_D3D11) { + // Apply rotation from the uniform. + WRITE(p, " mat2 displayRotation = mat2(\n"); + WRITE(p, " u_rotation == 0.0 ? 1.0 : (u_rotation == 2.0 ? -1.0 : 0.0), u_rotation == 1.0 ? 1.0 : (u_rotation == 3.0 ? -1.0 : 0.0),\n"); + WRITE(p, " u_rotation == 3.0 ? 1.0 : (u_rotation == 1.0 ? -1.0 : 0.0), u_rotation == 0.0 ? 1.0 : (u_rotation == 2.0 ? -1.0 : 0.0)\n"); + WRITE(p, " );\n"); + + WRITE(p, " vec4 pos = position;\n"); + WRITE(p, " pos.xy = mul(displayRotation, pos.xy);\n"); + } else { + WRITE(p, " vec4 pos = position;\n"); + } + // The viewport is used in this case, so need to compensate for that. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(position.xyz, 1.0)));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(pos);\n"); } else { - WRITE(p, " vec4 outPos = mul(u_proj, vec4(position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = pos;\n"); } } } else { @@ -1099,28 +1138,49 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag if (vertexRangeCulling) { WRITE(p, " vec3 projPos = outPos.xyz / outPos.w;\n"); - // Vertex range culling doesn't happen when depth is clamped, so only do this if in range. - WRITE(p, " if (u_cullRangeMin.w <= 0.0 || (projPos.z >= u_cullRangeMin.z && projPos.z <= u_cullRangeMax.z)) {\n"); - const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y || projPos.z < u_cullRangeMin.z"; - const char *outMax = "projPos.x > u_cullRangeMax.x || projPos.y > u_cullRangeMax.y || projPos.z > u_cullRangeMax.z"; + WRITE(p, " float projZ = (projPos.z - u_depthRange.z) * u_depthRange.w;\n"); + // Vertex range culling doesn't happen when Z clips, note sign of w is important. + WRITE(p, " if (u_cullRangeMin.w <= 0.0 || projZ * outPos.w > -outPos.w) {\n"); + const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y"; + const char *outMax = "projPos.x > u_cullRangeMax.x || projPos.y > u_cullRangeMax.y"; WRITE(p, " if (%s || %s) {\n", outMin, outMax); WRITE(p, " outPos.xyzw = u_cullRangeMax.wwww;\n"); WRITE(p, " }\n"); WRITE(p, " }\n"); + WRITE(p, " if (u_cullRangeMin.w <= 0.0) {\n"); + WRITE(p, " if (projPos.z < u_cullRangeMin.z || projPos.z > u_cullRangeMax.z) {\n"); + WRITE(p, " outPos.xyzw = u_cullRangeMax.wwww;\n"); + WRITE(p, " }\n"); + WRITE(p, " }\n"); + + const char *clip0 = compat.shaderLanguage == HLSL_D3D11 ? "" : "[0]"; + const char *cull0 = compat.shaderLanguage == HLSL_D3D11 ? ".x" : "[0]"; + const char *cull1 = compat.shaderLanguage == HLSL_D3D11 ? ".y" : "[1]"; + if (gstate_c.Supports(GPU_SUPPORTS_CLIP_DISTANCE)) { + // TODO: Not rectangles... + WRITE(p, " %sgl_ClipDistance%s = projZ * outPos.w + outPos.w;\n", compat.vsOutPrefix, clip0); + } + if (gstate_c.Supports(GPU_SUPPORTS_CULL_DISTANCE)) { + // Cull any triangle fully outside in the same direction when depth clamp enabled. + WRITE(p, " if (u_cullRangeMin.w > 0.0) {\n"); + WRITE(p, " %sgl_CullDistance%s = projPos.z - u_cullRangeMin.z;\n", compat.vsOutPrefix, cull0); + WRITE(p, " %sgl_CullDistance%s = u_cullRangeMax.z - projPos.z;\n", compat.vsOutPrefix, cull1); + WRITE(p, " } else {\n"); + WRITE(p, " %sgl_CullDistance%s = 0.0;\n", compat.vsOutPrefix, cull0); + WRITE(p, " %sgl_CullDistance%s = 0.0;\n", compat.vsOutPrefix, cull1); + WRITE(p, " }\n"); + } } // We've named the output gl_Position in HLSL as well. WRITE(p, " %sgl_Position = outPos;\n", compat.vsOutPrefix); - if (gstate_c.Supports(GPU_NEEDS_Z_EQUAL_W_HACK)) { - // See comment in GPU_Vulkan.cpp. + if (needsZWHack) { + // See comment in thin3d_vulkan.cpp. WRITE(p, " if (%sgl_Position.z == %sgl_Position.w) %sgl_Position.z *= 0.999999;\n", compat.vsOutPrefix, compat.vsOutPrefix, compat.vsOutPrefix); } - if (compat.shaderLanguage == GLSL_VULKAN) { - WRITE(p, " gl_PointSize = 1.0;\n"); - } if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { WRITE(p, " return Out;\n"); } diff --git a/GPU/Common/VertexShaderGenerator.h b/GPU/Common/VertexShaderGenerator.h index 65b151e9f4..c1899001e6 100644 --- a/GPU/Common/VertexShaderGenerator.h +++ b/GPU/Common/VertexShaderGenerator.h @@ -60,4 +60,5 @@ enum { CONST_VS_BONE8 = 77, CONST_VS_CULLRANGEMIN = 80, CONST_VS_CULLRANGEMAX = 81, + CONST_VS_ROTATION = 82, }; diff --git a/GPU/D3D11/DrawEngineD3D11.cpp b/GPU/D3D11/DrawEngineD3D11.cpp index 6dc47766fb..78dced1b42 100644 --- a/GPU/D3D11/DrawEngineD3D11.cpp +++ b/GPU/D3D11/DrawEngineD3D11.cpp @@ -43,9 +43,9 @@ #include "GPU/D3D11/GPU_D3D11.h" const D3D11_PRIMITIVE_TOPOLOGY d3d11prim[8] = { - D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, - D3D11_PRIMITIVE_TOPOLOGY_LINELIST, - D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Points are expanded to triangles. + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Lines are expanded to triangles too. + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Lines are expanded to triangles too. D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Fans not supported @@ -61,10 +61,11 @@ enum { }; static const D3D11_INPUT_ELEMENT_DESC TransformedVertexElements[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 1, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(TransformedVertex, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(TransformedVertex, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(TransformedVertex, color0), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 1, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(TransformedVertex, color1), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "NORMAL", 0, DXGI_FORMAT_R32_FLOAT, 0, offsetof(TransformedVertex, fog), D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; DrawEngineD3D11::DrawEngineD3D11(Draw::DrawContext *draw, ID3D11Device *device, ID3D11DeviceContext *context) @@ -586,9 +587,25 @@ rotateVBO: params.allowClear = true; params.allowSeparateAlphaClear = false; // D3D11 doesn't support separate alpha clears params.provokeFlatFirst = true; + params.flippedY = false; + params.usesHalfZ = true; + + // We need correct viewport values in gstate_c already. + if (gstate_c.IsDirty(DIRTY_VIEWPORTSCISSOR_STATE)) { + ViewportAndScissor vpAndScissor; + ConvertViewportAndScissor(framebufferManager_->UseBufferedRendering(), + framebufferManager_->GetRenderWidth(), framebufferManager_->GetRenderHeight(), + framebufferManager_->GetTargetBufferWidth(), framebufferManager_->GetTargetBufferHeight(), + vpAndScissor); + } int maxIndex = indexGen.MaxIndex(); SoftwareTransform swTransform(params); + + const Lin::Vec3 trans(gstate_c.vpXOffset, gstate_c.vpYOffset, gstate_c.vpZOffset * 0.5f + 0.5f); + const Lin::Vec3 scale(gstate_c.vpWidthScale, -gstate_c.vpHeightScale, gstate_c.vpDepthScale * 0.5f); + swTransform.SetProjMatrix(gstate.projMatrix, gstate_c.vpWidth < 0, gstate_c.vpHeight < 0, trans, scale); + swTransform.Decode(prim, dec_->VertexType(), dec_->GetDecVtxFmt(), maxIndex, &result); if (result.action == SW_NOT_READY) { swTransform.DetectOffsetTexture(maxIndex); diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index f973d49e5e..f02d93547e 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -107,9 +107,6 @@ GPU_D3D11::~GPU_D3D11() { void GPU_D3D11::CheckGPUFeatures() { u32 features = 0; - if (!PSP_CoreParameter().compat.flags().DisableRangeCulling) { - features |= GPU_SUPPORTS_VS_RANGE_CULLING; - } features |= GPU_SUPPORTS_BLEND_MINMAX; // Accurate depth is required because the Direct3D API does not support inverse Z. @@ -128,6 +125,20 @@ void GPU_D3D11::CheckGPUFeatures() { features |= GPU_SUPPORTS_DUALSOURCE_BLEND; if (draw_->GetDeviceCaps().depthClampSupported) features |= GPU_SUPPORTS_DEPTH_CLAMP; + if (draw_->GetDeviceCaps().clipDistanceSupported) + features |= GPU_SUPPORTS_CLIP_DISTANCE; + if (draw_->GetDeviceCaps().cullDistanceSupported) + features |= GPU_SUPPORTS_CULL_DISTANCE; + if (!draw_->GetBugs().Has(Draw::Bugs::BROKEN_NAN_IN_CONDITIONAL)) { + // Ignore the compat setting if clip and cull are both enabled. + // When supported, we can do the depth side of range culling more correctly. + const bool supported = draw_->GetDeviceCaps().clipDistanceSupported && draw_->GetDeviceCaps().cullDistanceSupported; + const bool disabled = PSP_CoreParameter().compat.flags().DisableRangeCulling; + if (supported || !disabled) { + features |= GPU_SUPPORTS_VS_RANGE_CULLING; + } + } + features |= GPU_SUPPORTS_COPY_IMAGE; features |= GPU_SUPPORTS_TEXTURE_FLOAT; features |= GPU_SUPPORTS_INSTANCE_RENDERING; diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index 5e5d8877b9..2707bc4226 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -94,13 +94,13 @@ static const D3D11_STENCIL_OP stencilOps[] = { }; static const D3D11_PRIMITIVE_TOPOLOGY primToD3D11[8] = { - D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, - D3D11_PRIMITIVE_TOPOLOGY_LINELIST, - D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Points are expanded to triangles. + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Lines are expanded to triangles too. + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Lines are expanded to triangles too. D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP, D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED, // D3D11 doesn't do triangle fans. - D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, // Rectangles are expanded to triangles. }; static const D3D11_LOGIC_OP logicOps[] = { @@ -253,7 +253,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { keys_.raster.value = 0; - bool wantCull = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); + bool wantCull = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP && gstate.isCullEnabled(); keys_.raster.cullMode = wantCull ? (gstate.getCullMode() ? D3D11_CULL_FRONT : D3D11_CULL_BACK) : D3D11_CULL_NONE; if (gstate.isModeClear() || gstate.isModeThrough()) { diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 43e7e28fdb..38f803997b 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -21,6 +21,7 @@ #include +#include "Common/TimeUtil.h" #include "Core/MemMap.h" #include "Core/Reporting.h" #include "GPU/ge_constants.h" @@ -169,6 +170,7 @@ void TextureCacheD3D11::InvalidateLastTexture() { void TextureCacheD3D11::StartFrame() { InvalidateLastTexture(); timesInvalidatedAllThisFrame_ = 0; + replacementTimeThisFrame_ = 0.0; if (texelsScaledThisFrame_) { // INFO_LOG(G3D, "Scaled %i texels", texelsScaledThisFrame_); @@ -483,14 +485,12 @@ void TextureCacheD3D11::BuildTexture(TexCacheEntry *const entry) { scaleFactor = scaleFactor > 4 ? 4 : (scaleFactor > 2 ? 2 : 1); } - u64 cachekey = replacer_.Enabled() ? entry->CacheKey() : 0; int w = gstate.getTextureWidth(0); int h = gstate.getTextureHeight(0); - ReplacedTexture &replaced = replacer_.FindReplacement(cachekey, entry->fullhash, w, h); - if (replaced.GetSize(0, w, h)) { + ReplacedTexture &replaced = FindReplacement(entry, w, h); + if (replaced.Valid()) { // We're replacing, so we won't scale. scaleFactor = 1; - entry->status |= TexCacheEntry::STATUS_IS_SCALED; if (g_Config.bMipMap) { maxLevel = replaced.MaxLevel(); badMipSizes = false; @@ -684,7 +684,9 @@ void TextureCacheD3D11::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture & if (replaced.GetSize(level, w, h)) { mapData = (u32 *)AllocateAlignedMemory(w * h * sizeof(u32), 16); mapRowPitch = w * 4; + double replaceStart = time_now_d(); replaced.Load(level, mapData, mapRowPitch); + replacementTimeThisFrame_ += time_now_d() - replaceStart; dstFmt = ToDXGIFormat(replaced.Format(level)); } else { GETextureFormat tfmt = (GETextureFormat)entry.format; diff --git a/GPU/Debugger/Record.cpp b/GPU/Debugger/Record.cpp index 400d1fb71e..f26db44bb8 100644 --- a/GPU/Debugger/Record.cpp +++ b/GPU/Debugger/Record.cpp @@ -535,9 +535,28 @@ void NotifyUpload(u32 dest, u32 sz) { NotifyMemcpy(dest, dest, sz); } +static bool HasDrawCommands() { + if (commands.empty()) + return false; + + for (const Command &cmd : commands) { + switch (cmd.type) { + case CommandType::INIT: + case CommandType::DISPLAY: + continue; + + default: + return true; + } + } + + // Only init and display commands, keep going. + return false; +} + void NotifyDisplay(u32 framebuf, int stride, int fmt) { bool writePending = false; - if (active && !commands.empty()) { + if (active && HasDrawCommands()) { writePending = true; } if (nextFrame && (gstate_c.skipDrawReason & SKIPDRAW_SKIPFRAME) == 0) { @@ -572,7 +591,7 @@ void NotifyDisplay(u32 framebuf, int stride, int fmt) { void NotifyFrame() { const bool noDisplayAction = flipLastAction + 4 < gpuStats.numFlips; // We do this only to catch things that don't call NotifyDisplay. - if (active && !commands.empty() && noDisplayAction) { + if (active && HasDrawCommands() && noDisplayAction) { NOTICE_LOG(SYSTEM, "Recording complete on frame"); struct DisplayBufData { diff --git a/GPU/Directx9/DrawEngineDX9.cpp b/GPU/Directx9/DrawEngineDX9.cpp index 377d2164f4..f627e2fa47 100644 --- a/GPU/Directx9/DrawEngineDX9.cpp +++ b/GPU/Directx9/DrawEngineDX9.cpp @@ -45,12 +45,15 @@ namespace DX9 { static const D3DPRIMITIVETYPE d3d_prim[8] = { - D3DPT_POINTLIST, - D3DPT_LINELIST, - D3DPT_LINESTRIP, + // Points, which are expanded to triangles. + D3DPT_TRIANGLELIST, + // Lines and line strips, which are also expanded to triangles. + D3DPT_TRIANGLELIST, + D3DPT_TRIANGLELIST, D3DPT_TRIANGLELIST, D3DPT_TRIANGLESTRIP, D3DPT_TRIANGLEFAN, + // Rectangles, which are expanded to triangles. D3DPT_TRIANGLELIST, }; @@ -77,10 +80,11 @@ enum { enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MAX = 4 }; static const D3DVERTEXELEMENT9 TransformedVertexElements[] = { - { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - { 0, 16, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, - { 0, 28, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, - { 0, 32, D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1 }, + { 0, offsetof(TransformedVertex, pos), D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, offsetof(TransformedVertex, uv), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, offsetof(TransformedVertex, color0), D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + { 0, offsetof(TransformedVertex, color1), D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1 }, + { 0, offsetof(TransformedVertex, fog), D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, D3DDECL_END() }; @@ -555,9 +559,31 @@ rotateVBO: params.allowClear = true; params.allowSeparateAlphaClear = false; params.provokeFlatFirst = true; + params.flippedY = false; + params.usesHalfZ = true; + + // We need correct viewport values in gstate_c already. + if (gstate_c.IsDirty(DIRTY_VIEWPORTSCISSOR_STATE)) { + ViewportAndScissor vpAndScissor; + ConvertViewportAndScissor(framebufferManager_->UseBufferedRendering(), + framebufferManager_->GetRenderWidth(), framebufferManager_->GetRenderHeight(), + framebufferManager_->GetTargetBufferWidth(), framebufferManager_->GetTargetBufferHeight(), + vpAndScissor); + } int maxIndex = indexGen.MaxIndex(); SoftwareTransform swTransform(params); + + // Half pixel offset hack. + float xScale = gstate_c.vpWidth < 0 ? -1.0f : 1.0f; + float xOffset = -1.0f / gstate_c.curRTRenderWidth; + float yScale = gstate_c.vpHeight > 0 ? -1.0f : 1.0f; + float yOffset = 1.0f / gstate_c.curRTRenderHeight; + + const Lin::Vec3 trans(gstate_c.vpXOffset * xScale + xOffset, gstate_c.vpYOffset * yScale + yOffset, gstate_c.vpZOffset * 0.5f + 0.5f); + const Lin::Vec3 scale(gstate_c.vpWidthScale, gstate_c.vpHeightScale, gstate_c.vpDepthScale * 0.5f); + swTransform.SetProjMatrix(gstate.projMatrix, gstate_c.vpWidth < 0, gstate_c.vpHeight > 0, trans, scale); + swTransform.Decode(prim, dec_->VertexType(), dec_->GetDecVtxFmt(), maxIndex, &result); if (result.action == SW_NOT_READY) { swTransform.DetectOffsetTexture(maxIndex); diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 38c597f62c..fd60ff23a1 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -22,13 +22,14 @@ #include #include +#include "Common/Data/Convert/SmallDataConvert.h" +#include "Common/Data/Encoding/Utf8.h" #include "Common/Data/Text/I18n.h" #include "Common/Math/lin/matrix4x4.h" #include "Common/Math/math_util.h" -#include "Common/Data/Convert/SmallDataConvert.h" #include "Common/GPU/D3D9/D3D9ShaderCompiler.h" #include "Common/GPU/thin3d.h" -#include "Common/Data/Encoding/Utf8.h" +#include "Common/System/Display.h" #include "Common/Common.h" #include "Common/Log.h" @@ -344,6 +345,7 @@ void ShaderManagerDX9::VSUpdateUniforms(u64 dirtyUniforms) { ConvertProjMatrixToD3D(flippedMatrix, invertedX, invertedY); VSSetMatrix(CONST_VS_PROJ, flippedMatrix.getReadPtr()); + VSSetFloat(CONST_VS_ROTATION, 0); // We don't use this on any platform in D3D9. } if (dirtyUniforms & DIRTY_PROJTHROUGHMATRIX) { Matrix4x4 proj_through; @@ -440,15 +442,10 @@ void ShaderManagerDX9::VSUpdateUniforms(u64 dirtyUniforms) { float viewZScale = halfActualZRange * 2.0f; // Account for the half pixel offset. float viewZCenter = minz + (DepthSliceFactor() / 256.0f) * 0.5f; - float viewZInvScale; + float reverseScale = 2.0f * (1.0f / gstate_c.vpDepthScale); + float reverseTranslate = gstate_c.vpZOffset * 0.5f + 0.5f; - if (viewZScale != 0.0) { - viewZInvScale = 1.0f / viewZScale; - } else { - viewZInvScale = 0.0; - } - - float data[4] = { viewZScale, viewZCenter, viewZCenter, viewZInvScale }; + float data[4] = { viewZScale, viewZCenter, reverseTranslate, reverseScale }; VSSetFloatUniform4(CONST_VS_DEPTHRANGE, data); } if (dirtyUniforms & DIRTY_CULLRANGE) { diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index b4fc44aa1d..f189bfa5f6 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -175,7 +175,7 @@ void DrawEngineDX9::ApplyDrawState(int prim) { } else { dxstate.dither.disable(); } - bool wantCull = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); + bool wantCull = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP && gstate.isCullEnabled(); dxstate.cullMode.set(wantCull, gstate.getCullMode()); if (gstate.isModeClear()) { // Well, probably doesn't matter... diff --git a/GPU/Directx9/TextureCacheDX9.cpp b/GPU/Directx9/TextureCacheDX9.cpp index 56e9b78dd0..b6b2bb4c18 100644 --- a/GPU/Directx9/TextureCacheDX9.cpp +++ b/GPU/Directx9/TextureCacheDX9.cpp @@ -18,6 +18,7 @@ #include #include +#include "Common/TimeUtil.h" #include "Core/MemMap.h" #include "Core/Reporting.h" #include "GPU/ge_constants.h" @@ -134,6 +135,7 @@ void TextureCacheDX9::ApplySamplingParams(const SamplerCacheKey &key) { void TextureCacheDX9::StartFrame() { InvalidateLastTexture(); timesInvalidatedAllThisFrame_ = 0; + replacementTimeThisFrame_ = 0.0; if (texelsScaledThisFrame_) { VERBOSE_LOG(G3D, "Scaled %i texels", texelsScaledThisFrame_); @@ -443,14 +445,12 @@ void TextureCacheDX9::BuildTexture(TexCacheEntry *const entry) { scaleFactor = scaleFactor > 4 ? 4 : (scaleFactor > 2 ? 2 : 1); } - u64 cachekey = replacer_.Enabled() ? entry->CacheKey() : 0; int w = gstate.getTextureWidth(0); int h = gstate.getTextureHeight(0); - ReplacedTexture &replaced = replacer_.FindReplacement(cachekey, entry->fullhash, w, h); - if (replaced.GetSize(0, w, h)) { + ReplacedTexture &replaced = FindReplacement(entry, w, h); + if (replaced.Valid()) { // We're replacing, so we won't scale. scaleFactor = 1; - entry->status |= TexCacheEntry::STATUS_IS_SCALED; if (g_Config.bMipMap) { maxLevel = replaced.MaxLevel(); badMipSizes = false; @@ -622,7 +622,9 @@ void TextureCacheDX9::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture &re gpuStats.numTexturesDecoded++; if (replaced.GetSize(level, w, h)) { + double replaceStart = time_now_d(); replaced.Load(level, rect.pBits, rect.Pitch); + replacementTimeThisFrame_ += time_now_d() - replaceStart; dstFmt = ToD3D9Format(replaced.Format(level)); } else { GETextureFormat tfmt = (GETextureFormat)entry.format; diff --git a/GPU/GLES/DepalettizeShaderGLES.cpp b/GPU/GLES/DepalettizeShaderGLES.cpp index 47ddfa1907..fbf544f1ca 100644 --- a/GPU/GLES/DepalettizeShaderGLES.cpp +++ b/GPU/GLES/DepalettizeShaderGLES.cpp @@ -183,7 +183,7 @@ DepalShader *DepalShaderCacheGLES::GetDepalettizeShader(uint32_t clutMode, GEBuf std::vector shaders{ vertexShader_, fragShader }; - GLRProgram *program = render_->CreateProgram(shaders, semantics, queries, initializer, false); + GLRProgram *program = render_->CreateProgram(shaders, semantics, queries, initializer, false, false); depal->program = program; depal->fragShader = fragShader; diff --git a/GPU/GLES/DepthBufferGLES.cpp b/GPU/GLES/DepthBufferGLES.cpp index 7eae61caa6..d262713721 100644 --- a/GPU/GLES/DepthBufferGLES.cpp +++ b/GPU/GLES/DepthBufferGLES.cpp @@ -116,7 +116,7 @@ void FramebufferManagerGLES::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int queries.push_back({ &u_depthDownloadTo8, "u_depthTo8" }); std::vector inits; inits.push_back({ &u_depthDownloadTex, 0, TEX_SLOT_PSP_TEXTURE }); - depthDownloadProgram_ = render_->CreateProgram(shaders, semantics, queries, inits, false); + depthDownloadProgram_ = render_->CreateProgram(shaders, semantics, queries, inits, false, false); for (auto iter : shaders) { render_->DeleteShader(iter); } diff --git a/GPU/GLES/DrawEngineGLES.cpp b/GPU/GLES/DrawEngineGLES.cpp index 1bd602e328..275ded02e6 100644 --- a/GPU/GLES/DrawEngineGLES.cpp +++ b/GPU/GLES/DrawEngineGLES.cpp @@ -45,37 +45,28 @@ #include "GPU/GLES/GPU_GLES.h" const GLuint glprim[8] = { - GL_POINTS, - GL_LINES, - GL_LINE_STRIP, + // Points, which are expanded to triangles. + GL_TRIANGLES, + // Lines and line strips, which are also expanded to triangles. + GL_TRIANGLES, + GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, + // Rectangles, which are expanded to triangles. GL_TRIANGLES, - // Rectangles need to be expanded into triangles. }; enum { TRANSFORMED_VERTEX_BUFFER_SIZE = VERTEX_BUFFER_MAX * sizeof(TransformedVertex) }; -#define VERTEXCACHE_DECIMATION_INTERVAL 17 -#define VERTEXCACHE_NAME_DECIMATION_INTERVAL 41 -#define VERTEXCACHE_NAME_DECIMATION_MAX 100 -#define VERTEXCACHE_NAME_CACHE_SIZE 64 -#define VERTEXCACHE_NAME_CACHE_FULL_BYTES (1024 * 1024) -#define VERTEXCACHE_NAME_CACHE_MAX_AGE 120 - -enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MAX = 4 }; - -DrawEngineGLES::DrawEngineGLES(Draw::DrawContext *draw) : vai_(256), inputLayoutMap_(16), draw_(draw) { +DrawEngineGLES::DrawEngineGLES(Draw::DrawContext *draw) : inputLayoutMap_(16), draw_(draw) { render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); decOptions_.expandAllWeightsToFloat = false; decOptions_.expand8BitNormalsToFloat = false; - decimationCounter_ = VERTEXCACHE_DECIMATION_INTERVAL; - bufferDecimationCounter_ = VERTEXCACHE_NAME_DECIMATION_INTERVAL; // Allocate nicely aligned memory. Maybe graphics drivers will // appreciate it. // All this is a LOT of memory, need to see if we can cut down somehow. @@ -118,10 +109,11 @@ void DrawEngineGLES::InitDeviceObjects() { int vertexSize = sizeof(TransformedVertex); std::vector entries; - entries.push_back({ ATTR_POSITION, 4, GL_FLOAT, GL_FALSE, vertexSize, 0 }); + entries.push_back({ ATTR_POSITION, 4, GL_FLOAT, GL_FALSE, vertexSize, offsetof(TransformedVertex, x) }); entries.push_back({ ATTR_TEXCOORD, 3, GL_FLOAT, GL_FALSE, vertexSize, offsetof(TransformedVertex, u) }); entries.push_back({ ATTR_COLOR0, 4, GL_UNSIGNED_BYTE, GL_TRUE, vertexSize, offsetof(TransformedVertex, color0) }); entries.push_back({ ATTR_COLOR1, 3, GL_UNSIGNED_BYTE, GL_TRUE, vertexSize, offsetof(TransformedVertex, color1) }); + entries.push_back({ ATTR_NORMAL, 1, GL_FLOAT, GL_FALSE, vertexSize, offsetof(TransformedVertex, fog) }); softwareInputLayout_ = render_->CreateInputLayout(entries); } @@ -244,71 +236,13 @@ void *DrawEngineGLES::DecodeVertsToPushBuffer(GLPushBuffer *push, uint32_t *bind return dest; } -void DrawEngineGLES::MarkUnreliable(VertexArrayInfo *vai) { - vai->status = VertexArrayInfo::VAI_UNRELIABLE; - if (vai->vbo) { - render_->DeleteBuffer(vai->vbo); - vai->vbo = 0; - } - if (vai->ebo) { - render_->DeleteBuffer(vai->ebo); - vai->ebo = 0; - } -} - -void DrawEngineGLES::ClearTrackedVertexArrays() { - vai_.Iterate([&](uint32_t hash, VertexArrayInfo *vai){ - FreeVertexArray(vai); - delete vai; - }); - vai_.Clear(); -} - -void DrawEngineGLES::DecimateTrackedVertexArrays() { - if (--decimationCounter_ <= 0) { - decimationCounter_ = VERTEXCACHE_DECIMATION_INTERVAL; - } else { - return; - } - - const int threshold = gpuStats.numFlips - VAI_KILL_AGE; - const int unreliableThreshold = gpuStats.numFlips - VAI_UNRELIABLE_KILL_AGE; - int unreliableLeft = VAI_UNRELIABLE_KILL_MAX; - vai_.Iterate([&](uint32_t hash, VertexArrayInfo *vai) { - bool kill; - if (vai->status == VertexArrayInfo::VAI_UNRELIABLE) { - // We limit killing unreliable so we don't rehash too often. - kill = vai->lastFrame < unreliableThreshold && --unreliableLeft >= 0; - } else { - kill = vai->lastFrame < threshold; - } - if (kill) { - FreeVertexArray(vai); - delete vai; - vai_.Remove(hash); - } - }); - vai_.Maintain(); -} - -void DrawEngineGLES::FreeVertexArray(VertexArrayInfo *vai) { - if (vai->vbo) { - render_->DeleteBuffer(vai->vbo); - vai->vbo = nullptr; - } - if (vai->ebo) { - render_->DeleteBuffer(vai->ebo); - vai->ebo = nullptr; - } -} - void DrawEngineGLES::DoFlush() { PROFILE_THIS_SCOPE("flush"); FrameData &frameData = frameData_[render_->GetCurFrame()]; gpuStats.numFlushes++; - gpuStats.numTrackedVertexArrays = (int)vai_.size(); + gpuStats.numTrackedVertexArrays = 0; // A new render step means we need to flush any dynamic state. Really, any state that is reset in // GLQueueRunner::PerformRenderPass. @@ -344,168 +278,30 @@ void DrawEngineGLES::DoFlush() { int vertexCount = 0; bool useElements = true; bool populateCache = false; - VertexArrayInfo *vai = nullptr; - // Cannot cache vertex data with morph enabled. - bool useCache = g_Config.bVertexCache && !(lastVType_ & GE_VTYPE_MORPHCOUNT_MASK); - // Also avoid caching when software skinning. - if (g_Config.bSoftwareSkinning && (lastVType_ & GE_VTYPE_WEIGHT_MASK)) - useCache = false; - - // TEMPORARY - useCache = false; - - if (useCache) { - u32 id = dcid_ ^ gstate.getUVGenMode(); // This can have an effect on which UV decoder we need to use! And hence what the decoded data will look like. See #9263 - vai = vai_.Get(id); - if (!vai) { - vai = new VertexArrayInfo(); - vai_.Insert(id, vai); - } - - switch (vai->status) { - case VertexArrayInfo::VAI_NEW: - { - // Haven't seen this one before. - uint64_t dataHash = ComputeHash(); - vai->hash = dataHash; - vai->minihash = ComputeMiniHash(); - vai->status = VertexArrayInfo::VAI_HASHING; - vai->drawsUntilNextFullHash = 0; - useCache = false; - break; - } - - // Hashing - still gaining confidence about the buffer. - // But if we get this far it's likely to be worth creating a vertex buffer. - case VertexArrayInfo::VAI_HASHING: - { - vai->numDraws++; - if (vai->lastFrame != gpuStats.numFlips) { - vai->numFrames++; - } - if (vai->drawsUntilNextFullHash == 0) { - // Let's try to skip a full hash if mini would fail. - const u32 newMiniHash = ComputeMiniHash(); - uint64_t newHash = vai->hash; - if (newMiniHash == vai->minihash) { - newHash = ComputeHash(); - } - if (newMiniHash != vai->minihash || newHash != vai->hash) { - MarkUnreliable(vai); - useCache = false; - break; - } - if (vai->numVerts > 64) { - // exponential backoff up to 16 draws, then every 32 - vai->drawsUntilNextFullHash = std::min(32, vai->numFrames); - } else { - // Lower numbers seem much more likely to change. - vai->drawsUntilNextFullHash = 0; - } - // TODO: tweak - //if (vai->numFrames > 1000) { - // vai->status = VertexArrayInfo::VAI_RELIABLE; - //} - } else { - vai->drawsUntilNextFullHash--; - u32 newMiniHash = ComputeMiniHash(); - if (newMiniHash != vai->minihash) { - MarkUnreliable(vai); - break; - } - } - - if (vai->vbo == nullptr) { - _dbg_assert_msg_(gstate_c.vertBounds.minV >= gstate_c.vertBounds.maxV, "Should not have checked UVs when caching."); - - // We'll populate the cache this time around, use it next time. - populateCache = true; - useCache = false; - } else { - gpuStats.numCachedDrawCalls++; - useElements = vai->ebo ? true : false; - gpuStats.numCachedVertsDrawn += vai->numVerts; - gstate_c.vertexFullAlpha = vai->flags & VAI_FLAG_VERTEXFULLALPHA; - - vertexBuffer = vai->vbo; - indexBuffer = vai->ebo; - vertexCount = vai->numVerts; - prim = static_cast(vai->prim); - } - break; - } - - // Reliable - we don't even bother hashing anymore. Right now we don't go here until after a very long time. - case VertexArrayInfo::VAI_RELIABLE: - { - vai->numDraws++; - if (vai->lastFrame != gpuStats.numFlips) { - vai->numFrames++; - } - gpuStats.numCachedDrawCalls++; - gpuStats.numCachedVertsDrawn += vai->numVerts; - vertexBuffer = vai->vbo; - indexBuffer = vai->ebo; - vertexCount = vai->numVerts; - prim = static_cast(vai->prim); - - gstate_c.vertexFullAlpha = vai->flags & VAI_FLAG_VERTEXFULLALPHA; - break; - } - - case VertexArrayInfo::VAI_UNRELIABLE: - { - vai->numDraws++; - if (vai->lastFrame != gpuStats.numFlips) { - vai->numFrames++; - } - useCache = false; - break; - } - } - - if (useCache) { - vai->lastFrame = gpuStats.numFlips; - } + if (g_Config.bSoftwareSkinning && (lastVType_ & GE_VTYPE_WEIGHT_MASK)) { + // If software skinning, we've already predecoded into "decoded". So push that content. + size_t size = decodedVerts_ * dec_->GetDecVtxFmt().stride; + u8 *dest = (u8 *)frameData.pushVertex->Push(size, &vertexBufferOffset, &vertexBuffer); + memcpy(dest, decoded, size); + } else { + // Decode directly into the pushbuffer + u8 *dest = (u8 *)DecodeVertsToPushBuffer(frameData.pushVertex, &vertexBufferOffset, &vertexBuffer); } - if (!useCache) { - if (g_Config.bSoftwareSkinning && (lastVType_ & GE_VTYPE_WEIGHT_MASK)) { - // If software skinning, we've already predecoded into "decoded". So push that content. - size_t size = decodedVerts_ * dec_->GetDecVtxFmt().stride; - u8 *dest = (u8 *)frameData.pushVertex->Push(size, &vertexBufferOffset, &vertexBuffer); - memcpy(dest, decoded, size); - } else { - // Decode directly into the pushbuffer - u8 *dest = (u8 *)DecodeVertsToPushBuffer(frameData.pushVertex, &vertexBufferOffset, &vertexBuffer); - if (populateCache) { - size_t size = decodedVerts_ * dec_->GetDecVtxFmt().stride; - vai->vbo = render_->CreateBuffer(GL_ARRAY_BUFFER, size, GL_STATIC_DRAW); - render_->BufferSubdata(vai->vbo, 0, size, dest, false); - } - } + gpuStats.numUncachedVertsDrawn += indexGen.VertexCount(); - if (populateCache || (vai && vai->status == VertexArrayInfo::VAI_NEW)) { - vai->numVerts = indexGen.VertexCount(); - vai->prim = indexGen.Prim(); - vai->maxIndex = indexGen.MaxIndex(); - vai->flags = gstate_c.vertexFullAlpha ? VAI_FLAG_VERTEXFULLALPHA : 0; - } - - gpuStats.numUncachedVertsDrawn += indexGen.VertexCount(); - // If there's only been one primitive type, and it's either TRIANGLES, LINES or POINTS, - // there is no need for the index buffer we built. We can then use glDrawArrays instead - // for a very minor speed boost. - useElements = !indexGen.SeenOnlyPurePrims(); - vertexCount = indexGen.VertexCount(); - if (!useElements && indexGen.PureCount()) { - vertexCount = indexGen.PureCount(); - } - prim = indexGen.Prim(); + // If there's only been one primitive type, and it's either TRIANGLES, LINES or POINTS, + // there is no need for the index buffer we built. We can then use glDrawArrays instead + // for a very minor speed boost. + useElements = !indexGen.SeenOnlyPurePrims(); + vertexCount = indexGen.VertexCount(); + if (!useElements && indexGen.PureCount()) { + vertexCount = indexGen.PureCount(); } + prim = indexGen.Prim(); - VERBOSE_LOG(G3D, "Flush prim %i! %i verts in one go", prim, vertexCount); + VERBOSE_LOG(G3D, "Flush prim %d! %d verts in one go", prim, vertexCount); bool hasColor = (lastVType_ & GE_VTYPE_COL_MASK) != GE_VTYPE_COL_NONE; if (gstate.isModeThrough()) { gstate_c.vertexFullAlpha = gstate_c.vertexFullAlpha && (hasColor || gstate.getMaterialAmbientA() == 255); @@ -528,11 +324,6 @@ void DrawEngineGLES::DoFlush() { size_t esz = sizeof(uint16_t) * indexGen.VertexCount(); void *dest = frameData.pushIndex->Push(esz, &indexBufferOffset, &indexBuffer); memcpy(dest, decIndex, esz); - - if (populateCache) { - vai->ebo = render_->CreateBuffer(GL_ELEMENT_ARRAY_BUFFER, esz, GL_STATIC_DRAW); - render_->BufferSubdata(vai->ebo, 0, esz, (uint8_t *)dest, false); - } } render_->BindIndexBuffer(indexBuffer); render_->DrawIndexed(glprim[prim], vertexCount, GL_UNSIGNED_SHORT, (GLvoid*)(intptr_t)indexBufferOffset); @@ -566,6 +357,16 @@ void DrawEngineGLES::DoFlush() { params.allowClear = true; params.allowSeparateAlphaClear = true; params.provokeFlatFirst = false; + params.flippedY = framebufferManager_->UseBufferedRendering(); + params.usesHalfZ = false; + + // We need correct viewport values in gstate_c already. + if (gstate_c.IsDirty(DIRTY_VIEWPORTSCISSOR_STATE)) { + ConvertViewportAndScissor(framebufferManager_->UseBufferedRendering(), + framebufferManager_->GetRenderWidth(), framebufferManager_->GetRenderHeight(), + framebufferManager_->GetTargetBufferWidth(), framebufferManager_->GetTargetBufferHeight(), + vpAndScissor); + } int maxIndex = indexGen.MaxIndex(); int vertexCount = indexGen.VertexCount(); @@ -577,6 +378,12 @@ void DrawEngineGLES::DoFlush() { #endif SoftwareTransform swTransform(params); + + const Lin::Vec3 trans(gstate_c.vpXOffset, gstate_c.vpYOffset, gstate_c.vpZOffset); + const Lin::Vec3 scale(gstate_c.vpWidthScale, gstate_c.vpHeightScale * (params.flippedY ? 1.0 : -1.0f), gstate_c.vpDepthScale); + const bool invertedY = gstate_c.vpHeight * (params.flippedY ? 1.0 : -1.0f) < 0; + swTransform.SetProjMatrix(gstate.projMatrix, gstate_c.vpWidth < 0, invertedY, trans, scale); + swTransform.Decode(prim, dec_->VertexType(), dec_->GetDecVtxFmt(), maxIndex, &result); if (result.action == SW_NOT_READY) swTransform.DetectOffsetTexture(maxIndex); diff --git a/GPU/GLES/DrawEngineGLES.h b/GPU/GLES/DrawEngineGLES.h index fd694f4d7e..5554fe21e8 100644 --- a/GPU/GLES/DrawEngineGLES.h +++ b/GPU/GLES/DrawEngineGLES.h @@ -50,65 +50,6 @@ enum { TEX_SLOT_SPLINE_WEIGHTS_V = 6, }; - -// States transitions: -// On creation: DRAWN_NEW -// DRAWN_NEW -> DRAWN_HASHING -// DRAWN_HASHING -> DRAWN_RELIABLE -// DRAWN_HASHING -> DRAWN_UNRELIABLE -// DRAWN_ONCE -> UNRELIABLE -// DRAWN_RELIABLE -> DRAWN_SAFE -// UNRELIABLE -> death -// DRAWN_ONCE -> death -// DRAWN_RELIABLE -> death - -enum { - VAI_FLAG_VERTEXFULLALPHA = 1, -}; - -// Try to keep this POD. -class VertexArrayInfo { -public: - VertexArrayInfo() { - status = VAI_NEW; - vbo = nullptr; - ebo = nullptr; - prim = GE_PRIM_INVALID; - numDraws = 0; - numFrames = 0; - lastFrame = gpuStats.numFlips; - numVerts = 0; - drawsUntilNextFullHash = 0; - flags = 0; - } - - enum Status : uint8_t { - VAI_NEW, - VAI_HASHING, - VAI_RELIABLE, // cache, don't hash - VAI_UNRELIABLE, // never cache - }; - - uint64_t hash; - u32 minihash; - - GLRBuffer *vbo; - GLRBuffer *ebo; - - // Precalculated parameter for drawRangeElements - u16 numVerts; - u16 maxIndex; - s8 prim; - Status status; - - // ID information - int numDraws; - int numFrames; - int lastFrame; // So that we can forget. - u16 drawsUntilNextFullHash; - u8 flags; -}; - class TessellationDataTransferGLES : public TessellationDataTransfer { private: GLRTexture *data_tex[3]{}; @@ -148,7 +89,7 @@ public: void DeviceLost(); void DeviceRestore(Draw::DrawContext *draw); - void ClearTrackedVertexArrays() override; + void ClearTrackedVertexArrays() override {} void BeginFrame(); void EndFrame(); @@ -184,7 +125,7 @@ public: protected: bool UpdateUseHWTessellation(bool enable) override; - void DecimateTrackedVertexArrays(); + void DecimateTrackedVertexArrays() {} private: void InitDeviceObjects(); @@ -199,18 +140,12 @@ private: void *DecodeVertsToPushBuffer(GLPushBuffer *push, uint32_t *bindOffset, GLRBuffer **buf); - void FreeVertexArray(VertexArrayInfo *vai); - - void MarkUnreliable(VertexArrayInfo *vai); - struct FrameData { GLPushBuffer *pushVertex; GLPushBuffer *pushIndex; }; FrameData frameData_[GLRenderManager::MAX_INFLIGHT_FRAMES]; - PrehashMap vai_; - DenseHashMap inputLayoutMap_; GLRInputLayout *softwareInputLayout_ = nullptr; diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index f28b4f7016..f6d6fb3e2e 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -87,7 +87,7 @@ void FramebufferManagerGLES::CompileDraw2DProgram() { std::vector semantics; semantics.push_back({ 0, "a_position" }); semantics.push_back({ 1, "a_texcoord0" }); - draw2dprogram_ = render_->CreateProgram(shaders, semantics, queries, initializers, false); + draw2dprogram_ = render_->CreateProgram(shaders, semantics, queries, initializers, false, false); for (auto shader : shaders) render_->DeleteShader(shader); } @@ -349,8 +349,6 @@ void FramebufferManagerGLES::Resized() { FramebufferManagerCommon::Resized(); render_->Resize(PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight); - - // render_->SetLineWidth(renderWidth_ / 480.0f); } bool FramebufferManagerGLES::GetOutputFramebuffer(GPUDebugBuffer &buffer) { diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 18b11d57f5..44f92a7d29 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -149,12 +149,6 @@ void GPU_GLES::CheckGPUFeatures() { features |= GPU_SUPPORTS_16BIT_FORMATS; - if (!draw_->GetBugs().Has(Draw::Bugs::BROKEN_NAN_IN_CONDITIONAL)) { - if (!PSP_CoreParameter().compat.flags().DisableRangeCulling) { - features |= GPU_SUPPORTS_VS_RANGE_CULLING; - } - } - if (gl_extensions.ARB_blend_func_extended || gl_extensions.EXT_blend_func_extended) { if (!g_Config.bVendorBugChecksEnabled || !draw_->GetBugs().Has(Draw::Bugs::DUAL_SOURCE_BLENDING_BROKEN)) { features |= GPU_SUPPORTS_DUALSOURCE_BLEND; @@ -182,7 +176,7 @@ void GPU_GLES::CheckGPUFeatures() { features |= GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH; } } - + if (gl_extensions.ARB_framebuffer_object || gl_extensions.NV_framebuffer_blit || gl_extensions.GLES3) { features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT | GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; } @@ -228,6 +222,19 @@ void GPU_GLES::CheckGPUFeatures() { if (gl_extensions.GLES3) features |= GPU_SUPPORTS_DEPTH_TEXTURE; } + if (draw_->GetDeviceCaps().clipDistanceSupported) + features |= GPU_SUPPORTS_CLIP_DISTANCE; + if (draw_->GetDeviceCaps().cullDistanceSupported) + features |= GPU_SUPPORTS_CULL_DISTANCE; + if (!draw_->GetBugs().Has(Draw::Bugs::BROKEN_NAN_IN_CONDITIONAL)) { + // Ignore the compat setting if clip and cull are both enabled. + // When supported, we can do the depth side of range culling more correctly. + const bool supported = draw_->GetDeviceCaps().clipDistanceSupported && draw_->GetDeviceCaps().cullDistanceSupported; + const bool disabled = PSP_CoreParameter().compat.flags().DisableRangeCulling; + if (supported || !disabled) { + features |= GPU_SUPPORTS_VS_RANGE_CULLING; + } + } // If we already have a 16-bit depth buffer, we don't need to round. bool prefer24 = draw_->GetDeviceCaps().preferredDepthBufferFormat == Draw::DataFormat::D24_S8; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 44029e691c..be2467778f 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -33,6 +33,7 @@ #include "Common/GPU/Shader.h" #include "Common/GPU/thin3d.h" #include "Common/GPU/OpenGL/GLRenderManager.h" +#include "Common/System/Display.h" #include "Common/Log.h" #include "Common/File/FileUtil.h" @@ -51,10 +52,10 @@ using namespace Lin; -Shader::Shader(GLRenderManager *render, const char *code, const std::string &desc, uint32_t glShaderType, bool useHWTransform, uint32_t attrMask, uint64_t uniformMask) - : render_(render), failed_(false), useHWTransform_(useHWTransform), attrMask_(attrMask), uniformMask_(uniformMask) { +Shader::Shader(GLRenderManager *render, const char *code, const std::string &desc, const ShaderDescGLES ¶ms) + : render_(render), useHWTransform_(params.useHWTransform), attrMask_(params.attrMask), uniformMask_(params.uniformMask) { PROFILE_THIS_SCOPE("shadercomp"); - isFragment_ = glShaderType == GL_FRAGMENT_SHADER; + isFragment_ = params.glShaderType == GL_FRAGMENT_SHADER; source_ = code; #ifdef SHADERLOG #ifdef _WIN32 @@ -63,7 +64,7 @@ Shader::Shader(GLRenderManager *render, const char *code, const std::string &des printf("%s\n", code); #endif #endif - shader = render->CreateShader(glShaderType, source_, desc); + shader = render->CreateShader(params.glShaderType, source_, desc); } Shader::~Shader() { @@ -84,7 +85,10 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, std::vector semantics; semantics.push_back({ ATTR_POSITION, "position" }); semantics.push_back({ ATTR_TEXCOORD, "texcoord" }); - semantics.push_back({ ATTR_NORMAL, "normal" }); + if (useHWTransform_) + semantics.push_back({ ATTR_NORMAL, "normal" }); + else + semantics.push_back({ ATTR_NORMAL, "fog" }); semantics.push_back({ ATTR_W1, "w1" }); semantics.push_back({ ATTR_W2, "w2" }); semantics.push_back({ ATTR_COLOR0, "color0" }); @@ -124,6 +128,7 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, queries.push_back({ &u_depthRange, "u_depthRange" }); queries.push_back({ &u_cullRangeMin, "u_cullRangeMin" }); queries.push_back({ &u_cullRangeMax, "u_cullRangeMax" }); + queries.push_back({ &u_rotation, "u_rotation" }); #ifdef USE_BONE_ARRAY queries.push_back({ &u_bone, "u_bone" }); @@ -182,7 +187,9 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, initialize.push_back({ &u_tess_weights_u, 0, 5 }); initialize.push_back({ &u_tess_weights_v, 0, 6 }); - program = render->CreateProgram(shaders, semantics, queries, initialize, gstate_c.featureFlags & GPU_SUPPORTS_DUALSOURCE_BLEND); + bool useDualSource = (gstate_c.featureFlags & GPU_SUPPORTS_DUALSOURCE_BLEND) != 0; + bool useClip0 = VSID.Bit(VS_BIT_VERTEX_RANGE_CULLING) && gstate_c.Supports(GPU_SUPPORTS_CLIP_DISTANCE); + program = render->CreateProgram(shaders, semantics, queries, initialize, useDualSource, useClip0); // The rest, use the "dirty" mechanism. dirtyUniforms = DIRTY_ALL_UNIFORMS; @@ -358,6 +365,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu ScaleProjMatrix(flippedMatrix, useBufferedRendering); render_->SetUniformM4x4(&u_proj, flippedMatrix.m); + render_->SetUniformF1(&u_rotation, useBufferedRendering ? 0 : (float)g_display_rotation); } if (dirty & DIRTY_PROJTHROUGHMATRIX) { @@ -476,14 +484,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu viewZCenter = vpZCenter; } - float viewZInvScale; - if (viewZScale != 0.0) { - viewZInvScale = 1.0f / viewZScale; - } else { - viewZInvScale = 0.0; - } - - float data[4] = { viewZScale, viewZCenter, viewZCenter, viewZInvScale }; + float data[4] = { viewZScale, viewZCenter, gstate_c.vpZOffset, 1.0f / gstate_c.vpDepthScale }; SetFloatUniform4(render_, &u_depthRange, data); } if (dirty & DIRTY_CULLRANGE) { @@ -640,7 +641,8 @@ Shader *ShaderManagerGLES::CompileFragmentShader(FShaderID FSID) { return nullptr; } std::string desc = FragmentShaderDesc(FSID); - return new Shader(render_, codeBuffer_, desc, GL_FRAGMENT_SHADER, false, 0, uniformMask); + ShaderDescGLES params{ GL_FRAGMENT_SHADER, 0, uniformMask }; + return new Shader(render_, codeBuffer_, desc, params); } Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) { @@ -653,7 +655,9 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) { return nullptr; } std::string desc = VertexShaderDesc(VSID); - return new Shader(render_, codeBuffer_, desc, GL_VERTEX_SHADER, useHWTransform, attrMask, uniformMask); + ShaderDescGLES params{ GL_VERTEX_SHADER, attrMask, uniformMask }; + params.useHWTransform = useHWTransform; + return new Shader(render_, codeBuffer_, desc, params); } Shader *ShaderManagerGLES::ApplyVertexShader(bool useHWTransform, bool useHWTessellation, u32 vertType, bool weightsAsFloat, VShaderID *VSID) { diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index c49b6700c0..89b335b094 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -60,6 +60,7 @@ public: int u_depthRange; // x,y = viewport xscale/xcenter. z,w=clipping minz/maxz (?) int u_cullRangeMin; int u_cullRangeMax; + int u_rotation; #ifdef USE_BONE_ARRAY int u_bone; // array, size is numBones @@ -114,9 +115,16 @@ public: // Real public interface +struct ShaderDescGLES { + uint32_t glShaderType; + uint32_t attrMask; + uint64_t uniformMask; + bool useHWTransform; +}; + class Shader { public: - Shader(GLRenderManager *render, const char *code, const std::string &desc, uint32_t glShaderType, bool useHWTransform, uint32_t attrMask, uint64_t uniformMask); + Shader(GLRenderManager *render, const char *code, const std::string &desc, const ShaderDescGLES ¶ms); ~Shader(); GLRShader *shader; @@ -131,7 +139,7 @@ public: private: GLRenderManager *render_; std::string source_; - bool failed_; + bool failed_ = false; bool useHWTransform_; bool isFragment_; uint32_t attrMask_; // only used in vertex shaders diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 404dc506ac..36e3982a48 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -229,7 +229,7 @@ void DrawEngineGLES::ApplyDrawState(int prim) { bool cullEnable; GLenum cullMode = cullingMode[gstate.getCullMode() ^ !useBufferedRendering]; - cullEnable = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); + cullEnable = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP && gstate.isCullEnabled(); bool depthClampEnable = false; if (gstate.isModeClear() || gstate.isModeThrough()) { diff --git a/GPU/GLES/StencilBufferGLES.cpp b/GPU/GLES/StencilBufferGLES.cpp index 480690b930..7ea535925f 100644 --- a/GPU/GLES/StencilBufferGLES.cpp +++ b/GPU/GLES/StencilBufferGLES.cpp @@ -147,7 +147,7 @@ bool FramebufferManagerGLES::NotifyStencilUpload(u32 addr, int size, StencilUplo queries.push_back({ &u_stencilValue, "u_stencilValue" }); std::vector inits; inits.push_back({ &u_stencilUploadTex, 0, TEX_SLOT_PSP_TEXTURE }); - stencilUploadProgram_ = render_->CreateProgram(shaders, semantics, queries, inits, false); + stencilUploadProgram_ = render_->CreateProgram(shaders, semantics, queries, inits, false, false); for (auto iter : shaders) { render_->DeleteShader(iter); } diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 31049790b8..9453e275d5 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -24,6 +24,7 @@ #include "Common/Math/math_util.h" #include "Common/Profiler/Profiler.h" #include "Common/GPU/OpenGL/GLRenderManager.h" +#include "Common/TimeUtil.h" #include "Core/Config.h" #include "Core/Host.h" @@ -152,6 +153,7 @@ static void ConvertColors(void *dstBuf, const void *srcBuf, Draw::DataFormat dst void TextureCacheGLES::StartFrame() { InvalidateLastTexture(); timesInvalidatedAllThisFrame_ = 0; + replacementTimeThisFrame_ = 0.0; GLRenderManager *renderManager = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); if (!lowMemoryMode_ && renderManager->SawOutOfMemory()) { @@ -507,14 +509,12 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { scaleFactor = scaleFactor > 4 ? 4 : (scaleFactor > 2 ? 2 : 1); } - u64 cachekey = replacer_.Enabled() ? entry->CacheKey() : 0; int w = gstate.getTextureWidth(0); int h = gstate.getTextureHeight(0); - ReplacedTexture &replaced = replacer_.FindReplacement(cachekey, entry->fullhash, w, h); - if (replaced.GetSize(0, w, h)) { + ReplacedTexture &replaced = FindReplacement(entry, w, h); + if (replaced.Valid()) { // We're replacing, so we won't scale. scaleFactor = 1; - entry->status |= TexCacheEntry::STATUS_IS_SCALED; if (g_Config.bMipMap) { maxLevel = replaced.MaxLevel(); badMipSizes = false; @@ -665,7 +665,9 @@ void TextureCacheGLES::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture &r int bpp = replaced.Format(level) == ReplacedTextureFormat::F_8888 ? 4 : 2; decPitch = w * bpp; uint8_t *rearrange = (uint8_t *)AllocateAlignedMemory(decPitch * h, 16); + double replaceStart = time_now_d(); replaced.Load(level, rearrange, decPitch); + replacementTimeThisFrame_ += time_now_d() - replaceStart; pixelData = rearrange; dstFmt = ToDataFormat(replaced.Format(level)); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 7c02d5523b..a88f40f824 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -2265,9 +2265,10 @@ void GPUCommon::Execute_ImmVertexAlphaPrim(u32 op, u32 diff) { v.x = ((gstate.imm_vscx & 0xFFFFFF) - offsetX) / 16.0f; v.y = ((gstate.imm_vscy & 0xFFFFFF) - offsetY) / 16.0f; v.z = gstate.imm_vscz & 0xFFFF; + v.pos_w = 1.0f; v.u = getFloat24(gstate.imm_vtcs); v.v = getFloat24(gstate.imm_vtct); - v.w = getFloat24(gstate.imm_vtcq); + v.uv_w = getFloat24(gstate.imm_vtcq); v.color0_32 = (gstate.imm_cv & 0xFFFFFF) | (gstate.imm_ap << 24); v.fog = 0.0f; // we have no information about the scale here v.color1_32 = gstate.imm_scv & 0xFFFFFF; diff --git a/GPU/GPUCommon.h b/GPU/GPUCommon.h index b58f3cafd7..75bea0bd7a 100644 --- a/GPU/GPUCommon.h +++ b/GPU/GPUCommon.h @@ -43,16 +43,17 @@ enum { struct TransformedVertex { union { struct { - float x, y, z, fog; // in case of morph, preblend during decode + float x, y, z, pos_w; // in case of morph, preblend during decode }; float pos[4]; }; union { struct { - float u; float v; float w; // scaled by uscale, vscale, if there + float u; float v; float uv_w; // scaled by uscale, vscale, if there }; float uv[3]; }; + float fog; union { u8 color0[4]; // prelit u32 color0_32; @@ -265,6 +266,10 @@ protected: void DeviceLost() override; void DeviceRestore() override; + inline bool IsTrianglePrim(GEPrimitiveType prim) const { + return prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP; + } + void SetDrawType(DrawType type, GEPrimitiveType prim) { if (type != lastDraw_) { // We always flush when drawing splines/beziers so no need to do so here @@ -273,7 +278,7 @@ protected: } // Prim == RECTANGLES can cause CanUseHardwareTransform to flip, so we need to dirty. // Also, culling may be affected so dirty the raster state. - if ((prim == GE_PRIM_RECTANGLES) != (lastPrim_ == GE_PRIM_RECTANGLES)) { + if (IsTrianglePrim(prim) != IsTrianglePrim(lastPrim_)) { Flush(); gstate_c.Dirty(DIRTY_RASTER_STATE | DIRTY_VERTEXSHADER_STATE); lastPrim_ = prim; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 5b11b37b73..e91be6d1ab 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -471,7 +471,6 @@ enum { GPU_SUPPORTS_BLEND_MINMAX = FLAG_BIT(4), GPU_SUPPORTS_LOGIC_OP = FLAG_BIT(5), GPU_USE_DEPTH_RANGE_HACK = FLAG_BIT(6), - GPU_SUPPORTS_WIDE_LINES = FLAG_BIT(7), GPU_SUPPORTS_ANISOTROPY = FLAG_BIT(8), GPU_USE_CLEAR_RAM_HACK = FLAG_BIT(9), GPU_SUPPORTS_INSTANCE_RENDERING = FLAG_BIT(10), @@ -482,7 +481,7 @@ enum { GPU_SUPPORTS_32BIT_INT_FSHADER = FLAG_BIT(15), GPU_SUPPORTS_DEPTH_TEXTURE = FLAG_BIT(16), GPU_SUPPORTS_ACCURATE_DEPTH = FLAG_BIT(17), - // Free bit: 18, + // Free bit: 18 GPU_SUPPORTS_COPY_IMAGE = FLAG_BIT(19), GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH = FLAG_BIT(20), GPU_SCALE_DEPTH_FROM_24BIT_TO_16BIT = FLAG_BIT(21), @@ -492,8 +491,8 @@ enum { GPU_SUPPORTS_FRAMEBUFFER_BLIT = FLAG_BIT(26), GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH = FLAG_BIT(27), GPU_SUPPORTS_TEXTURE_NPOT = FLAG_BIT(28), - GPU_NEEDS_Z_EQUAL_W_HACK = FLAG_BIT(29), - // Free bit: 30 + GPU_SUPPORTS_CLIP_DISTANCE = FLAG_BIT(29), + GPU_SUPPORTS_CULL_DISTANCE = FLAG_BIT(30), GPU_PREFER_REVERSE_COLOR_ORDER = FLAG_BIT(31), }; diff --git a/GPU/Math3D.h b/GPU/Math3D.h index 62b017d15d..b8e26f58b3 100644 --- a/GPU/Math3D.h +++ b/GPU/Math3D.h @@ -30,6 +30,14 @@ #endif #endif +#if PPSSPP_ARCH(ARM_NEON) +#if defined(_MSC_VER) && PPSSPP_ARCH(ARM64) +#include +#else +#include +#endif +#endif + namespace Math3D { // Helper for Vec classes to clamp values. @@ -829,30 +837,83 @@ typedef Math3D::Vec3 Vec3f; typedef Math3D::Vec3Packed Vec3Packedf; typedef Math3D::Vec4 Vec4f; +#if defined(_M_SSE) +template +float vectorGetByIndex(__m128 v) { + // shuffle V so that the element that we want is moved to the bottom + return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(i, i, i, i))); +} +#endif + // v and vecOut must point to different memory. inline void Vec3ByMatrix43(float vecOut[3], const float v[3], const float m[12]) { +#if defined(_M_SSE) + __m128 col0 = _mm_loadu_ps(m); + __m128 col1 = _mm_loadu_ps(m + 3); + __m128 col2 = _mm_loadu_ps(m + 6); + __m128 col3 = _mm_loadu_ps(m + 9); + __m128 x = _mm_set1_ps(v[0]); + __m128 y = _mm_set1_ps(v[1]); + __m128 z = _mm_set1_ps(v[2]); + __m128 sum = _mm_add_ps( + _mm_add_ps(_mm_mul_ps(col0, x), _mm_mul_ps(col1, y)), + _mm_add_ps(_mm_mul_ps(col2, z), col3)); + // Not sure what the best way to store 3 elements is. Ideally, we should + // probably store all four. + vecOut[0] = _mm_cvtss_f32(sum); + vecOut[1] = vectorGetByIndex<1>(sum); + vecOut[2] = vectorGetByIndex<2>(sum); +#elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) + float32x4_t col0 = vld1q_f32(m); + float32x4_t col1 = vld1q_f32(m + 3); + float32x4_t col2 = vld1q_f32(m + 6); + float32x4_t col3 = vld1q_f32(m + 9); + float32x4_t vec = vld1q_f32(v); + float32x4_t sum = vaddq_f32( + vaddq_f32(vmulq_laneq_f32(col0, vec, 0), vmulq_laneq_f32(col1, vec, 1)), + vaddq_f32(vmulq_laneq_f32(col2, vec, 2), col3)); + vecOut[0] = vgetq_lane_f32(sum, 0); + vecOut[1] = vgetq_lane_f32(sum, 1); + vecOut[2] = vgetq_lane_f32(sum, 2); +#else vecOut[0] = v[0] * m[0] + v[1] * m[3] + v[2] * m[6] + m[9]; vecOut[1] = v[0] * m[1] + v[1] * m[4] + v[2] * m[7] + m[10]; vecOut[2] = v[0] * m[2] + v[1] * m[5] + v[2] * m[8] + m[11]; +#endif } inline void Vec3ByMatrix44(float vecOut[4], const float v[3], const float m[16]) { +#if defined(_M_SSE) + __m128 col0 = _mm_loadu_ps(m); + __m128 col1 = _mm_loadu_ps(m + 4); + __m128 col2 = _mm_loadu_ps(m + 8); + __m128 col3 = _mm_loadu_ps(m + 12); + __m128 x = _mm_set1_ps(v[0]); + __m128 y = _mm_set1_ps(v[1]); + __m128 z = _mm_set1_ps(v[2]); + __m128 sum = _mm_add_ps( + _mm_add_ps(_mm_mul_ps(col0, x), _mm_mul_ps(col1, y)), + _mm_add_ps(_mm_mul_ps(col2, z), col3)); + _mm_storeu_ps(vecOut, sum); +#elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) + float32x4_t col0 = vld1q_f32(m); + float32x4_t col1 = vld1q_f32(m + 4); + float32x4_t col2 = vld1q_f32(m + 8); + float32x4_t col3 = vld1q_f32(m + 12); + float32x4_t vec = vld1q_f32(v); + float32x4_t sum = vaddq_f32( + vaddq_f32(vmulq_laneq_f32(col0, vec, 0), vmulq_laneq_f32(col1, vec, 1)), + vaddq_f32(vmulq_laneq_f32(col2, vec, 2), col3)); + vst1q_f32(vecOut, sum); +#else vecOut[0] = v[0] * m[0] + v[1] * m[4] + v[2] * m[8] + m[12]; vecOut[1] = v[0] * m[1] + v[1] * m[5] + v[2] * m[9] + m[13]; vecOut[2] = v[0] * m[2] + v[1] * m[6] + v[2] * m[10] + m[14]; vecOut[3] = v[0] * m[3] + v[1] * m[7] + v[2] * m[11] + m[15]; +#endif } -inline void Vec4ByMatrix44(float vecOut[4], const float v[4], const float m[16]) -{ - vecOut[0] = v[0] * m[0] + v[1] * m[4] + v[2] * m[8] + v[3] * m[12]; - vecOut[1] = v[0] * m[1] + v[1] * m[5] + v[2] * m[9] + v[3] * m[13]; - vecOut[2] = v[0] * m[2] + v[1] * m[6] + v[2] * m[10] + v[3] * m[14]; - vecOut[3] = v[0] * m[3] + v[1] * m[7] + v[2] * m[11] + v[3] * m[15]; -} - - inline void Norm3ByMatrix43(float vecOut[3], const float v[3], const float m[12]) { vecOut[0] = v[0] * m[0] + v[1] * m[3] + v[2] * m[6]; diff --git a/GPU/Software/Clipper.cpp b/GPU/Software/Clipper.cpp index c0c46764a8..0fc8053e52 100644 --- a/GPU/Software/Clipper.cpp +++ b/GPU/Software/Clipper.cpp @@ -30,6 +30,7 @@ namespace Clipper { enum { SKIP_FLAG = -1, + CLIP_POS_Z_BIT = 0x10, CLIP_NEG_Z_BIT = 0x20, }; @@ -37,6 +38,7 @@ static inline int CalcClipMask(const ClipCoords& v) { int mask = 0; // This checks `x / w` compared to 1 or -1, skipping the division. + if (v.z > v.w) mask |= CLIP_POS_Z_BIT; if (v.z < -v.w) mask |= CLIP_NEG_Z_BIT; return mask; } diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index 1fbd61dbe1..ff08813ba4 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -844,7 +844,7 @@ Vec3 AlphaBlendingResult(const Vec4 &source, const Vec4 &dst) } template -inline void DrawSinglePixel(const DrawingCoords &p, u16 z, u8 fog, const Vec4 &color_in) { +inline void DrawSinglePixel(const DrawingCoords &p, int z, u8 fog, const Vec4 &color_in) { Vec4 prim_color = color_in.Clamp(0, 255); // Depth range test - applied in clear mode, if not through mode. if (!gstate.isModeThrough()) @@ -1287,7 +1287,7 @@ void DrawTriangleSlice( subp.x = p.x + (i & 1); subp.y = p.y + (i / 2); - DrawSinglePixel(subp, (u16)z[i], fog[i], prim_color[i]); + DrawSinglePixel(subp, z[i], fog[i], prim_color[i]); } } } @@ -1315,9 +1315,9 @@ void DrawTriangle(const VertexData& v0, const VertexData& v1, const VertexData& DrawingCoords scissorTL(gstate.getScissorX1(), gstate.getScissorY1(), 0); DrawingCoords scissorBR(gstate.getScissorX2(), gstate.getScissorY2(), 0); minX = std::max(minX, (int)TransformUnit::DrawingToScreen(scissorTL).x); - maxX = std::min(maxX, (int)TransformUnit::DrawingToScreen(scissorBR).x); + maxX = std::min(maxX, (int)TransformUnit::DrawingToScreen(scissorBR).x + 15); minY = std::max(minY, (int)TransformUnit::DrawingToScreen(scissorTL).y); - maxY = std::min(maxY, (int)TransformUnit::DrawingToScreen(scissorBR).y); + maxY = std::min(maxY, (int)TransformUnit::DrawingToScreen(scissorBR).y + 15); // 32 because we do two pixels at once, and we don't want overlap. int rangeY = (maxY - minY) / 32 + 1; @@ -1366,6 +1366,9 @@ void DrawPoint(const VertexData &v0) ScreenCoords scissorTL(TransformUnit::DrawingToScreen(DrawingCoords(gstate.getScissorX1(), gstate.getScissorY1(), 0))); ScreenCoords scissorBR(TransformUnit::DrawingToScreen(DrawingCoords(gstate.getScissorX2(), gstate.getScissorY2(), 0))); + // Allow drawing within a pixel's center. + scissorBR.x += 15; + scissorBR.y += 15; if (pos.x < scissorTL.x || pos.y < scissorTL.y || pos.x > scissorBR.x || pos.y > scissorBR.y) return; @@ -1579,12 +1582,21 @@ void DrawLine(const VertexData &v0, const VertexData &v1) else steps = abs(dx) / 16; - float xinc = (float)dx / steps; - float yinc = (float)dy / steps; - float zinc = (float)dz / steps; + // Avoid going too far since we typically don't start at the pixel center. + if (dx < 0 && dx >= -16) + dx++; + if (dy < 0 && dy >= -16) + dy++; + + double xinc = (double)dx / steps; + double yinc = (double)dy / steps; + double zinc = (double)dz / steps; ScreenCoords scissorTL(TransformUnit::DrawingToScreen(DrawingCoords(gstate.getScissorX1(), gstate.getScissorY1(), 0))); ScreenCoords scissorBR(TransformUnit::DrawingToScreen(DrawingCoords(gstate.getScissorX2(), gstate.getScissorY2(), 0))); + // Allow drawing within a pixel's center. + scissorBR.x += 15; + scissorBR.y += 15; bool clearMode = gstate.isModeClear(); int texbufw[8] = {0}; @@ -1608,9 +1620,9 @@ void DrawLine(const VertexData &v0, const VertexData &v1) Sampler::Funcs sampler = Sampler::GetFuncs(); - float x = a.x > b.x ? a.x - 1 : a.x; - float y = a.y > b.y ? a.y - 1 : a.y; - float z = a.z; + double x = a.x > b.x ? a.x - 1 : a.x; + double y = a.y > b.y ? a.y - 1 : a.y; + double z = a.z; const int steps1 = steps == 0 ? 1 : steps; for (int i = 0; i < steps; i++) { if (x >= scissorTL.x && y >= scissorTL.y && x <= scissorBR.x && y <= scissorBR.y) { @@ -1654,8 +1666,8 @@ void DrawLine(const VertexData &v0, const VertexData &v1) } // If inc is 0, force the delta to zero. - float ds = xinc == 0.0f ? 0.0f : (s1 - s) * 16.0f * (1.0f / xinc); - float dt = yinc == 0.0f ? 0.0f : (t1 - t) * 16.0f * (1.0f / yinc); + float ds = xinc == 0.0 ? 0.0f : (s1 - s) * 16.0f * (1.0f / xinc); + float dt = yinc == 0.0 ? 0.0f : (t1 - t) * 16.0f * (1.0f / yinc); int texLevel; int texLevelFrac; diff --git a/GPU/Software/RasterizerRectangle.cpp b/GPU/Software/RasterizerRectangle.cpp index 920f5c6077..5bccf690a5 100644 --- a/GPU/Software/RasterizerRectangle.cpp +++ b/GPU/Software/RasterizerRectangle.cpp @@ -223,6 +223,12 @@ void DrawSprite(const VertexData& v0, const VertexData& v1) { bool g_needsClearAfterDialog = false; +static inline bool NoClampOrWrap(const Vec2f &tc) { + if (tc.x < 0 || tc.y < 0) + return false; + return tc.x <= gstate.getTextureWidth(0) && tc.y <= gstate.getTextureHeight(0); +} + // Returns true if the normal path should be skipped. bool RectangleFastPath(const VertexData &v0, const VertexData &v1) { g_DarkStalkerStretch = DSStretch::Off; @@ -236,7 +242,8 @@ bool RectangleFastPath(const VertexData &v0, const VertexData &v1) { (ydiff == vdiff || ydiff == -vdiff); // Currently only works for TL/BR, which is the most common but not required. bool orient_check = xdiff >= 0 && ydiff >= 0; - bool state_check = !gstate.isModeClear(); // TODO: Add support for clear modes in Rasterizer::DrawSprite. + // We already have a fast path for clear in ClearRectangle. + bool state_check = !gstate.isModeClear() && NoClampOrWrap(v0.texturecoords) && NoClampOrWrap(v1.texturecoords); if ((coord_check || !gstate.isTextureMapEnabled()) && orient_check && state_check) { Rasterizer::DrawSprite(v0, v1); return true; diff --git a/GPU/Vulkan/DepalettizeShaderVulkan.cpp b/GPU/Vulkan/DepalettizeShaderVulkan.cpp index c404d1870a..e5d6cf2d0a 100644 --- a/GPU/Vulkan/DepalettizeShaderVulkan.cpp +++ b/GPU/Vulkan/DepalettizeShaderVulkan.cpp @@ -176,7 +176,7 @@ VulkanTexture *DepalShaderCacheVulkan::GetClutTexture(GEPaletteFormat clutFormat uint32_t pushOffset = push_->PushAligned(rawClut, 1024, 4, &pushBuffer); vktex->UploadMip(cmd, 0, texturePixels, 1, pushBuffer, pushOffset, texturePixels); - vktex->EndCreate(cmd); + vktex->EndCreate(cmd, false, VK_PIPELINE_STAGE_TRANSFER_BIT); DepalTextureVulkan *tex = new DepalTextureVulkan(); tex->texture = vktex; diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 628f133f98..6fdbdb0ac5 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -353,10 +353,6 @@ void DrawEngineVulkan::DecodeVertsToPushBuffer(VulkanPushBuffer *push, uint32_t DecodeVerts(dest); } -void DrawEngineVulkan::SetLineWidth(float lineWidth) { - pipelineManager_->SetLineWidth(lineWidth); -} - VkResult DrawEngineVulkan::RecreateDescriptorPool(FrameData &frame, int newSize) { // Reallocate this desc pool larger, and "wipe" the cache. We might lose a tiny bit of descriptor set reuse but // only for this frame. @@ -909,17 +905,27 @@ void DrawEngineVulkan::DoFlush() { params.allowClear = framebufferManager_->UseBufferedRendering(); params.allowSeparateAlphaClear = false; params.provokeFlatFirst = true; + params.flippedY = true; + params.usesHalfZ = true; // We need to update the viewport early because it's checked for flipping in SoftwareTransform. // We don't have a "DrawStateEarly" in vulkan, so... // TODO: Probably should eventually refactor this and feed the vp size into SoftwareTransform directly (Unknown's idea). if (gstate_c.IsDirty(DIRTY_VIEWPORTSCISSOR_STATE)) { - gstate_c.vpWidth = gstate.getViewportXScale() * 2.0f; - gstate_c.vpHeight = gstate.getViewportYScale() * 2.0f; + ViewportAndScissor vpAndScissor; + ConvertViewportAndScissor(framebufferManager_->UseBufferedRendering(), + framebufferManager_->GetRenderWidth(), framebufferManager_->GetRenderHeight(), + framebufferManager_->GetTargetBufferWidth(), framebufferManager_->GetTargetBufferHeight(), + vpAndScissor); } int maxIndex = indexGen.MaxIndex(); SoftwareTransform swTransform(params); + + const Lin::Vec3 trans(gstate_c.vpXOffset, gstate_c.vpYOffset, gstate_c.vpZOffset * 0.5f + 0.5f); + const Lin::Vec3 scale(gstate_c.vpWidthScale, gstate_c.vpHeightScale, gstate_c.vpDepthScale * 0.5f); + swTransform.SetProjMatrix(gstate.projMatrix, gstate_c.vpWidth < 0, gstate_c.vpHeight < 0, trans, scale); + swTransform.Decode(prim, dec_->VertexType(), dec_->GetDecVtxFmt(), maxIndex, &result); if (result.action == SW_NOT_READY) { swTransform.DetectOffsetTexture(maxIndex); diff --git a/GPU/Vulkan/DrawEngineVulkan.h b/GPU/Vulkan/DrawEngineVulkan.h index d72e852cc7..1507aaffce 100644 --- a/GPU/Vulkan/DrawEngineVulkan.h +++ b/GPU/Vulkan/DrawEngineVulkan.h @@ -186,7 +186,6 @@ public: return stats_; } - void SetLineWidth(float lineWidth); void SetDepalTexture(VkImageView depal) { if (boundDepal_ != depal) { boundDepal_ = depal; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 6b4c5e7d03..c8184315ee 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -96,9 +96,6 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw) UpdateVsyncInterval(true); textureCacheVulkan_->NotifyConfigChanged(); - if (vulkan_->GetDeviceFeatures().enabled.wideLines) { - drawEngine_.SetLineWidth(PSP_CoreParameter().renderWidth / 480.0f); - } // Load shader cache. std::string discID = g_paramSFO.GetDiscID(); @@ -185,10 +182,6 @@ GPU_Vulkan::~GPU_Vulkan() { void GPU_Vulkan::CheckGPUFeatures() { uint32_t features = 0; - if (!PSP_CoreParameter().compat.flags().DisableRangeCulling) { - features |= GPU_SUPPORTS_VS_RANGE_CULLING; - } - switch (vulkan_->GetPhysicalDeviceProperties().properties.vendorID) { case VULKAN_VENDOR_AMD: // Accurate depth is required on AMD (due to reverse-Z driver bug) so we ignore the compat flag to disable it on those. See #9545 @@ -206,10 +199,6 @@ void GPU_Vulkan::CheckGPUFeatures() { if (!PSP_CoreParameter().compat.flags().DisableAccurateDepth || driverTooOld) { features |= GPU_SUPPORTS_ACCURATE_DEPTH; } - // These GPUs (up to some certain hardware version?) has a bug where draws where gl_Position.w == .z - // corrupt the depth buffer. This is easily worked around by simply scaling Z down a tiny bit when this case - // is detected. See: https://github.com/hrydgard/ppsspp/issues/11937 - features |= GPU_NEEDS_Z_EQUAL_W_HACK; break; } default: @@ -238,21 +227,35 @@ void GPU_Vulkan::CheckGPUFeatures() { features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; } - if (vulkan_->GetDeviceFeatures().enabled.wideLines) { - features |= GPU_SUPPORTS_WIDE_LINES; - } - if (vulkan_->GetDeviceFeatures().enabled.depthClamp) { + auto &enabledFeatures = vulkan_->GetDeviceFeatures().enabled; + if (enabledFeatures.depthClamp) { features |= GPU_SUPPORTS_DEPTH_CLAMP; } - if (vulkan_->GetDeviceFeatures().enabled.dualSrcBlend) { + if (enabledFeatures.shaderClipDistance) { + features |= GPU_SUPPORTS_CLIP_DISTANCE; + } + if (enabledFeatures.shaderCullDistance) { + // Must support at least 8 if feature supported, so we're fine. + features |= GPU_SUPPORTS_CULL_DISTANCE; + } + if (!draw_->GetBugs().Has(Draw::Bugs::BROKEN_NAN_IN_CONDITIONAL)) { + // Ignore the compat setting if clip and cull are both enabled. + // When supported, we can do the depth side of range culling more correctly. + const bool supported = draw_->GetDeviceCaps().clipDistanceSupported && draw_->GetDeviceCaps().cullDistanceSupported; + const bool disabled = PSP_CoreParameter().compat.flags().DisableRangeCulling; + if (supported || !disabled) { + features |= GPU_SUPPORTS_VS_RANGE_CULLING; + } + } + if (enabledFeatures.dualSrcBlend) { if (!g_Config.bVendorBugChecksEnabled || !draw_->GetBugs().Has(Draw::Bugs::DUAL_SOURCE_BLENDING_BROKEN)) { features |= GPU_SUPPORTS_DUALSOURCE_BLEND; } } - if (vulkan_->GetDeviceFeatures().enabled.logicOp) { + if (enabledFeatures.logicOp) { features |= GPU_SUPPORTS_LOGIC_OP; } - if (vulkan_->GetDeviceFeatures().enabled.samplerAnisotropy) { + if (enabledFeatures.samplerAnisotropy) { features |= GPU_SUPPORTS_ANISOTROPY; } @@ -299,9 +302,6 @@ void GPU_Vulkan::BeginHostFrame() { framebufferManager_->Resized(); drawEngine_.Resized(); textureCacheVulkan_->NotifyConfigChanged(); - if (vulkan_->GetDeviceFeatures().enabled.wideLines) { - drawEngine_.SetLineWidth(PSP_CoreParameter().renderWidth / 480.0f); - } resized_ = false; } @@ -369,8 +369,6 @@ void GPU_Vulkan::BuildReportingInfo() { CHECK_BOOL_FEATURE(depthBiasClamp); CHECK_BOOL_FEATURE(fillModeNonSolid); CHECK_BOOL_FEATURE(depthBounds); - CHECK_BOOL_FEATURE(wideLines); - CHECK_BOOL_FEATURE(largePoints); CHECK_BOOL_FEATURE(alphaToOne); CHECK_BOOL_FEATURE(multiViewport); CHECK_BOOL_FEATURE(samplerAnisotropy); @@ -488,7 +486,7 @@ void GPU_Vulkan::InitDeviceObjects() { for (int i = 0; i < VulkanContext::MAX_INFLIGHT_FRAMES; i++) { _assert_(!frameData_[i].push_); VkBufferUsageFlags usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - frameData_[i].push_ = new VulkanPushBuffer(vulkan_, 64 * 1024, usage); + frameData_[i].push_ = new VulkanPushBuffer(vulkan_, 256 * 1024, usage); } VulkanRenderManager *rm = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); diff --git a/GPU/Vulkan/PipelineManagerVulkan.cpp b/GPU/Vulkan/PipelineManagerVulkan.cpp index 69ac5ee2cc..0c333d4bb4 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.cpp +++ b/GPU/Vulkan/PipelineManagerVulkan.cpp @@ -115,15 +115,18 @@ static int SetupVertexAttribs(VkVertexInputAttributeDescription attrs[], const D return count; } -static int SetupVertexAttribsPretransformed(VkVertexInputAttributeDescription attrs[], bool needsUV, bool needsColor1) { +static int SetupVertexAttribsPretransformed(VkVertexInputAttributeDescription attrs[], bool needsUV, bool needsColor1, bool needsFog) { int count = 0; - VertexAttribSetup(&attrs[count++], DEC_FLOAT_4, 0, PspAttributeLocation::POSITION); + VertexAttribSetup(&attrs[count++], DEC_FLOAT_4, offsetof(TransformedVertex, pos), PspAttributeLocation::POSITION); if (needsUV) { - VertexAttribSetup(&attrs[count++], DEC_FLOAT_3, 16, PspAttributeLocation::TEXCOORD); + VertexAttribSetup(&attrs[count++], DEC_FLOAT_3, offsetof(TransformedVertex, uv), PspAttributeLocation::TEXCOORD); } - VertexAttribSetup(&attrs[count++], DEC_U8_4, 28, PspAttributeLocation::COLOR0); + VertexAttribSetup(&attrs[count++], DEC_U8_4, offsetof(TransformedVertex, color0), PspAttributeLocation::COLOR0); if (needsColor1) { - VertexAttribSetup(&attrs[count++], DEC_U8_4, 32, PspAttributeLocation::COLOR1); + VertexAttribSetup(&attrs[count++], DEC_U8_4, offsetof(TransformedVertex, color1), PspAttributeLocation::COLOR1); + } + if (needsFog) { + VertexAttribSetup(&attrs[count++], DEC_FLOAT_1, offsetof(TransformedVertex, fog), PspAttributeLocation::NORMAL); } return count; } @@ -162,7 +165,7 @@ static std::string CutFromMain(std::string str) { static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pipelineCache, VkPipelineLayout layout, VkRenderPass renderPass, const VulkanPipelineRasterStateKey &key, - const DecVtxFormat *decFmt, VulkanVertexShader *vs, VulkanFragmentShader *fs, bool useHwTransform, float lineWidth) { + const DecVtxFormat *decFmt, VulkanVertexShader *vs, VulkanFragmentShader *fs, bool useHwTransform) { PROFILE_THIS_SCOPE("pipelinebuild"); bool useBlendConstant = false; @@ -230,7 +233,7 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip rs.depthBiasEnable = false; rs.cullMode = key.cullMode; rs.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - rs.lineWidth = lineWidth; + rs.lineWidth = 1.0f; rs.rasterizerDiscardEnable = false; rs.polygonMode = VK_POLYGON_MODE_FILL; rs.depthClampEnable = key.depthClampEnable; @@ -276,8 +279,9 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip } else { bool needsUV = vs->GetID().Bit(VS_BIT_DO_TEXTURE); bool needsColor1 = vs->GetID().Bit(VS_BIT_LMODE); - attributeCount = SetupVertexAttribsPretransformed(attrs, needsUV, needsColor1); - vertexStride = 36; + bool needsFog = vs->GetID().Bit(VS_BIT_ENABLE_FOG); + attributeCount = SetupVertexAttribsPretransformed(attrs, needsUV, needsColor1, needsFog); + vertexStride = (int)sizeof(TransformedVertex); } VkVertexInputBindingDescription ibd{}; @@ -377,7 +381,7 @@ VulkanPipeline *PipelineManagerVulkan::GetOrCreatePipeline(VkPipelineLayout layo VulkanPipeline *pipeline = CreateVulkanPipeline( vulkan_->GetDevice(), pipelineCache_, layout, renderPass, - rasterKey, decFmt, vs, fs, useHwTransform, lineWidth_); + rasterKey, decFmt, vs, fs, useHwTransform); pipelines_.Insert(key, pipeline); // Don't return placeholder null pipelines. @@ -569,22 +573,6 @@ std::string VulkanPipelineKey::GetDescription(DebugShaderStringType stringType) } } -void PipelineManagerVulkan::SetLineWidth(float lineWidth) { - if (lineWidth_ == lineWidth) - return; - lineWidth_ = lineWidth; - - // Wipe all line-drawing pipelines. - pipelines_.Iterate([&](const VulkanPipelineKey &key, VulkanPipeline *value) { - if (value->flags & PIPELINE_FLAG_USES_LINES) { - if (value->pipeline) - vulkan_->Delete().QueueDeletePipeline(value->pipeline); - delete value; - pipelines_.Remove(key); - } - }); -} - // For some reason this struct is only defined in the spec, not in the headers. struct VkPipelineCacheHeader { uint32_t headerSize; diff --git a/GPU/Vulkan/PipelineManagerVulkan.h b/GPU/Vulkan/PipelineManagerVulkan.h index 8646d5b8bf..929914643e 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.h +++ b/GPU/Vulkan/PipelineManagerVulkan.h @@ -72,8 +72,6 @@ public: void Clear(); - void SetLineWidth(float lw); - void DeviceLost(); void DeviceRestore(VulkanContext *vulkan); @@ -89,6 +87,5 @@ private: DenseHashMap pipelines_; VkPipelineCache pipelineCache_ = VK_NULL_HANDLE; VulkanContext *vulkan_; - float lineWidth_ = 1.0f; bool cancelCache_ = false; }; diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 0ae5f0305b..85ad4e674c 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -93,9 +93,9 @@ static const VkStencilOp stencilOps[] = { }; static const VkPrimitiveTopology primToVulkan[8] = { - VK_PRIMITIVE_TOPOLOGY_POINT_LIST, - VK_PRIMITIVE_TOPOLOGY_LINE_LIST, - VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // We convert points to triangles. + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // We convert lines to triangles. + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // We convert line strips to triangles. VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, @@ -233,14 +233,13 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag } if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { - bool wantCull = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); + bool wantCull = !gstate.isModeClear() && prim != GE_PRIM_RECTANGLES && prim > GE_PRIM_LINE_STRIP && gstate.isCullEnabled(); key.cullMode = wantCull ? (gstate.getCullMode() ? VK_CULL_MODE_FRONT_BIT : VK_CULL_MODE_BACK_BIT) : VK_CULL_MODE_NONE; if (gstate.isModeClear() || gstate.isModeThrough()) { // TODO: Might happen in clear mode if not through... key.depthClampEnable = false; } else { - // Set cull if (gstate.getDepthRangeMin() == 0 || gstate.getDepthRangeMax() == 65535) { // TODO: Still has a bug where we clamp to depth range if one is not the full range. // But the alternate is not clamping in either direction... diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 289856900b..6be4b6c46f 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -28,6 +28,7 @@ #include "Common/Data/Convert/ColorConv.h" #include "Common/StringUtils.h" +#include "Common/TimeUtil.h" #include "Core/Config.h" #include "Core/Host.h" #include "Core/MemMap.h" @@ -56,92 +57,13 @@ using namespace PPSSPP_VK; #define TEXCACHE_MAX_SLAB_SIZE (32 * 1024 * 1024) #define TEXCACHE_SLAB_PRESSURE 4 -const char *copyShader = R"( -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -// No idea what's optimal here... -#define WORKGROUP_SIZE 16 -layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1) in; - -layout(std430, binding = 1) buffer Buf1 { - uint data[]; -} buf1; - -layout(std430, binding = 2) buffer Buf2 { - uint data[]; -} buf2; - -layout(push_constant) uniform Params { - int width; - int height; - int scale; - int fmt; -} params; - -uint readColoru(uvec2 p) { - // Note that if the pixels are packed, we can do multiple stores - // and only launch this compute shader for every N pixels, - // by slicing the width in half and multiplying x by 2, for example. - if (params.fmt == 0) { - return buf1.data[p.y * params.width + p.x]; - } else { - uint offset = p.y * params.width + p.x; - uint data = buf1.data[offset / 2]; - if ((offset & 1) != 0) { - data = data >> 16; - } - if (params.fmt == 6) { - uint r = ((data << 3) & 0xF8) | ((data >> 2) & 0x07); - uint g = ((data >> 3) & 0xFC) | ((data >> 9) & 0x03); - uint b = ((data >> 8) & 0xF8) | ((data >> 13) & 0x07); - return 0xFF000000 | (b << 16) | (g << 8) | r; - } else if (params.fmt == 5) { - uint r = ((data << 3) & 0xF8) | ((data >> 2) & 0x07); - uint g = ((data >> 2) & 0xF8) | ((data >> 7) & 0x07); - uint b = ((data >> 7) & 0xF8) | ((data >> 12) & 0x07); - uint a = ((data >> 15) & 0x01) == 0 ? 0x00 : 0xFF; - return (a << 24) | (b << 16) | (g << 8) | r; - } else if (params.fmt == 4) { - uint r = (data & 0x0F) | ((data << 4) & 0xF0); - uint g = (data & 0xF0) | ((data >> 4) & 0x0F); - uint b = ((data >> 8) & 0x0F) | ((data >> 4) & 0xF0); - uint a = ((data >> 12) & 0x0F) | ((data >> 8) & 0xF0); - return (a << 24) | (b << 16) | (g << 8) | r; - } - } -} - -vec4 readColorf(uvec2 p) { - return unpackUnorm4x8(readColoru(p)); -} - -%s - -void main() { - uvec2 xy = gl_GlobalInvocationID.xy; - // Kill off any out-of-image threads to avoid stray writes. - // Should only happen on the tiniest mipmaps as PSP textures are power-of-2, - // and we use a 16x16 workgroup size. - if (xy.x >= params.width || xy.y >= params.height) - return; - - uvec2 origxy = xy / params.scale; - if (params.scale == 1) { - buf2.data[xy.y * params.width + xy.x] = readColoru(origxy); - } else { - buf2.data[xy.y * params.width + xy.x] = applyScalingu(origxy, xy); - } -} -)"; - const char *uploadShader = R"( #version 450 #extension GL_ARB_separate_shader_objects : enable -// No idea what's optimal here... -#define WORKGROUP_SIZE 16 -layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1) in; +// 8x8 is the most common compute shader workgroup size, and works great on all major +// hardware vendors. +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; uniform layout(binding = 0, rgba8) writeonly image2D img; @@ -152,67 +74,37 @@ layout(std430, binding = 1) buffer Buf { layout(push_constant) uniform Params { int width; int height; - int scale; - int fmt; } params; uint readColoru(uvec2 p) { - // Note that if the pixels are packed, we can do multiple stores - // and only launch this compute shader for every N pixels, - // by slicing the width in half and multiplying x by 2, for example. - if (params.fmt == 0) { - return buf.data[p.y * params.width + p.x]; - } else { - uint offset = p.y * params.width + p.x; - uint data = buf.data[offset / 2]; - if ((offset & 1) != 0) { - data = data >> 16; - } - if (params.fmt == 6) { - uint r = ((data << 3) & 0xF8) | ((data >> 2) & 0x07); - uint g = ((data >> 3) & 0xFC) | ((data >> 9) & 0x03); - uint b = ((data >> 8) & 0xF8) | ((data >> 13) & 0x07); - return 0xFF000000 | (b << 16) | (g << 8) | r; - } else if (params.fmt == 5) { - uint r = ((data << 3) & 0xF8) | ((data >> 2) & 0x07); - uint g = ((data >> 2) & 0xF8) | ((data >> 7) & 0x07); - uint b = ((data >> 7) & 0xF8) | ((data >> 12) & 0x07); - uint a = ((data >> 15) & 0x01) == 0 ? 0x00 : 0xFF; - return (a << 24) | (b << 16) | (g << 8) | r; - } else if (params.fmt == 4) { - uint r = (data & 0x0F) | ((data << 4) & 0xF0); - uint g = (data & 0xF0) | ((data >> 4) & 0x0F); - uint b = ((data >> 8) & 0x0F) | ((data >> 4) & 0xF0); - uint a = ((data >> 12) & 0x0F) | ((data >> 8) & 0xF0); - return (a << 24) | (b << 16) | (g << 8) | r; - } - } + return buf.data[p.y * params.width + p.x]; } vec4 readColorf(uvec2 p) { // Unpack the color (we could look it up in a CLUT here if we wanted...) - // It's a bit silly that we need to unpack to float and then have imageStore repack, - // but the alternative is to store to a buffer, and then launch a vkCmdCopyBufferToImage instead. + // The imageStore repack is free. return unpackUnorm4x8(readColoru(p)); } +void writeColorf(ivec2 p, vec4 c) { + imageStore(img, p, c); +} + %s +// Note that main runs once per INPUT pixel, unlike the old model. void main() { uvec2 xy = gl_GlobalInvocationID.xy; // Kill off any out-of-image threads to avoid stray writes. // Should only happen on the tiniest mipmaps as PSP textures are power-of-2, - // and we use a 16x16 workgroup size. + // and we use a 8x8 workgroup size. Probably not really necessary. if (xy.x >= params.width || xy.y >= params.height) return; - - uvec2 origxy = xy / params.scale; - if (params.scale == 1) { - imageStore(img, ivec2(xy.x, xy.y), readColorf(origxy)); - } else { - imageStore(img, ivec2(xy.x, xy.y), applyScalingf(origxy, xy)); - } + // applyScaling will write the upscaled pixels, using writeColorf above. + // It's expected to write a square of scale*scale pixels, at the location xy*scale. + applyScaling(xy); } + )"; SamplerCache::~SamplerCache() { @@ -330,8 +222,6 @@ void TextureCacheVulkan::DeviceLost() { if (uploadCS_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteShaderModule(uploadCS_); - if (copyCS_ != VK_NULL_HANDLE) - vulkan_->Delete().QueueDeleteShaderModule(copyCS_); computeShaderManager_.DeviceLost(); @@ -382,34 +272,30 @@ void TextureCacheVulkan::CompileScalingShader() { if (!g_Config.bTexHardwareScaling || g_Config.sTextureShaderName != textureShader_) { if (uploadCS_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteShaderModule(uploadCS_); - if (copyCS_ != VK_NULL_HANDLE) - vulkan_->Delete().QueueDeleteShaderModule(copyCS_); textureShader_.clear(); - maxScaleFactor_ = 255; - } else if (uploadCS_ || copyCS_) { + shaderScaleFactor_ = 0; // no texture scaling shader + } else if (uploadCS_) { // No need to recreate. return; } + if (!g_Config.bTexHardwareScaling) return; - ReloadAllPostShaderInfo(); + ReloadAllPostShaderInfo(draw_); const TextureShaderInfo *shaderInfo = GetTextureShaderInfo(g_Config.sTextureShaderName); if (!shaderInfo || shaderInfo->computeShaderFile.empty()) return; std::string shaderSource = ReadShaderSrc(shaderInfo->computeShaderFile); std::string fullUploadShader = StringFromFormat(uploadShader, shaderSource.c_str()); - std::string fullCopyShader = StringFromFormat(copyShader, shaderSource.c_str()); std::string error; uploadCS_ = CompileShaderModule(vulkan_, VK_SHADER_STAGE_COMPUTE_BIT, fullUploadShader.c_str(), &error); _dbg_assert_msg_(uploadCS_ != VK_NULL_HANDLE, "failed to compile upload shader"); - copyCS_ = CompileShaderModule(vulkan_, VK_SHADER_STAGE_COMPUTE_BIT, fullCopyShader.c_str(), &error); - _dbg_assert_msg_(copyCS_ != VK_NULL_HANDLE, "failed to compile copy shader"); textureShader_ = g_Config.sTextureShaderName; - maxScaleFactor_ = shaderInfo->maxScale; + shaderScaleFactor_ = shaderInfo->scaleFactor; } void TextureCacheVulkan::ReleaseTexture(TexCacheEntry *entry, bool delete_them) { @@ -442,6 +328,7 @@ void TextureCacheVulkan::StartFrame() { timesInvalidatedAllThisFrame_ = 0; texelsScaledThisFrame_ = 0; + replacementTimeThisFrame_ = 0.0; if (clearCacheNextFrame_) { Clear(true); @@ -767,34 +654,35 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { } int scaleFactor = standardScaleFactor_; - if (scaleFactor > maxScaleFactor_) - scaleFactor = maxScaleFactor_; + bool hardwareScaling = g_Config.bTexHardwareScaling && uploadCS_ != VK_NULL_HANDLE; + if (hardwareScaling) { + scaleFactor = shaderScaleFactor_; + dstFmt = VK_FORMAT_R8G8B8A8_UNORM; + } // Rachet down scale factor in low-memory mode. - if (lowMemoryMode_) { + // TODO: I think really we should just turn it off? + if (lowMemoryMode_ && !hardwareScaling) { // Keep it even, though, just in case of npot troubles. scaleFactor = scaleFactor > 4 ? 4 : (scaleFactor > 2 ? 2 : 1); } - u64 cachekey = replacer_.Enabled() ? entry->CacheKey() : 0; int w = gstate.getTextureWidth(0); int h = gstate.getTextureHeight(0); - ReplacedTexture &replaced = replacer_.FindReplacement(cachekey, entry->fullhash, w, h); - if (replaced.GetSize(0, w, h)) { + ReplacedTexture &replaced = FindReplacement(entry, w, h); + if (replaced.Valid()) { // We're replacing, so we won't scale. scaleFactor = 1; - entry->status |= TexCacheEntry::STATUS_IS_SCALED; if (g_Config.bMipMap) { maxLevel = replaced.MaxLevel(); badMipSizes = false; } } - bool hardwareScaling = g_Config.bTexHardwareScaling && (uploadCS_ != VK_NULL_HANDLE || copyCS_ != VK_NULL_HANDLE); - // Don't scale the PPGe texture. - if (entry->addr > 0x05000000 && entry->addr < PSP_GetKernelMemoryEnd()) + if (entry->addr > 0x05000000 && entry->addr < PSP_GetKernelMemoryEnd()) { scaleFactor = 1; + } if ((entry->status & TexCacheEntry::STATUS_CHANGE_FREQUENT) != 0 && scaleFactor != 1 && !hardwareScaling) { // Remember for later that we /wanted/ to scale this texture. entry->status |= TexCacheEntry::STATUS_TO_SCALE; @@ -818,13 +706,13 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { maxLevel = 0; } + // Any texture scaling is gonna move away from the original 16-bit format, if any. VkFormat actualFmt = scaleFactor > 1 ? VULKAN_8888_FORMAT : dstFmt; if (replaced.Valid()) { actualFmt = ToVulkanFormat(replaced.Format(0)); } bool computeUpload = false; - bool computeCopy = false; VkCommandBuffer cmdInit = (VkCommandBuffer)draw_->GetNativeObject(Draw::NativeObject::INIT_COMMANDBUFFER); { @@ -856,11 +744,8 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { // Compute experiment if (actualFmt == VULKAN_8888_FORMAT && scaleFactor > 1 && hardwareScaling) { - // Enable the experiment you want. if (uploadCS_ != VK_NULL_HANDLE) computeUpload = true; - else if (copyCS_ != VK_NULL_HANDLE) - computeCopy = true; } if (computeUpload) { @@ -903,7 +788,7 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { ReplacedTextureDecodeInfo replacedInfo; if (replacer_.Enabled() && !replaced.Valid()) { - replacedInfo.cachekey = cachekey; + replacedInfo.cachekey = entry->CacheKey(); replacedInfo.hash = entry->fullhash; replacedInfo.addr = entry->addr; replacedInfo.isVideo = IsVideo(entry->addr); @@ -918,43 +803,31 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { bool fakeMipmap = IsFakeMipmapChange() && level > 0; // Upload the texture data. for (int i = 0; i <= maxLevel; i++) { - int mipWidth = gstate.getTextureWidth(i) * scaleFactor; - int mipHeight = gstate.getTextureHeight(i) * scaleFactor; + int mipUnscaledWidth = gstate.getTextureWidth(i); + int mipUnscaledHeight = gstate.getTextureHeight(i); + + int mipWidth = mipUnscaledWidth * scaleFactor; + int mipHeight = mipUnscaledHeight * scaleFactor; if (replaced.Valid()) { replaced.GetSize(i, mipWidth, mipHeight); } - int srcBpp = dstFmt == VULKAN_8888_FORMAT ? 4 : 2; - int srcStride = mipWidth * srcBpp; - int srcSize = srcStride * mipHeight; int bpp = actualFmt == VULKAN_8888_FORMAT ? 4 : 2; int stride = (mipWidth * bpp + 15) & ~15; int size = stride * mipHeight; uint32_t bufferOffset; VkBuffer texBuf; - // nvidia returns 1 but that can't be healthy... let's align by 16 as a minimum. + // NVIDIA reports a min alignment of 1 but that can't be healthy... let's align by 16 as a minimum. int pushAlignment = std::max(16, (int)vulkan_->GetPhysicalDeviceProperties().properties.limits.optimalBufferCopyOffsetAlignment); void *data; bool dataScaled = true; if (replaced.Valid()) { // Directly load the replaced image. data = drawEngine_->GetPushBufferForTextureData()->PushAligned(size, &bufferOffset, &texBuf, pushAlignment); - replaced.Load(i, data, stride); + double replaceStart = time_now_d(); + replaced.Load(i, data, stride); // if it fails, it'll just be garbage data... OK for now. + replacementTimeThisFrame_ += time_now_d() - replaceStart; entry->vkTex->UploadMip(cmdInit, i, mipWidth, mipHeight, texBuf, bufferOffset, stride / bpp); } else { - auto dispatchCompute = [&](VkDescriptorSet descSet) { - struct Params { int x; int y; int s; int fmt; } params{ mipWidth, mipHeight, scaleFactor, 0 }; - if (dstFmt == VULKAN_4444_FORMAT) { - params.fmt = 4; - } else if (dstFmt == VULKAN_1555_FORMAT) { - params.fmt = 5; - } else if (dstFmt == VULKAN_565_FORMAT) { - params.fmt = 6; - } - vkCmdBindDescriptorSets(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipelineLayout(), 0, 1, &descSet, 0, nullptr); - vkCmdPushConstants(cmdInit, computeShaderManager_.GetPipelineLayout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(params), ¶ms); - vkCmdDispatch(cmdInit, (mipWidth + 15) / 16, (mipHeight + 15) / 16, 1); - }; - if (fakeMipmap) { data = drawEngine_->GetPushBufferForTextureData()->PushAligned(size, &bufferOffset, &texBuf, pushAlignment); LoadTextureLevel(*entry, (uint8_t *)data, stride, level, scaleFactor, dstFmt); @@ -962,44 +835,22 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { break; } else { if (computeUpload) { + int srcBpp = dstFmt == VULKAN_8888_FORMAT ? 4 : 2; + int srcStride = mipUnscaledWidth * srcBpp; + int srcSize = srcStride * mipUnscaledHeight; + data = drawEngine_->GetPushBufferForTextureData()->PushAligned(srcSize, &bufferOffset, &texBuf, pushAlignment); dataScaled = false; LoadTextureLevel(*entry, (uint8_t *)data, srcStride, i, 1, dstFmt); // This format can be used with storage images. VkImageView view = entry->vkTex->CreateViewForMip(i); VkDescriptorSet descSet = computeShaderManager_.GetDescriptorSet(view, texBuf, bufferOffset, srcSize); + struct Params { int x; int y; } params{ mipUnscaledWidth, mipUnscaledHeight }; vkCmdBindPipeline(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipeline(uploadCS_)); - dispatchCompute(descSet); + vkCmdBindDescriptorSets(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipelineLayout(), 0, 1, &descSet, 0, nullptr); + vkCmdPushConstants(cmdInit, computeShaderManager_.GetPipelineLayout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(params), ¶ms); + vkCmdDispatch(cmdInit, (mipUnscaledWidth + 7) / 8, (mipUnscaledHeight + 7) / 8, 1); vulkan_->Delete().QueueDeleteImageView(view); - } else if (computeCopy) { - data = drawEngine_->GetPushBufferForTextureData()->PushAligned(srcSize, &bufferOffset, &texBuf, pushAlignment); - dataScaled = false; - LoadTextureLevel(*entry, (uint8_t *)data, srcStride, i, 1, dstFmt); - // Simple test of using a "copy shader" before the upload. This one could unswizzle or whatever - // and will work for any texture format including 16-bit as long as the shader is written to pack it into int32 size bits - // which is the smallest possible write. - VkBuffer localBuf; - uint32_t localOffset; - uint32_t localSize = size; - localOffset = (uint32_t)drawEngine_->GetPushBufferLocal()->Allocate(localSize, &localBuf); - - VkDescriptorSet descSet = computeShaderManager_.GetDescriptorSet(VK_NULL_HANDLE, texBuf, bufferOffset, srcSize, localBuf, localOffset, localSize); - vkCmdBindPipeline(cmdInit, VK_PIPELINE_BIND_POINT_COMPUTE, computeShaderManager_.GetPipeline(copyCS_)); - dispatchCompute(descSet); - - // After the compute, before the copy, we need a memory barrier. - VkBufferMemoryBarrier barrier{ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER }; - barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - barrier.buffer = localBuf; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.offset = localOffset; - barrier.size = localSize; - vkCmdPipelineBarrier(cmdInit, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, 0, nullptr, 1, &barrier, 0, nullptr); - - entry->vkTex->UploadMip(cmdInit, i, mipWidth, mipHeight, localBuf, localOffset, stride / bpp); } else { data = drawEngine_->GetPushBufferForTextureData()->PushAligned(size, &bufferOffset, &texBuf, pushAlignment); LoadTextureLevel(*entry, (uint8_t *)data, stride, i, scaleFactor, dstFmt); @@ -1008,16 +859,22 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { } if (replacer_.Enabled()) { // When hardware texture scaling is enabled, this saves the original. - int w = dataScaled ? mipWidth : mipWidth / scaleFactor; - int h = dataScaled ? mipHeight : mipHeight / scaleFactor; + int w = dataScaled ? mipWidth : mipUnscaledWidth; + int h = dataScaled ? mipHeight : mipUnscaledHeight; replacer_.NotifyTextureDecoded(replacedInfo, data, stride, i, w, h); } } } + VkImageLayout layout = computeUpload ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + VkPipelineStageFlags prevStage = computeUpload ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : VK_PIPELINE_STAGE_TRANSFER_BIT; + // Generate any additional mipmap levels. - for (int level = maxLevel + 1; level <= maxLevelToGenerate; level++) { - entry->vkTex->GenerateMip(cmdInit, level, computeUpload ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + // This will transition the whole stack to GENERAL if it wasn't already. + if (maxLevel != maxLevelToGenerate) { + entry->vkTex->GenerateMips(cmdInit, maxLevel + 1, computeUpload); + layout = VK_IMAGE_LAYOUT_GENERAL; + prevStage = VK_PIPELINE_STAGE_TRANSFER_BIT; } if (maxLevel == 0) { @@ -1028,7 +885,7 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { if (replaced.Valid()) { entry->SetAlphaStatus(TexCacheEntry::TexStatus(replaced.AlphaStatus())); } - entry->vkTex->EndCreate(cmdInit, false, computeUpload ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + entry->vkTex->EndCreate(cmdInit, false, prevStage, layout); } } diff --git a/GPU/Vulkan/TextureCacheVulkan.h b/GPU/Vulkan/TextureCacheVulkan.h index 364f5e202d..da2cf9ee76 100644 --- a/GPU/Vulkan/TextureCacheVulkan.h +++ b/GPU/Vulkan/TextureCacheVulkan.h @@ -135,9 +135,8 @@ private: Vulkan2D *vulkan2D_; std::string textureShader_; - int maxScaleFactor_ = 255; + int shaderScaleFactor_ = 0; VkShaderModule uploadCS_ = VK_NULL_HANDLE; - VkShaderModule copyCS_ = VK_NULL_HANDLE; // Bound state to emulate an API similar to the others VkImageView imageView_ = VK_NULL_HANDLE; diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index aa905d46e6..8df0bac88c 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -309,7 +309,7 @@ VkPipeline Vulkan2D::GetPipeline(VkRenderPass rp, VkShaderModule vs, VkShaderMod VkPipelineInputAssemblyStateCreateInfo inputAssembly = { VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO }; inputAssembly.flags = 0; inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; - inputAssembly.primitiveRestartEnable = true; + inputAssembly.primitiveRestartEnable = false; VkVertexInputAttributeDescription attrs[2]; int attributeCount = 2; @@ -385,6 +385,7 @@ VkShaderModule CompileShaderModule(VulkanContext *vulkan, VkShaderStageFlagBits ERROR_LOG(G3D, "Shader source:\n%s", LineNumberString(code).c_str()); OutputDebugStringUTF8("Messages:\n"); OutputDebugStringUTF8(error->c_str()); + OutputDebugStringUTF8(LineNumberString(code).c_str()); return VK_NULL_HANDLE; } else { VkShaderModule module; diff --git a/MoltenVK/macOS/Frameworks/libMoltenVK.dylib b/MoltenVK/macOS/Frameworks/libMoltenVK.dylib deleted file mode 100755 index 438d894ec5..0000000000 Binary files a/MoltenVK/macOS/Frameworks/libMoltenVK.dylib and /dev/null differ diff --git a/Qt/QtMain.cpp b/Qt/QtMain.cpp index b642f74421..17d1b58de6 100644 --- a/Qt/QtMain.cpp +++ b/Qt/QtMain.cpp @@ -5,6 +5,7 @@ // Qt 4.7+ / 5.0+ implementation of the framework. // Currently supports: Android, Linux, Windows, Mac OSX +#include "ppsspp_config.h" #include #include #include @@ -41,6 +42,7 @@ #include "Common/Data/Text/I18n.h" #include "Common/Thread/ThreadUtil.h" #include "Common/Data/Encoding/Utf8.h" +#include "Common/StringUtils.h" #include "Core/Config.h" #include "Core/ConfigValues.h" #include "Core/HW/Camera.h" @@ -227,6 +229,8 @@ bool System_GetPropertyBool(SystemProperty prop) { #endif case SYSPROP_CAN_JIT: return true; + case SYSPROP_HAS_KEYBOARD: + return true; default: return false; } @@ -280,7 +284,7 @@ void Vibrate(int length_ms) { } void OpenDirectory(const char *path) { - // Unsupported + QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromUtf8(path))); } void LaunchBrowser(const char *url) diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index f2dd0410b4..1f56e0e765 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -625,7 +625,7 @@ void MainWindow::createMenus() QList() << 0 << 1); MenuTree* textureFilteringMenu = new MenuTree(this, gameSettingsMenu, QT_TR_NOOP("Te&xture filtering")); textureFilteringGroup = new MenuActionGroup(this, textureFilteringMenu, SLOT(textureFilteringGroup_triggered(QAction *)), - QStringList() << "&Auto" << "&Nearest" << "&Linear" << "Linear on &FMV", + QStringList() << "&Auto" << "&Nearest" << "&Linear" << "Auto Max &Quality", QList() << 1 << 2 << 3 << 4); MenuTree* screenScalingFilterMenu = new MenuTree(this, gameSettingsMenu, QT_TR_NOOP("Scr&een scaling filter")); screenScalingFilterGroup = new MenuActionGroup(this, screenScalingFilterMenu, SLOT(screenScalingFilterGroup_triggered(QAction *)), @@ -634,8 +634,8 @@ void MainWindow::createMenus() MenuTree* textureScalingMenu = new MenuTree(this, gameSettingsMenu, QT_TR_NOOP("&Texture scaling")); textureScalingLevelGroup = new MenuActionGroup(this, textureScalingMenu, SLOT(textureScalingLevelGroup_triggered(QAction *)), - QStringList() << "&Off" << "&Auto" << "&2x" << "&3x" << "&4x" << "&5x", - QList() << 1 << 2 << 3 << 4 << 5 << 6); + QStringList() << "&Off" << "&2x" << "&3x" << "&4x" << "&5x", + QList() << 1 << 2 << 3 << 4 << 5); textureScalingMenu->addSeparator(); textureScalingTypeGroup = new MenuActionGroup(this, textureScalingMenu, SLOT(textureScalingTypeGroup_triggered(QAction *)), QStringList() << "&xBRZ" << "&Hybrid" << "&Bicubic" << "H&ybrid + bicubic", diff --git a/Qt/mainwindow.h b/Qt/mainwindow.h index 26ad5b521c..99c9fc3ad2 100644 --- a/Qt/mainwindow.h +++ b/Qt/mainwindow.h @@ -24,7 +24,6 @@ class MenuTree; enum { FB_NON_BUFFERED_MODE = 0, FB_BUFFERED_MODE = 1, - TEXSCALING_AUTO = 0, }; // hacky, should probably use qt signals or something, but whatever.. @@ -127,9 +126,6 @@ private slots: void renderingResolutionGroup_triggered(QAction *action) { g_Config.iInternalResolution = action->data().toInt(); NativeMessageReceived("gpu_resized", ""); - if (g_Config.iTexScalingLevel == TEXSCALING_AUTO) { - NativeMessageReceived("gpu_clearCache", ""); - } } void windowGroup_triggered(QAction *action) { SetWindowScale(action->data().toInt()); } diff --git a/README.md b/README.md index 3497f2d6ee..2fe3ffa4a2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -PPSSPP - a fast and portable PSP emulator +PPSSPP - a fast and portable PSP emulator ========================================= Created by Henrik Rydgård @@ -30,6 +30,88 @@ If you want to download regularly updated builds for Android, Windows x86 and x6 For game compatibility, see [community compatibility feedback](https://report.ppsspp.org/games). +What's new in 1.12.3 +==================== +* Fix background music speed. A couple translation fixes. + +What's new in 1.12.2 +==================== +* Fix joystick detection bug on Android. + +What's new in 1.12.1 +==================== +* Bug fixes (control mapping fix, popup menus in the Windows debugger, a few crashfixes) + +What's new in 1.12 +================== + +Platform support: +* Add support for Android 12 Scoped Storage restrictions ([#11997]) +* iOS: Fix multitouch tracking ([#5099]) +* Android: Fix screenshot orientation on Vulkan ([#14053]) +* Linux: Improve support for system FFmpeg 3.1+ ([#14176], [#14188], [#14199]) +* libretro: Always enable function hooks ([#14145]) +* AMD: Enable Vulkan rendering on a thread ([#13864]) +* Add iOS version detection, turn off JIT on bootup if >= 14.3. ([#14201]) +* iOS: Try a different JIT detection method, thanks Halo-Michael ([#14241]) +* Windows: Restore window size correctly ([#14317]) + +Game fixes: +* Fix NBA Live 08 loading ([#8288]) +* Display Open Season title screen correctly ([#13252]) +* Fix Metal Gear Solid Peace Walker Chinese Patched blue screen ([#14127]) +* Load Ape Academy 2 correctly ([#14271]) +* Many more... + +Graphics and Sound: +* Add new texture filtering mode "Auto Max Quality" ([#14789]) +* Fix Princess Maker 5 Portable half screen in Vulkan ([#13741]) +* Fix Pro Yakyu Spirits 2010 (NPJH50234): Rendering errors with hardware transform off ([#14167]) +* Support texture replacement filtering overrides ([#14230]) +* Fix Yarudora Portable: Double Cast's FMVs artifacting ([#13759]) +* Fix Sims 2 Castaway/Pets EA Logo glitched out ([#13146]) +* Fix bad size & position on Japanese & Numbers & Alphabets ([#14209]) +* Implement basic depth texturing for OpenGL ([#14042]) +* Google Cardboard fixes ([#14966], [#14768]) +* Correct mini-map update in Z.H.P. ([#14069]) +* Fix crash in vertex jit on ARM32 ([#14879]) +* Add a setting for reverb volume ([#14711]) +* Option to switch to new devices or not, on Windows. + +UI: +* Add a setting for choosing background animation in PPSSPP's menus ([#14313], [#14818], [#14810], [#14347]) +* Add CRC calculation on game info screen and feedback screen ([#14000], [#14041]) +* Add a Storage tab to System Information with some path info ([#14224], [#14238]) +* Track and show memory allocation / usage information in debugger ([#14056]) +* Allow searching within the savedata manager ([#14237]) +* Enable postshaders to access previous frame ([#14528]) +* Add missing japanese keyboard symbol ([#14548]) +* Add Reset button on crash screen, allow load state and related ([#14708]) +* Implement savestate load and save undo ([#14676], [#14679], [#14697]) +* A lot of minor debugger improvements + +Controls: +* New analog stick calibration menu ([#14596]) +* Improved combo button and moved settings to Customize Touch Control -> Customize -> Custom button ([#13869]) +* Improved tilt control, allow to change axis ([#12530]) +* Add a visual means of control mapping ([#14769]) +* Add basic motion gesture support ([#13107]) +* Fix touch control DPAD not getting input when dragged over, and make touch analog drag not activate other buttons ([#14843]) +* Allow adjusting touch control analog stick head size ([#14480]) + +Adhoc/Network: +* Fix multiplayer issue on MGS:PW due to detecting an incorrect source port on incoming data ([#14140]) +* Always enable TCPNoDelay to improve response time ([#14235]) +* Fix Teenage Mutant Ninja Turtles multiplayer ([#14284]) +* Fix FlatOut Head On multiplayer ([#14290]) +* Prevent flooding Adhoc Server with connection attempts ([#14335]) +* Fix crashing issue when leaving a multiplayer game room (ie. GTA Vice City Stories) ([#14342]) +* Fix stuck issue when scanning AP to Recruit on MGS:PW ([#14345]) +* Fix possible crash issue on blocking socket implementation (ie. Kao Challengers) ([#14466]) +* Create GameMode's socket after Master and all Replicas have been created (ie. Fading Shadows) ([#14492]) +* Reduce HLE delays due to multiplayer performance regressions (ie. Ys vs. Sora no Kiseki) ([#14513]) +* Fix socket error 10014 on Windows when hosting a game of Vulcanus Seek and Destroy ([#14849]) + What's new in 1.11.3 ==================== * Fix for graphics glitches in the on-screen keyboard @@ -110,7 +192,7 @@ What's new in 1.10.0 * Add PPSSPP-specific CWCheat ([#12816], [#12912]) * Reintroduce Cardboard VR, allow more resolutions ([#12449], [#8714]) * Fix some crashes ([#12908], [#12876]) -* Ghost in the Shell graphics fixed (JIT inaccuracy with inf*0) ([#12519]) +* Ghost in the Shell graphics fixed (JIT inaccuracy with inf * 0) ([#12519]) * Mac build now supports Vulkan on top of MoltenVK ([#12583]) * Raspberry Pi 4 EGL crash fixed ([#12474]) * VSync now supported on all backends, frame duplication option added for 30 Hz games ([#12659], [#12602]) @@ -134,98 +216,20 @@ What's new in 1.10.0 * Some minor kernel module support ([#13028], [#12225], [#13026], [#13004], [#13038], [#13023]) * Fixed fullscreen toggling with Vulkan in SDL builds ([#11974]) -What's new in 1.9.0/1.9.3 -------------------------- -* Sizing/touch fixes on Android -* Fixes for some crashes -What's new in 1.9.0/1.9.2 -------------------------- -* Flicker fixed in God of War that appeared with newer drivers for Mali GPUs ([#12224]) -* Improve performance of God of War on Vulkan ([#12242]), implement built-in GPU profiler ([#12262], [#12266]) -* Vertex range culling fixed on ARM Mali ([#12227]) -* Started to improve VFPU precision, resulting so far in a fix for the long standing Tekken 6 leg shaking problem ([#12217]) -* Fixed a VFPU precision snafu on ARM64, fixing disappearing officers in Warriors Orochi ([#11299]) and some problems in Tomb Raider ([#11179]). -* Vulkan is the default again on Android versions newer than Pie -* Fix various homebrew store issues -* GPU pause signal handling fixed, fixing some hangs in Bleach and Armored Core games ([#12160]) -* Audio sample rate conversion handling fixes ([#12147]) -* Some Vulkan optimizations (pre-rotation ([#12216]), perf fix in Metal Gear Acid, etc) -* Multiple fixes for the UWP build ([#12036], others) -* MP3 playback fixes ([#12005]) -* Audio in Motorstorm: Arctic Edge fixed by returning errors correctly ([#12121]) -* Audio glitches in Final Fantasy Tactics fixed ([#9956]) -* Camera display in Invizimals fixed ([#12278], [#8521]) -* Added hotkeys for texture dump and replace ([#11938]) -* Added Visual Studio 2019 support. Windows XP is no longer supported ([#11995], others) -* Fixes for video capture ([#12069]) -* Added a separate sound volume for alternative speed ([#12124]) -* Improved mouse control (Windows only) ([#12173], [#12176]) -* Support for installing texture packs and ISOs from zips ([#12175]) -* Right analog support for touch controls (only used by patched games and some HD remasters) ([#12182]) -* Android: Fix OpenSL initialization, possibly helps audio crackle a little. ([#12333]). -* Fix graphics on Amazon Fire TV Stick 4K -* Fixed strange vehicle behavior in MGS:PW (somehow) ([#12342]) +Looking for [older news](history.md)? -What's new in 1.8.0 -------------------- -* Avoid crash when starting PPSSPP due to bad AMD Vulkan drivers ([#11802]) -* PowerVR Vulkan display corruption fixed ([#11744], [#11747]) -* Naruto Shippuden 3 hang fixed ([#11780]) -* Fixes to various lighting bugs ([#11567], [#11574], [#11577]) -* Fix control issue in Sonic Rivals and Rock Band ([#11878], [#11798], [#11879]) -* Significant performance improvement in Earth Defense Force 2 ([#11172]) -* Fix "real clock sync" setting (helps with latency for music games - [#11813]) -* More speed in FF4 effects and other generated curves ([#11425]) -* Support for resizing Vulkan on Linux ([#11451]) -* Improved support for GLES on Linux/IoT ([#11507], [#11537], [#11541], [#11632], [#11746], [#11806], [#11845]) -* Percentage based frameskipping ([#11523]) -* DXT accuracy improved, fixing thick white line in Gran Turismo sky ([#11530]) -* Fix Motorstorm freeze on non-Windows ([#11618]) -* Faster block transfer in some games like Digimon Adventures ([#11531], [#11553], [#11776]) -* Blending optimizations and improvements ([#11543], [#11620]) -* Improve D3D11 rendering issues ([#11584]) -* Change default graphics backend to D3D11 or OpenGL ([#11621], [#11658]) -* Remove some outdated settings ([#11665], [#11666], [#11667]) -* Fix remote disc streaming with ipv6 ([#11689], [#11700]) -* Vulkan: Workarounds for some driver bugs for 5xx series Qualcomm GPUs ([#11691], [#11694]) -* Fix some Qt port issues with recent performance improvements ([#11720], [#11807], [#11808]) -* UWP Xbox One: fix X/Back button confusion ([#11740]) -* Fix Formula 1 2006 timing issue ([#11767]) -* Fixes and workarounds for some vertex range culling bugs that broke a few games ([#11785], [#11859]), and disable it on older GPUs ([#11712], [#11773], [#11787]) -* Android: Allow putting PSP storage on custom paths like SD cards ([#11812]) -* Corrected vocp instruction, fixing models in Artdink games ([#11822], [#11835]) -* Bundle SDL in binary for macOS builds ([#11831]) -* Prevent keeping games open on Windows ([#11842]) -What's new in 1.7.3/1.7.4/1.7.5 -------------------- -* Fixes for a couple of common crashes -* Reverted immersive mode change temporarily to see if it helps misaligned buttons -* Change default adhoc server address +Adhoc support +------------- +Not fully functional, but some games work. Check the [Ad-Hoc section of the forum](http://forums.ppsspp.org/forumdisplay.php?fid=34) for help. -What's new in 1.7.2 -------------------- -* Update text of "Buy PPSSPP Gold" button - -What's new in 1.7.1 -------------------- -* Minor crashfixes, lang updates -* Save bug fixed ([#11508]) - -What's new in 1.7.0 -------------------- -* Fix for insta-crash on Galaxy Note 9, some Xiaomi devices, and the new nVidia Shield ([#11441]) -* Vertex range culling on most platforms, fixes DTM: Race Driver and similar ([#11393]) -* Major speed boost in some Gundam and Earth Defense Force games ([#10973]) -* Fix for issues with post processing shaders in GL 3+ ([#11182]) -* Fixes to sound output switching on Windows (WASAPI) ([#11438]) -* Detects DirectInput devices when running ([#11461]) -* Simple Discord integration ([#11307]) -* New debugging APIs ([#10909]) -* Task switching made a lot more robust (fixes GPD XD problems) ([#11447]) -* Texture decoding optimizations ([#11350]) -* Tons and tons of miscellaneous bugfixes and compatibility fixes +Credit goes to: + - ANR2ME + - Igor Calabria + - [coldbird's code](https://code.google.com/archive/p/aemu/) + - Kyhel + - And more, of course. [comment]: # (LINK_LIST_BEGIN_HERE) @@ -296,98 +300,6 @@ What's new in 1.7.0 [#13038]: https://github.com/hrydgard/ppsspp/issues/13038 "Add sysclib_strncmp,sysclib_memmove" [#13023]: https://github.com/hrydgard/ppsspp/issues/13023 "Add sysclib_strstr" [#11974]: https://github.com/hrydgard/ppsspp/issues/11974 "[Linux] [Vulkan] Toggle fullscreen doesn't update display properly" -[#12224]: https://github.com/hrydgard/ppsspp/issues/12224 "Vulkan: Add missing barrier between multiple passes to the same target." -[#12242]: https://github.com/hrydgard/ppsspp/issues/12242 "Vulkan: Automatically merge render passes to the same target when possible" -[#12262]: https://github.com/hrydgard/ppsspp/issues/12262 "Vulkan: Implement basic integrated GPU profiling." -[#12266]: https://github.com/hrydgard/ppsspp/issues/12266 "Vulkan: Further improvements to GPU profiling" -[#12227]: https://github.com/hrydgard/ppsspp/issues/12227 "Vulkan/GL: Set all four coordinates to NaN instead of just W." -[#12217]: https://github.com/hrydgard/ppsspp/issues/12217 "Merge vfpu-dot changes and add compat flag for Tekken" -[#11299]: https://github.com/hrydgard/ppsspp/issues/11299 "Warrior Orochi Enemy Missing" -[#11179]: https://github.com/hrydgard/ppsspp/issues/11179 "Tomb Raider Anniversary jump to horizontal bar issue" -[#12160]: https://github.com/hrydgard/ppsspp/issues/12160 "GPU: Forget pause signal on new list" -[#12147]: https://github.com/hrydgard/ppsspp/issues/12147 "Handle audio SRC mixing more correctly" -[#12216]: https://github.com/hrydgard/ppsspp/issues/12216 "Cant get Invizimals to work on PPSSPP (Video source not rendered)" -[#12036]: https://github.com/hrydgard/ppsspp/issues/12036 "Several UWP fixes" -[#12005]: https://github.com/hrydgard/ppsspp/issues/12005 "Correct mp3 looping, frame num, and sum decoded" -[#12121]: https://github.com/hrydgard/ppsspp/issues/12121 "Return errors on Audio2 release when channel busy" -[#9956]: https://github.com/hrydgard/ppsspp/issues/9956 "Audio crackle/distortion in Final Fantasy Tactics" -[#12278]: https://github.com/hrydgard/ppsspp/issues/12278 "UsbCam/jpeg: Cleanups, notify framebuffer manager" -[#8521]: https://github.com/hrydgard/ppsspp/issues/8521 "PSP Camera Support (Android)" -[#11938]: https://github.com/hrydgard/ppsspp/issues/11938 "Add texture dump/replace hotkeys." -[#11995]: https://github.com/hrydgard/ppsspp/issues/11995 "Fix VS2019 builds and remove _xp dependency" -[#12069]: https://github.com/hrydgard/ppsspp/issues/12069 "Fix avi dump feature" -[#12124]: https://github.com/hrydgard/ppsspp/issues/12124 "Audio: Add volume for alternate speed" -[#12173]: https://github.com/hrydgard/ppsspp/issues/12173 "Ignore mapped mouse input for UI" -[#12176]: https://github.com/hrydgard/ppsspp/issues/12176 "Mouse improvements" -[#12175]: https://github.com/hrydgard/ppsspp/issues/12175 "UI: Allow installing texture packs from zips" -[#12182]: https://github.com/hrydgard/ppsspp/issues/12182 "Add right analog for touch controls." -[#12333]: https://github.com/hrydgard/ppsspp/issues/12333 "Android OpenSL initial queue fix" -[#12342]: https://github.com/hrydgard/ppsspp/issues/12342 "Serious MGS Peace Walker bug fixed post-1.8.0" -[#11802]: https://github.com/hrydgard/ppsspp/issues/11802 "Windows: Detect Vulkan in separate process" -[#11744]: https://github.com/hrydgard/ppsspp/issues/11744 "VulkanDeviceAlloc: Memorytype per slab" -[#11747]: https://github.com/hrydgard/ppsspp/issues/11747 "Vk validation fixes, plus PowerVR swapchain hack" -[#11780]: https://github.com/hrydgard/ppsspp/issues/11780 "Naruto Shippuden Ultimate Ninja 3: Probably a better fix for the video hang issue." -[#11567]: https://github.com/hrydgard/ppsspp/issues/11567 "Correct shade mapping when light pos is all zeros" -[#11574]: https://github.com/hrydgard/ppsspp/issues/11574 "Correct various light param issues based on tests" -[#11577]: https://github.com/hrydgard/ppsspp/issues/11577 "Correct provoking vertex for lighting when flat shading" -[#11878]: https://github.com/hrydgard/ppsspp/issues/11878 "Sonic Rivals controls semi-broken" -[#11798]: https://github.com/hrydgard/ppsspp/issues/11798 "User report: Long notes in Rock Band Unplugged are not registered correctly" -[#11879]: https://github.com/hrydgard/ppsspp/issues/11879 "Fix apparent bug in #11094, fixes #11878 and likely #11798" -[#11172]: https://github.com/hrydgard/ppsspp/issues/11172 "handle cullface, help to #10597" -[#11813]: https://github.com/hrydgard/ppsspp/issues/11813 "Core: Fix lag sync on game start / after pause" -[#11425]: https://github.com/hrydgard/ppsspp/issues/11425 "[Refactoring] Improve spline/bezier." -[#11451]: https://github.com/hrydgard/ppsspp/issues/11451 "SDL/Vulkan window resize improvements" -[#11507]: https://github.com/hrydgard/ppsspp/issues/11507 "Improve support of Qt + USING_GLES2" -[#11537]: https://github.com/hrydgard/ppsspp/issues/11537 "CMake: Allow disabling Wayland support with USE_WAYLAND_WSI" -[#11541]: https://github.com/hrydgard/ppsspp/issues/11541 "CMake: Fix linking X11 when using EGL and not fbdev" -[#11632]: https://github.com/hrydgard/ppsspp/issues/11632 "SDL: Allow toggling fullscreen for GLES2 on desktops." -[#11746]: https://github.com/hrydgard/ppsspp/issues/11746 "CMakeLists: fix EGL detection for ARM devices" -[#11806]: https://github.com/hrydgard/ppsspp/issues/11806 "SDL: Force fullscreen desktop for USING_FBDEV" -[#11845]: https://github.com/hrydgard/ppsspp/issues/11845 "EGL: Avoid HDR mode. Uses unknownbrackets' changes from #11839." -[#11523]: https://github.com/hrydgard/ppsspp/issues/11523 "Add frameskip setting" -[#11530]: https://github.com/hrydgard/ppsspp/issues/11530 "Make DXT alpha and color calculation more accurate" -[#11618]: https://github.com/hrydgard/ppsspp/issues/11618 "Io: Ensure sign extension for error codes" -[#11531]: https://github.com/hrydgard/ppsspp/issues/11531 "WIP: Virtual readbacks" -[#11553]: https://github.com/hrydgard/ppsspp/issues/11553 "Remove constraint that virtual framebuffers have to represent VRAM." -[#11776]: https://github.com/hrydgard/ppsspp/issues/11776 "Only gate really expensive block transfers behind the setting." -[#11543]: https://github.com/hrydgard/ppsspp/issues/11543 "GPU: Dirty frag shader on depth write" -[#11620]: https://github.com/hrydgard/ppsspp/issues/11620 "Optimize out some stencil emulation, try to avoid depth write" -[#11584]: https://github.com/hrydgard/ppsspp/issues/11584 "D3D11: Allow shader blend to self" -[#11621]: https://github.com/hrydgard/ppsspp/issues/11621 "Vulkan: Avoid using Vulkan" -[#11658]: https://github.com/hrydgard/ppsspp/issues/11658 "Windows: Hide Vulkan/D3D11 if not available" -[#11665]: https://github.com/hrydgard/ppsspp/issues/11665 "Remove the \"Disable stencil test\" hack setting" -[#11666]: https://github.com/hrydgard/ppsspp/issues/11666 "Remove \"Timer Hack\" setting." -[#11667]: https://github.com/hrydgard/ppsspp/issues/11667 "Remove outdated TrueColor setting." -[#11689]: https://github.com/hrydgard/ppsspp/issues/11689 "Correct remote disc streaming with ipv6" -[#11700]: https://github.com/hrydgard/ppsspp/issues/11700 "http: Report errors reading discs" -[#11691]: https://github.com/hrydgard/ppsspp/issues/11691 "WIP: Vulkan/adreno: Apply workaround for Harvest Moon issue #10421" -[#11694]: https://github.com/hrydgard/ppsspp/issues/11694 "Vulkan: Limit stencil workaround to Adreno 5xx" -[#11720]: https://github.com/hrydgard/ppsspp/issues/11720 "Try to support Qt keyboard input directly. Fixes #11653" -[#11807]: https://github.com/hrydgard/ppsspp/issues/11807 "Qt: Re-enable Load button to browse for file" -[#11808]: https://github.com/hrydgard/ppsspp/issues/11808 "Qt: Correct text bind on first draw of string" -[#11740]: https://github.com/hrydgard/ppsspp/issues/11740 "Fix for weird Xbox B button behavior, see #10948." -[#11767]: https://github.com/hrydgard/ppsspp/issues/11767 "Compat: Force realistic UMD timing for F1 2006." -[#11785]: https://github.com/hrydgard/ppsspp/issues/11785 "GPU: Correct depth clamp range in range cull" -[#11859]: https://github.com/hrydgard/ppsspp/issues/11859 "GPU: Handle cull range properly drawing at offset" -[#11712]: https://github.com/hrydgard/ppsspp/issues/11712 "GLES: Detect Vivante GPU, disable vertex range culling" -[#11773]: https://github.com/hrydgard/ppsspp/issues/11773 "D3D9: Disable range culling on really old NVIDIA cards" -[#11787]: https://github.com/hrydgard/ppsspp/issues/11787 "GLES: Disable range culling on VideoCore/Vivante" -[#11812]: https://github.com/hrydgard/ppsspp/issues/11812 "Android: Allow using a custom Memory Stick storage path" -[#11822]: https://github.com/hrydgard/ppsspp/issues/11822 "interp: Correct vocp prefix handling" -[#11835]: https://github.com/hrydgard/ppsspp/issues/11835 "Correct vocp / vsocp prefix handling" -[#11831]: https://github.com/hrydgard/ppsspp/issues/11831 "Bundle libSDL inside app on macOS, fixes #11830" -[#11842]: https://github.com/hrydgard/ppsspp/issues/11842 "Win32 handle leak fix" -[#11508]: https://github.com/hrydgard/ppsspp/issues/11508 "Savedata: Write only one secure entry" -[#11441]: https://github.com/hrydgard/ppsspp/issues/11441 "Vulkan: Apply Themaister's patch, removing illegal pre-transitions of swapchain images. Fixes #11417 (crash on Note 9)" -[#11393]: https://github.com/hrydgard/ppsspp/issues/11393 "Implement vertex range culling" -[#10973]: https://github.com/hrydgard/ppsspp/issues/10973 "handle cull mode" -[#11182]: https://github.com/hrydgard/ppsspp/issues/11182 "GLES: Use accurate GLSL ver in postshader convert" -[#11438]: https://github.com/hrydgard/ppsspp/issues/11438 "Allow WASAPI device switching" -[#11461]: https://github.com/hrydgard/ppsspp/issues/11461 "Windows: Detect DirectInput devices after launch" -[#11307]: https://github.com/hrydgard/ppsspp/issues/11307 "Enable Discord integration for Mac and Linux." -[#10909]: https://github.com/hrydgard/ppsspp/issues/10909 "WebSocket based debugger interface" -[#11447]: https://github.com/hrydgard/ppsspp/issues/11447 "Avoid calling any GL calls during shutdown on Android. Should help #11063" -[#11350]: https://github.com/hrydgard/ppsspp/issues/11350 "TexCache: Optimize DXT3/DXT5 decode to single pass" [#13636]: https://github.com/hrydgard/ppsspp/issues/13636 "Reinterpret framebuffer formats as needed. Outrun reflections partial fix" [#13640]: https://github.com/hrydgard/ppsspp/issues/13640 "Fix car reflections in Outrun" [#13760]: https://github.com/hrydgard/ppsspp/issues/13760 "Fix car lighting issues in DiRT 2." @@ -422,7 +334,6 @@ What's new in 1.7.0 [#13368]: https://github.com/hrydgard/ppsspp/issues/13368 "Reschedule after resuming thread from suspend." [#13969]: https://github.com/hrydgard/ppsspp/issues/13969 "Io: Don't allow async close while async busy" [#13633]: https://github.com/hrydgard/ppsspp/issues/13633 "Downstream Panic (US) New Game crashes" -[#13667]: https://github.com/hrydgard/ppsspp/issues/13667 "Dynasty Warriors Multi Raid 2: Online questions" [#13262]: https://github.com/hrydgard/ppsspp/issues/13262 "Implement texturing from depth buffers (Vulkan only so far)" [#13556]: https://github.com/hrydgard/ppsspp/issues/13556 "D3D11 depth texture support" [#14085]: https://github.com/hrydgard/ppsspp/issues/14085 "Handle exec addr errors better - don't let IgnoreBadMemoryAccesses skip dispatcher exceptions" @@ -436,3 +347,65 @@ What's new in 1.7.0 [#14129]: https://github.com/hrydgard/ppsspp/issues/14129 "GPU: Force reinterpret off without copy image" [#14134]: https://github.com/hrydgard/ppsspp/issues/14134 "Android: Ensure shutdown waits for render" [#14132]: https://github.com/hrydgard/ppsspp/issues/14132 "Io: Truncate reads/writes to valid memory" +[#11997]: https://github.com/hrydgard/ppsspp/issues/11997 "Android 12 scoped storage hell" +[#5099]: https://github.com/hrydgard/ppsspp/issues/5099 "IOS touch controls problems." +[#14053]: https://github.com/hrydgard/ppsspp/issues/14053 "Toggle screenshot minor issue." +[#14176]: https://github.com/hrydgard/ppsspp/issues/14176 "Remove deprecated API calls for new FFmpeg 4.3.x" +[#14188]: https://github.com/hrydgard/ppsspp/issues/14188 "Additional fixes for FFmpeg 3.1+" +[#14199]: https://github.com/hrydgard/ppsspp/issues/14199 "Mpeg: Set low latency flag for video decode" +[#14145]: https://github.com/hrydgard/ppsspp/issues/14145 "libretro: Remove \"Unsafe FuncReplacements\" option." +[#13864]: https://github.com/hrydgard/ppsspp/issues/13864 "Vulkan: Remove #10097 hack for newer AMD drivers" +[#14201]: https://github.com/hrydgard/ppsspp/issues/14201 "Add iOS version detection, turn off JIT on bootup if >= 14.3." +[#14241]: https://github.com/hrydgard/ppsspp/issues/14241 "iOS: Try a different JIT detection method, thanks Halo-Michael." +[#14317]: https://github.com/hrydgard/ppsspp/issues/14317 "Window size restarts on closing" +[#8288]: https://github.com/hrydgard/ppsspp/issues/8288 "NBA live 08 Invalid address and hang" +[#14069]: https://github.com/hrydgard/ppsspp/issues/14069 "Mini-Map in Z.H.P. Updates Incorrectly Without Software Rendering" +[#13252]: https://github.com/hrydgard/ppsspp/issues/13252 "Open Season Title Screen does not display" +[#14127]: https://github.com/hrydgard/ppsspp/issues/14127 "Metal Gear Solid Peace Walker Chinese Patched blue screen" +[#14271]: https://github.com/hrydgard/ppsspp/issues/14271 "Ape Academy 2 is broken on versions after 1.8.0(?) - tested on latest nightly and 1.11.3" +[#13741]: https://github.com/hrydgard/ppsspp/issues/13741 "Princess Maker 5 Portable half screen in Vulkan" +[#14167]: https://github.com/hrydgard/ppsspp/issues/14167 "[Android] Pro Yakyu Spirits 2010 (NPJH50234): Rendering errors with hardware transform off" +[#14230]: https://github.com/hrydgard/ppsspp/issues/14230 "Support texture replacement filtering overrides" +[#13759]: https://github.com/hrydgard/ppsspp/issues/13759 "Yarudora Portable: Double Cast" +[#13146]: https://github.com/hrydgard/ppsspp/issues/13146 "Sims 2 Castaway/Pets EA Logo glitched out - 1.10.2" +[#14789]: https://github.com/hrydgard/ppsspp/issues/14789 "Add new texture filtering mode \"Auto Max Quality\"" +[#14209]: https://github.com/hrydgard/ppsspp/issues/14209 "Fix Size & Position jpn0.pgf/ltn0.pgf/ltn2.pgf/ltn4.pgf/ltn6.pgf" +[#14042]: https://github.com/hrydgard/ppsspp/issues/14042 "Implement basic depth texturing for OpenGL" +[#14966]: https://github.com/hrydgard/ppsspp/issues/14966 "Config: Correct cardboard setting ini load" +[#14768]: https://github.com/hrydgard/ppsspp/issues/14768 "Fix the math in cardboard VR mode for wide aspect ratios" +[#14879]: https://github.com/hrydgard/ppsspp/issues/14879 "vertexjit: Correct morph flag alpha check assert" +[#14313]: https://github.com/hrydgard/ppsspp/issues/14313 "Add a setting for choosing background animation in PPSSPP's menus" +[#14818]: https://github.com/hrydgard/ppsspp/issues/14818 "Focus based moving background" +[#14810]: https://github.com/hrydgard/ppsspp/issues/14810 "Wave animation" +[#14347]: https://github.com/hrydgard/ppsspp/issues/14347 "UI: Add BG animation for recent games" +[#14041]: https://github.com/hrydgard/ppsspp/issues/14041 "UI: Add button to show CRC on feedback screen" +[#14224]: https://github.com/hrydgard/ppsspp/issues/14224 "Add a Storage tab to System Information with some path info" +[#14238]: https://github.com/hrydgard/ppsspp/issues/14238 "UI: Wrap long info items and cleanup storage display" +[#14056]: https://github.com/hrydgard/ppsspp/issues/14056 "Track memory allocations and writes for debug info" +[#14237]: https://github.com/hrydgard/ppsspp/issues/14237 "Add initial search to savedata manager" +[#14528]: https://github.com/hrydgard/ppsspp/issues/14528 "Postshader: Let shaders use the previous frame" +[#14548]: https://github.com/hrydgard/ppsspp/issues/14548 "Add some PPSSPP's Japanese keyboard" +[#14708]: https://github.com/hrydgard/ppsspp/issues/14708 "Add Reset button on crash screen, allow load state and related" +[#14676]: https://github.com/hrydgard/ppsspp/issues/14676 "Add savestate undo UI" +[#14679]: https://github.com/hrydgard/ppsspp/issues/14679 "Savestate load undo" +[#14697]: https://github.com/hrydgard/ppsspp/issues/14697 "Add undo last save as well" +[#14596]: https://github.com/hrydgard/ppsspp/issues/14596 "Replace the \"Test Analogs\" screen with a new screen that lets you directly try the settings." +[#13869]: https://github.com/hrydgard/ppsspp/issues/13869 "Make combo button more generic" +[#12530]: https://github.com/hrydgard/ppsspp/issues/12530 "Allow tilt input on Z instead of X" +[#14000]: https://github.com/hrydgard/ppsspp/issues/14000 "Add CRC32 calc" +[#14769]: https://github.com/hrydgard/ppsspp/issues/14769 "Add a visual means of control mapping" +[#13107]: https://github.com/hrydgard/ppsspp/issues/13107 "Basic mappable motion gesture" +[#14843]: https://github.com/hrydgard/ppsspp/issues/14843 "DPad drag fixes" +[#14480]: https://github.com/hrydgard/ppsspp/issues/14480 "Configurable analog head size" +[#14140]: https://github.com/hrydgard/ppsspp/issues/14140 "[Adhoc] Fix multiplayer issue on MGS:PW due to detecting an incorrect source port on incoming data" +[#14235]: https://github.com/hrydgard/ppsspp/issues/14235 "[Adhoc] Always enable TCPNoDelay to improve response time" +[#14284]: https://github.com/hrydgard/ppsspp/issues/14284 "[Adhoc] Fix Teenage Mutant Ninja Turtles Multiplayer" +[#14290]: https://github.com/hrydgard/ppsspp/issues/14290 "Fix FlatOut Head On multiplayer." +[#14335]: https://github.com/hrydgard/ppsspp/issues/14335 "[Adhoc] Prevent flooding Adhoc Server with connection attempts" +[#14342]: https://github.com/hrydgard/ppsspp/issues/14342 "[AdhocMatching] Fix crashing issue when leaving a multiplayer game room" +[#14345]: https://github.com/hrydgard/ppsspp/issues/14345 "[APctl] Fix stuck issue when scanning AP to Recruit on MGS:PW" +[#14466]: https://github.com/hrydgard/ppsspp/issues/14466 "[Adhoc] Fix possible crash issue on blocking socket implementation." +[#14492]: https://github.com/hrydgard/ppsspp/issues/14492 "[AdhocGameMode] Create GameMode's socket after Master and all Replicas have been created" +[#14513]: https://github.com/hrydgard/ppsspp/issues/14513 "[Adhoc] Reducing HLE delays due to Mutiplayer performance regressions" +[#14849]: https://github.com/hrydgard/ppsspp/issues/14849 "[Adhoc] Fix Socket error 10014 on Windows when hosting a game of Vulcanus Seek and Destroy" +[#14711]: https://github.com/hrydgard/ppsspp/issues/14711 "Sas: Add option to control reverb volume" diff --git a/SDL/SDLMain.cpp b/SDL/SDLMain.cpp index f0f74f979a..09aa31b1ec 100644 --- a/SDL/SDLMain.cpp +++ b/SDL/SDLMain.cpp @@ -2,6 +2,7 @@ // This is quite messy due to platform-specific implementations and #ifdef's. // If your platform is not supported, it is suggested to use Qt instead. +#include #include #include @@ -190,11 +191,27 @@ void System_AskForPermission(SystemPermission permission) {} PermissionStatus System_GetPermissionStatus(SystemPermission permission) { return PERMISSION_STATUS_GRANTED; } void OpenDirectory(const char *path) { -#if defined(_WIN32) - PIDLIST_ABSOLUTE pidl = ILCreateFromPath(ConvertUTF8ToWString(ReplaceAll(path, "/", "\\")).c_str()); +#if PPSSPP_PLATFORM(WINDOWS) + SFGAOF flags; + PIDLIST_ABSOLUTE pidl = nullptr; + HRESULT hr = SHParseDisplayName(ConvertUTF8ToWString(ReplaceAll(path, "/", "\\")).c_str(), nullptr, &pidl, 0, &flags); if (pidl) { - SHOpenFolderAndSelectItems(pidl, 0, NULL, 0); - ILFree(pidl); + if (SUCCEEDED(hr)) + SHOpenFolderAndSelectItems(pidl, 0, NULL, 0); + CoTaskMemFree(pidl); + } +#elif PPSSPP_PLATFORM(MAC) || (PPSSPP_PLATFORM(LINUX) && !PPSSPP_PLATFORM(ANDROID)) + pid_t pid = fork(); + if (pid < 0) + return; + + if (pid == 0) { +#if PPSSPP_PLATFORM(MAC) + execlp("open", "open", path, nullptr); +#else + execlp("xdg-open", "xdg-open", path, nullptr); +#endif + exit(1); } #endif } @@ -667,7 +684,17 @@ int main(int argc, char *argv[]) { if (strlen(path) > 0 && path[strlen(path) - 1] != '/') strcat(path, "/"); - NativeInit(remain_argc, (const char **)remain_argv, path, "/tmp", nullptr); +#if PPSSPP_PLATFORM(MAC) + std::string external_dir_str; + if (SDL_GetBasePath()) + external_dir_str = std::string(SDL_GetBasePath()) + "/assets"; + else + external_dir_str = "/tmp"; + const char *external_dir = external_dir_str.c_str(); +#else + const char *external_dir = "/tmp"; +#endif + NativeInit(remain_argc, (const char **)remain_argv, path, external_dir, nullptr); // Use the setting from the config when initing the window. if (g_Config.bFullScreen) diff --git a/SDL/macOS b/SDL/macOS new file mode 160000 index 0000000000..f19a1d54b8 --- /dev/null +++ b/SDL/macOS @@ -0,0 +1 @@ +Subproject commit f19a1d54b8a5af6cc378ea307e0ec676922eb4cc diff --git a/SDL/macbundle.sh b/SDL/macbundle.sh index 423c9b09c7..29de754e70 100755 --- a/SDL/macbundle.sh +++ b/SDL/macbundle.sh @@ -9,24 +9,36 @@ if [ ! -f "${PPSSPPSDL}" ]; then fi SDL=$(otool -L "${PPSSPPSDL}" | grep -v @executable_path | grep -Eo /.+libSDL.+dylib) -if [ "${SDL}" = "" ]; then - echo "SDL is already bundled/unused." - exit 0 +if [ "${SDL}" != "" ]; then + if [ ! -f "${SDL}" ]; then + echo "Cannot locate SDL: ${SDL}!" + exit 0 + fi + + echo "Installing SDL from ${SDL}..." + + SDLNAME=$(basename "${SDL}") + mkdir -p "${PPSSPP}/Contents/Frameworks" || exit 0 + cp -r "$SDL" "${PPSSPP}/Contents/Frameworks" || exit 0 + install_name_tool -change "${SDL}" "@executable_path/../Frameworks/${SDLNAME}" "${PPSSPPSDL}" || exit 0 +elif [ "$(otool -L "${PPSSPPSDL}" | grep @rpath/SDL)" != "" ]; then + cd "$(dirname "$0")" + RPATH="$(pwd)/macOS" + cd - + SDL="${RPATH}/SDL2.framework" + if [ ! -d "${SDL}" ]; then + echo "Cannot locate SDL.framework: ${SDL}!" + exit 0 + fi + + rm -rf "${PPSSPP}/Contents/Frameworks/SDL2.framework" || exit 0 + mkdir -p "${PPSSPP}/Contents/Frameworks" || exit 0 + cp -a "$SDL" "${PPSSPP}/Contents/Frameworks" || exit 0 + install_name_tool -rpath "${RPATH}" "@executable_path/../Frameworks" "${PPSSPPSDL}" || echo "Already patched." fi -if [ ! -f "${SDL}" ]; then - echo "Cannot locate SDL: ${SDL}!" - exit 0 -fi - -echo "Installing SDL from ${SDL}..." - -SDLNAME=$(basename "${SDL}") -mkdir -p "${PPSSPP}/Contents/Frameworks" || exit 0 -cp -r "$SDL" "${PPSSPP}/Contents/Frameworks" || exit 0 -install_name_tool -change "${SDL}" "@executable_path/../Frameworks/${SDLNAME}" "${PPSSPPSDL}" || exit 0 - GIT_VERSION_LINE=$(grep "PPSSPP_GIT_VERSION = " "$(dirname "${0}")/../git-version.cpp") +echo "Setting version to ${GIT_VERSION_LINE}..." SHORT_VERSION_MATCH='.*"v([0-9\.]+(-[0-9]+)?).*";' LONG_VERSION_MATCH='.*"v(.*)";' if [[ "${GIT_VERSION_LINE}" =~ ^${SHORT_VERSION_MATCH}$ ]]; then @@ -36,3 +48,6 @@ else plutil -replace CFBundleShortVersionString -string "" ${PPSSPP}/Contents/Info.plist plutil -replace CFBundleVersion -string "" ${PPSSPP}/Contents/Info.plist fi + +# AdHoc codesign is required for Apple Silicon. +codesign -fs - --deep "${PPSSPP}" || exit 1 diff --git a/Tools/langtool/.gitignore b/Tools/langtool/.gitignore new file mode 100644 index 0000000000..eb5a316cbd --- /dev/null +++ b/Tools/langtool/.gitignore @@ -0,0 +1 @@ +target diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock new file mode 100644 index 0000000000..362b6ec359 --- /dev/null +++ b/Tools/langtool/Cargo.lock @@ -0,0 +1,223 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "langtool" +version = "0.1.0" +dependencies = [ + "structopt", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf9d950ef167e25e0bdb073cf1d68e9ad2795ac826f2f3f59647817cf23c0bfa" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d838a2c9943ac3125cf6df165eda53493451b719f3255b2a26b85f772d0ba" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Tools/langtool/Cargo.toml b/Tools/langtool/Cargo.toml new file mode 100644 index 0000000000..b18910d38f --- /dev/null +++ b/Tools/langtool/Cargo.toml @@ -0,0 +1,8 @@ +[package] +authors = ["Henrik Rydgård "] +edition = "2018" +name = "langtool" +version = "0.1.0" + +[dependencies] +structopt = "0.3" diff --git a/Tools/langtool/README.md b/Tools/langtool/README.md new file mode 100644 index 0000000000..f9a1d5b80b --- /dev/null +++ b/Tools/langtool/README.md @@ -0,0 +1,25 @@ +# Language ini file processor tool + +To install Rust and cargo, [go here](https://www.rust-lang.org/learn/get-started). + +To run, with rust installed, change to this Tools/langtool directory, then: + +```bash +cargo run +``` + +(Or just move the binary out of target/ and run it directly). + +To see command line usage, type: + +```bash +cargo run -- --help +``` + +To autoformat the code, use: + +```bash +cargo fmt +``` + +or set up your IDE to do that (it's already pre-set-up for VS Code, if you open the langtool folder directly). diff --git a/Tools/langtool/src/inifile.rs b/Tools/langtool/src/inifile.rs new file mode 100644 index 0000000000..8669175c9b --- /dev/null +++ b/Tools/langtool/src/inifile.rs @@ -0,0 +1,136 @@ +use std::path::{Path, PathBuf}; +use std::io::{self, Write}; +use std::fs::File; + +use crate::section::Section; + +#[derive(Debug)] +pub struct IniFile { + pub filename: PathBuf, + pub preamble: Vec, + pub sections: Vec
, + pub has_bom: bool, +} + +impl IniFile { + pub fn parse(filename: &str) -> io::Result { + let lines = read_lines(filename)?; + + let mut sections = vec![]; + let mut preamble = vec![]; + let mut cur_section = None; + + let mut has_bom = false; + + for line in lines { + let line = line.unwrap(); + + let line = if let Some(line) = line.strip_prefix('\u{feff}') { + has_bom = true; + line + } else { + &line + }; + + if let Some('[') = line.chars().next() { + if let Some(right_bracket) = line.find(']') { + if let Some(section) = cur_section.take() { + sections.push(section); + } + + let name = &line[1..right_bracket]; + cur_section = Some(Section { + name: name.to_owned(), + title_line: line.to_owned(), // preserves comment and bom + lines: vec![], + }); + } else { + // Bad syntax + break; + } + } else if let Some(cur_section) = &mut cur_section { + cur_section.lines.push(line.to_owned()); + } else { + preamble.push(line.to_owned()); + } + } + + if let Some(section) = cur_section.take() { + sections.push(section); + } + + let ini = IniFile { + filename: PathBuf::from(filename), + preamble, + sections, + has_bom, + }; + Ok(ini) + } + + pub fn write(&self) -> io::Result<()> { + let file = std::fs::File::create(&self.filename)?; + let mut file = std::io::LineWriter::new(file); + + // Write BOM + if self.has_bom { + file.write_all("\u{feff}".as_bytes())?; + } + for line in &self.preamble { + file.write_all(line.as_bytes())?; + file.write_all(b"\n")?; + } + for section in &self.sections { + file.write_all(section.title_line.as_bytes())?; + file.write_all(b"\n")?; + for line in §ion.lines { + file.write_all(line.as_bytes())?; + file.write_all(b"\n")?; + } + } + + Ok(()) + } + + // Assumes alphabetical section order! + pub fn insert_section_if_missing(&mut self, section: &Section) -> bool { + // First, check if it's there. + + for iter_section in &self.sections { + if iter_section.name == section.name { + return false; + } + } + + // Then, find a suitable insertion spot + for (i, iter_section) in self.sections.iter_mut().enumerate() { + if iter_section.name > section.name { + println!("Inserting section {}", section.name); + self.sections.insert(i, section.clone()); + return true; + } + } + // Reached the end for some reason? Add it. + self.sections.push(section.clone()); + true + } + + pub fn get_section_mut(&mut self, section_name: &str) -> Option<&mut Section> { + for section in &mut self.sections { + if section.name == section_name { + return Some(section); + } + } + None + } +} + +// Grabbed from a sample, a fast line reader iterator. +fn read_lines

(filename: P) -> io::Result>> +where + P: AsRef, +{ + let file = File::open(filename)?; + use std::io::BufRead; + Ok(io::BufReader::new(file).lines()) +} diff --git a/Tools/langtool/src/main.rs b/Tools/langtool/src/main.rs new file mode 100644 index 0000000000..0ab1bc29ee --- /dev/null +++ b/Tools/langtool/src/main.rs @@ -0,0 +1,112 @@ +use std::io; + +mod section; + +mod inifile; +use inifile::IniFile; + +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +struct Opt { + #[structopt(subcommand)] + cmd: Command, +} + +#[derive(StructOpt, Debug)] +enum Command { + CopyMissingLines {}, + CommentUnknownLines {}, + RemoveUnknownLines {}, +} + +fn copy_missing_lines(reference_ini: &IniFile, target_ini: &mut IniFile) -> io::Result<()> { + // Insert any missing full sections. + for reference_section in &reference_ini.sections { + if !target_ini.insert_section_if_missing(reference_section) { + if let Some(target_section) = target_ini.get_section_mut(&reference_section.name) { + for line in &reference_section.lines { + target_section.insert_line_if_missing(line); + } + + //target_section.remove_lines_if_not_in(reference_section); + target_section.comment_out_lines_if_not_in(reference_section); + } + } + } + Ok(()) +} + +fn deal_with_unknown_lines( + reference_ini: &IniFile, + target_ini: &mut IniFile, + remove: bool, +) -> io::Result<()> { + // Insert any missing full sections. + for reference_section in &reference_ini.sections { + if let Some(target_section) = target_ini.get_section_mut(&reference_section.name) { + if remove { + target_section.remove_lines_if_not_in(reference_section); + } else { + target_section.comment_out_lines_if_not_in(reference_section); + } + } + } + Ok(()) +} + +fn main() { + let opt = Opt::from_args(); + + // TODO: Grab extra arguments from opt somehow. + let args: Vec = vec![]; //std::env::args().skip(1).collect(); + let mut filenames = args; + + let root = "../../assets/lang"; + let reference_file = "en_US.ini"; + + let reference_ini = IniFile::parse(&format!("{}/{}", root, reference_file)).unwrap(); + + if filenames.is_empty() { + // Grab them all. + for path in std::fs::read_dir(root).unwrap() { + let path = path.unwrap(); + if path.file_name() == reference_file { + continue; + } + let filename = path.file_name(); + let filename = filename.to_string_lossy(); + if !filename.ends_with(".ini") { + continue; + } + filenames.push(path.file_name().to_string_lossy().to_string()); + } + } + + for filename in filenames { + if filename == "langtool" { + // Get this from cargo run for some reason. + continue; + } + let target_ini_filename = format!("{}/{}", root, filename); + println!("Langtool processing {}", target_ini_filename); + + let mut target_ini = IniFile::parse(&target_ini_filename).unwrap(); + + match opt.cmd { + Command::CopyMissingLines {} => { + copy_missing_lines(&reference_ini, &mut target_ini).unwrap(); + } + Command::CommentUnknownLines {} => { + deal_with_unknown_lines(&reference_ini, &mut target_ini, false).unwrap(); + } + Command::RemoveUnknownLines {} => { + deal_with_unknown_lines(&reference_ini, &mut target_ini, true).unwrap(); + } + } + + target_ini.write().unwrap(); + } + + // println!("{:#?}", target_ini); +} diff --git a/Tools/langtool/src/section.rs b/Tools/langtool/src/section.rs new file mode 100644 index 0000000000..1812cd006e --- /dev/null +++ b/Tools/langtool/src/section.rs @@ -0,0 +1,104 @@ +// Super simplified ini file processor. +// Doesn't even bother with understanding comments. +// Just understands section headings and +// keys and values, split by ' = '. + +#[derive(Debug, Clone)] +pub struct Section { + pub name: String, + pub title_line: String, + pub lines: Vec, +} + +impl Section { + pub fn insert_line_if_missing(&mut self, line: &str) -> bool { + let prefix = if let Some(pos) = line.find(" =") { + &line[0..pos + 2] + } else { + return false; + }; + + // Ignore comments when copying lines. + if prefix.starts_with('#') { + return false; + } + // Need to decide a policy for these. + if prefix.starts_with("translators") { + return false; + } + let prefix = prefix.to_owned(); + + for iter_line in &self.lines { + if iter_line.starts_with(&prefix) { + // Already have it + return false; + } + } + + // Now try to insert it at an alphabetic-ish location. + let prefix = prefix.to_ascii_lowercase(); + + // Then, find a suitable insertion spot + for (i, iter_line) in self.lines.iter().enumerate() { + if iter_line.to_ascii_lowercase() > prefix { + println!("Inserting line {} into {}", line, self.name); + self.lines.insert(i, line.to_owned()); + return true; + } + } + + for i in (0..self.lines.len()).rev() { + if self.lines[i].is_empty() { + continue; + } + println!("Inserting line {} into {}", line, self.name); + self.lines.insert(i + 1, line.to_owned()); + return true; + } + + println!("failed to insert {}", line); + true + } + + pub fn comment_out_lines_if_not_in(&mut self, other: &Section) { + // Brute force (O(n^2)). Bad but not a problem. + + for line in &mut self.lines { + let prefix = if let Some(pos) = line.find(" =") { + &line[0..pos + 2] + } else { + // Keep non-key lines. + continue; + }; + if prefix.starts_with("Font") || prefix.starts_with('#') { + continue; + } + if !other.lines.iter().any(|line| line.starts_with(prefix)) { + println!("Commenting out: {}", line); + // Comment out the line. + *line = "#".to_owned() + line; + } + } + } + + pub fn remove_lines_if_not_in(&mut self, other: &Section) { + // Brute force (O(n^2)). Bad but not a problem. + + self.lines.retain(|line| { + let prefix = if let Some(pos) = line.find(" =") { + &line[0..pos + 2] + } else { + // Keep non-key lines. + return true; + }; + if prefix.starts_with("Font") || prefix.starts_with('#') { + return true; + } + if !other.lines.iter().any(|line| line.starts_with(prefix)) { + false + } else { + true + } + }); + } +} diff --git a/UI/BackgroundAudio.cpp b/UI/BackgroundAudio.cpp index 82d7bf586d..ff83abcfc5 100644 --- a/UI/BackgroundAudio.cpp +++ b/UI/BackgroundAudio.cpp @@ -344,7 +344,10 @@ int BackgroundAudio::Play() { } double now = time_now_d(); - int sz = lastPlaybackTime_ <= 0.0 ? 44100 / 60 : (int)((now - lastPlaybackTime_) * 44100); + int sz = 44100 / 60; + if (lastPlaybackTime_ > 0.0 && lastPlaybackTime_ <= now) { + sz = (int)((now - lastPlaybackTime_) * 44100); + } sz = std::min(BUFSIZE / 2, sz); if (at3Reader_) { if (at3Reader_->Read(buffer, sz)) { diff --git a/UI/ComboKeyMappingScreen.cpp b/UI/ComboKeyMappingScreen.cpp index 4754c33bd8..931c0b0d9b 100644 --- a/UI/ComboKeyMappingScreen.cpp +++ b/UI/ComboKeyMappingScreen.cpp @@ -32,6 +32,62 @@ #include "UI/ComboKeyMappingScreen.h" +class ButtonShapeScreen : public PopupScreen { +public: + ButtonShapeScreen(std::string title, int *setting) : PopupScreen(title), setting_(setting) {} + + void CreatePopupContents(UI::ViewGroup *parent) override { + using namespace UI; + using namespace CustomKey; + + ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); + LinearLayout *items = new LinearLayoutList(ORIENT_VERTICAL); + + for (int i = 0; i < ARRAY_SIZE(comboKeyShapes); ++i) { + Choice *c = items->Add(new Choice(ImageID(comboKeyShapes[i].l), 0.6f, comboKeyShapes[i].r*PI/180, comboKeyShapes[i].f)); + c->OnClick.Add([=](UI::EventParams &e) { + *setting_ = i; + TriggerFinish(DR_OK); + return UI::EVENT_DONE; + }); + } + + scroll->Add(items); + parent->Add(scroll); + } + +private: + int *setting_; +}; + +class ButtonIconScreen : public PopupScreen { +public: + ButtonIconScreen(std::string title, int *setting) : PopupScreen(title), setting_(setting) {} + + void CreatePopupContents(UI::ViewGroup *parent) override { + using namespace UI; + using namespace CustomKey; + + ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); + LinearLayout *items = new LinearLayoutList(ORIENT_VERTICAL); + + for (int i = 0; i < ARRAY_SIZE(comboKeyImages); ++i) { + Choice *c = items->Add(new Choice(ImageID(comboKeyImages[i].i), 1.0f, comboKeyImages[i].r*PI/180)); + c->OnClick.Add([=](UI::EventParams &e) { + *setting_ = i; + TriggerFinish(DR_OK); + return UI::EVENT_DONE; + }); + } + + scroll->Add(items); + parent->Add(scroll); + } + +private: + int *setting_; +}; + class ButtonPreview : public UI::View { public: ButtonPreview(ImageID bgImg, ImageID img, float rotationIcon, bool flipShape, float rotationShape, int x, int y) @@ -152,23 +208,30 @@ void ComboKeyScreen::CreateViews() { LinearLayout *vertLayout = new LinearLayout(ORIENT_VERTICAL); rightScroll_->Add(vertLayout); - vertLayout->Add(new ItemHeader(co->T("Button Style"))); + vertLayout->Add(new ItemHeader(co->T("Button style"))); vertLayout->Add(new CheckBox(show, co->T("Visible"))); - // All icon and name are defined in GamepadEmu.h - static const char *imageNames[ARRAY_SIZE(comboKeyImages)]; - for (int i = 0; i < ARRAY_SIZE(imageNames); ++i) { - imageNames[i] = comboKeyImages[i].n; - } - PopupMultiChoice *icon = vertLayout->Add(new PopupMultiChoice(&(cfg->image), co->T("Icon"), imageNames, 0, ARRAY_SIZE(imageNames), mc->GetName(), screenManager())); - icon->OnChoice.Handle(this, &ComboKeyScreen::onCombo); - - // All shape and name are defined in GamepadEmu.h - static const char *shapeNames[ARRAY_SIZE(comboKeyShapes)]; - for (int i = 0; i < ARRAY_SIZE(shapeNames); ++i) { - shapeNames[i] = comboKeyShapes[i].n; - } - vertLayout->Add(new PopupMultiChoice(&(cfg->shape), co->T("Shape"), shapeNames, 0, ARRAY_SIZE(shapeNames), mc->GetName(), screenManager()))->OnChoice.Handle(this, &ComboKeyScreen::onCombo); + Choice *icon = vertLayout->Add(new Choice(co->T("Icon"))); + icon->SetIcon(ImageID(comboKeyImages[cfg->image].i), 1.0f, comboKeyImages[cfg->image].r*PI/180); // Set right icon on the choice + icon->OnClick.Add([=](UI::EventParams &e) { + auto iconScreen = new ButtonIconScreen(co->T("Icon"), &(cfg->image)); + if (e.v) + iconScreen->SetPopupOrigin(e.v); + + screenManager()->push(iconScreen); + return UI::EVENT_DONE; + }); + + Choice *shape = vertLayout->Add(new Choice(co->T("Shape"))); + shape->SetIcon(ImageID(comboKeyShapes[cfg->shape].l), 0.6f, comboKeyShapes[cfg->shape].r*PI/180, comboKeyShapes[cfg->shape].f); // Set right icon on the choice + shape->OnClick.Add([=](UI::EventParams &e) { + auto shape = new ButtonShapeScreen(co->T("Shape"), &(cfg->shape)); + if (e.v) + shape->SetPopupOrigin(e.v); + + screenManager()->push(shape); + return UI::EVENT_DONE; + }); vertLayout->Add(new ItemHeader(co->T("Button Binding"))); vertLayout->Add(new CheckBox(&(cfg->toggle), co->T("Toggle mode"))); @@ -249,6 +312,11 @@ void ComboKeyScreen::saveArray() { } } +void ComboKeyScreen::dialogFinished(const Screen *dialog, DialogResult result) { + saveArray(); + RecreateViews(); +} + void ComboKeyScreen::onFinish(DialogResult result) { saveArray(); g_Config.Save("ComboKeyScreen::onFinish"); @@ -258,9 +326,3 @@ UI::EventReturn ComboKeyScreen::ChoiceEventHandler::onChoiceClick(UI::EventParam checkbox_->Toggle(); return UI::EVENT_DONE; }; - -UI::EventReturn ComboKeyScreen::onCombo(UI::EventParams &e) { - saveArray(); - CreateViews(); - return UI::EVENT_DONE; -} diff --git a/UI/ComboKeyMappingScreen.h b/UI/ComboKeyMappingScreen.h index aa4fd71a06..4ee477444d 100644 --- a/UI/ComboKeyMappingScreen.h +++ b/UI/ComboKeyMappingScreen.h @@ -32,7 +32,10 @@ public: void CreateViews() override; void onFinish(DialogResult result) override; - UI::EventReturn onCombo(UI::EventParams &e); + +protected: + void dialogFinished(const Screen *dialog, DialogResult result) override; + private: void saveArray(); diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index e29be742a5..94eef4dcd9 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -36,6 +36,7 @@ #include "Common/StringUtils.h" #include "Common/System/Display.h" #include "Common/System/System.h" +#include "Common/TimeUtil.h" #include "Core/KeyMap.h" #include "Core/Host.h" #include "Core/HLE/sceCtrl.h" @@ -44,6 +45,10 @@ #include "UI/ControlMappingScreen.h" #include "UI/GameSettingsScreen.h" +#if PPSSPP_PLATFORM(ANDROID) +#include "android/jni/app-android.h" +#endif + class SingleControlMapper : public UI::LinearLayout { public: SingleControlMapper(int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams = nullptr); @@ -99,7 +104,7 @@ void SingleControlMapper::Refresh() { using namespace UI; - float itemH = 45; + float itemH = 55.0f; float leftColumnWidth = 200; float rightColumnWidth = 250; // TODO: Should be flexible somehow. Maybe we need to implement Measure. @@ -250,7 +255,6 @@ void ControlMappingScreen::CreateViews() { rightScroll_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(1.0f)); rightScroll_->SetTag("ControlMapping"); - rightScroll_->SetScrollToTop(false); LinearLayout *rightColumn = new LinearLayoutList(ORIENT_VERTICAL); rightScroll_->Add(rightColumn); @@ -327,7 +331,7 @@ void KeyMappingNewKeyDialog::CreatePopupContents(UI::ViewGroup *parent) { } bool KeyMappingNewKeyDialog::key(const KeyInput &key) { - if (mapped_) + if (mapped_ || time_now_d() < delayUntil_) return false; if (key.flags & KEY_DOWN) { if (key.keyCode == NKCODE_EXT_MOUSEBUTTON_1) { @@ -343,6 +347,10 @@ bool KeyMappingNewKeyDialog::key(const KeyInput &key) { return true; } +void KeyMappingNewKeyDialog::SetDelay(float t) { + delayUntil_ = time_now_d() + t; +} + void KeyMappingNewMouseKeyDialog::CreatePopupContents(UI::ViewGroup *parent) { using namespace UI; @@ -393,7 +401,7 @@ static bool IgnoreAxisForMapping(int axis) { bool KeyMappingNewKeyDialog::axis(const AxisInput &axis) { - if (mapped_) + if (mapped_ || time_now_d() < delayUntil_) return false; if (IgnoreAxisForMapping(axis.axisId)) return false; @@ -479,7 +487,8 @@ void JoystickHistoryView::Draw(UIContext &dc) { } float minRadius = std::min(bounds_.w, bounds_.h) * 0.5f - image->w; dc.Begin(); - dc.DrawTextShadow(title_.c_str(), bounds_.centerX(), bounds_.centerY() + minRadius + 5.0, 0xFFFFFFFF, ALIGN_TOP | ALIGN_HCENTER); + Bounds textBounds(bounds_.x, bounds_.centerY() + minRadius + 5.0, bounds_.w, bounds_.h/2 - minRadius - 5.0); + dc.DrawTextShadowRect(title_.c_str(), textBounds, 0xFFFFFFFF, ALIGN_TOP | ALIGN_HCENTER | FLAG_WRAP_TEXT); dc.Flush(); dc.BeginNoTex(); dc.Draw()->RectOutline(bounds_.centerX() - minRadius, bounds_.centerY() - minRadius, minRadius * 2.0f, minRadius * 2.0f, 0x80FFFFFF); @@ -800,7 +809,7 @@ void TouchTestScreen::render() { ui_context->Begin(); - char buffer[1024]; + char buffer[2048]; for (int i = 0; i < MAX_TOUCH_POINTS; i++) { if (touches_[i].id != -1) { ui_context->Draw()->Circle(touches_[i].x, touches_[i].y, 100.0, 3.0, 80, 0.0f, 0xFFFFFFFF, 1.0); @@ -809,15 +818,19 @@ void TouchTestScreen::render() { } } + char extra_debug[2048]{}; + +#if PPSSPP_PLATFORM(ANDROID) + truncate_cpy(extra_debug, Android_GetInputDeviceDebugString().c_str()); +#endif + snprintf(buffer, sizeof(buffer), #if PPSSPP_PLATFORM(ANDROID) "display_res: %dx%d\n" #endif - "dp_res: %dx%d\n" - "pixel_res: %dx%d\n" - "g_dpi: %f\n" - "g_dpi_scale: %0.3fx%0.3f\n" - "g_dpi_scale_real: %0.3fx%0.3f\n", + "dp_res: %dx%d pixel_res: %dx%d\n" + "g_dpi: %0.3f g_dpi_scale: %0.3fx%0.3f\n" + "g_dpi_scale_real: %0.3fx%0.3f\n%s", #if PPSSPP_PLATFORM(ANDROID) display_xres, display_yres, #endif @@ -825,7 +838,10 @@ void TouchTestScreen::render() { pixel_xres, pixel_yres, g_dpi, g_dpi_scale_x, g_dpi_scale_y, - g_dpi_scale_real_x, g_dpi_scale_real_y); + g_dpi_scale_real_x, g_dpi_scale_real_y, extra_debug); + + // On Android, also add joystick debug data. + ui_context->DrawTextShadow(buffer, bounds.centerX(), bounds.y + 20.0f, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); ui_context->Flush(); @@ -1144,14 +1160,14 @@ void VisualMappingScreen::resized() { UI::EventReturn VisualMappingScreen::OnMapButton(UI::EventParams &e) { nextKey_ = e.a; - MapNext(); + MapNext(false); return UI::EVENT_DONE; } UI::EventReturn VisualMappingScreen::OnBindAll(UI::EventParams &e) { bindAll_ = 0; nextKey_ = bindAllOrder[bindAll_]; - MapNext(); + MapNext(false); return UI::EVENT_DONE; } @@ -1184,7 +1200,7 @@ void VisualMappingScreen::HandleKeyMapping(KeyDef key) { void VisualMappingScreen::dialogFinished(const Screen *dialog, DialogResult result) { if (result == DR_YES && nextKey_ != 0) { - MapNext(); + MapNext(true); } else { // This means they canceled. if (nextKey_ != 0) @@ -1195,7 +1211,7 @@ void VisualMappingScreen::dialogFinished(const Screen *dialog, DialogResult resu } } -void VisualMappingScreen::MapNext() { +void VisualMappingScreen::MapNext(bool successive) { auto km = GetI18NCategory("KeyMapping"); if (nextKey_ == VIRTKEY_AXIS_Y_MIN || nextKey_ == VIRTKEY_AXIS_X_MIN || nextKey_ == VIRTKEY_AXIS_X_MAX) { @@ -1207,5 +1223,6 @@ void VisualMappingScreen::MapNext() { Bounds bounds = screenManager()->getUIContext()->GetLayoutBounds(); dialog->SetPopupOffset(psp_->GetPopupOffset() * bounds.h); + dialog->SetDelay(successive ? 0.5f : 0.1f); screenManager()->push(dialog); } diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index 393fb1f18c..add89bfdfa 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -57,13 +57,15 @@ private: class KeyMappingNewKeyDialog : public PopupScreen { public: explicit KeyMappingNewKeyDialog(int btn, bool replace, std::function callback, std::shared_ptr i18n) - : PopupScreen(i18n->T("Map Key"), "Cancel", ""), callback_(callback), mapped_(false) { + : PopupScreen(i18n->T("Map Key"), "Cancel", ""), callback_(callback) { pspBtn_ = btn; } virtual bool key(const KeyInput &key) override; virtual bool axis(const AxisInput &axis) override; + void SetDelay(float t); + protected: void CreatePopupContents(UI::ViewGroup *parent) override; @@ -74,7 +76,8 @@ protected: private: int pspBtn_; std::function callback_; - bool mapped_; // Prevent double registrations + bool mapped_ = false; // Prevent double registrations + double delayUntil_ = 0.0f; }; class KeyMappingNewMouseKeyDialog : public PopupScreen { @@ -178,7 +181,7 @@ private: UI::EventReturn OnMapButton(UI::EventParams &e); UI::EventReturn OnBindAll(UI::EventParams &e); void HandleKeyMapping(KeyDef key); - void MapNext(); + void MapNext(bool successive); MockPSP *psp_ = nullptr; int nextKey_ = 0; diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index 57e252483e..3ec6b8139c 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -96,8 +96,7 @@ void CwCheatScreen::CreateViews() { rightScroll_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT, 0.5f)); rightScroll_->SetTag("CwCheats"); - rightScroll_->SetScrollToTop(false); - rightScroll_->ScrollTo(g_Config.fCwCheatScrollPosition); + rightScroll_->RememberPosition(&g_Config.fCwCheatScrollPosition); LinearLayout *rightColumn = new LinearLayoutList(ORIENT_VERTICAL, new LinearLayoutParams(200, FILL_PARENT, actionMenuMargins)); rightScroll_->Add(rightColumn); @@ -140,7 +139,6 @@ void CwCheatScreen::onFinish(DialogResult result) { if (MIPSComp::jit) { MIPSComp::jit->ClearCache(); } - g_Config.fCwCheatScrollPosition = rightScroll_->GetScrollPosition(); } UI::EventReturn CwCheatScreen::OnEnableAll(UI::EventParams ¶ms) { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 78695e8efd..c8d5fae07b 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -110,7 +110,7 @@ static void __EmuScreenVblank() if (frameStep_ && lastNumFlips != gpuStats.numFlips) { frameStep_ = false; - Core_EnableStepping(true); + Core_EnableStepping(true, "ui.frameAdvance", 0); lastNumFlips = gpuStats.numFlips; } #ifndef MOBILE_DEVICE @@ -185,6 +185,10 @@ EmuScreen::EmuScreen(const Path &filename) OnDevMenu.Handle(this, &EmuScreen::OnDevTools); OnChatMenu.Handle(this, &EmuScreen::OnChat); + + // Usually, we don't want focus movement enabled on this screen, so disable on start. + // Only if you open chat or dev tools do we want it to start working. + UI::EnableFocusMovement(false); } bool EmuScreen::bootAllowStorage(const Path &filename) { @@ -607,7 +611,7 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) { } else if (!frameStep_) { - Core_EnableStepping(true); + Core_EnableStepping(true, "ui.frameAdvance", 0); } break; @@ -736,15 +740,15 @@ bool EmuScreen::key(const KeyInput &key) { Core_NotifyActivity(); if (UI::IsFocusMovementEnabled()) { - if ((key.flags & KEY_DOWN) != 0 && UI::IsEscapeKey(key)) { + if (UIScreen::key(key)) { + return true; + } else if ((key.flags & KEY_DOWN) != 0 && UI::IsEscapeKey(key)) { if (chatMenu_) chatMenu_->Close(); if (chatButton_) chatButton_->SetVisibility(UI::V_VISIBLE); UI::EnableFocusMovement(false); return true; - } else if (UIScreen::key(key)) { - return true; } } @@ -834,31 +838,31 @@ void EmuScreen::CreateViews() { AnchorLayoutParams *layoutParams = nullptr; switch (g_Config.iChatButtonPosition) { case 0: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, 80, NONE, NONE, 50, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 80, NONE, NONE, 50, true); break; case 1: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, bounds.centerX(), NONE, NONE, 50, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, bounds.centerX(), NONE, NONE, 50, true); break; case 2: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, NONE, NONE, 80, 50, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, NONE, 80, 50, true); break; case 3: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, 80, 50, NONE, NONE, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 80, 50, NONE, NONE, true); break; case 4: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, bounds.centerX(), 50, NONE, NONE, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, bounds.centerX(), 50, NONE, NONE, true); break; case 5: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, NONE, 50, 80, NONE, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, 50, 80, NONE, true); break; case 6: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, 80, bounds.centerY(), NONE, NONE, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 80, bounds.centerY(), NONE, NONE, true); break; case 7: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, NONE, bounds.centerY(), 80, NONE, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, bounds.centerY(), 80, NONE, true); break; default: - layoutParams = new AnchorLayoutParams(130, WRAP_CONTENT, 80, NONE, NONE, 50, true); + layoutParams = new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 80, NONE, NONE, 50, true); break; } @@ -1150,6 +1154,8 @@ static void DrawCrashDump(UIContext *ctx) { sysName.c_str(), sysVersion, GetCompilerABI() ); + if (ctx->Draw()->GetFontAtlas()->getFont(ubuntu24)) + ctx->BindFontTexture(); ctx->Draw()->SetFontScale(.7f, .7f); ctx->Draw()->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF); y += 140; @@ -1201,6 +1207,8 @@ BREAK CheatsInEffect() ? "Y" : "N", HLEPlugins::HasEnabled() ? "Y" : "N"); ctx->Draw()->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF); + ctx->Flush(); + ctx->RebindTexture(); } static void DrawAudioDebugStats(DrawBuffer *draw2d, const Bounds &bounds) { diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 9cb05ca450..2749fa98b3 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -168,7 +168,7 @@ void GameScreen::CreateViews() { if (isRecentGame(gamePath_)) { rightColumnItems->Add(AddOtherChoice(new Choice(ga->T("Remove From Recent"))))->OnClick.Handle(this, &GameScreen::OnRemoveFromRecent); } -#if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) +#if (defined(USING_QT_UI) || PPSSPP_PLATFORM(WINDOWS) || PPSSPP_PLATFORM(MAC)) && !PPSSPP_PLATFORM(UWP) rightColumnItems->Add(AddOtherChoice(new Choice(ga->T("Show In Folder"))))->OnClick.Handle(this, &GameScreen::OnShowInFolder); #endif if (g_Config.bEnableCheats) { diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 37d5102c55..a049616f67 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -82,6 +82,7 @@ #if PPSSPP_PLATFORM(ANDROID) #include "android/jni/AndroidAudio.h" +#include "android/jni/AndroidContentURI.h" extern AndroidAudioState *g_audioState; @@ -163,8 +164,33 @@ static std::string *GPUDeviceNameSetting() { return nullptr; } +bool PathToVisualUsbPath(Path path, std::string &outPath) { + switch (path.Type()) { + case PathType::NATIVE: + if (path.StartsWith(g_Config.memStickDirectory)) { + return g_Config.memStickDirectory.ComputePathTo(path, outPath); + } + break; + case PathType::CONTENT_URI: +#if PPSSPP_PLATFORM(ANDROID) + { + // Try to parse something sensible out of the content URI. + AndroidContentURI uri(path.ToString()); + outPath = uri.RootPath(); + if (startsWith(outPath, "primary:")) { + outPath = "/" + outPath.substr(8); + } + return true; + } +#endif + default: + break; + } + return false; +} + void GameSettingsScreen::CreateViews() { - ReloadAllPostShaderInfo(); + ReloadAllPostShaderInfo(screenManager()->getDrawContext()); if (editThenRestore_) { std::shared_ptr info = g_gameInfoCache->GetInfo(nullptr, gamePath_, 0); @@ -186,6 +212,7 @@ void GameSettingsScreen::CreateViews() { auto co = GetI18NCategory("Controls"); auto a = GetI18NCategory("Audio"); auto sa = GetI18NCategory("Savedata"); + auto se = GetI18NCategory("Search"); auto sy = GetI18NCategory("System"); auto n = GetI18NCategory("Networking"); auto ms = GetI18NCategory("MainSettings"); @@ -195,20 +222,21 @@ void GameSettingsScreen::CreateViews() { root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); - TabHolder *tabHolder; if (vertical) { LinearLayout *verticalLayout = new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT)); - tabHolder = new TabHolder(ORIENT_HORIZONTAL, 200, new LinearLayoutParams(1.0f)); - verticalLayout->Add(tabHolder); + tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 200, new LinearLayoutParams(1.0f)); + verticalLayout->Add(tabHolder_); verticalLayout->Add(new Choice(di->T("Back"), "", false, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 0.0f, Margins(0))))->OnClick.Handle(this, &UIScreen::OnBack); root_->Add(verticalLayout); } else { - tabHolder = new TabHolder(ORIENT_VERTICAL, 200, new AnchorLayoutParams(10, 0, 10, 0, false)); - root_->Add(tabHolder); + tabHolder_ = new TabHolder(ORIENT_VERTICAL, 200, new AnchorLayoutParams(10, 0, 10, 0, false)); + root_->Add(tabHolder_); AddStandardBack(root_); } - tabHolder->SetTag("GameSettings"); - root_->SetDefaultFocusView(tabHolder); + tabHolder_->SetTag("GameSettings"); + root_->SetDefaultFocusView(tabHolder_); + settingTabContents_.clear(); + settingTabFilterNotices_.clear(); float leftSide = 40.0f; if (!vertical) { @@ -226,12 +254,7 @@ void GameSettingsScreen::CreateViews() { // TODO: These currently point to global settings, not game specific ones. // Graphics - ViewGroup *graphicsSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); - graphicsSettingsScroll->SetTag("GameSettingsGraphics"); - LinearLayout *graphicsSettings = new LinearLayoutList(ORIENT_VERTICAL); - graphicsSettings->SetSpacing(0); - graphicsSettingsScroll->Add(graphicsSettings); - tabHolder->AddTab(ms->T("Graphics"), graphicsSettingsScroll); + LinearLayout *graphicsSettings = AddTab("GameSettingsGraphics", ms->T("Graphics")); if (!g_Config.bSimpleUI) { graphicsSettings->Add(new ItemHeader(gr->T("Rendering Mode"))); @@ -472,11 +495,15 @@ void GameSettingsScreen::CreateViews() { return UI::EVENT_CONTINUE; }); vtxCache->SetEnabledFunc([] { - return !g_Config.bSoftwareRendering && g_Config.bHardwareTransform; + return !g_Config.bSoftwareRendering && g_Config.bHardwareTransform && g_Config.iGPUBackend != (int)GPUBackend::OPENGL; }); CheckBox *texBackoff = graphicsSettings->Add(new CheckBox(&g_Config.bTextureBackoffCache, gr->T("Lazy texture caching", "Lazy texture caching (speedup)"))); texBackoff->SetDisabledPtr(&g_Config.bSoftwareRendering); + texBackoff->OnClick.Add([=](EventParams& e) { + settingInfo_->Show(gr->T("Lazy texture caching Tip", "Faster, but can cause text problems in a few games"), e.v); + return UI::EVENT_CONTINUE; + }); CheckBox *texSecondary_ = graphicsSettings->Add(new CheckBox(&g_Config.bTextureSecondaryCache, gr->T("Retain changed textures", "Retain changed textures (speedup, mem hog)"))); texSecondary_->OnClick.Add([=](EventParams &e) { @@ -517,12 +544,18 @@ void GameSettingsScreen::CreateViews() { // graphicsSettings->Add(new CheckBox(&g_Config.bFXAA, gr->T("FXAA"))); graphicsSettings->Add(new ItemHeader(gr->T("Texture Scaling"))); #ifndef MOBILE_DEVICE - static const char *texScaleLevels[] = {"Auto", "Off", "2x", "3x", "4x", "5x", "6x"}; + static const char *texScaleLevels[] = {"Off", "2x", "3x", "4x", "5x", "6x"}; #else - static const char *texScaleLevels[] = {"Auto", "Off", "2x", "3x"}; + static const char *texScaleLevels[] = {"Off", "2x", "3x"}; #endif - PopupMultiChoice *texScalingChoice = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iTexScalingLevel, gr->T("Upscale Level"), texScaleLevels, 0, ARRAY_SIZE(texScaleLevels), gr->GetName(), screenManager())); + if (!g_Config.bSimpleUI) { + static const char *texScaleAlgos[] = { "xBRZ", "Hybrid", "Bicubic", "Hybrid + Bicubic", }; + PopupMultiChoice *texScalingType = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iTexScalingType, gr->T("Upscale Type"), texScaleAlgos, 0, ARRAY_SIZE(texScaleAlgos), gr->GetName(), screenManager())); + texScalingType->SetEnabledFunc([]() { + return !g_Config.bSoftwareRendering && !UsingHardwareTextureScaling(); + }); + PopupMultiChoice *texScalingChoice = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iTexScalingLevel, gr->T("Upscale Level"), texScaleLevels, 1, ARRAY_SIZE(texScaleLevels), gr->GetName(), screenManager())); // TODO: Better check? When it won't work, it scales down anyway. if (!gl_extensions.OES_texture_npot && GetGPUBackend() == GPUBackend::OPENGL) { texScalingChoice->HideChoice(3); // 3x @@ -534,11 +567,7 @@ void GameSettingsScreen::CreateViews() { } return UI::EVENT_CONTINUE; }); - - if (!g_Config.bSimpleUI) { - static const char *texScaleAlgos[] = { "xBRZ", "Hybrid", "Bicubic", "Hybrid + Bicubic" }; - PopupMultiChoice *texScalingType = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iTexScalingType, gr->T("Upscale Type"), texScaleAlgos, 0, ARRAY_SIZE(texScaleAlgos), gr->GetName(), screenManager())); - texScalingType->SetEnabledFunc([]() { + texScalingChoice->SetEnabledFunc([]() { return !g_Config.bSoftwareRendering && !UsingHardwareTextureScaling(); }); @@ -616,15 +645,9 @@ void GameSettingsScreen::CreateViews() { dump->SetEnabled(false); } // Audio - ViewGroup *audioSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); - audioSettingsScroll->SetTag("GameSettingsAudio"); - LinearLayout *audioSettings = new LinearLayoutList(ORIENT_VERTICAL); - audioSettings->SetSpacing(0); - audioSettingsScroll->Add(audioSettings); - tabHolder->AddTab(ms->T("Audio"), audioSettingsScroll); + LinearLayout *audioSettings = AddTab("GameSettingsAudio", ms->T("Audio")); audioSettings->Add(new ItemHeader(ms->T("Audio"))); - audioSettings->Add(new CheckBox(&g_Config.bEnableSound, a->T("Enable Sound"))); PopupSliderChoice *volume = audioSettings->Add(new PopupSliderChoice(&g_Config.iGlobalVolume, VOLUME_OFF, VOLUME_FULL, a->T("Global volume"), screenManager())); @@ -689,12 +712,8 @@ void GameSettingsScreen::CreateViews() { atracmp3Vol->SetEnabledPtr(&g_Config.bEnableSound); } // Control - ViewGroup *controlsSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); - controlsSettingsScroll->SetTag("GameSettingsControls"); - LinearLayout *controlsSettings = new LinearLayoutList(ORIENT_VERTICAL); - controlsSettings->SetSpacing(0); - controlsSettingsScroll->Add(controlsSettings); - tabHolder->AddTab(ms->T("Controls"), controlsSettingsScroll); + LinearLayout *controlsSettings = AddTab("GameSettingsControls", ms->T("Controls")); + controlsSettings->Add(new ItemHeader(ms->T("Controls"))); controlsSettings->Add(new Choice(co->T("Control Mapping")))->OnClick.Handle(this, &GameSettingsScreen::OnControlMapping); controlsSettings->Add(new Choice(co->T("Calibrate Analog Stick")))->OnClick.Handle(this, &GameSettingsScreen::OnCalibrateAnalogs); @@ -799,12 +818,7 @@ void GameSettingsScreen::CreateViews() { controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fMouseSmoothing, 0.0f, 0.95f, co->T("Mouse smoothing"), 0.05f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bMouseControl); #endif - ViewGroup *networkingSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); - networkingSettingsScroll->SetTag("GameSettingsNetworking"); - LinearLayout *networkingSettings = new LinearLayoutList(ORIENT_VERTICAL); - networkingSettings->SetSpacing(0); - networkingSettingsScroll->Add(networkingSettings); - tabHolder->AddTab(ms->T("Networking"), networkingSettingsScroll); + LinearLayout *networkingSettings = AddTab("GameSettingsNetworking", ms->T("Networking")); networkingSettings->Add(new ItemHeader(ms->T("Networking"))); @@ -869,11 +883,13 @@ void GameSettingsScreen::CreateViews() { #endif #if defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) - qc1->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat0); - qc2->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat1); - qc3->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat2); - qc4->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat3); - qc5->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat4); + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { + qc1->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat0); + qc2->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat1); + qc3->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat2); + qc4->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat3); + qc5->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat4); + } #endif networkingSettings->Add(new ItemHeader(n->T("Misc", "Misc (default = compatibility)"))); @@ -881,12 +897,7 @@ void GameSettingsScreen::CreateViews() { networkingSettings->Add(new PopupSliderChoice(&g_Config.iMinTimeout, 0, 15000, n->T("Minimum Timeout", "Minimum Timeout (override in ms, 0 = default)"), 50, screenManager())); networkingSettings->Add(new CheckBox(&g_Config.bForcedFirstConnect, n->T("Forced First Connect", "Forced First Connect (faster Connect)"))); - ViewGroup *toolsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); - toolsScroll->SetTag("GameSettingsTools"); - LinearLayout *tools = new LinearLayoutList(ORIENT_VERTICAL); - tools->SetSpacing(0); - toolsScroll->Add(tools); - tabHolder->AddTab(ms->T("Tools"), toolsScroll); + LinearLayout *tools = AddTab("GameSettingsTools", ms->T("Tools")); tools->Add(new ItemHeader(ms->T("Tools"))); // These were moved here so use the wrong translation objects, to avoid having to change all inis... This isn't a sustainable situation :P @@ -899,12 +910,7 @@ void GameSettingsScreen::CreateViews() { tools->Add(new Choice(ri->T("Remote disc streaming")))->OnClick.Handle(this, &GameSettingsScreen::OnRemoteISO); // System - ViewGroup *systemSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); - systemSettingsScroll->SetTag("GameSettingsSystem"); - LinearLayout *systemSettings = new LinearLayoutList(ORIENT_VERTICAL); - systemSettings->SetSpacing(0); - systemSettingsScroll->Add(systemSettings); - tabHolder->AddTab(ms->T("System"), systemSettingsScroll); + LinearLayout *systemSettings = AddTab("GameSettingsSystem", ms->T("System")); if (!g_Config.bSimpleUI) { systemSettings->Add(new ItemHeader(sy->T("UI"))); @@ -925,41 +931,28 @@ void GameSettingsScreen::CreateViews() { static const char *backgroundAnimations[] = { "No animation", "Floating symbols", "Recent games", "Waves", "Moving background" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iBackgroundAnimation, sy->T("UI background animation"), backgroundAnimations, 0, ARRAY_SIZE(backgroundAnimations), sy->GetName(), screenManager())); - systemSettings->Add(new ItemHeader(sy->T("Help the PPSSPP team"))); - if (!enableReportsSet_) - enableReports_ = Reporting::IsEnabled(); - enableReportsSet_ = true; - enableReportsCheckbox_ = new CheckBox(&enableReports_, sy->T("Enable Compatibility Server Reports")); - enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); - systemSettings->Add(enableReportsCheckbox_); - - systemSettings->Add(new ItemHeader(sy->T("Emulation"))); - - systemSettings->Add(new CheckBox(&g_Config.bFastMemory, sy->T("Fast Memory", "Fast Memory")))->OnClick.Handle(this, &GameSettingsScreen::OnJitAffectingSetting); - systemSettings->Add(new CheckBox(&g_Config.bIgnoreBadMemAccess, sy->T("Ignore bad memory accesses"))); - - systemSettings->Add(new CheckBox(&g_Config.bSeparateIOThread, sy->T("I/O on thread (experimental)")))->SetEnabled(!PSP_IsInited()); - static const char *ioTimingMethods[] = { "Fast (lag on slow storage)", "Host (bugs, less lag)", "Simulate UMD delays" }; - View *ioTimingMethod = systemSettings->Add(new PopupMultiChoice(&g_Config.iIOTimingMethod, sy->T("IO timing method"), ioTimingMethods, 0, ARRAY_SIZE(ioTimingMethods), sy->GetName(), screenManager())); - ioTimingMethod->SetEnabledPtr(&g_Config.bSeparateIOThread); - systemSettings->Add(new CheckBox(&g_Config.bForceLagSync, sy->T("Force real clock sync (slower, less lag)"))); - PopupSliderChoice *lockedMhz = systemSettings->Add(new PopupSliderChoice(&g_Config.iLockedCPUSpeed, 0, 1000, sy->T("Change CPU Clock", "Change CPU Clock (unstable)"), screenManager(), sy->T("MHz, 0:default"))); - lockedMhz->OnChange.Add([&](UI::EventParams &) { - enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); - return UI::EVENT_CONTINUE; - }); - lockedMhz->SetZeroLabel(sy->T("Auto")); - PopupSliderChoice *rewindFreq = systemSettings->Add(new PopupSliderChoice(&g_Config.iRewindFlipFrequency, 0, 1800, sy->T("Rewind Snapshot Frequency", "Rewind Snapshot Frequency (mem hog)"), screenManager(), sy->T("frames, 0:off"))); - rewindFreq->SetZeroLabel(sy->T("Off")); - systemSettings->Add(new ItemHeader(sy->T("PSP Memory Stick"))); +#if (defined(USING_QT_UI) || PPSSPP_PLATFORM(WINDOWS) || PPSSPP_PLATFORM(MAC)) && !PPSSPP_PLATFORM(UWP) + systemSettings->Add(new Choice(sy->T("Show Memory Stick folder")))->OnClick.Handle(this, &GameSettingsScreen::OnOpenMemStick); +#endif + } #if PPSSPP_PLATFORM(ANDROID) memstickDisplay_ = g_Config.memStickDirectory.ToVisualString(); - auto memstickPath = systemSettings->Add(new ChoiceWithValueDisplay(&memstickDisplay_, sy->T("Change Memory Stick folder", "Memory Stick folder"), (const char *)nullptr)); + auto memstickPath = systemSettings->Add(new ChoiceWithValueDisplay(&memstickDisplay_, sy->T("Memory Stick folder", "Memory Stick folder"), (const char *)nullptr)); memstickPath->SetEnabled(!PSP_IsInited()); memstickPath->OnClick.Handle(this, &GameSettingsScreen::OnChangeMemStickDir); + + // Display USB path for convenience. + std::string usbPath; + if (PathToVisualUsbPath(g_Config.memStickDirectory, usbPath)) { + if (usbPath.empty()) { + // Probably it's just the root. So let's add PSP to make it clear. + usbPath = "/PSP"; + } + systemSettings->Add(new InfoItem(sy->T("USB"), usbPath))->SetChoiceStyle(true); + } #elif defined(_WIN32) && !PPSSPP_PLATFORM(UWP) SavePathInMyDocumentChoice = systemSettings->Add(new CheckBox(&installed_, sy->T("Save path in My Documents", "Save path in My Documents"))); SavePathInMyDocumentChoice->SetEnabled(!PSP_IsInited()); @@ -1005,7 +998,33 @@ void GameSettingsScreen::CreateViews() { } #endif systemSettings->Add(new CheckBox(&g_Config.bMemStickInserted, sy->T("Memory Stick inserted"))); - systemSettings->Add(new PopupSliderChoice(&g_Config.iMemStickSizeGB, 1, 32, sy->T("Change Memory Stick Size", "Memory Stick Size (GB)"), screenManager(), "GB")); + UI::PopupSliderChoice *sizeChoice = systemSettings->Add(new PopupSliderChoice(&g_Config.iMemStickSizeGB, 1, 32, sy->T("Memory Stick size", "Memory Stick size"), screenManager(), "GB")); + sizeChoice->SetFormat("%d GB"); + + systemSettings->Add(new ItemHeader(sy->T("Help the PPSSPP team"))); + if (!enableReportsSet_) + enableReports_ = Reporting::IsEnabled(); + enableReportsSet_ = true; + enableReportsCheckbox_ = new CheckBox(&enableReports_, sy->T("Enable Compatibility Server Reports")); + enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); + systemSettings->Add(enableReportsCheckbox_); + + systemSettings->Add(new ItemHeader(sy->T("Emulation"))); + + systemSettings->Add(new CheckBox(&g_Config.bFastMemory, sy->T("Fast Memory", "Fast Memory")))->OnClick.Handle(this, &GameSettingsScreen::OnJitAffectingSetting); + systemSettings->Add(new CheckBox(&g_Config.bIgnoreBadMemAccess, sy->T("Ignore bad memory accesses"))); + + static const char *ioTimingMethods[] = { "Fast (lag on slow storage)", "Host (bugs, less lag)", "Simulate UMD delays" }; + View *ioTimingMethod = systemSettings->Add(new PopupMultiChoice(&g_Config.iIOTimingMethod, sy->T("IO timing method"), ioTimingMethods, 0, ARRAY_SIZE(ioTimingMethods), sy->GetName(), screenManager())); + systemSettings->Add(new CheckBox(&g_Config.bForceLagSync, sy->T("Force real clock sync (slower, less lag)"))); + PopupSliderChoice *lockedMhz = systemSettings->Add(new PopupSliderChoice(&g_Config.iLockedCPUSpeed, 0, 1000, sy->T("Change CPU Clock", "Change CPU Clock (unstable)"), screenManager(), sy->T("MHz, 0:default"))); + lockedMhz->OnChange.Add([&](UI::EventParams &) { + enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); + return UI::EVENT_CONTINUE; + }); + lockedMhz->SetZeroLabel(sy->T("Auto")); + PopupSliderChoice *rewindFreq = systemSettings->Add(new PopupSliderChoice(&g_Config.iRewindFlipFrequency, 0, 1800, sy->T("Rewind Snapshot Frequency", "Rewind Snapshot Frequency (mem hog)"), screenManager(), sy->T("frames, 0:off"))); + rewindFreq->SetZeroLabel(sy->T("Off")); systemSettings->Add(new ItemHeader(sy->T("General"))); @@ -1027,9 +1046,8 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new CheckBox(&g_Config.bEnableStateUndo, sy->T("Savestate slot backups"))); static const char *autoLoadSaveStateChoices[] = { "Off", "Oldest Save", "Newest Save", "Slot 1", "Slot 2", "Slot 3", "Slot 4", "Slot 5" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iAutoLoadSaveState, sy->T("Auto Load Savestate"), autoLoadSaveStateChoices, 0, ARRAY_SIZE(autoLoadSaveStateChoices), sy->GetName(), screenManager())); -#if defined(USING_WIN_UI) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) - systemSettings->Add(new CheckBox(&g_Config.bBypassOSKWithKeyboard, sy->T("Use system native keyboard"))); -#endif + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) + systemSettings->Add(new CheckBox(&g_Config.bBypassOSKWithKeyboard, sy->T("Use system native keyboard"))); #if PPSSPP_ARCH(AMD64) systemSettings->Add(new CheckBox(&g_Config.bCacheFullIsoInRam, sy->T("Cache ISO in RAM", "Cache full ISO in RAM")))->SetEnabled(!PSP_IsInited()); @@ -1053,7 +1071,10 @@ void GameSettingsScreen::CreateViews() { #if !defined(MOBILE_DEVICE) && !defined(USING_QT_UI) // TODO: Add all platforms where KEY_CHAR support is added systemSettings->Add(new PopupTextInputChoice(&g_Config.sNickName, sy->T("Change Nickname"), "", 32, screenManager())); #elif PPSSPP_PLATFORM(ANDROID) - systemSettings->Add(new ChoiceWithValueDisplay(&g_Config.sNickName, sy->T("Change Nickname"), (const char *)nullptr))->OnClick.Handle(this, &GameSettingsScreen::OnChangeNickname); + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) + systemSettings->Add(new ChoiceWithValueDisplay(&g_Config.sNickName, sy->T("Change Nickname"), (const char *)nullptr))->OnClick.Handle(this, &GameSettingsScreen::OnChangeNickname); + else + systemSettings->Add(new PopupTextInputChoice(&g_Config.sNickName, sy->T("Change Nickname"), "", 32, screenManager())); #endif if (!g_Config.bSimpleUI) { systemSettings->Add(new CheckBox(&g_Config.bScreenshotsAsPNG, sy->T("Screenshots as PNG"))); @@ -1068,16 +1089,52 @@ void GameSettingsScreen::CreateViews() { } systemSettings->Add(new CheckBox(&g_Config.bSaveLoadResetsAVdumping, sy->T("Reset Recording on Save/Load State"))); #endif - if (!g_Config.bSimpleUI) { +if (!g_Config.bSimpleUI) { systemSettings->Add(new CheckBox(&g_Config.bDayLightSavings, sy->T("Day Light Saving"))); - static const char *dateFormat[] = { "YYYYMMDD", "MMDDYYYY", "DDMMYYYY" }; + static const char* dateFormat[] = { "YYYYMMDD", "MMDDYYYY", "DDMMYYYY" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iDateFormat, sy->T("Date Format"), dateFormat, 0, 3, sy->GetName(), screenManager())); - static const char *timeFormat[] = { "24HR", "12HR" }; + static const char* timeFormat[] = { "24HR", "12HR" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iTimeFormat, sy->T("Time Format"), timeFormat, 0, 2, sy->GetName(), screenManager())); - static const char *buttonPref[] = { "Use O to confirm", "Use X to confirm" }; + static const char* buttonPref[] = { "Use O to confirm", "Use X to confirm" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iButtonPreference, sy->T("Confirmation Button"), buttonPref, 0, 2, sy->GetName(), screenManager())); + + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { + // Search + LinearLayout* searchSettings = AddTab("GameSettingsSearch", ms->T("Search"), true); + + searchSettings->Add(new ItemHeader(se->T("Find settings"))); + searchSettings->Add(new ChoiceWithValueDisplay(&searchFilter_, se->T("Filter"), (const char*)nullptr))->OnClick.Handle(this, &GameSettingsScreen::OnChangeSearchFilter); + clearSearchChoice_ = searchSettings->Add(new Choice(se->T("Clear filter"))); + clearSearchChoice_->OnClick.Handle(this, &GameSettingsScreen::OnClearSearchFilter); + noSearchResults_ = searchSettings->Add(new TextView(se->T("No settings matched '%1'"), new LinearLayoutParams(Margins(20, 5)))); + + ApplySearchFilter(); } } +} + +UI::LinearLayout *GameSettingsScreen::AddTab(const char *tag, const std::string &title, bool isSearch) { + auto se = GetI18NCategory("Search"); + + using namespace UI; + ViewGroup *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); + scroll->SetTag(tag); + + LinearLayout *contents = new LinearLayoutList(ORIENT_VERTICAL); + contents->SetSpacing(0); + scroll->Add(contents); + tabHolder_->AddTab(title, scroll); + + if (!isSearch) { + settingTabContents_.push_back(contents); + + auto notice = contents->Add(new TextView(se->T("Filtering settings by '%1'"), new LinearLayoutParams(Margins(20, 5)))); + notice->SetVisibility(V_GONE); + settingTabFilterNotices_.push_back(notice); + } + + return contents; +} UI::EventReturn GameSettingsScreen::OnAutoFrameskip(UI::EventParams &e) { if (g_Config.bAutoFrameSkip && g_Config.iFrameSkip == 0) { @@ -1162,6 +1219,11 @@ UI::EventReturn GameSettingsScreen::OnChangeMemStickDir(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GameSettingsScreen::OnOpenMemStick(UI::EventParams &e) { + OpenDirectory(File::ResolvePath(g_Config.memStickDirectory.ToString().c_str()).c_str()); + return UI::EVENT_DONE; +} + #if defined(_WIN32) && !PPSSPP_PLATFORM(UWP) UI::EventReturn GameSettingsScreen::OnSavePathMydoc(UI::EventParams &e) { @@ -1316,6 +1378,50 @@ void GameSettingsScreen::sendMessage(const char *message, const char *value) { g_Config.bShaderChainRequires60FPS = PostShaderChainRequires60FPS(GetFullPostShadersChain(g_Config.vPostShaderNames)); RecreateViews(); } + if (!strcmp(message, "gameSettings_search")) { + std::string filter = value ? value : ""; + searchFilter_.resize(filter.size()); + std::transform(filter.begin(), filter.end(), searchFilter_.begin(), tolower); + + ApplySearchFilter(); + } +} + +void GameSettingsScreen::ApplySearchFilter() { + auto se = GetI18NCategory("Search"); + + bool matches = searchFilter_.empty(); + for (int t = 0; t < (int)settingTabContents_.size(); ++t) { + auto tabContents = settingTabContents_[t]; + bool tabMatches = searchFilter_.empty(); + + // Show an indicator that a filter is applied. + settingTabFilterNotices_[t]->SetVisibility(tabMatches ? UI::V_GONE : UI::V_VISIBLE); + settingTabFilterNotices_[t]->SetText(ReplaceAll(se->T("Filtering settings by '%1'"), "%1", searchFilter_)); + + UI::View *lastHeading = nullptr; + for (int i = 1; i < tabContents->GetNumSubviews(); ++i) { + UI::View *v = tabContents->GetViewByIndex(i); + if (!v->CanBeFocused()) { + lastHeading = v; + } + + std::string label = v->DescribeText(); + std::transform(label.begin(), label.end(), label.begin(), tolower); + bool match = v->CanBeFocused() && label.find(searchFilter_) != label.npos; + tabMatches = tabMatches || match; + + if (match && lastHeading) + lastHeading->SetVisibility(UI::V_VISIBLE); + v->SetVisibility(searchFilter_.empty() || match ? UI::V_VISIBLE : UI::V_GONE); + } + tabHolder_->EnableTab(t, tabMatches); + matches = matches || tabMatches; + } + + noSearchResults_->SetText(ReplaceAll(se->T("No settings matched '%1'"), "%1", searchFilter_)); + noSearchResults_->SetVisibility(matches ? UI::V_GONE : UI::V_VISIBLE); + clearSearchChoice_->SetVisibility(searchFilter_.empty() ? UI::V_GONE : UI::V_VISIBLE); } void GameSettingsScreen::dialogFinished(const Screen *dialog, DialogResult result) { @@ -1642,6 +1748,23 @@ UI::EventReturn GameSettingsScreen::OnSysInfo(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GameSettingsScreen::OnChangeSearchFilter(UI::EventParams &e) { +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) + auto se = GetI18NCategory("Search"); + System_InputBoxGetString(se->T("Search term"), searchFilter_, [this](bool result, const std::string &value) { + if (result) { + NativeMessageReceived("gameSettings_search", StripSpaces(value).c_str()); + } + }); +#endif + return UI::EVENT_DONE; +} + +UI::EventReturn GameSettingsScreen::OnClearSearchFilter(UI::EventParams &e) { + NativeMessageReceived("gameSettings_search", ""); + return UI::EVENT_DONE; +} + void DeveloperToolsScreen::CreateViews() { using namespace UI; root_ = new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT)); @@ -1944,7 +2067,8 @@ void HostnameSelectScreen::CreatePopupContents(UI::ViewGroup *parent) { buttonsRow2->Add(new Spacer(new LinearLayoutParams(1.0, G_LEFT))); #if PPSSPP_PLATFORM(ANDROID) - buttonsRow2->Add(new Button(di->T("Edit")))->OnClick.Handle(this, &HostnameSelectScreen::OnEditClick); // Since we don't have OnClick Event triggered from TextEdit's Touch().. here we go! + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) + buttonsRow2->Add(new Button(di->T("Edit")))->OnClick.Handle(this, &HostnameSelectScreen::OnEditClick); #endif buttonsRow2->Add(new Button(di->T("Delete")))->OnClick.Handle(this, &HostnameSelectScreen::OnDeleteClick); buttonsRow2->Add(new Button(di->T("Delete all")))->OnClick.Handle(this, &HostnameSelectScreen::OnDeleteAllClick); @@ -2130,9 +2254,8 @@ void GestureMappingScreen::CreateViews() { auto mc = GetI18NCategory("MappableControls"); root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); - Choice *back = new Choice(di->T("Back"), "", false, new AnchorLayoutParams(130, WRAP_CONTENT, 10, NONE, NONE, 10)); - root_->Add(back)->OnClick.Handle(this, &UIScreen::OnBack); - TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, 140, new AnchorLayoutParams(10, 0, 10, 0, false)); + AddStandardBack(root_); + TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, 200, new AnchorLayoutParams(10, 0, 10, 0, false)); root_->Add(tabHolder); ScrollView *rightPanel = new ScrollView(ORIENT_VERTICAL); tabHolder->AddTab(co->T("Gesture"), rightPanel); diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 743c8e562c..0cddc7f11b 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -47,6 +47,8 @@ protected: void RecreateViews() override; private: + UI::LinearLayout *AddTab(const char *tag, const std::string &title, bool isSearch = false); + void ApplySearchFilter(); void TriggerRestart(const char *why); std::string gameID_; @@ -59,6 +61,8 @@ private: UI::PopupMultiChoice *resolutionChoice_; UI::CheckBox *frameSkipAuto_; SettingInfoMessage *settingInfo_; + UI::Choice *clearSearchChoice_; + UI::TextView *noSearchResults_; #ifdef _WIN32 UI::CheckBox *SavePathInMyDocumentChoice; UI::CheckBox *SavePathInOtherChoice; @@ -69,6 +73,10 @@ private: std::string memstickDisplay_; + UI::TabHolder *tabHolder_; + std::vector settingTabContents_; + std::vector settingTabFilterNotices_; + // Event handlers UI::EventReturn OnControlMapping(UI::EventParams &e); UI::EventReturn OnCalibrateAnalogs(UI::EventParams &e); @@ -110,6 +118,7 @@ private: UI::EventReturn OnAudioDevice(UI::EventParams &e); UI::EventReturn OnJitAffectingSetting(UI::EventParams &e); UI::EventReturn OnChangeMemStickDir(UI::EventParams &e); + UI::EventReturn OnOpenMemStick(UI::EventParams &e); #if defined(_WIN32) && !PPSSPP_PLATFORM(UWP) UI::EventReturn OnSavePathMydoc(UI::EventParams &e); UI::EventReturn OnSavePathOther(UI::EventParams &e); @@ -125,6 +134,8 @@ private: UI::EventReturn OnSavedataManager(UI::EventParams &e); UI::EventReturn OnSysInfo(UI::EventParams &e); + UI::EventReturn OnChangeSearchFilter(UI::EventParams &e); + UI::EventReturn OnClearSearchFilter(UI::EventParams &e); // Temporaries to convert setting types, cache enabled, etc. int iAlternateSpeedPercent1_; @@ -134,6 +145,7 @@ private: bool enableReportsSet_ = false; bool tessHWEnable_; std::string shaderNames_[256]; + std::string searchFilter_; //edit the game-specific settings and restore the global settings after exiting bool editThenRestore_; diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 63f36632e3..4089dc9390 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -97,16 +97,13 @@ void MultiTouchButton::GetContentDimensions(const UIContext &dc, float &w, float } void MultiTouchButton::Touch(const TouchInput &input) { - if (analogPointerMask & (1 << input.id)) - return; - GamepadView::Touch(input); if ((input.flags & TOUCH_DOWN) && bounds_.Contains(input.x, input.y)) { pointerDownMask_ |= 1 << input.id; usedPointerMask |= 1 << input.id; } if (input.flags & TOUCH_MOVE) { - if (bounds_.Contains(input.x, input.y)) + if (bounds_.Contains(input.x, input.y) && !(analogPointerMask & (1 << input.id))) pointerDownMask_ |= 1 << input.id; else pointerDownMask_ &= ~(1 << input.id); @@ -156,9 +153,6 @@ void MultiTouchButton::Draw(UIContext &dc) { } void BoolButton::Touch(const TouchInput &input) { - if (analogPointerMask & (1 << input.id)) - return; - bool lastDown = pointerDownMask_ != 0; MultiTouchButton::Touch(input); bool down = pointerDownMask_ != 0; @@ -172,9 +166,6 @@ void BoolButton::Touch(const TouchInput &input) { } void PSPButton::Touch(const TouchInput &input) { - if (analogPointerMask & (1 << input.id)) - return; - bool lastDown = pointerDownMask_ != 0; MultiTouchButton::Touch(input); bool down = pointerDownMask_ != 0; @@ -202,9 +193,6 @@ void ComboKey::GetContentDimensions(const UIContext &dc, float &w, float &h) con } void ComboKey::Touch(const TouchInput &input) { - if (analogPointerMask & (1 << input.id)) - return; - using namespace CustomKey; bool lastDown = pointerDownMask_ != 0; MultiTouchButton::Touch(input); @@ -244,9 +232,6 @@ void PSPDpad::GetContentDimensions(const UIContext &dc, float &w, float &h) cons } void PSPDpad::Touch(const TouchInput &input) { - if (analogPointerMask & (1 << input.id)) - return; - GamepadView::Touch(input); if (input.flags & TOUCH_DOWN) { @@ -257,7 +242,7 @@ void PSPDpad::Touch(const TouchInput &input) { } } if (input.flags & TOUCH_MOVE) { - if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y)) { + if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y) && !(analogPointerMask & (1 << input.id))) { dragPointerId_ = input.id; } if (input.id == dragPointerId_) { diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 655fbaf7c3..3b320b3ce8 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -212,44 +212,42 @@ protected: namespace CustomKey { // Image list struct keyImage { - const char* n; // UI name ImageID i; // ImageID float r; // Rotation angle in degree }; static const keyImage comboKeyImages[] = { - { "1", ImageID("I_1"), 0.0f }, - { "2", ImageID("I_2"), 0.0f }, - { "3", ImageID("I_3"), 0.0f }, - { "4", ImageID("I_4"), 0.0f }, - { "5", ImageID("I_5"), 0.0f }, - { "6", ImageID("I_6"), 0.0f }, - { "A", ImageID("I_A"), 0.0f }, - { "B", ImageID("I_B"), 0.0f }, - { "C", ImageID("I_C"), 0.0f }, - { "D", ImageID("I_D"), 0.0f }, - { "E", ImageID("I_E"), 0.0f }, - { "F", ImageID("I_F"), 0.0f }, - { "Circle", ImageID("I_CIRCLE"), 0.0f }, - { "Cross", ImageID("I_CROSS"), 0.0f }, - { "Square", ImageID("I_SQUARE"), 0.0f }, - { "Triangle", ImageID("I_TRIANGLE"), 0.0f }, - { "L", ImageID("I_L"), 0.0f }, - { "R", ImageID("I_R"), 0.0f }, - { "Start", ImageID("I_START"), 0.0f }, - { "Select", ImageID("I_SELECT"), 0.0f }, - { "Plus", ImageID("I_CROSS"), 45.0f }, - { "Rhombus", ImageID("I_SQUARE"), 45.0f }, - { "Down Triangle", ImageID("I_TRIANGLE"), 180.0f }, - { "Arrow up", ImageID("I_ARROW"), 90.0f}, - { "Arrow down", ImageID("I_ARROW"), 270.0f}, - { "Arrow left", ImageID("I_ARROW"), 0.0f}, - { "Arrow right", ImageID("I_ARROW"), 180.0f}, - { "Gear", ImageID("I_GEAR"), 0.0f}, + { ImageID("I_1"), 0.0f }, + { ImageID("I_2"), 0.0f }, + { ImageID("I_3"), 0.0f }, + { ImageID("I_4"), 0.0f }, + { ImageID("I_5"), 0.0f }, + { ImageID("I_6"), 0.0f }, + { ImageID("I_A"), 0.0f }, + { ImageID("I_B"), 0.0f }, + { ImageID("I_C"), 0.0f }, + { ImageID("I_D"), 0.0f }, + { ImageID("I_E"), 0.0f }, + { ImageID("I_F"), 0.0f }, + { ImageID("I_CIRCLE"), 0.0f }, + { ImageID("I_CROSS"), 0.0f }, + { ImageID("I_SQUARE"), 0.0f }, + { ImageID("I_TRIANGLE"), 0.0f }, + { ImageID("I_L"), 0.0f }, + { ImageID("I_R"), 0.0f }, + { ImageID("I_START"), 0.0f }, + { ImageID("I_SELECT"), 0.0f }, + { ImageID("I_CROSS"), 45.0f }, + { ImageID("I_SQUARE"), 45.0f }, + { ImageID("I_TRIANGLE"), 180.0f }, + { ImageID("I_ARROW"), 90.0f}, + { ImageID("I_ARROW"), 270.0f}, + { ImageID("I_ARROW"), 0.0f}, + { ImageID("I_ARROW"), 180.0f}, + { ImageID("I_GEAR"), 0.0f}, }; // Shape list struct keyShape { - const char* n; // UI name ImageID i; // ImageID ImageID l; // ImageID line version float r; // Rotation angle in dregree @@ -257,15 +255,16 @@ namespace CustomKey { bool d; // Invert height and width for context dimension (for example for 90 degree rot) }; static const keyShape comboKeyShapes[] = { - { "Circle", ImageID("I_ROUND"), ImageID("I_ROUND_LINE"), 0.0f, false, false }, - { "Rectangle", ImageID("I_RECT"), ImageID("I_RECT_LINE"), 0.0f, false, false }, - { "Vertical Rectangle", ImageID("I_RECT"), ImageID("I_RECT_LINE"), 90.0f, false, true }, - { "L button", ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, false, false }, - { "R button", ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, true, false }, - { "Arrow up", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 270.0f, false, true }, - { "Arrow down", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 90.0f, false, true }, - { "Arrow left", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 180.0f, false, false }, - { "Arrow right", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 0.0f, false, false }, + { ImageID("I_ROUND"), ImageID("I_ROUND_LINE"), 0.0f, false, false }, + { ImageID("I_RECT"), ImageID("I_RECT_LINE"), 0.0f, false, false }, + { ImageID("I_RECT"), ImageID("I_RECT_LINE"), 90.0f, false, true }, + { ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, false, false }, + { ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, true, false }, + { ImageID("I_DIR"), ImageID("I_DIR_LINE"), 270.0f, false, true }, + { ImageID("I_DIR"), ImageID("I_DIR_LINE"), 90.0f, false, true }, + { ImageID("I_DIR"), ImageID("I_DIR_LINE"), 180.0f, false, false }, + { ImageID("I_DIR"), ImageID("I_DIR_LINE"), 0.0f, false, false }, + { ImageID("I_SQUARE_SHAPE"), ImageID("I_SQUARE_SHAPE_LINE"), 0.0f, false, false }, }; // Button list diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 93ff0816df..6188f3459d 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -341,7 +341,7 @@ void GameButton::Draw(UIContext &dc) { dc.MeasureText(dc.GetFontStyle(), 0.7f, 0.7f, ginfo->id_version.c_str(), &vw, &vh, 0); availableWidth -= vw + 20; dc.SetFontScale(0.7f, 0.7f); - dc.DrawText(ginfo->id_version.c_str(), availableWidth + 160, bounds_.centerY(), style.fgColor, ALIGN_VCENTER); + dc.DrawText(ginfo->id_version.c_str(), bounds_.x + availableWidth + 160, bounds_.centerY(), style.fgColor, ALIGN_VCENTER); dc.SetFontScale(1.0f, 1.0f); } float sineWidth = std::max(0.0f, (tw - availableWidth)) / 2.0f; @@ -680,7 +680,7 @@ void GameBrowser::Refresh() { topBar->Add(new Choice(ImageID("I_SDCARD"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::StorageClick); } if (System_GetPropertyBool(SYSPROP_HAS_FOLDER_BROWSER)) { - topBar->Add(new Choice(mm->T("Browse", "Browse..."), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::BrowseClick); + topBar->Add(new Choice(mm->T("Browse"), ImageID("I_FOLDER_OPEN"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::BrowseClick); } } else { topBar->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 64.0f, 1.0f))); @@ -1007,7 +1007,7 @@ void MainScreen::CreateViews() { Button *focusButton = nullptr; if (hasStorageAccess) { - scrollAllGames_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT), true); + scrollAllGames_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); scrollAllGames_->SetTag("MainScreenAllGames"); ScrollView *scrollHomebrew = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); scrollHomebrew->SetTag("MainScreenHomebrew"); @@ -1026,7 +1026,7 @@ void MainScreen::CreateViews() { tabHolder_->AddTab(mm->T("Games"), scrollAllGames_); tabHolder_->AddTab(mm->T("Homebrew & Demos"), scrollHomebrew); - scrollAllGames_->ScrollTo(g_Config.fGameListScrollPosition); + scrollAllGames_->RememberPosition(&g_Config.fGameListScrollPosition); tabAllGames->OnChoice.Handle(this, &MainScreen::OnGameSelectedInstant); tabHomebrew->OnChoice.Handle(this, &MainScreen::OnGameSelectedInstant); @@ -1245,9 +1245,6 @@ void MainScreen::update() { RecreateViews(); lastVertical_ = vertical; } - if (scrollAllGames_) { - g_Config.fGameListScrollPosition = scrollAllGames_->GetScrollPosition(); - } } bool MainScreen::UseVerticalLayout() const { diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 8f15edc91d..ef617c5b5c 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -38,16 +38,17 @@ #include "Common/Thread/ThreadManager.h" -#include "Core/Util/GameManager.h" -#include "Core/System.h" #include "Core/Config.h" +#include "Core/Reporting.h" +#include "Core/System.h" +#include "Core/Util/GameManager.h" #include "UI/MemStickScreen.h" #include "UI/MainScreen.h" #include "UI/MiscScreens.h" static bool FolderSeemsToBeUsed(Path newMemstickFolder) { - // Inspect the potential new folder. + // Inspect the potential new folder, quickly. if (File::Exists(newMemstickFolder / "PSP/SAVEDATA") || File::Exists(newMemstickFolder / "SAVEDATA")) { // Does seem likely. We could add more criteria like checking for actual savegames or something. return true; @@ -79,7 +80,7 @@ static bool SwitchMemstickFolderTo(Path newMemstickFolder) { std::string str = newMemstickFolder.ToString(); if (!File::WriteDataToFile(true, str.c_str(), (unsigned int)str.size(), memStickDirFile)) { ERROR_LOG(SYSTEM, "Failed to write memstick path '%s' to '%s'", newMemstickFolder.c_str(), memStickDirFile.c_str()); - // Not sure what to do if this file. + // Not sure what to do if this file can't be written. Disk full? } // Save so the settings, at least, are transferred. @@ -102,6 +103,86 @@ static std::string FormatSpaceString(int64_t space) { MemStickScreen::MemStickScreen(bool initialSetup) : initialSetup_(initialSetup) { +#if PPSSPP_PLATFORM(ANDROID) + // Let's only offer the browse-for-folder choice on Android 10 or later. + // Earlier versions often don't really have working folder browsers. + storageBrowserWorking_ = System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 29; +#else + // For testing UI only + storageBrowserWorking_ = true; +#endif + + if (initialSetup_) { + // Preselect current choice. + if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { + choice_ = CHOICE_BROWSE_FOLDER; + } else { + WARN_LOG_REPORT(SYSTEM, "Scoped storage not enabled - shouldn't be in MemStickScreen at initial setup"); + choice_ = CHOICE_STORAGE_ROOT; + // Shouldn't really be here in initial setup. + } + } else { + // Detect the current choice, so it's preselected in the UI. + if (g_Config.memStickDirectory == Path(g_extFilesDir)) { + choice_ = CHOICE_PRIVATE_DIRECTORY; + } else if (g_Config.memStickDirectory == Path(g_externalDir)) { + choice_ = CHOICE_STORAGE_ROOT; + } else if (storageBrowserWorking_) { + choice_ = CHOICE_BROWSE_FOLDER; + } else { + choice_ = CHOICE_SET_MANUAL; + } + } +} + +static void AddExplanation(UI::ViewGroup *viewGroup, MemStickScreen::Choice choice, UI::View *extraView = nullptr) { + auto iz = GetI18NCategory("MemStick"); + using namespace UI; + + int flags = FLAG_WRAP_TEXT; + + UI::ViewGroup *holder = new UI::LinearLayout(ORIENT_VERTICAL); + + UI::ViewGroup *indentHolder = new UI::LinearLayout(ORIENT_HORIZONTAL); + indentHolder->Add(new Spacer(20.0)); + indentHolder->Add(holder); + + viewGroup->Add(indentHolder); + + if (extraView) { + holder->Add(extraView); + } + + switch (choice) { + case MemStickScreen::CHOICE_STORAGE_ROOT: + // Old school choice + holder->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP"), flags, false))->SetBullet(true); + holder->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold"), flags, false))->SetBullet(true); + holder->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access"), flags, false))->SetBullet(true); + break; + case MemStickScreen::CHOICE_BROWSE_FOLDER: + holder->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP"), flags, false))->SetBullet(true); + holder->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold"), flags, false))->SetBullet(true); + holder->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access"), flags, false))->SetBullet(true); + break; + case MemStickScreen::CHOICE_PRIVATE_DIRECTORY: + // Consider https://www.compart.com/en/unicode/U+26A0 (unicode warning sign?)? or a graphic? + holder->Add(new TextView(iz->T("DataWillBeLostOnUninstall", "Warning! Data will be lost when you uninstall PPSSPP!"), flags, false))->SetBullet(true); + holder->Add(new TextView(iz->T("DataCannotBeShared", "Data CANNOT be shared between PPSSPP regular/Gold!"), flags, false))->SetBullet(true); +#if GOLD + holder->Add(new TextView(iz->T("USBAccessThroughGold", "USB access through Android/data/org.ppsspp.ppssppgold/files"), flags, false))->SetBullet(true); +#else + holder->Add(new TextView(iz->T("USBAccessThrough", "USB access through Android/data/org.ppsspp.ppsspp/files"), flags, false))->SetBullet(true); +#endif + break; + case MemStickScreen::CHOICE_SET_MANUAL: + default: + holder->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access"), flags, false))->SetBullet(true); + // What more? + + // Should we have a special text here? It'll popup a text window for editing. + break; + } } void MemStickScreen::CreateViews() { @@ -110,78 +191,146 @@ void MemStickScreen::CreateViews() { auto di = GetI18NCategory("Dialog"); auto iz = GetI18NCategory("MemStick"); - Margins actionMenuMargins(15, 15, 15, 0); + Margins actionMenuMargins(15, 0, 15, 0); root_ = new LinearLayout(ORIENT_HORIZONTAL); Spacer *spacerColumn = new Spacer(new LinearLayoutParams(20.0, FILL_PARENT, 0.0f)); - ScrollView *leftColumnScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + ScrollView *mainColumnScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + + ViewGroup *mainColumn = new LinearLayoutList(ORIENT_VERTICAL); + mainColumnScroll->Add(mainColumn); - ViewGroup *leftColumn = new LinearLayoutList(ORIENT_VERTICAL); - ViewGroup *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(300, FILL_PARENT, actionMenuMargins)); root_->Add(spacerColumn); - root_->Add(leftColumnScroll); - root_->Add(rightColumnItems); - - leftColumnScroll->Add(leftColumn); + root_->Add(mainColumnScroll); if (initialSetup_) { - leftColumn->Add(new TextView(iz->T("Welcome to PPSSPP!"), ALIGN_LEFT, false)); - leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); + mainColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); + mainColumn->Add(new TextView(iz->T("Welcome to PPSSPP!"), ALIGN_LEFT, false)); } - if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - leftColumn->Add(new TextView(iz->T("ScopedStorageWarning", "WARNING: BETA ANDROID SCOPED STORAGE SUPPORT\nMAY EAT YOUR DATA"), ALIGN_LEFT, false)); - } + mainColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 18.0f, 0.0f))); - leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick):"), ALIGN_LEFT, false)); + mainColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose where to keep PSP data (Memory Stick)"), ALIGN_LEFT, false)); + mainColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 18.0f, 0.0f))); + + ViewGroup *subColumns = new LinearLayoutList(ORIENT_HORIZONTAL); + mainColumn->Add(subColumns); + + ViewGroup *leftColumn = new LinearLayoutList(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + subColumns->Add(leftColumn); + + ViewGroup *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(220, FILL_PARENT, actionMenuMargins)); + subColumns->Add(rightColumnItems); // For legacy Android systems, so you can switch back to the old ways if you move to SD or something. - // TODO: Gonna need a scroll view. + // Trying to avoid needing a scroll view, so only showing the explanation for one option at a time. + #if PPSSPP_PLATFORM(ANDROID) if (!System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - leftColumn->Add(new Choice(iz->T("Use PSP folder at root of storage")))->OnClick.Handle(this, &MemStickScreen::OnUseStorageRoot); - leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); + leftColumn->Add(new RadioButton(&choice_, CHOICE_STORAGE_ROOT, iz->T("Use PSP folder at root of storage")))->OnClick.Handle(this, &MemStickScreen::OnChoiceClick); + if (choice_ == CHOICE_STORAGE_ROOT) { + AddExplanation(leftColumn, (MemStickScreen::Choice)choice_); + } } #endif - // Let's only offer the browse-for-folder choice on Android 10 or later. - // Earlier versions often don't really have working folder browsers. - bool storageBrowserWorking = System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 29; + if (storageBrowserWorking_) { + //ImageID("I_FOLDER_OPEN") + leftColumn->Add(new RadioButton(&choice_, CHOICE_BROWSE_FOLDER, iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnChoiceClick); - if (storageBrowserWorking) { - leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); - leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); + // TODO: Show current folder here if we have one set. } else { - leftColumn->Add(new Choice(iz->T("Manually specify PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnSetFolderManually); + leftColumn->Add(new RadioButton(&choice_, CHOICE_SET_MANUAL, iz->T("Manually specify PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnChoiceClick); leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); + // TODO: Show current folder here if we have one set. + } + if (choice_ == CHOICE_BROWSE_FOLDER || choice_ == CHOICE_SET_MANUAL) { + UI::View *extraView = nullptr; + if (!g_Config.memStickDirectory.empty()) { + extraView = new TextView(StringFromFormat(" %s: %s", iz->T("Current"), g_Config.memStickDirectory.ToVisualString().c_str()), ALIGN_LEFT, false); + } + AddExplanation(leftColumn, (MemStickScreen::Choice)choice_, extraView); } - leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); - // Consider https://www.compart.com/en/unicode/U+26A0 (unicode warning sign?)? or a graphic? - leftColumn->Add(new TextView(iz->T("DataWillBeLostOnUninstall", "Warning! Data will be lost when you uninstall PPSSPP!")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("DataCannotBeShared", "Data CANNOT be shared between PPSSPP regular/Gold!")))->SetBullet(true); -#if GOLD - leftColumn->Add(new TextView(iz->T("USBAccessThroughGold", "USB access through Android/data/org.ppsspp.ppssppgold/files")))->SetBullet(true); -#else - leftColumn->Add(new TextView(iz->T("USBAccessThrough", "USB access through Android/data/org.ppsspp.ppsspp/files")))->SetBullet(true); -#endif + std::string privateString = iz->T("Use App Private Data"); + if (initialSetup_) { + privateString = StringFromFormat("%s (%s)", iz->T("Skip for now"), privateString.c_str()); + } + + leftColumn->Add(new RadioButton(&choice_, CHOICE_PRIVATE_DIRECTORY, privateString.c_str()))->OnClick.Handle(this, &MemStickScreen::OnChoiceClick); + if (choice_ == CHOICE_PRIVATE_DIRECTORY) { + AddExplanation(leftColumn, (MemStickScreen::Choice)choice_); + } leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); + const char *confirmButtonText = nullptr; + ImageID confirmButtonImage = ImageID::invalid(); + switch (choice_) { + case CHOICE_BROWSE_FOLDER: + confirmButtonText = di->T("OK"); + confirmButtonImage = ImageID("I_FOLDER_OPEN"); + break; + case CHOICE_PRIVATE_DIRECTORY: + if (initialSetup_) { + confirmButtonText = di->T("Skip"); + confirmButtonImage = ImageID("I_WARNING"); + } else { + confirmButtonText = di->T("OK"); + } + break; + case CHOICE_STORAGE_ROOT: + case CHOICE_SET_MANUAL: + default: + confirmButtonText = di->T("OK"); + break; + } + + rightColumnItems->Add(new UI::Choice(confirmButtonText, confirmButtonImage))->OnClick.Handle(this, &MemStickScreen::OnConfirmClick); + rightColumnItems->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); + if (!initialSetup_) { - rightColumnItems->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); + rightColumnItems->Add(new UI::Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); + } + if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_TV) { + rightColumnItems->Add(new UI::Choice(iz->T("WhatsThis", "What's this?")))->OnClick.Handle(this, &MemStickScreen::OnHelp); } INFO_LOG(SYSTEM, "MemStickScreen: initialSetup=%d", (int)initialSetup_); } -UI::EventReturn MemStickScreen::OnSetFolderManually(UI::EventParams ¶ms) { +UI::EventReturn MemStickScreen::OnHelp(UI::EventParams ¶ms) { + LaunchBrowser("https://www.ppsspp.org/guide_storage.html"); + + return UI::EVENT_DONE; +} + +UI::EventReturn MemStickScreen::OnChoiceClick(UI::EventParams ¶ms) { + // Change the confirm button to match the choice, + // and change the text that we show. + RecreateViews(); + + return UI::EVENT_DONE; +} + + +UI::EventReturn MemStickScreen::OnConfirmClick(UI::EventParams ¶ms) { + switch (choice_) { + case CHOICE_SET_MANUAL: + return SetFolderManually(params); + case CHOICE_STORAGE_ROOT: + return UseStorageRoot(params); + case CHOICE_PRIVATE_DIRECTORY: + return UseInternalStorage(params); + case CHOICE_BROWSE_FOLDER: + return Browse(params); + } + return UI::EVENT_DONE; +} + +UI::EventReturn MemStickScreen::SetFolderManually(UI::EventParams ¶ms) { // The old way, from before scoped storage. #if PPSSPP_PLATFORM(ANDROID) auto sy = GetI18NCategory("System"); @@ -248,7 +397,7 @@ UI::EventReturn MemStickScreen::OnSetFolderManually(UI::EventParams ¶ms) { return UI::EVENT_DONE; } -UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { +UI::EventReturn MemStickScreen::UseInternalStorage(UI::EventParams ¶ms) { Path pendingMemStickFolder = Path(g_extFilesDir); if (initialSetup_) { @@ -258,6 +407,7 @@ UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { TriggerFinish(DialogResult::DR_OK); } else { // This can't really happen?? Not worth making an error message. + ERROR_LOG_REPORT(SYSTEM, "Could not switch memstick path in setup (internal)"); } } else if (pendingMemStickFolder != g_Config.memStickDirectory) { // Always ask for confirmation when called from the UI. Likely there's already some data. @@ -269,7 +419,7 @@ UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { return UI::EVENT_DONE; } -UI::EventReturn MemStickScreen::OnUseStorageRoot(UI::EventParams ¶ms) { +UI::EventReturn MemStickScreen::UseStorageRoot(UI::EventParams ¶ms) { Path pendingMemStickFolder = Path(g_externalDir); if (initialSetup_) { @@ -279,6 +429,7 @@ UI::EventReturn MemStickScreen::OnUseStorageRoot(UI::EventParams ¶ms) { TriggerFinish(DialogResult::DR_OK); } else { // This can't really happen?? Not worth making an error message. + ERROR_LOG_REPORT(SYSTEM, "Could not switch memstick path in setup"); } } else if (pendingMemStickFolder != g_Config.memStickDirectory) { // Always ask for confirmation when called from the UI. Likely there's already some data. @@ -290,7 +441,7 @@ UI::EventReturn MemStickScreen::OnUseStorageRoot(UI::EventParams ¶ms) { return UI::EVENT_DONE; } -UI::EventReturn MemStickScreen::OnBrowse(UI::EventParams ¶ms) { +UI::EventReturn MemStickScreen::Browse(UI::EventParams ¶ms) { System_SendMessage("browse_folder", ""); return UI::EVENT_DONE; } @@ -337,7 +488,14 @@ void MemStickScreen::update() { } } -static bool ListFileSuffixesRecursively(const Path &root, Path folder, std::vector &dirSuffixes, std::vector &fileSuffixes) { +// Keep the size with the file, so we can skip overly large ones in the move. +// The user will have to take care of them afterwards, it'll just take too long probably. +struct FileSuffix { + std::string suffix; + u64 fileSize; +}; + +static bool ListFileSuffixesRecursively(const Path &root, Path folder, std::vector &dirSuffixes, std::vector &fileSuffixes) { std::vector files; if (!File::GetFilesInDir(folder, &files)) { return false; @@ -350,12 +508,12 @@ static bool ListFileSuffixesRecursively(const Path &root, Path folder, std::vect dirSuffixes.push_back(dirSuffix); ListFileSuffixesRecursively(root, folder / file.name, dirSuffixes, fileSuffixes); } else { - ERROR_LOG(SYSTEM, "Failed to compute PathTo from '%s' to '%s'", root.c_str(), folder.c_str()); + ERROR_LOG_REPORT(SYSTEM, "Failed to compute PathTo from '%s' to '%s'", root.c_str(), folder.c_str()); } } else { std::string fileSuffix; if (root.ComputePathTo(file.fullName, fileSuffix)) { - fileSuffixes.push_back(fileSuffix); + fileSuffixes.push_back(FileSuffix{ fileSuffix, file.size }); } } } @@ -401,17 +559,17 @@ void ConfirmMemstickMoveScreen::CreateViews() { free_disk_space(newMemstickFolder_, freeSpaceNew); free_disk_space(oldMemstickFolder, freeSpaceOld); - leftColumn->Add(new TextView(iz->T("New PSP Data Folder"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("Selected PSP Data Folder"), ALIGN_LEFT, false)); if (!initialSetup_) { - leftColumn->Add(new TextView(iz->T("PPSSPP will restart after the change."), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("PPSSPP will restart after the change"), ALIGN_LEFT, false)); } leftColumn->Add(new TextView(newMemstickFolder_.ToVisualString(), ALIGN_LEFT, false)); std::string newFreeSpaceText = std::string(iz->T("Free space")) + ": " + FormatSpaceString(freeSpaceNew); leftColumn->Add(new TextView(newFreeSpaceText, ALIGN_LEFT, false)); if (existingFilesInNewFolder_) { - leftColumn->Add(new TextView(iz->T("Already contains data."), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("Already contains PSP data"), ALIGN_LEFT, false)); if (!moveData_) { - leftColumn->Add(new TextView(iz->T("No data will be changed."), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("No data will be changed"), ALIGN_LEFT, false)); } } if (!error_.empty()) { @@ -420,7 +578,7 @@ void ConfirmMemstickMoveScreen::CreateViews() { if (!oldMemstickFolder.empty()) { std::string oldFreeSpaceText = std::string(iz->T("Free space")) + ": " + FormatSpaceString(freeSpaceOld); - rightColumn->Add(new TextView(iz->T("Old PSP Data Folder"), ALIGN_LEFT, false)); + rightColumn->Add(new TextView(std::string(iz->T("Current")) + ":", ALIGN_LEFT, false)); rightColumn->Add(new TextView(oldMemstickFolder.ToVisualString(), ALIGN_LEFT, false)); rightColumn->Add(new TextView(oldFreeSpaceText, ALIGN_LEFT, false)); } @@ -455,15 +613,16 @@ void ConfirmMemstickMoveScreen::update() { progressView_->SetText(progressReporter_.Get()); } - bool *result = moveDataTask_->Poll(); + MoveResult *result = moveDataTask_->Poll(); if (result) { - if (*result) { + if (result->success) { progressReporter_.Set(iz->T("Done!")); INFO_LOG(SYSTEM, "Move data task finished successfully!"); // Succeeded! FinishFolderMove(); } else { + progressReporter_.Set(iz->T("Failed to move some files!")); INFO_LOG(SYSTEM, "Move data task failed!"); // What do we do here? We might be in the middle of a move... Bad. RecreateViews(); @@ -474,7 +633,6 @@ void ConfirmMemstickMoveScreen::update() { } } - UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { auto sy = GetI18NCategory("System"); auto iz = GetI18NCategory("MemStick"); @@ -487,7 +645,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { if (moveData_) { progressReporter_.Set(iz->T("Starting move...")); - moveDataTask_ = Promise::Spawn(&g_threadManager, [&]() -> bool * { + moveDataTask_ = Promise::Spawn(&g_threadManager, [&]() -> MoveResult * { Path moveSrc = g_Config.memStickDirectory; Path moveDest = newMemstickFolder_; if (moveSrc.GetFilename() != "PSP") { @@ -501,7 +659,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { INFO_LOG(SYSTEM, "About to move PSP data from '%s' to '%s'", moveSrc.c_str(), moveDest.c_str()); // Search through recursively, listing the files to move and also summing their sizes. - std::vector fileSuffixesToMove; + std::vector fileSuffixesToMove; std::vector directorySuffixesToCreate; // NOTE: It's correct to pass moveSrc twice here, it's to keep the root in the recursion. @@ -510,12 +668,17 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { std::string error = "Failed to read old directory"; INFO_LOG(SYSTEM, "%s", error.c_str()); progressReporter_.Set(iz->T(error.c_str())); - return new bool(false); + return new MoveResult{ false, error }; } bool dryRun = false; // Useful for debugging. - size_t moveFailures = 0; + size_t failedFiles = 0; + size_t skippedFiles = 0; + + // We're not moving huge files like ISOs during this process, unless + // they can be directly moved, without rewriting the file. + const uint64_t BIG_FILE_THRESHOLD = 24 * 1024 * 1024; if (!moveSrc.empty()) { // Better not interrupt the app while this is happening! @@ -527,28 +690,43 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str()); } else { INFO_LOG(SYSTEM, "Creating dir '%s'", dir.c_str()); - if (!File::Exists(dir)) { - File::CreateDir(dir); - } + progressReporter_.Set(dirSuffix); + // Just ignore already-exists errors. + File::CreateDir(dir); } } for (auto &fileSuffix : fileSuffixesToMove) { - progressReporter_.Set(fileSuffix); + progressReporter_.Set(StringFromFormat("%s (%s)", fileSuffix.suffix.c_str(), NiceSizeFormat(fileSuffix.fileSize).c_str())); - Path from = moveSrc / fileSuffix; - Path to = moveDest / fileSuffix; - if (dryRun) { - INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s'", from.c_str(), to.c_str()); - } else { - // Remove the "from" prefix from the path. - // We have to drop down to string operations for this. - if (!File::Move(from, to)) { - ERROR_LOG(SYSTEM, "Failed to move file '%s' to '%s'", from.c_str(), to.c_str()); - moveFailures++; - // Should probably just bail? + Path from = moveSrc / fileSuffix.suffix; + Path to = moveDest / fileSuffix.suffix; + + if (fileSuffix.fileSize > BIG_FILE_THRESHOLD) { + // We only move big files if it's fast to do so. + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s' (%d bytes) if fast", from.c_str(), to.c_str(), (int)fileSuffix.fileSize); } else { - INFO_LOG(SYSTEM, "Moved file '%s' to '%s'", from.c_str(), to.c_str()); + if (!File::MoveIfFast(from, to)) { + INFO_LOG(SYSTEM, "Skipped moving file '%s' to '%s' (%s)", from.c_str(), to.c_str(), NiceSizeFormat(fileSuffix.fileSize).c_str()); + skippedFiles++; + } else { + INFO_LOG(SYSTEM, "Moved file '%s' to '%s'", from.c_str(), to.c_str()); + } + } + } else { + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s' (%d bytes)", from.c_str(), to.c_str(), (int)fileSuffix.fileSize); + } else { + // Remove the "from" prefix from the path. + // We have to drop down to string operations for this. + if (!File::Move(from, to)) { + ERROR_LOG(SYSTEM, "Failed to move file '%s' to '%s'", from.c_str(), to.c_str()); + failedFiles++; + // Should probably just bail? + } else { + INFO_LOG(SYSTEM, "Moved file '%s' to '%s'", from.c_str(), to.c_str()); + } } } } @@ -560,19 +738,15 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { INFO_LOG(SYSTEM, "dry run: Would have deleted dir '%s'", dir.c_str()); } else { INFO_LOG(SYSTEM, "Deleting dir '%s'", dir.c_str()); - if (!File::Exists(dir)) { + progressReporter_.Set(dirSuffix); + if (File::Exists(dir)) { File::DeleteDir(dir); } } } } - if (moveFailures > 0) { - progressReporter_.Set(iz->T("Failed to move some files!")); - return new bool(false); - } - - return new bool(true); + return new MoveResult{ true, "", failedFiles }; }, TaskType::IO_BLOCKING); RecreateViews(); @@ -599,12 +773,15 @@ void ConfirmMemstickMoveScreen::FinishFolderMove() { if (!initialSetup_) { // We restart the app here, to get the new settings. System_SendMessage("graphics_restart", ""); - } - - if (g_Config.Save("MemstickPathChanged")) { - TriggerFinish(DialogResult::DR_OK); } else { - error_ = iz->T("Failed to save config"); - RecreateViews(); + // This is initial setup, we now switch to the main screen, if we were successful + // (which we better have been...) + if (g_Config.Save("MemstickPathChanged")) { + // TriggerFinish(DialogResult::DR_OK); + screenManager()->switchScreen(new MainScreen()); + } else { + error_ = iz->T("Failed to save config"); + RecreateViews(); + } } } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index a320f017c8..7434b12855 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -38,6 +38,13 @@ public: std::string tag() const override { return "game"; } + enum Choice { + CHOICE_BROWSE_FOLDER, + CHOICE_PRIVATE_DIRECTORY, + CHOICE_STORAGE_ROOT, + CHOICE_SET_MANUAL, + }; + protected: void CreateViews() override; @@ -56,15 +63,25 @@ protected: private: // Event handlers - UI::EventReturn OnBrowse(UI::EventParams &e); - UI::EventReturn OnUseInternalStorage(UI::EventParams ¶ms); - UI::EventReturn OnUseStorageRoot(UI::EventParams ¶ms); - UI::EventReturn OnSetFolderManually(UI::EventParams ¶ms); + UI::EventReturn OnHelp(UI::EventParams &e); + + // Confirm button sub handlers + UI::EventReturn Browse(UI::EventParams &e); + UI::EventReturn UseInternalStorage(UI::EventParams ¶ms); + UI::EventReturn UseStorageRoot(UI::EventParams ¶ms); + UI::EventReturn SetFolderManually(UI::EventParams ¶ms); + + // Button handlers. + UI::EventReturn OnConfirmClick(UI::EventParams ¶ms); + UI::EventReturn OnChoiceClick(UI::EventParams ¶ms); SettingInfoMessage *settingInfo_ = nullptr; bool initialSetup_; + bool storageBrowserWorking_; bool done_ = false; + + int choice_ = 0; }; class ProgressReporter { @@ -84,6 +101,13 @@ private: std::mutex mutex_; }; +struct MoveResult { + bool success; // Got through the whole move. + std::string errorMessage; + size_t failedFiles; + size_t skippedFiles; +}; + class ConfirmMemstickMoveScreen : public UIDialogScreenWithBackground { public: ConfirmMemstickMoveScreen(Path newMemstickFolder, bool initialSetup); @@ -106,7 +130,7 @@ private: ProgressReporter progressReporter_; UI::TextView *progressView_ = nullptr; - Promise *moveDataTask_ = nullptr; + Promise *moveDataTask_ = nullptr; std::string error_; }; diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index b71f48d730..c0b5ca03a3 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -52,6 +52,7 @@ #include "UI/GameSettingsScreen.h" #include "UI/MainScreen.h" #include "UI/MiscScreens.h" +#include "UI/MemStickScreen.h" #ifdef _MSC_VER #pragma execution_character_set("utf-8") @@ -519,9 +520,11 @@ void PromptScreen::TriggerFinish(DialogResult result) { UIDialogScreenWithBackground::TriggerFinish(result); } -PostProcScreen::PostProcScreen(const std::string &title, int id) : ListPopupScreen(title), id_(id) { +PostProcScreen::PostProcScreen(const std::string &title, int id) : ListPopupScreen(title), id_(id) { } + +void PostProcScreen::CreateViews() { auto ps = GetI18NCategory("PostShaders"); - ReloadAllPostShaderInfo(); + ReloadAllPostShaderInfo(screenManager()->getDrawContext()); shaders_ = GetAllPostShaderInfo(); std::vector items; int selected = -1; @@ -534,6 +537,7 @@ PostProcScreen::PostProcScreen(const std::string &title, int id) : ListPopupScre items.push_back(ps->T(shaders_[i].section.c_str(), shaders_[i].name.c_str())); } adaptor_ = UI::StringVectorListAdaptor(items, selected); + ListPopupScreen::CreateViews(); } void PostProcScreen::OnCompleted(DialogResult result) { @@ -546,9 +550,11 @@ void PostProcScreen::OnCompleted(DialogResult result) { g_Config.vPostShaderNames.push_back(value); } -TextureShaderScreen::TextureShaderScreen(const std::string &title) : ListPopupScreen(title) { +TextureShaderScreen::TextureShaderScreen(const std::string &title) : ListPopupScreen(title) {} + +void TextureShaderScreen::CreateViews() { auto ps = GetI18NCategory("TextureShaders"); - ReloadAllPostShaderInfo(); + ReloadAllPostShaderInfo(screenManager()->getDrawContext()); shaders_ = GetAllTextureShaderInfo(); std::vector items; int selected = -1; @@ -558,6 +564,8 @@ TextureShaderScreen::TextureShaderScreen(const std::string &title) : ListPopupSc items.push_back(ps->T(shaders_[i].section.c_str(), shaders_[i].name.c_str())); } adaptor_ = UI::StringVectorListAdaptor(items, selected); + + ListPopupScreen::CreateViews(); } void TextureShaderScreen::OnCompleted(DialogResult result) { @@ -668,25 +676,35 @@ void LogoScreen::Next() { if (!switched_) { switched_ = true; Path gamePath = boot_filename; - if (gotoGameSettings_) { + + switch (afterLogoScreen_) { + case AfterLogoScreen::TO_GAME_SETTINGS: if (!gamePath.empty()) { screenManager()->switchScreen(new EmuScreen(gamePath)); } else { screenManager()->switchScreen(new MainScreen()); } screenManager()->push(new GameSettingsScreen(gamePath)); - } else if (boot_filename.size()) { - screenManager()->switchScreen(new EmuScreen(gamePath)); - } else { - screenManager()->switchScreen(new MainScreen()); + break; + case AfterLogoScreen::MEMSTICK_SCREEN_INITIAL_SETUP: + screenManager()->switchScreen(new MemStickScreen(true)); + break; + case AfterLogoScreen::DEFAULT: + default: + if (boot_filename.size()) { + screenManager()->switchScreen(new EmuScreen(gamePath)); + } else { + screenManager()->switchScreen(new MainScreen()); + } + break; } } } const float logoScreenSeconds = 2.5f; -LogoScreen::LogoScreen(bool gotoGameSettings) - : gotoGameSettings_(gotoGameSettings) { +LogoScreen::LogoScreen(AfterLogoScreen afterLogoScreen) + : afterLogoScreen_(afterLogoScreen) { } void LogoScreen::update() { @@ -707,7 +725,7 @@ void LogoScreen::sendMessage(const char *message, const char *value) { } bool LogoScreen::key(const KeyInput &key) { - if (key.deviceId != DEVICE_ID_MOUSE) { + if (key.deviceId != DEVICE_ID_MOUSE && (key.flags & KEY_DOWN)) { Next(); return true; } @@ -1071,4 +1089,4 @@ void SettingInfoMessage::Draw(UIContext &dc) { std::string SettingInfoMessage::GetText() const { return showing_ && text_ ? text_->GetText() : ""; -} \ No newline at end of file +} diff --git a/UI/MiscScreens.h b/UI/MiscScreens.h index 40cb29ebca..07de77f4cc 100644 --- a/UI/MiscScreens.h +++ b/UI/MiscScreens.h @@ -108,6 +108,8 @@ class PostProcScreen : public ListPopupScreen { public: PostProcScreen(const std::string &title, int id); + void CreateViews() override; + private: void OnCompleted(DialogResult result) override; bool ShowButtons() const override { return true; } @@ -119,15 +121,24 @@ class TextureShaderScreen : public ListPopupScreen { public: TextureShaderScreen(const std::string &title); + void CreateViews() override; + private: void OnCompleted(DialogResult result) override; bool ShowButtons() const override { return true; } std::vector shaders_; }; +enum class AfterLogoScreen { + TO_GAME_SETTINGS, + DEFAULT, + MEMSTICK_SCREEN_INITIAL_SETUP, +}; + class LogoScreen : public UIScreen { public: - LogoScreen(bool gotoGameSettings = false); + LogoScreen(AfterLogoScreen afterLogoScreen = AfterLogoScreen::DEFAULT); + bool key(const KeyInput &key) override; bool touch(const TouchInput &touch) override; void update() override; @@ -140,7 +151,7 @@ private: int frames_ = 0; double sinceStart_ = 0.0; bool switched_ = false; - bool gotoGameSettings_ = false; + AfterLogoScreen afterLogoScreen_; }; class CreditsScreen : public UIDialogScreenWithBackground { diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 265f38346e..e58969b01d 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -132,8 +132,8 @@ // The new UI framework, for initialization static UI::Theme ui_theme; - -Atlas g_ui_atlas; +static Atlas g_ui_atlas; +static Atlas g_font_atlas; #if PPSSPP_ARCH(ARM) && defined(__ANDROID__) #include "../../android/jni/ArmEmitterTest.h" @@ -389,6 +389,15 @@ static void CheckFailedGPUBackends() { return; #endif +#if PPSSPP_PLATFORM(ANDROID) + if (System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 30) { + // In Android 11 or later, Vulkan is as stable as OpenGL, so let's not even bother. + // Have also seen unexplained issues with random fallbacks to OpenGL for no good reason, + // especially when debugging. + return; + } +#endif + // We only want to do this once per process run and backend, to detect process crashes. // If NativeShutdown is called before we finish, we might call this multiple times. static int lastBackend = -1; @@ -475,7 +484,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch // on iOS it's even the path to bundled app assets. It's a mess. // We want this to be FIRST. -#if PPSSPP_PLATFORM(IOS) +#if PPSSPP_PLATFORM(IOS) || PPSSPP_PLATFORM(MAC) // Packed assets are included in app VFSRegister("", new DirectoryAssetReader(Path(external_dir))); #endif @@ -518,7 +527,6 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch } else { g_Config.memStickDirectory = Path(external_dir); g_Config.defaultCurrentDirectory = Path(external_dir); - CreateDirectoriesAndroid(); } // Might also add an option to move it to internal / non-visible storage, but there's @@ -548,10 +556,19 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch INFO_LOG(SYSTEM, "No memstick directory file found (tried to open '%s')", memstickDirFile.c_str()); } + // Attempt to create directories after reading the path. + if (!System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { + CreateDirectoriesAndroid(); + } + #elif PPSSPP_PLATFORM(IOS) g_Config.defaultCurrentDirectory = g_Config.internalDataDirectory; g_Config.memStickDirectory = Path(user_data_path); g_Config.flash0Directory = Path(std::string(external_dir)) / "flash0"; +#elif PPSSPP_PLATFORM(MAC) + g_Config.defaultCurrentDirectory = Path(getenv("HOME")); + g_Config.memStickDirectory = g_Config.defaultCurrentDirectory / ".config/ppsspp"; + g_Config.flash0Directory = Path(std::string(external_dir)) / "flash0"; #elif PPSSPP_PLATFORM(SWITCH) g_Config.memStickDirectory = g_Config.internalDataDirectory / "config/ppsspp"; g_Config.flash0Directory = g_Config.internalDataDirectory / "assets/flash0"; @@ -612,6 +629,13 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch for (int i = 1; i < argc; i++) { if (argv[i][0] == '-') { +#if defined(__APPLE__) + // On Apple system debugged executable may get -NSDocumentRevisionsDebugMode YES in argv. + if (!strcmp(argv[i], "-NSDocumentRevisionsDebugMode") && argc - 1 > i) { + i++; + continue; + } +#endif switch (argv[i][1]) { case 'd': // Enable debug logging @@ -800,17 +824,16 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch screenManager = new ScreenManager(); if (g_Config.memStickDirectory.empty()) { INFO_LOG(SYSTEM, "No memstick directory! Asking for one to be configured."); - screenManager->switchScreen(new LogoScreen(false)); - screenManager->push(new MemStickScreen(true)); + screenManager->switchScreen(new LogoScreen(AfterLogoScreen::MEMSTICK_SCREEN_INITIAL_SETUP)); } else if (gotoGameSettings) { - screenManager->switchScreen(new LogoScreen(true)); + screenManager->switchScreen(new LogoScreen(AfterLogoScreen::TO_GAME_SETTINGS)); } else if (gotoTouchScreenTest) { screenManager->switchScreen(new MainScreen()); screenManager->push(new TouchTestScreen()); } else if (skipLogo) { screenManager->switchScreen(new EmuScreen(boot_filename)); } else { - screenManager->switchScreen(new LogoScreen()); + screenManager->switchScreen(new LogoScreen(AfterLogoScreen::DEFAULT)); } // Easy testing @@ -890,6 +913,22 @@ static void UIThemeInit() { void RenderOverlays(UIContext *dc, void *userdata); bool CreateGlobalPipelines(); +static void LoadAtlasMetadata(Atlas &metadata, const char *filename, bool required) { + size_t atlas_data_size = 0; + if (!metadata.IsMetadataLoaded()) { + const uint8_t *atlas_data = VFSReadFile(filename, &atlas_data_size); + bool load_success = atlas_data != nullptr && metadata.Load(atlas_data, atlas_data_size); + if (!load_success) { + if (required) + ERROR_LOG(G3D, "Failed to load %s - graphics will be broken", filename); + else + WARN_LOG(G3D, "Failed to load %s", filename); + // Stumble along with broken visuals instead of dying... + } + delete[] atlas_data; + } +} + bool NativeInitGraphics(GraphicsContext *graphicsContext) { INFO_LOG(SYSTEM, "NativeInitGraphics"); @@ -904,20 +943,14 @@ bool NativeInitGraphics(GraphicsContext *graphicsContext) { return false; } - // Load the atlas. - size_t atlas_data_size = 0; - if (!g_ui_atlas.IsMetadataLoaded()) { - const uint8_t *atlas_data = VFSReadFile("ui_atlas_luna.meta", &atlas_data_size); - bool load_success = atlas_data != nullptr && g_ui_atlas.Load(atlas_data, atlas_data_size); - if (!load_success) { - ERROR_LOG(G3D, "Failed to load ui_atlas_luna.meta - graphics will be broken."); - // Stumble along with broken visuals instead of dying. - } - delete[] atlas_data; - } + // Load any missing atlas. + LoadAtlasMetadata(g_ui_atlas, "ui_atlas_luna.meta", true); + LoadAtlasMetadata(g_font_atlas, "font_atlas_luna.meta", g_ui_atlas.num_fonts == 0); ui_draw2d.SetAtlas(&g_ui_atlas); + ui_draw2d.SetFontAtlas(&g_font_atlas); ui_draw2d_front.SetAtlas(&g_ui_atlas); + ui_draw2d_front.SetFontAtlas(&g_font_atlas); UIThemeInit(); diff --git a/UI/RemoteISOScreen.cpp b/UI/RemoteISOScreen.cpp index d67783e4e7..95d0ef0da1 100644 --- a/UI/RemoteISOScreen.cpp +++ b/UI/RemoteISOScreen.cpp @@ -585,7 +585,7 @@ void RemoteISOSettingsScreen::update() { void RemoteISOSettingsScreen::CreateViews() { auto ri = GetI18NCategory("RemoteISO"); - + ViewGroup *remoteisoSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT)); remoteisoSettingsScroll->SetTag("RemoteISOSettings"); LinearLayout *remoteisoSettings = new LinearLayoutList(ORIENT_VERTICAL); @@ -595,24 +595,34 @@ void RemoteISOSettingsScreen::CreateViews() { remoteisoSettings->Add(new ItemHeader(ri->T("Remote disc streaming"))); remoteisoSettings->Add(new CheckBox(&g_Config.bRemoteShareOnStartup, ri->T("Share on PPSSPP startup"))); remoteisoSettings->Add(new CheckBox(&g_Config.bRemoteISOManual, ri->T("Manual Mode Client", "Manually configure client"))); -#if !defined(MOBILE_DEVICE) - PopupTextInputChoice *remoteServer = remoteisoSettings->Add(new PopupTextInputChoice(&g_Config.sLastRemoteISOServer, ri->T("Remote Server"), "", 255, screenManager())); -#else - ChoiceWithValueDisplay *remoteServer = new ChoiceWithValueDisplay(&g_Config.sLastRemoteISOServer, ri->T("Remote Server"), (const char *)nullptr); - remoteisoSettings->Add(remoteServer); - remoteServer->OnClick.Handle(this, &RemoteISOSettingsScreen::OnClickRemoteServer); + + UI::Choice *remoteServer; +#if defined(MOBILE_DEVICE) + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { + remoteServer = new ChoiceWithValueDisplay(&g_Config.sLastRemoteISOServer, ri->T("Remote Server"), (const char *)nullptr); + remoteServer->OnClick.Handle(this, &RemoteISOSettingsScreen::OnClickRemoteServer); + } else #endif + remoteServer = new PopupTextInputChoice(&g_Config.sLastRemoteISOServer, ri->T("Remote Server"), "", 255, screenManager()); + remoteisoSettings->Add(remoteServer); remoteServer->SetEnabledPtr(&g_Config.bRemoteISOManual); + PopupSliderChoice *remotePort = remoteisoSettings->Add(new PopupSliderChoice(&g_Config.iLastRemoteISOPort, 0, 65535, ri->T("Remote Port", "Remote Port"), 100, screenManager())); remotePort->SetEnabledPtr(&g_Config.bRemoteISOManual); -#if !defined(MOBILE_DEVICE) - PopupTextInputChoice *remoteSubdir = remoteisoSettings->Add(new PopupTextInputChoice(&g_Config.sRemoteISOSubdir, ri->T("Remote Subdirectory"), "", 255, screenManager())); - remoteSubdir->OnChange.Handle(this, &RemoteISOSettingsScreen::OnChangeRemoteISOSubdir); -#else - ChoiceWithValueDisplay *remoteSubdir = remoteisoSettings->Add( - new ChoiceWithValueDisplay(&g_Config.sRemoteISOSubdir, ri->T("Remote Subdirectory"), (const char *)nullptr)); - remoteSubdir->OnClick.Handle(this, &RemoteISOSettingsScreen::OnClickRemoteISOSubdir); + + UI::Choice *remoteSubdir; +#if defined(MOBILE_DEVICE) + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { + remoteSubdir = new ChoiceWithValueDisplay(&g_Config.sRemoteISOSubdir, ri->T("Remote Subdirectory"), (const char *)nullptr); + remoteSubdir->OnClick.Handle(this, &RemoteISOSettingsScreen::OnClickRemoteISOSubdir); + } else #endif + { + PopupTextInputChoice *remoteSubdirInput = new PopupTextInputChoice(&g_Config.sRemoteISOSubdir, ri->T("Remote Subdirectory"), "", 255, screenManager()); + remoteSubdirInput->OnChange.Handle(this, &RemoteISOSettingsScreen::OnChangeRemoteISOSubdir); + remoteSubdir = remoteSubdirInput; + } + remoteisoSettings->Add(remoteSubdir); remoteSubdir->SetEnabledPtr(&g_Config.bRemoteISOManual); PopupSliderChoice *portChoice = new PopupSliderChoice(&g_Config.iRemoteISOPort, 0, 65535, ri->T("Local Server Port", "Local Server Port"), 100, screenManager()); @@ -635,23 +645,29 @@ UI::EventReturn RemoteISOSettingsScreen::OnClickRemoteServer(UI::EventParams &e) return UI::EVENT_DONE; } +static void CleanupRemoteISOSubdir() { + // Replace spaces and force forward slashes. + // TODO: Maybe we should uri escape this after? + ReplaceAll(g_Config.sRemoteISOSubdir, " ", "%20"); + ReplaceAll(g_Config.sRemoteISOSubdir, "\\", "/"); + // Make sure it begins with /. + if (g_Config.sRemoteISOSubdir.empty() || g_Config.sRemoteISOSubdir[0] != '/') + g_Config.sRemoteISOSubdir = "/" + g_Config.sRemoteISOSubdir; +} + UI::EventReturn RemoteISOSettingsScreen::OnClickRemoteISOSubdir(UI::EventParams &e) { #if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) auto ri = GetI18NCategory("RemoteISO"); System_InputBoxGetString(ri->T("Remote Subdirectory"), g_Config.sRemoteISOSubdir, [](bool result, const std::string &value) { g_Config.sRemoteISOSubdir = value; + // Apply the cleanup logic, too. + CleanupRemoteISOSubdir(); }); #endif return UI::EVENT_DONE; } UI::EventReturn RemoteISOSettingsScreen::OnChangeRemoteISOSubdir(UI::EventParams &e) { - //Conform to HTTP standards - ReplaceAll(g_Config.sRemoteISOSubdir, " ", "%20"); - ReplaceAll(g_Config.sRemoteISOSubdir, "\\", "/"); - //Make sure it begins with / - if (g_Config.sRemoteISOSubdir.empty() || g_Config.sRemoteISOSubdir[0] != '/') - g_Config.sRemoteISOSubdir = "/" + g_Config.sRemoteISOSubdir; - + CleanupRemoteISOSubdir(); return UI::EVENT_DONE; } diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index cfd61045a3..731e3d5d95 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -87,10 +87,13 @@ public: const Style &textStyle = dc.theme->popupStyle; std::shared_ptr ginfo = g_gameInfoCache->GetInfo(screenManager()->getDrawContext(), savePath_, GAMEINFO_WANTBG | GAMEINFO_WANTSIZE); - LinearLayout *content = new LinearLayout(ORIENT_VERTICAL); - parent->Add(content); if (!ginfo) return; + + ScrollView *contentScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); + LinearLayout *content = new LinearLayout(ORIENT_VERTICAL); + parent->Add(contentScroll); + contentScroll->Add(content); LinearLayout *toprow = new LinearLayout(ORIENT_HORIZONTAL, new LayoutParams(FILL_PARENT, WRAP_CONTENT)); content->Add(toprow); @@ -122,10 +125,13 @@ public: } auto di = GetI18NCategory("Dialog"); - LinearLayout *buttons = new LinearLayout(ORIENT_HORIZONTAL); - buttons->Add(new Button(di->T("Back"), new LinearLayoutParams(1.0)))->OnClick.Handle(this, &UIScreen::OnBack); - buttons->Add(new Button(di->T("Delete"), new LinearLayoutParams(1.0)))->OnClick.Handle(this, &SavedataPopupScreen::OnDeleteButtonClick); - content->Add(buttons); + LinearLayout *buttons = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); + buttons->SetSpacing(0); + Margins buttonMargins(5, 5); + + buttons->Add(new Button(di->T("Back"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle(this, &UIScreen::OnBack); + buttons->Add(new Button(di->T("Delete"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle(this, &SavedataPopupScreen::OnDeleteButtonClick); + parent->Add(buttons); } protected: @@ -138,32 +144,49 @@ private: class SortedLinearLayout : public UI::LinearLayoutList { public: + typedef std::function PrepFunc; typedef std::function CompareFunc; - typedef std::function DoneFunc; SortedLinearLayout(UI::Orientation orientation, UI::LayoutParams *layoutParams = nullptr) : UI::LinearLayoutList(orientation, layoutParams) { } - void SetCompare(CompareFunc lessFunc, DoneFunc doneFunc) { + void SetCompare(const PrepFunc &prepFunc, const CompareFunc &lessFunc) { + prepIndex_ = 0; + prepFunc_ = prepFunc; lessFunc_ = lessFunc; - doneFunc_ = doneFunc; } void Update() override; private: + size_t prepIndex_ = 0; + PrepFunc prepFunc_; CompareFunc lessFunc_; - DoneFunc doneFunc_; }; void SortedLinearLayout::Update() { + if (prepFunc_) { + // Try to avoid dropping more than a frame, prefer items shift. + constexpr double ALLOWED_TIME = 0.95 / 60.0; + double start_time = time_now_d(); + for (; prepIndex_ < views_.size(); ++prepIndex_) { + prepFunc_(views_[prepIndex_]); + if (time_now_d() > start_time + ALLOWED_TIME) { + break; + } + } + } if (lessFunc_) { + // We may sort several times while calculating. std::stable_sort(views_.begin(), views_.end(), lessFunc_); } - if (doneFunc_ && doneFunc_()) { + // We're done if we got through all items. + if (prepIndex_ >= views_.size()) { + prepFunc_ = PrepFunc(); lessFunc_ = CompareFunc(); } + UI::LinearLayout::Update(); } @@ -184,14 +207,57 @@ public: const Path &GamePath() const { return savePath_; } + uint64_t GetTotalSize() const { + return totalSize_; + } + int64_t GetDateSeconds() const { + return dateSeconds_; + } + + void UpdateTotalSize(); + void UpdateDateSeconds(); + private: void UpdateText(const std::shared_ptr &ginfo); Path savePath_; std::string title_; std::string subtitle_; + uint64_t totalSize_ = 0; + int64_t dateSeconds_ = 0; + bool hasTotalSize_ = false; + bool hasDateSeconds_ = false; }; +void SavedataButton::UpdateTotalSize() { + if (hasTotalSize_) + return; + + File::FileInfo info; + if (File::GetFileInfo(savePath_, &info)) { + totalSize_ = info.size; + if (info.isDirectory) + totalSize_ = File::ComputeRecursiveDirectorySize(savePath_); + } + + hasTotalSize_ = true; +} + +void SavedataButton::UpdateDateSeconds() { + if (hasDateSeconds_) + return; + + File::FileInfo info; + if (File::GetFileInfo(savePath_, &info)) { + dateSeconds_ = info.mtime; + if (info.isDirectory && File::GetFileInfo(savePath_ / "PARAM.SFO", &info)) { + dateSeconds_ = info.mtime; + } + } + + hasDateSeconds_ = true; +} + UI::EventReturn SavedataPopupScreen::OnDeleteButtonClick(UI::EventParams &e) { std::shared_ptr ginfo = g_gameInfoCache->GetInfo(nullptr, savePath_, GAMEINFO_WANTSIZE); ginfo->Delete(); @@ -408,15 +474,19 @@ void SavedataBrowser::SetSortOption(SavedataSortOption opt) { if (gameList_) { SortedLinearLayout *gl = static_cast(gameList_); if (sortOption_ == SavedataSortOption::FILENAME) { - gl->SetCompare(&ByFilename, &SortDone); + gl->SetCompare(&PrepFilename, &ByFilename); } else if (sortOption_ == SavedataSortOption::SIZE) { - gl->SetCompare(&BySize, &SortDone); + gl->SetCompare(&PrepSize, &BySize); } else if (sortOption_ == SavedataSortOption::DATE) { - gl->SetCompare(&ByDate, &SortDone); + gl->SetCompare(&PrepDate, &ByDate); } } } +void SavedataBrowser::PrepFilename(UI::View *v) { + // Nothing needed. +} + bool SavedataBrowser::ByFilename(const UI::View *v1, const UI::View *v2) { const SavedataButton *b1 = static_cast(v1); const SavedataButton *b2 = static_cast(v2); @@ -424,61 +494,42 @@ bool SavedataBrowser::ByFilename(const UI::View *v1, const UI::View *v2) { return strcmp(b1->GamePath().c_str(), b2->GamePath().c_str()) < 0; } -static time_t GetTotalSize(const SavedataButton *b) { - auto fileLoader = std::unique_ptr(ConstructFileLoader(b->GamePath())); - std::string errorString; - switch (Identify_File(fileLoader.get(), &errorString)) { - case IdentifiedFileType::PSP_PBP_DIRECTORY: - case IdentifiedFileType::PSP_SAVEDATA_DIRECTORY: - return File::ComputeRecursiveDirectorySize(ResolvePBPDirectory(b->GamePath())); - default: - return fileLoader->FileSize(); - } +void SavedataBrowser::PrepSize(UI::View *v) { + SavedataButton *b = static_cast(v); + b->UpdateTotalSize(); } bool SavedataBrowser::BySize(const UI::View *v1, const UI::View *v2) { const SavedataButton *b1 = static_cast(v1); const SavedataButton *b2 = static_cast(v2); + const uint64_t size1 = b1->GetTotalSize(); + const uint64_t size2 = b2->GetTotalSize(); - if (GetTotalSize(b1) > GetTotalSize(b2)) + if (size1 > size2) return true; - else if (GetTotalSize(b1) < GetTotalSize(b2)) + else if (size1 < size2) return false; return strcmp(b1->GamePath().c_str(), b2->GamePath().c_str()) < 0; } -static time_t GetDateSeconds(const SavedataButton *b) { - auto fileLoader = std::unique_ptr(ConstructFileLoader(b->GamePath())); - tm datetm; - bool success; - std::string errorString; - if (Identify_File(fileLoader.get(), &errorString) == IdentifiedFileType::PSP_SAVEDATA_DIRECTORY) { - success = File::GetModifTime(b->GamePath() / "PARAM.SFO", datetm); - } else { - success = File::GetModifTime(b->GamePath(), datetm); - } - - if (success) { - return mktime(&datetm); - } - return (time_t)0; +void SavedataBrowser::PrepDate(UI::View *v) { + SavedataButton *b = static_cast(v); + b->UpdateDateSeconds(); } bool SavedataBrowser::ByDate(const UI::View *v1, const UI::View *v2) { const SavedataButton *b1 = static_cast(v1); const SavedataButton *b2 = static_cast(v2); + const int64_t time1 = b1->GetDateSeconds(); + const int64_t time2 = b2->GetDateSeconds(); - if (GetDateSeconds(b1) > GetDateSeconds(b2)) + if (time1 > time2) return true; - if (GetDateSeconds(b1) < GetDateSeconds(b2)) + if (time1 < time2) return false; return strcmp(b1->GamePath().c_str(), b2->GamePath().c_str()) < 0; } -bool SavedataBrowser::SortDone() { - return true; -} - void SavedataBrowser::Refresh() { using namespace UI; @@ -602,9 +653,8 @@ void SavedataScreen::CreateViews() { sortStrip->OnChoice.Handle(this, &SavedataScreen::OnSortClick); AddStandardBack(root_); -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) - root_->Add(new Choice(di->T("Search"), "", false, new AnchorLayoutParams(WRAP_CONTENT, 64, NONE, NONE, 10, 10)))->OnClick.Handle(this, &SavedataScreen::OnSearch); -#endif + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) + root_->Add(new Choice(di->T("Search"), "", false, new AnchorLayoutParams(WRAP_CONTENT, 64, NONE, NONE, 10, 10)))->OnClick.Handle(this, &SavedataScreen::OnSearch); root_->Add(main); root_->Add(sortStrip); diff --git a/UI/SavedataScreen.h b/UI/SavedataScreen.h index b9d057d025..1f9509e687 100644 --- a/UI/SavedataScreen.h +++ b/UI/SavedataScreen.h @@ -46,10 +46,12 @@ public: UI::Event OnChoice; private: + static void PrepFilename(UI::View *); + static void PrepSize(UI::View *); + static void PrepDate(UI::View *); static bool ByFilename(const UI::View *, const UI::View *); static bool BySize(const UI::View *, const UI::View *); static bool ByDate(const UI::View *, const UI::View *); - static bool SortDone(); void Refresh(); UI::EventReturn SavedataButtonClick(UI::EventParams &e); diff --git a/UI/TiltAnalogSettingsScreen.cpp b/UI/TiltAnalogSettingsScreen.cpp index d1170df37b..0176eb3824 100644 --- a/UI/TiltAnalogSettingsScreen.cpp +++ b/UI/TiltAnalogSettingsScreen.cpp @@ -42,7 +42,7 @@ void TiltAnalogSettingsScreen::CreateViews() { //TODO: allow values greater than 100? I'm not sure if that's needed. settings->Add(new PopupSliderChoice(&g_Config.iTiltSensitivityX, 0, 100, co->T("Tilt Sensitivity along X axis"), screenManager(),"%")); settings->Add(new PopupSliderChoice(&g_Config.iTiltSensitivityY, 0, 100, co->T("Tilt Sensitivity along Y axis"), screenManager(),"%")); - settings->Add(new PopupSliderChoiceFloat(&g_Config.fDeadzoneRadius, 0.0, 1.0, co->T("Deadzone Radius"), 0.01f, screenManager(),"/ 1.0")); + settings->Add(new PopupSliderChoiceFloat(&g_Config.fDeadzoneRadius, 0.0, 1.0, co->T("Deadzone radius"), 0.01f, screenManager(),"/ 1.0")); settings->Add(new PopupSliderChoiceFloat(&g_Config.fTiltDeadzoneSkip, 0.0, 1.0, co->T("Tilt Base Radius"), 0.01f, screenManager(),"/ 1.0")); settings->Add(new ItemHeader(co->T("Calibration"))); @@ -54,7 +54,7 @@ void TiltAnalogSettingsScreen::CreateViews() { settings->Add(calibrate); root_->Add(settings); - settings->Add(new ItemHeader("")); + settings->Add(new BorderView(BORDER_BOTTOM, BorderStyle::HEADER_FG, 2.0f, new LayoutParams(FILL_PARENT, 40.0f))); settings->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); } diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index 4cb21ea517..7cee7d6ed5 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -301,7 +301,7 @@ public: dc.Draw()->DrawImage(stickImage, bounds_.centerX(), bounds_.centerY(), scale_ * spacing_, colorBg, ALIGN_CENTER); } - float GetSpacing() const override { return spacing_; } + float GetSpacing() const override { return spacing_ * 3; } void SetSpacing(float s) override { // In mapping spacing is clamped between 0.5 and 3.0 and passed to this method spacing_ = s/3; @@ -606,59 +606,41 @@ void TouchControlLayoutScreen::update() { } void TouchControlLayoutScreen::CreateViews() { + using namespace UI; + // setup g_Config for button layout const Bounds &bounds = screenManager()->getUIContext()->GetBounds(); InitPadLayout(bounds.w, bounds.h); - const float leftColumnWidth = 140.0f; + const float leftColumnWidth = 170.0f; layoutAreaScale = 1.0-(leftColumnWidth+10)/bounds.w; - using namespace UI; - auto co = GetI18NCategory("Controls"); auto di = GetI18NCategory("Dialog"); root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); - Choice *reset = new Choice(di->T("Reset"), "", false, new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 84)); - Choice *back = new Choice(di->T("Back"), "", false, new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 10)); - Choice *visibility = new Choice(co->T("Customize"), "", false, new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 298)); - // controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fButtonScale, 0.80, 2.0, co->T("Button Scaling"), screenManager())) - // ->OnChange.Handle(this, &GameSettingsScreen::OnChangeControlScaling); + ScrollView *leftColumnScroll = root_->Add(new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 10))); + LinearLayout *leftColumn = leftColumnScroll->Add(new LinearLayout(ORIENT_VERTICAL)); - CheckBox *snap = new CheckBox(&g_Config.bTouchSnapToGrid, di->T("Snap"), "", new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 228)); - PopupSliderChoice *gridSize = new PopupSliderChoice(&g_Config.iTouchSnapGridSize, 2, 256, di->T("Grid"), screenManager(), "", new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 158)); - gridSize->SetEnabledPtr(&g_Config.bTouchSnapToGrid); - - mode_ = new ChoiceStrip(ORIENT_VERTICAL, new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 140 + 158 + 64 + 10)); + mode_ = new ChoiceStrip(ORIENT_VERTICAL); mode_->AddChoice(di->T("Move")); mode_->AddChoice(di->T("Resize")); mode_->SetSelection(0, false); mode_->OnChoice.Handle(this, &TouchControlLayoutScreen::OnMode); - reset->OnClick.Handle(this, &TouchControlLayoutScreen::OnReset); - back->OnClick.Handle(this, &UIScreen::OnBack); - visibility->OnClick.Handle(this, &TouchControlLayoutScreen::OnVisibility); - root_->Add(mode_); - root_->Add(visibility); - root_->Add(snap); - root_->Add(gridSize); - root_->Add(reset); - root_->Add(back); + CheckBox *snap = new CheckBox(&g_Config.bTouchSnapToGrid, di->T("Snap")); + PopupSliderChoice *gridSize = new PopupSliderChoice(&g_Config.iTouchSnapGridSize, 2, 256, di->T("Grid"), screenManager(), "", new AnchorLayoutParams(leftColumnWidth, WRAP_CONTENT, 10, NONE, NONE, 158)); + gridSize->SetEnabledPtr(&g_Config.bTouchSnapToGrid); - TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, leftColumnWidth, new AnchorLayoutParams(10, 0, 10, 0, false)); - tabHolder->SetTag("TouchControlLayout"); - root_->Add(tabHolder); + leftColumn->Add(mode_); + leftColumn->Add(new Choice(co->T("Customize")))->OnClick.Handle(this, &TouchControlLayoutScreen::OnVisibility); + leftColumn->Add(snap); + leftColumn->Add(gridSize); + leftColumn->Add(new Choice(di->T("Reset")))->OnClick.Handle(this, &TouchControlLayoutScreen::OnReset); + leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); - root_->Add(new ItemHeader("", new AnchorLayoutParams(leftColumnWidth + 10, bounds.h*(1.0-layoutAreaScale)-40, NONE, NONE, false))); - layoutView_ = root_->Add(new ControlLayoutView(new AnchorLayoutParams(leftColumnWidth + 10, bounds.h*(1.0-layoutAreaScale), 0.0f, 0.0f, false))); - - // this is more for show than anything else. It's used to provide a boundary - // so that buttons like back can be placed within the boundary. - // serves no other purpose. - // AnchorLayout *controlsHolder = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); - - auto ms = GetI18NCategory("MainSettings"); - - //tabHolder->AddTab(ms->T("Controls"), controlsHolder); + root_->Add(new BorderView(BORDER_BOTTOM, BorderStyle::ITEM_DOWN_BG, 4.0f, new AnchorLayoutParams(leftColumnWidth + 10, bounds.h * (1.0f - layoutAreaScale), 0.0f, NONE, false))); + root_->Add(new BorderView(BORDER_RIGHT, BorderStyle::ITEM_DOWN_BG, 4.0f, new AnchorLayoutParams(leftColumnWidth + 10, 0.0f, NONE, 0.0f, false))); + layoutView_ = root_->Add(new ControlLayoutView(new AnchorLayoutParams(leftColumnWidth + 10, bounds.h * (1.0 - layoutAreaScale), 0.0f, 0.0f, false))); } diff --git a/UWP/Common/DeviceResources.cpp b/UWP/Common/DeviceResources.cpp index fa1e71be5a..8527d77f51 100644 --- a/UWP/Common/DeviceResources.cpp +++ b/UWP/Common/DeviceResources.cpp @@ -1,4 +1,4 @@ -#include "pch.h" +#include "pch.h" #include #include "DeviceResources.h" #include "DirectXHelper.h" @@ -424,21 +424,27 @@ void DX::DeviceResources::CreateWindowSizeDependentResources() void DX::DeviceResources::UpdateRenderTargetSize() { m_effectiveDpi = m_dpi; - - // To improve battery life on high resolution devices, render to a smaller render target - // and allow the GPU to scale the output when it is presented. - if (!DisplayMetrics::SupportHighResolutions && m_dpi > DisplayMetrics::DpiThreshold) + if (Windows::System::Profile::AnalyticsInfo::VersionInfo->DeviceFamily == L"Windows.Xbox") { - float width = DX::ConvertDipsToPixels(m_logicalSize.Width, m_dpi); - float height = DX::ConvertDipsToPixels(m_logicalSize.Height, m_dpi); - - // When the device is in portrait orientation, height > width. Compare the - // larger dimension against the width threshold and the smaller dimension - // against the height threshold. - if (std::max(width, height) > DisplayMetrics::WidthThreshold && std::min(width, height) > DisplayMetrics::HeightThreshold) + m_effectiveDpi = 96.0f / static_cast(m_logicalSize.Height) * 1080.0f; + } + else + { + // To improve battery life on high resolution devices, render to a smaller render target + // and allow the GPU to scale the output when it is presented. + if (!DisplayMetrics::SupportHighResolutions && m_dpi >= DisplayMetrics::DpiThreshold) { - // To scale the app we change the effective DPI. Logical size does not change. - m_effectiveDpi /= 2.0f; + float width = DX::ConvertDipsToPixels(m_logicalSize.Width, m_dpi); + float height = DX::ConvertDipsToPixels(m_logicalSize.Height, m_dpi); + + // When the device is in portrait orientation, height > width. Compare the + // larger dimension against the width threshold and the smaller dimension + // against the height threshold. + if (std::max(width, height) > DisplayMetrics::WidthThreshold && std::min(width, height) > DisplayMetrics::HeightThreshold) + { + // To scale the app we change the effective DPI. Logical size does not change. + m_effectiveDpi /= 2.0f; + } } } // Calculate the necessary render target size in pixels. @@ -456,10 +462,37 @@ void DX::DeviceResources::SetWindow(CoreWindow^ window) DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); m_window = window; - m_logicalSize = Windows::Foundation::Size(window->Bounds.Width, window->Bounds.Height); + if (Windows::System::Profile::AnalyticsInfo::VersionInfo->DeviceFamily == L"Windows.Xbox") + { + const auto hdi = Windows::Graphics::Display::Core::HdmiDisplayInformation::GetForCurrentView(); + if (hdi) + { + try + { + const auto dm = hdi->GetCurrentDisplayMode(); + const unsigned int hdmi_width = dm->ResolutionWidthInRawPixels; + const unsigned int hdmi_height = dm->ResolutionHeightInRawPixels; + // If we're running on Xbox, use the HDMI mode instead of the CoreWindow size. + // In UWP, the CoreWindow is always 1920x1080, even when running at 4K. + + m_logicalSize = Windows::Foundation::Size(hdmi_width, hdmi_height); + m_dpi = currentDisplayInformation->LogicalDpi * 1.5; + } + catch (const Platform::Exception^) + { + m_logicalSize = Windows::Foundation::Size(window->Bounds.Width, window->Bounds.Height); + m_dpi = currentDisplayInformation->LogicalDpi; + } + } + } + else + { + m_logicalSize = Windows::Foundation::Size(window->Bounds.Width, window->Bounds.Height); + m_dpi = currentDisplayInformation->LogicalDpi; + } m_nativeOrientation = currentDisplayInformation->NativeOrientation; m_currentOrientation = currentDisplayInformation->CurrentOrientation; - m_dpi = currentDisplayInformation->LogicalDpi; + m_d2dContext->SetDpi(m_dpi, m_dpi); CreateWindowSizeDependentResources(); @@ -667,4 +700,4 @@ DXGI_MODE_ROTATION DX::DeviceResources::ComputeDisplayRotation() break; } return rotation; -} \ No newline at end of file +} diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj index 19882bdb05..e44da3fb91 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj +++ b/UWP/CoreUWP/CoreUWP.vcxproj @@ -400,6 +400,7 @@ + @@ -634,6 +635,7 @@ + diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters index 6a1542dfd1..753ecb296d 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj.filters +++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters @@ -682,6 +682,9 @@ Debugger\WebSocket + + Debugger\WebSocket + Debugger\WebSocket @@ -1685,6 +1688,9 @@ Debugger\WebSocket + + Debugger\WebSocket + Debugger\WebSocket diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index 29afda806e..e23e1eb8c1 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -434,6 +434,8 @@ bool System_GetPropertyBool(SystemProperty prop) { #endif case SYSPROP_CAN_JIT: return true; + case SYSPROP_HAS_KEYBOARD: + return true; default: return false; } diff --git a/Windows/Debugger/CPURegsInterface.h b/Windows/Debugger/CPURegsInterface.h deleted file mode 100644 index 4b5013b85d..0000000000 --- a/Windows/Debugger/CPURegsInterface.h +++ /dev/null @@ -1,4 +0,0 @@ - -#pragma once - -#include "Core/Core.h" diff --git a/Windows/Debugger/CtrlDisAsmView.cpp b/Windows/Debugger/CtrlDisAsmView.cpp index 4c3b13228f..15493687c6 100644 --- a/Windows/Debugger/CtrlDisAsmView.cpp +++ b/Windows/Debugger/CtrlDisAsmView.cpp @@ -3,6 +3,7 @@ #include "Windows/resource.h" #include "Core/MemMap.h" #include "Core/MIPS/JitCommon/JitCommon.h" +#include "Windows/W32Util/ContextMenu.h" #include "Windows/W32Util/Misc.h" #include "Windows/W32Util/ShellUtil.h" #include "Windows/MainWindow.h" @@ -29,7 +30,6 @@ #include TCHAR CtrlDisAsmView::szClassName[] = _T("CtrlDisAsmView"); -extern HMENU g_hPopupMenus; void CtrlDisAsmView::init() { @@ -926,16 +926,11 @@ void CtrlDisAsmView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) } else if (button == 2) { - //popup menu? - POINT pt; - GetCursorPos(&pt); - switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus,1),TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) + switch (TriggerContextMenu(ContextMenuID::DISASM, wnd, ContextPoint::FromEvent(lParam))) { case ID_DISASM_GOTOINMEMORYVIEW: SendMessage(GetParent(wnd),WM_DEB_GOTOHEXEDIT,curAddress,0); break; - case ID_DISASM_ADDHLE: - break; case ID_DISASM_TOGGLEBREAKPOINT: toggleBreakpoint(); redraw(); diff --git a/Windows/Debugger/CtrlMemView.cpp b/Windows/Debugger/CtrlMemView.cpp index 1d57442c8f..eeb7ad2d3e 100644 --- a/Windows/Debugger/CtrlMemView.cpp +++ b/Windows/Debugger/CtrlMemView.cpp @@ -7,6 +7,7 @@ #include "Core/Config.h" #include "Windows/resource.h" #include "Core/MemMap.h" +#include "Windows/W32Util/ContextMenu.h" #include "Windows/W32Util/Misc.h" #include "Windows/InputBox.h" #include "Windows/main.h" @@ -18,7 +19,6 @@ #include "DumpMemoryWindow.h" wchar_t CtrlMemView::szClassName[] = L"CtrlMemView"; -extern HMENU g_hPopupMenus; CtrlMemView::CtrlMemView(HWND _wnd) { @@ -421,7 +421,7 @@ void CtrlMemView::onChar(WPARAM wParam, LPARAM lParam) } bool active = Core_IsActive(); - if (active) Core_EnableStepping(true); + if (active) Core_EnableStepping(true, "memory.access", curAddress); if (asciiSelected) { @@ -475,18 +475,14 @@ void CtrlMemView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) { if (button==2) { - //popup menu? - POINT pt; - GetCursorPos(&pt); - bool enable16 = !asciiSelected && (curAddress % 2) == 0; bool enable32 = !asciiSelected && (curAddress % 4) == 0; - HMENU menu = GetSubMenu(g_hPopupMenus,0); + HMENU menu = GetContextMenu(ContextMenuID::MEMVIEW); EnableMenuItem(menu,ID_MEMVIEW_COPYVALUE_16,enable16 ? MF_ENABLED : MF_GRAYED); EnableMenuItem(menu,ID_MEMVIEW_COPYVALUE_32,enable32 ? MF_ENABLED : MF_GRAYED); - switch (TrackPopupMenuEx(menu,TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) + switch (TriggerContextMenu(ContextMenuID::MEMVIEW, wnd, ContextPoint::FromEvent(lParam))) { case ID_MEMVIEW_DUMP: { @@ -562,6 +558,13 @@ void CtrlMemView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) W32Util::CopyTextToClipboard(wnd,temp); } break; + + case ID_MEMVIEW_GOTOINDISASM: + if (disasmWindow) { + disasmWindow->Goto(curAddress); + disasmWindow->Show(true); + } + break; } return; } diff --git a/Windows/Debugger/CtrlRegisterList.cpp b/Windows/Debugger/CtrlRegisterList.cpp index 9cd9f36c0a..3de9f87221 100644 --- a/Windows/Debugger/CtrlRegisterList.cpp +++ b/Windows/Debugger/CtrlRegisterList.cpp @@ -7,6 +7,7 @@ #include "Common/Data/Encoding/Utf8.h" #include "Windows/resource.h" #include "Core/MemMap.h" +#include "Windows/W32Util/ContextMenu.h" #include "Windows/W32Util/Misc.h" #include "Windows/InputBox.h" @@ -19,8 +20,6 @@ #include "Windows/main.h" -extern HMENU g_hPopupMenus; - enum { REGISTER_PC = 32, REGISTER_HI, REGISTER_LO, REGISTERS_END }; TCHAR CtrlRegisterList::szClassName[] = _T("CtrlRegisterList"); @@ -509,9 +508,8 @@ void CtrlRegisterList::onMouseUp(WPARAM wParam, LPARAM lParam, int button) { return; } - POINT pt; - GetCursorPos(&pt); - switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus,3),TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) + + switch (TriggerContextMenu(ContextMenuID::REGLIST, wnd, ContextPoint::FromEvent(lParam))) { case ID_REGLIST_GOTOINMEMORYVIEW: SendMessage(GetParent(wnd),WM_DEB_GOTOHEXEDIT,val,0); diff --git a/Windows/Debugger/DebuggerShared.h b/Windows/Debugger/DebuggerShared.h index 1500d46392..6490a52837 100644 --- a/Windows/Debugger/DebuggerShared.h +++ b/Windows/Debugger/DebuggerShared.h @@ -2,8 +2,6 @@ #include "Common/CommonWindows.h" #include "Core/Debugger/DebugInterface.h" -extern HMENU g_hPopupMenus; - enum { WM_DEB_GOTOWPARAM = WM_USER+2, WM_DEB_GOTOADDRESSEDIT, WM_DEB_MAPLOADED, @@ -16,4 +14,4 @@ enum { WM_DEB_GOTOWPARAM = WM_USER+2, bool executeExpressionWindow(HWND hwnd, DebugInterface* cpu, u32& dest); void displayExpressionError(HWND hwnd); -bool parseExpression(const char* exp, DebugInterface* cpu, u32& dest); \ No newline at end of file +bool parseExpression(const char* exp, DebugInterface* cpu, u32& dest); diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 3d802ddeef..833a9dbe0d 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -405,11 +405,11 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) bottomTabs->ShowTab(stackTraceView->GetHandle()); break; - case ID_DEBUG_DSIPLAYREGISTERLIST: + case ID_DEBUG_DISPLAYREGISTERLIST: leftTabs->ShowTab(0); break; - case ID_DEBUG_DSIPLAYFUNCTIONLIST: + case ID_DEBUG_DISPLAYFUNCTIONLIST: leftTabs->ShowTab(1); break; @@ -420,7 +420,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) if (isRunning) { SetDebugMode(true, false); - Core_EnableStepping(true); + Core_EnableStepping(true, "cpu.breakpoint.add", 0); Core_WaitInactive(200); } @@ -523,7 +523,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { ptr->setDontRedraw(false); SetDebugMode(true, true); - Core_EnableStepping(true); + Core_EnableStepping(true, "ui.break", 0); Sleep(1); //let cpu catch up ptr->gotoPC(); UpdateDialog(); @@ -585,10 +585,6 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) } break; - case IDC_ALLFUNCTIONS: - if (g_symbolMap) - g_symbolMap->FillSymbolListBox(GetDlgItem(m_hDlg, IDC_FUNCTIONLIST),ST_FUNCTION); - break; default: return FALSE; } diff --git a/Windows/Debugger/Debugger_Disasm.h b/Windows/Debugger/Debugger_Disasm.h index e77a9bb2ca..9b14cbc7ba 100644 --- a/Windows/Debugger/Debugger_Disasm.h +++ b/Windows/Debugger/Debugger_Disasm.h @@ -6,7 +6,7 @@ #include "Windows/W32Util/TabControl.h" #include "Windows/Debugger/CtrlDisAsmView.h" #include "Windows/Debugger/Debugger_Lists.h" -#include "Windows/Debugger/CPURegsInterface.h" +#include "Core/Core.h" #include "Core/MIPS/MIPSDebugInterface.h" #include "Core/Debugger/Breakpoints.h" #include diff --git a/Windows/Debugger/Debugger_Lists.cpp b/Windows/Debugger/Debugger_Lists.cpp index 4463678dda..9c90d6d0f2 100644 --- a/Windows/Debugger/Debugger_Lists.cpp +++ b/Windows/Debugger/Debugger_Lists.cpp @@ -2,13 +2,14 @@ #include "Common/CommonWindows.h" #include #include +#include "Windows/Debugger/BreakpointWindow.h" #include "Windows/Debugger/DebuggerShared.h" #include "Windows/Debugger/CtrlDisAsmView.h" +#include "Windows/W32Util/ContextMenu.h" #include "Windows/resource.h" #include "Windows/main.h" -#include "BreakpointWindow.h" -#include "../../Core/HLE/sceKernelThread.h" #include "Common/Data/Encoding/Utf8.h" +#include "Core/HLE/sceKernelThread.h" enum { TL_NAME, TL_PROGRAMCOUNTER, TL_ENTRYPOINT, TL_PRIORITY, TL_STATE, TL_WAITTYPE, TL_COLUMNCOUNT }; enum { BPL_ENABLED, BPL_TYPE, BPL_OFFSET, BPL_SIZELABEL, BPL_OPCODE, BPL_CONDITION, BPL_HITS, BPL_COLUMNCOUNT }; @@ -66,10 +67,6 @@ GenericListViewDef moduleListDef = { moduleListColumns, ARRAY_SIZE(moduleListColumns), NULL, false }; -const int POPUP_SUBMENU_ID_BREAKPOINTLIST = 5; -const int POPUP_SUBMENU_ID_THREADLIST = 6; -const int POPUP_SUBMENU_ID_NEWBREAKPOINT = 7; - // // CtrlThreadList // @@ -114,10 +111,7 @@ void CtrlThreadList::showMenu(int itemIndex, const POINT &pt) if (Core_IsActive()) return; - POINT screenPt(pt); - ClientToScreen(GetHandle(), &screenPt); - - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_THREADLIST); + HMENU subMenu = GetContextMenu(ContextMenuID::THREADLIST); switch (threadInfo.status) { case THREADSTATUS_DEAD: case THREADSTATUS_DORMANT: @@ -138,7 +132,7 @@ void CtrlThreadList::showMenu(int itemIndex, const POINT &pt) break; } - switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, GetHandle(), 0)) + switch (TriggerContextMenu(ContextMenuID::THREADLIST, GetHandle(), ContextPoint::FromClient(pt))) { case ID_DISASM_THREAD_FORCERUN: __KernelResumeThreadFromWait(threadInfo.id, 0); @@ -569,16 +563,11 @@ void CtrlBreakpointList::OnToggle(int item, bool newValue) void CtrlBreakpointList::showBreakpointMenu(int itemIndex, const POINT &pt) { - POINT screenPt(pt); - ClientToScreen(GetHandle(), &screenPt); - bool isMemory; int index = getBreakpointIndex(itemIndex, isMemory); if (index == -1) { - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_NEWBREAKPOINT); - - switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, GetHandle(), 0)) + switch (TriggerContextMenu(ContextMenuID::NEWBREAKPOINT, GetHandle(), ContextPoint::FromClient(pt))) { case ID_DISASM_ADDNEWBREAKPOINT: { @@ -596,14 +585,14 @@ void CtrlBreakpointList::showBreakpointMenu(int itemIndex, const POINT &pt) bpPrev = displayedBreakPoints_[index]; } - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_BREAKPOINTLIST); + HMENU subMenu = GetContextMenu(ContextMenuID::BREAKPOINTLIST); if (isMemory) { CheckMenuItem(subMenu, ID_DISASM_DISABLEBREAKPOINT, MF_BYCOMMAND | (mcPrev.IsEnabled() ? MF_CHECKED : MF_UNCHECKED)); } else { CheckMenuItem(subMenu, ID_DISASM_DISABLEBREAKPOINT, MF_BYCOMMAND | (bpPrev.IsEnabled() ? MF_CHECKED : MF_UNCHECKED)); } - switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, GetHandle(), 0)) + switch (TriggerContextMenu(ContextMenuID::BREAKPOINTLIST, GetHandle(), ContextPoint::FromClient(pt))) { case ID_DISASM_DISABLEBREAKPOINT: if (isMemory) { diff --git a/Windows/Debugger/Debugger_Profiler.cpp b/Windows/Debugger/Debugger_Profiler.cpp deleted file mode 100644 index ab654ce6c3..0000000000 --- a/Windows/Debugger/Debugger_Profiler.cpp +++ /dev/null @@ -1,333 +0,0 @@ -// __________________________________________________________________________________________________ -// -// $Archive: $ -// $Revision: 1.42 $ -// $Author: tronic $ -// $Modtime: $ -// -///////////////////////////////////////////////////////////////////////////////////////////////////// -// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "stdafx.h" -#include -#include -#include "../resource.h" -#include "../../Globals.h" - -#include "Core/ARM/ARM.h" - -#include "Windows/Debugger/Debugger_Profiler.h" -#ifdef THEMES -#include "../XPTheme.h" -#include "../W32Util/TabControl.h" -#endif - -extern void SetDlgItemText_Hex(HWND _hDialog, int _iResource, u32 _iValue); -extern void SetDlgItemText_Float(HWND _hDialog, int _iResource, u32 _iReg); - -///////////////////////////////////////////////////////////////////////////////////////////////////// -// I M P L E M E N T A T I O N ////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// - -HINSTANCE CRegisters::m_hInstance = NULL; -HWND CRegisters::m_hParent = NULL; -HWND CRegisters::m_hDlg = NULL; -W32Util::TabControl * CRegisters::m_pWinTabCtrl= NULL; - -HWND CRegisters::m_pWinDialog_GPR = NULL; -HWND CRegisters::m_pWinDialog_FPU = NULL; -HWND CRegisters::m_pWinDialog_DMA = NULL; -HWND CRegisters::m_pWinDialog_TIMER = NULL; - -BOOL CRegisters::m_bPaired = FALSE; - -///////////////////////////////////////////////////////////////////////////////////////////////////// -// I M P L E M E N T A T I O N ////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// - -// __________________________________________________________________________________________________ -// constructor -// -void CRegisters::Init(HINSTANCE _hInstance, HWND _hParent) -{ - m_hInstance = _hInstance; - m_hParent = _hParent; - - // - // --- build dialog --- - // - - m_hDlg = CreateDialog(_hInstance, (LPCSTR)IDD_REGISTERS, _hParent, RegistersDlgProc); - ShowWindow(m_hDlg,SW_HIDE); - - m_pWinTabCtrl = new W32Util::TabControl(_hInstance, GetDlgItem(m_hDlg,IDC_REGISTER_TAB), RegistersDlgProc); - - m_pWinDialog_GPR = m_pWinTabCtrl->AddItem("Main", IDD_REGISTERS_GPR, RegistersDlgProc); - m_pWinDialog_FPU = m_pWinTabCtrl->AddItem("FPU", IDD_REGISTERS_FPU1, RegistersDlgProc); - m_pWinDialog_DMA = m_pWinTabCtrl->AddItem("Misc", IDD_REGISTERS_DMA, RegistersDlgProc); - -#ifdef THEMES - if (WTL::CTheme::IsThemingSupported()) - { - EnableThemeDialogTexture(m_pWinDialog_GPR,ETDT_ENABLETAB); - EnableThemeDialogTexture(m_pWinDialog_FPU,ETDT_ENABLETAB); - EnableThemeDialogTexture(m_pWinDialog_DMA,ETDT_ENABLETAB); - } -#endif -// m_pWinDialog_TIMER = m_pWinTabCtrl->AddItem("Timer",IDD_REGISTERS_TIMER, RegistersDlgProc); -} - -// __________________________________________________________________________________________________ -// destructor -// -void CRegisters::DeInit(void) -{ - DestroyWindow(m_hDlg); - DestroyWindow(m_pWinDialog_GPR); - DestroyWindow(m_pWinDialog_FPU); - DestroyWindow(m_pWinDialog_DMA); -} - -// __________________________________________________________________________________________________ -// Show -// -void -CRegisters::Show(bool _bShow) -{ - Update(); - ShowWindow(m_hDlg,_bShow?SW_NORMAL:SW_HIDE); - if (_bShow) - BringWindowToTop(m_hDlg); -} - -// __________________________________________________________________________________________________ -// Update -// -void -CRegisters::Update(void) -{ - UpdateGPR(); - UpdateFPU(); - UpdateDMA(); -// UpdateTIMER(); -} - -bool inChange = false; -void CRegisters::changeReg(DWORD control, int reg) -{ - inChange=true; - HWND ctrl = GetDlgItem(m_pWinDialog_GPR,control); - char temp[256]; - GetWindowText(ctrl,temp,256); - DWORD val; - sscanf(temp,"%08x",&val); - currentARM->r[reg] = val; - inChange=false; -} - - -// __________________________________________________________________________________________________ -// RegistersDlgProc -// -BOOL CALLBACK -CRegisters::RegistersDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - if (m_pWinTabCtrl != NULL) - { - m_pWinTabCtrl->MessageHandler (message,wParam,lParam); - } - - switch(message) - { - case WM_INITDIALOG: - { - return TRUE; - } - break; - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - /* - case IDC_PAIRED: - m_bPaired = Button_GetCheck(GetDlgItem(m_pWinDialog_FPU, IDC_PAIRED)); - CRegisters::UpdateFPU(); - break;*/ - - case IDC_GPR_R0: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R0,0); break; - case IDC_GPR_R1: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R1,1); break; - case IDC_GPR_R2: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R2,2); break; - case IDC_GPR_R3: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R3,3); break; - case IDC_GPR_R4: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R4,4); break; - case IDC_GPR_R5: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R5,5); break; - case IDC_GPR_R6: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R6,6); break; - case IDC_GPR_R7: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R7,7); break; - case IDC_GPR_R8: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R8,8); break; - case IDC_GPR_R9: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R9,9); break; - case IDC_GPR_R10: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R10,10); break; - case IDC_GPR_R11: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R11,11); break; - case IDC_GPR_R12: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R12,12); break; - case IDC_GPR_R13: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R13,13); break; - case IDC_GPR_R14: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R14,14); break; - case IDC_GPR_R15: if (HIWORD(wParam)==EN_CHANGE) changeReg(IDC_GPR_R15,15); break; - //case IDC_UPDATEMISC: UpdateDMA(); break; - } - break; - case WM_CLOSE: - Show(false); - break; - } - - return FALSE; -} - -// __________________________________________________________________________________________________ -// UpdateGPR -// -void -CRegisters::UpdateGPR(void) -{ - HWND hWnd = m_pWinDialog_GPR; - - SetDlgItemText_Hex(hWnd, IDC_GPR_R0, currentARM->r[0]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R1, currentARM->r[1]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R2, currentARM->r[2]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R3, currentARM->r[3]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R4, currentARM->r[4]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R5, currentARM->r[5]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R6, currentARM->r[6]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R7, currentARM->r[7]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R8, currentARM->r[8]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R9, currentARM->r[9]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R10, currentARM->r[10]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R11, currentARM->r[11]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R12, currentARM->r[12]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R13, currentARM->r[13]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R14, currentARM->r[14]); - SetDlgItemText_Hex(hWnd, IDC_GPR_R15, currentARM->r[15]); - - SetDlgItemText_Hex(hWnd, IDC_GPR_R13_SVC, currentARM->r13_svc); - SetDlgItemText_Hex(hWnd, IDC_GPR_R14_SVC, currentARM->r14_svc); - SetDlgItemText_Hex(hWnd, IDC_GPR_R13_USR, currentARM->r13_usr); - SetDlgItemText_Hex(hWnd, IDC_GPR_R14_USR, currentARM->r14_usr); - SetDlgItemText_Hex(hWnd, IDC_GPR_R13_IRQ, currentARM->r13_irq); - SetDlgItemText_Hex(hWnd, IDC_GPR_R14_IRQ, currentARM->r14_irq); - - SetDlgItemText_Hex(hWnd, IDC_GPR_CPSR, currentARM->GetCPSR()); - SetDlgItemText_Hex(hWnd, IDC_GPR_SPSR, currentARM->spsr); -/* SetDlgItemText_Hex(hWnd, IDC_GPR_LR, PowerPC::LR); - SetDlgItemText_Hex(hWnd, IDC_GPR_CR, PowerPC::ppcState.cr); - SetDlgItemText_Hex(hWnd, IDC_GPR_TU, PowerPC::ppcState.TU); - SetDlgItemText_Hex(hWnd, IDC_GPR_TL, PowerPC::ppcState.TL); - SetDlgItemText_Hex(hWnd, IDC_GPR_CTR, PowerPC::CTR); - SetDlgItemText_Hex(hWnd, IDC_GPR_DEC, PowerPC::DEC); - SetDlgItemText_Hex(hWnd, IDC_GPR_MSR, PowerPC::ppcState.msr); - SetDlgItemText_Hex(hWnd, IDC_GPR_SRR0, PowerPC::SRR0); - SetDlgItemText_Hex(hWnd, IDC_GPR_SRR1, PowerPC::SRR1); - SetDlgItemText_Hex(hWnd, IDC_GPR_EXCEPTIONS, PowerPC::ppcState.Exceptions); -*/ -} - -void -CRegisters::UpdateFPU(void) -{ - HWND hWnd = m_pWinDialog_FPU; -/* - SetDlgItemText_Float(hWnd, IDC_FPU_R0, 0); - SetDlgItemText_Float(hWnd, IDC_FPU_R1, 1); - SetDlgItemText_Float(hWnd, IDC_FPU_R2, 2); - SetDlgItemText_Float(hWnd, IDC_FPU_R3, 3); - SetDlgItemText_Float(hWnd, IDC_FPU_R4, 4); - SetDlgItemText_Float(hWnd, IDC_FPU_R5, 5); - SetDlgItemText_Float(hWnd, IDC_FPU_R6, 6); - SetDlgItemText_Float(hWnd, IDC_FPU_R7, 7); - SetDlgItemText_Float(hWnd, IDC_FPU_R8, 8); - SetDlgItemText_Float(hWnd, IDC_FPU_R9, 9); - SetDlgItemText_Float(hWnd, IDC_FPU_R10, 10); - SetDlgItemText_Float(hWnd, IDC_FPU_R11, 11); - SetDlgItemText_Float(hWnd, IDC_FPU_R12, 12); - SetDlgItemText_Float(hWnd, IDC_FPU_R13, 13); - SetDlgItemText_Float(hWnd, IDC_FPU_R14, 14); - SetDlgItemText_Float(hWnd, IDC_FPU_R15, 15); - SetDlgItemText_Float(hWnd, IDC_FPU_R16, 16); - SetDlgItemText_Float(hWnd, IDC_FPU_R17, 17); - SetDlgItemText_Float(hWnd, IDC_FPU_R18, 18); - SetDlgItemText_Float(hWnd, IDC_FPU_R19, 19); - SetDlgItemText_Float(hWnd, IDC_FPU_R20, 20); - SetDlgItemText_Float(hWnd, IDC_FPU_R21, 21); - SetDlgItemText_Float(hWnd, IDC_FPU_R22, 22); - SetDlgItemText_Float(hWnd, IDC_FPU_R23, 23); - SetDlgItemText_Float(hWnd, IDC_FPU_R24, 24); - SetDlgItemText_Float(hWnd, IDC_FPU_R25, 25); - SetDlgItemText_Float(hWnd, IDC_FPU_R26, 26); - SetDlgItemText_Float(hWnd, IDC_FPU_R27, 27); - SetDlgItemText_Float(hWnd, IDC_FPU_R28, 28); - SetDlgItemText_Float(hWnd, IDC_FPU_R29, 29); - SetDlgItemText_Float(hWnd, IDC_FPU_R30, 30); - SetDlgItemText_Float(hWnd, IDC_FPU_R31, 31); - - SetDlgItemText_Hex(hWnd, IDC_FPU_FPSCR, (DWORD)PowerPC::ppcState.fpscr); - SetDlgItemText_Hex(hWnd, IDC_FPU_HID2, HID2.Hex); -*/ - /* - SetDlgItemText_Hex(hWnd, IDC_GPR_XER, ppcState.xer); - SetDlgItemText_Hex(hWnd, IDC_GPR_LR, ppcState.lr); - SetDlgItemText_Hex(hWnd, IDC_GPR_CR, ppcState.cr); - SetDlgItemText_Hex(hWnd, IDC_GPR_TU, ppcState.tu); - SetDlgItemText_Hex(hWnd, IDC_GPR_TL, ppcState.tl); - SetDlgItemText_Hex(hWnd, IDC_GPR_CTR, ppcState.ctr); - SetDlgItemText_Hex(hWnd, IDC_GPR_DEC, ppcState.dec); -*/ -} - -// __________________________________________________________________________________________________ -// UpdateDMA -// -void -CRegisters::UpdateDMA(void) -{ - HWND hWnd = m_pWinDialog_DMA; -/* - SetDlgItemText_Hex(hWnd, IDC_SOURCE_ADDR_DMA0, CPeripheralInterface::m_InterruptCause); - SetDlgItemText_Hex(hWnd, IDC_DEST_ADDR_DMA0, CPeripheralInterface::m_InterruptMask); - - SetDlgItemText_Hex(hWnd, IDC_SPRG0, PowerPC::SPRG0); - SetDlgItemText_Hex(hWnd, IDC_SPRG1, PowerPC::SPRG1); - SetDlgItemText_Hex(hWnd, IDC_SPRG2, PowerPC::SPRG2); - SetDlgItemText_Hex(hWnd, IDC_SPRG3, PowerPC::SPRG3); - - SetDlgItemText_Hex(hWnd, IDC_FIFOCPUBASE, CGPFifo::fifo.cpubegin); - SetDlgItemText_Hex(hWnd, IDC_FIFOCPUEND, CGPFifo::fifo.cpuend); - SetDlgItemText_Hex(hWnd, IDC_FIFOCPUWRITEPTR, CGPFifo::fifo.writeptr); - - SetDlgItemText_Hex(hWnd, IDC_FIFOGPBASE, CGPFifo::fifo.gpbegin); - SetDlgItemText_Hex(hWnd, IDC_FIFOGPEND, CGPFifo::fifo.gpend); - SetDlgItemText_Hex(hWnd, IDC_FIFOGPREADPTR, CGPFifo::fifo.readptr); - SetDlgItemText_Hex(hWnd, IDC_FIFOGPBREAKPT, CGPFifo::fifo.breakpt); - SetDlgItemText_Hex(hWnd, IDC_FIFOGPUNKNOWN, CGPFifo::fifo.gpunknown); - - CheckDlgButton(hWnd,IDC_BPENABLE,CGPFifo::fifo.bpenable);*/ -} - -void SetDlgItemText_Hex(HWND _hDialog, int _iResource, u32 _iValue) -{ - char szBuffer[32]; - sprintf(szBuffer, "%08X", _iValue); - SetDlgItemText(_hDialog, _iResource, szBuffer); -} - -void SetDlgItemText_Float(HWND _hDialog, int _iResource, u32 _iReg) -{ - /* - char szBuffer[128]; - if (CRegisters::m_bPaired) - { - sprintf(szBuffer, "%.4f %.4f", (float)PowerPC::ppcState.fpr[_iReg], (float)PowerPC::ppcState.ps1[_iReg]); - } - else - { - sprintf(szBuffer, "%.6e", *(double*)&PowerPC::ppcState.fpr[_iReg]); - } - SetDlgItemText(_hDialog, _iResource, szBuffer);*/ -} \ No newline at end of file diff --git a/Windows/Debugger/Debugger_Profiler.h b/Windows/Debugger/Debugger_Profiler.h deleted file mode 100644 index 7a8b4b8132..0000000000 --- a/Windows/Debugger/Debugger_Profiler.h +++ /dev/null @@ -1,67 +0,0 @@ -// __________________________________________________________________________________________________ -// -// $Archive: $ -// $Revision: 1.7 $ -// $Author: tronic $ -// $Modtime: $ -// -///////////////////////////////////////////////////////////////////////////////////////////////////// -// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef _REGISTERS_H -#define _REGISTERS_H - -#include "../W32Util/TabControl.h" - - -class CRegisters -{ -private: - - static HINSTANCE m_hInstance; - static HWND m_hParent; - - static HWND m_hDlg; - static W32Util::TabControl *m_pWinTabCtrl; - - static HWND m_pWinDialog_GPR; - static HWND m_pWinDialog_DMA; - static HWND m_pWinDialog_FPU; - static HWND m_pWinDialog_TIMER; - - - static BOOL CALLBACK RegistersDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - - // update regs - static void UpdateGPR(void); - - // update dma regs - static void UpdateDMA(void); - - // update dma regs - static void UpdateFPU(void); - - static void changeReg(DWORD control, int reg); -public: - static BOOL m_bPaired; - - // constructor - static void Init(HINSTANCE _hInstance, HWND _hParent); - - // destructor - static void DeInit(void); - - // - // --- tools --- - // - - // show - static void Show(bool _bShow); - - // show - static void Update(void); -}; - - -#endif \ No newline at end of file diff --git a/Windows/Debugger/Debugger_SymbolMap.h b/Windows/Debugger/Debugger_SymbolMap.h deleted file mode 100644 index 43c3e31d6b..0000000000 --- a/Windows/Debugger/Debugger_SymbolMap.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "../../Globals.h" - - -bool Debugger_LoadSymbolMap(const char *filename); -void Debugger_SaveSymbolMap(const char *filename); -void Debugger_AddSymbol(const char *symbolname, unsigned int vaddress, size_t size, SymbolType symbol); -void Debugger_ResetSymbolMap(); -void Debugger_AnalyzeBackwards(); -int Debugger_GetSymbolNum(unsigned int address, SymbolType symmask=ST_FUNCTION); -char *Debugger_GetDescription(unsigned int address); -void Debugger_FillSymbolListBox(HWND listbox, SymbolType symmask=ST_FUNCTION); -void Debugger_FillSymbolComboBox(HWND listbox,SymbolType symmask=ST_FUNCTION); -void Debugger_FillListBoxBLinks(HWND listbox, int num); -int Debugger_GetNumSymbols(); -char *Debugger_GetSymbolName(int i); -void Debugger_SetSymbolName(int i, const char *newname); -size_t Debugger_GetSymbolSize(int i); -u32 Debugger_GetSymbolAddr(int i); -int Debugger_FindSymbol(const char *name); -DWORD Debugger_GetAddress(int num); -void Debugger_IncreaseRunCount(int num); -unsigned int Debugger_GetRunCount(int num); -void Debugger_SortSymbols(); - -void Debugger_UseFuncSignaturesFile(const char *filename, u32 maxAddress); -void Debugger_CompileFuncSignaturesFile(const char *filename); diff --git a/Windows/Debugger/DumpMemoryWindow.cpp b/Windows/Debugger/DumpMemoryWindow.cpp index 67b95ce8fe..a55337b149 100644 --- a/Windows/Debugger/DumpMemoryWindow.cpp +++ b/Windows/Debugger/DumpMemoryWindow.cpp @@ -81,7 +81,7 @@ INT_PTR CALLBACK DumpMemoryWindow::dlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, bool priorDumpWasStepping = Core_IsStepping(); if (!priorDumpWasStepping && PSP_IsInited()) { // If emulator isn't paused force paused state, but wait before locking. - Core_EnableStepping(true); + Core_EnableStepping(true, "memory.access", bp->start); Core_WaitInactive(); } diff --git a/Windows/Debugger/SimpleELF.h b/Windows/Debugger/SimpleELF.h deleted file mode 100644 index 1bee3e41eb..0000000000 --- a/Windows/Debugger/SimpleELF.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef GCELF_H -#define GCELF_H - -// ELF File Types -#define ET_NONE 0 // No file type -#define ET_REL 1 // Relocatable file -#define ET_EXEC 2 // Executable file -#define ET_DYN 3 // Shared object file -#define ET_CORE 4 // Core file -#define ET_LOPROC 0xFF00 // Processor specific -#define ET_HIPROC 0xFFFF // Processor specific - -// ELF Machine Types -#define EM_NONE 0 // No machine -#define EM_M32 1 // AT&T WE 32100 -#define EM_SPARC 2 // SPARC -#define EM_386 3 // Intel Architecture -#define EM_68K 4 // Motorola 68000 -#define EM_88K 5 // Motorola 88000 -#define EM_860 6 // Intel 80860 -#define EM_MIPS 7 // MIPS RS3000 Big-Endian -#define EM_MIPS_RS4_BE 8 // MIPS RS4000 Big-Endian -#define EM_ARM 40 // ARM/Thumb Architecture - -// ELF Version Types -#define EV_NONE 0 // Invalid version -#define EV_CURRENT 1 // Current version - -// ELF Section Header Types -#define SHT_NULL 0 -#define SHT_PROGBITS 1 -#define SHT_SYMTAB 2 -#define SHT_STRTAB 3 -#define SHT_RELA 4 -#define SHT_HASH 5 -#define SHT_DYNAMIC 6 -#define SHT_NOTE 7 -#define SHT_NOBITS 8 -#define SHT_REL 9 -#define SHT_SHLIB 10 -#define SHT_DYNSYM 11 - - -typedef struct -{ - unsigned char ID[4]; - unsigned char clazz; - unsigned char data; - unsigned char version; - unsigned char pad[9]; - unsigned short e_type; // ELF file type - unsigned short e_machine; // ELF target machine - unsigned long e_version; // ELF file version number - unsigned long e_entry; - unsigned long e_phoff; - unsigned long e_shoff; - unsigned long e_flags; - unsigned short e_ehsize; - unsigned short e_phentsize; - unsigned short e_phnum; - unsigned short e_shentsize; - unsigned short e_shnum; - unsigned short e_shtrndx; -} ELF_Header; - -typedef struct { - unsigned long type; - unsigned long offset; - unsigned long vaddr; - unsigned long paddr; - unsigned long filesz; - unsigned long memsz; - unsigned long flags; - unsigned long align; -} Program_Header; - -typedef struct -{ - unsigned long name; - unsigned long type; - unsigned long flags; - unsigned long addr; - unsigned long offset; - unsigned long size; - unsigned long link; - unsigned long info; - unsigned long addralign; - unsigned long entsize; -} Section_Header; - -typedef struct { - unsigned long name; - unsigned long value; - unsigned long size; - unsigned char info; - unsigned char other; - unsigned short shndx; -} Symbol_Header; - -typedef struct { - unsigned long offset; - unsigned long info; - signed long addend; -} Rela_Header; - -const char ELFID[4] = {0x7F, 'E', 'L', 'F'}; - -#endif \ No newline at end of file diff --git a/Windows/DlgDynaView.cpp b/Windows/DlgDynaView.cpp deleted file mode 100644 index 8717b14907..0000000000 --- a/Windows/DlgDynaView.cpp +++ /dev/null @@ -1,224 +0,0 @@ - -#include "stdafx.h" -#include - -#include "resource.h" - -#include "Core/HW.h" -#include "Core/MemMap.h" -//#include "hw\hw.h" -#include "DlgDynaView.h" -//#include "PowerPC/PowerPCDisasm.h" -//#include "PowerPC/DynaRec/DynaCodeCache.h" -//#include "pchw/x86Disasm.h" - -#ifdef THEMES -#include "XPTheme.h" -#endif - -///////////////////////////////////////////////////////////////////////////////////////////////////// -// I M P L E M E N T A T I O N ////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// - -HINSTANCE CDynaViewDlg::m_hInstance = NULL; -HWND CDynaViewDlg::m_hParent = NULL; -HWND CDynaViewDlg::m_hDlg = NULL; -int CDynaViewDlg::m_iBlock = -1; -HFONT dfont; -//RECT slRect; - -// __________________________________________________________________________________________________ -// constructor -// -void CDynaViewDlg::Init(HINSTANCE _hInstance, HWND _hParent) -{ - m_hInstance = _hInstance; - m_hParent = _hParent; - dfont = CreateFont(14,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH, - "Courier New"); - - // - // --- build dialog --- - // - m_hDlg = CreateDialog(_hInstance, (LPCSTR)IDD_DYNAVIEW, _hParent, DlgProc); - Size(); - ShowWindow(m_hDlg,SW_HIDE); -#ifdef THEMES - if (WTL::CTheme::IsThemingSupported()) - EnableThemeDialogTexture(m_hDlg ,ETDT_ENABLETAB); -#endif - - //m_hListView = GetDlgItem(m_hDlg , IDC_SEARCHRESULTS); -// SetWindowText(GetDlgItem(m_hDlg ,IDC_SEARCHRANGESTART),"80003100"); -// SetWindowText(GetDlgItem(m_hDlg ,IDC_SEARCHRANGEEND),"80400000"); - - //GetWindowRect(GetDlgItem(hDlg,IDC_SYMBOLS),&slRect); - //Size(); -} - -// __________________________________________________________________________________________________ -// destructor -// -void CDynaViewDlg::DeInit(void) -{ - DeleteObject(dfont); -} - -// __________________________________________________________________________________________________ -// Show -// -void -CDynaViewDlg::Show(bool _bShow) -{ - ShowWindow(m_hDlg, _bShow?SW_NORMAL:SW_HIDE); - if (_bShow) - BringWindowToTop(m_hDlg); -} - - -// __________________________________________________________________________________________________ -// RegistersDlgProc -// -BOOL CALLBACK -CDynaViewDlg::DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - - switch(message) - { - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDC_PREVBLOCK: - { - if (m_iBlock>0) - View(m_iBlock-1); - } - break; - case IDC_NEXTBLOCK: - { - if (m_iBlock>=-1) - View(m_iBlock+1); - } - break; - case IDC_CODEADDRESS: - { - - } - break; - } - } - break; - case WM_INITDIALOG: - { - SendMessage(GetDlgItem(hDlg,IDC_X86ASM),WM_SETFONT,(WPARAM)dfont,0); - SendMessage(GetDlgItem(hDlg,IDC_POWERPCASM),WM_SETFONT,(WPARAM)dfont,0); - View(-1); - return TRUE; - } - break; - case WM_SIZE: - Size(); - break; - - case WM_CLOSE: - Show(false); - break; - } - - return FALSE; -} - - -void CDynaViewDlg::View(int blocknum) -{ - if (!HW_IsInited() || blocknum == -1) - { - m_iBlock = -1; - SetWindowText(GetDlgItem(m_hDlg,IDC_POWERPCASM), "Invalid block"); - SetWindowText(GetDlgItem(m_hDlg,IDC_X86ASM), "Invalid block"); - SetWindowText(GetDlgItem(m_hDlg,IDC_BLOCKNUMBER), "N/A"); - return; - } - m_iBlock = blocknum; - /* - CDynaCodeCache::Codeblock *block; - block = CDynaCodeCache::GetCodeBlock(m_iBlock); - if (block == 0 || block->m_pCode == 0) - { - View(-1); - return; - } - char temp[256]; - int addr=block->m_uAddress; - sprintf(temp,"%08x",addr); - SetWindowText(GetDlgItem(m_hDlg,IDC_CODEADDRESS),temp); - - char *bigtemp = new char[65536]; - bigtemp[0]=0; - for (int i=0; im_uBlockSize; i++, addr+=4) - { - u32 op = i==0?block->m_uOriginalOp:CMemory::ReadUncheckedu32(addr); - strcat(bigtemp,DisassembleGekko(op,addr)); - strcat(bigtemp,"\x0D\x0A"); - } - SetWindowText(GetDlgItem(m_hDlg,IDC_POWERPCASM),bigtemp); - - bigtemp[0]=0; - _u8 *x86 = block->m_pCode; - while (x86m_pCode+block->m_uCodeSize) - { - int size; - strcat(bigtemp,disasmx86((unsigned char*)x86,(int)x86,&size)); - strcat(bigtemp,"\x0D\x0A"); - x86+=size; - } - SetWindowText(GetDlgItem(m_hDlg,IDC_X86ASM),bigtemp); - - sprintf(temp,"%i/%i",m_iBlock,CDynaCodeCache::GetNumBlocks()); - SetWindowText(GetDlgItem(m_hDlg,IDC_BLOCKNUMBER), temp); - delete [] bigtemp; - */ -} - -void CDynaViewDlg::ViewAddr(u32 addr) -{ - /* - int num = CDynaCodeCache::GetCodeBlockNumber(addr); - if (num!=-1) - View(num);*/ -} - -void CDynaViewDlg::Size() -{ - RECT rc,rc2; - GetClientRect(m_hDlg,&rc); - int dw=rc.right-rc.left; - int dh=rc.bottom-rc.top; - - int space = 6; - - HWND lbox = GetDlgItem(m_hDlg, IDC_POWERPCASM); - HWND rbox = GetDlgItem(m_hDlg, IDC_X86ASM); - GetWindowRect(lbox,&rc2); - - int boxw = (dw-space*3)/2; - int boxtop = 40; - int boxh = dh-boxtop-space; - MoveWindow(lbox,space,boxtop,boxw,boxh,TRUE); - MoveWindow(rbox,space*2+boxw,boxtop,boxw,boxh,TRUE); - /* - RECT rc; - HWND hDlg = m_pWinDialog->GetDialogHandle(); - GetClientRect(hDlg,&rc); - int dw=rc.right-rc.left; - int dh=rc.bottom-rc.top; - HWND memView = GetDlgItem(hDlg, IDC_MEMVIEW); - HWND symList = GetDlgItem(hDlg, IDC_SYMBOLS); - int wf = slRect.right-slRect.left; - int w = dw-3-wf; - int top = 48; - MoveWindow(symList,0,top,wf,dh-top,TRUE); - MoveWindow(memView,wf+4,top,w,dh-top,TRUE); - */ -} \ No newline at end of file diff --git a/Windows/DlgDynaView.h b/Windows/DlgDynaView.h deleted file mode 100644 index e5d8d17d3d..0000000000 --- a/Windows/DlgDynaView.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - - -class CDynaViewDlg -{ -private: - static HINSTANCE m_hInstance; - static HWND m_hParent; - static int m_iBlock; - static HWND m_hDlg; - - static BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - -public: - // constructor - static void Init(HINSTANCE _hInstance, HWND _hParent); - - // destructor - static void DeInit(void); - // - // --- tools --- - // - static HWND GetDlgHandle() - { - return m_hDlg; - } - - // show - static void Show(bool _bShow); - static void Size(); - - static void View(int num); - static void ViewAddr(u32 addr); -}; diff --git a/Windows/GEDebugger/CtrlDisplayListView.cpp b/Windows/GEDebugger/CtrlDisplayListView.cpp index cdcb68e1f7..296851c630 100644 --- a/Windows/GEDebugger/CtrlDisplayListView.cpp +++ b/Windows/GEDebugger/CtrlDisplayListView.cpp @@ -4,6 +4,7 @@ #include "Windows/GEDebugger/CtrlDisplayListView.h" #include "Windows/GEDebugger/GEDebugger.h" #include "Windows/InputBox.h" +#include "Windows/W32Util/ContextMenu.h" #include "Windows/main.h" #include "Core/Config.h" #include "GPU/Debugger/Breakpoints.h" @@ -11,9 +12,6 @@ LPCTSTR CtrlDisplayListView::windowClass = _T("CtrlDisplayListView"); -const int POPUP_SUBMENU_ID_DISPLAYLISTVIEW = 8; -extern HMENU g_hPopupMenus; - void CtrlDisplayListView::registerClass() { WNDCLASSEX wndClass; @@ -298,10 +296,7 @@ void CtrlDisplayListView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) { if (button == 2) { - //popup menu? - POINT pt; - GetCursorPos(&pt); - switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus,POPUP_SUBMENU_ID_DISPLAYLISTVIEW),TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) + switch (TriggerContextMenu(ContextMenuID::DISPLAYLISTVIEW, wnd, ContextPoint::FromEvent(lParam))) { case ID_DISASM_GOTOINMEMORYVIEW: if (memoryWindow) diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index 706550ccbf..9ac704543a 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -33,6 +33,7 @@ #include "Windows/GEDebugger/TabDisplayLists.h" #include "Windows/GEDebugger/TabState.h" #include "Windows/GEDebugger/TabVertices.h" +#include "Windows/W32Util/ContextMenu.h" #include "Windows/W32Util/ShellUtil.h" #include "Windows/InputBox.h" #include "Windows/MainWindow.h" @@ -48,8 +49,6 @@ #include #include -const int POPUP_SUBMENU_ID_GEDBG_PREVIEW = 10; - using namespace GPUBreakpoints; using namespace GPUDebug; using namespace GPUStepping; @@ -211,15 +210,13 @@ CGEDebugger::~CGEDebugger() { void CGEDebugger::SetupPreviews() { if (primaryWindow == nullptr) { - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_GEDBG_PREVIEW); - primaryWindow = SimpleGLWindow::GetFrom(GetDlgItem(m_hDlg, IDC_GEDBG_FRAME)); primaryWindow->Initialize(SimpleGLWindow::ALPHA_IGNORE | SimpleGLWindow::RESIZE_SHRINK_CENTER); primaryWindow->SetHoverCallback([&] (int x, int y) { PrimaryPreviewHover(x, y); }); - primaryWindow->SetRightClickMenu(subMenu, [&] (int cmd) { - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_GEDBG_PREVIEW); + primaryWindow->SetRightClickMenu(ContextMenuID::GEDBG_PREVIEW, [&] (int cmd) { + HMENU subMenu = GetContextMenu(ContextMenuID::GEDBG_PREVIEW); switch (cmd) { case 0: // Setup. @@ -246,15 +243,13 @@ void CGEDebugger::SetupPreviews() { primaryWindow->Clear(); } if (secondWindow == nullptr) { - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_GEDBG_PREVIEW); - secondWindow = SimpleGLWindow::GetFrom(GetDlgItem(m_hDlg, IDC_GEDBG_TEX)); secondWindow->Initialize(SimpleGLWindow::ALPHA_BLEND | SimpleGLWindow::RESIZE_SHRINK_CENTER); secondWindow->SetHoverCallback([&] (int x, int y) { SecondPreviewHover(x, y); }); - secondWindow->SetRightClickMenu(subMenu, [&] (int cmd) { - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_GEDBG_PREVIEW); + secondWindow->SetRightClickMenu(ContextMenuID::GEDBG_PREVIEW, [&] (int cmd) { + HMENU subMenu = GetContextMenu(ContextMenuID::GEDBG_PREVIEW); switch (cmd) { case 0: // Setup. diff --git a/Windows/GEDebugger/SimpleGLWindow.cpp b/Windows/GEDebugger/SimpleGLWindow.cpp index d9b60b7418..b8c26069cf 100644 --- a/Windows/GEDebugger/SimpleGLWindow.cpp +++ b/Windows/GEDebugger/SimpleGLWindow.cpp @@ -23,6 +23,7 @@ #include "Common/Common.h" #include "Common/Log.h" #include "Windows/GEDebugger/SimpleGLWindow.h" +#include "Windows/W32Util/ContextMenu.h" const wchar_t *SimpleGLWindow::windowClass = L"SimpleGLWindow"; @@ -563,11 +564,10 @@ bool SimpleGLWindow::RightClick(int mouseX, int mouseY) { } POINT pt{mouseX, mouseY}; - ClientToScreen(hWnd_, &pt); rightClickCallback_(0); - int result = TrackPopupMenuEx(rightClickMenu_, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, hWnd_, 0); - if (result != 0) { + int result = TriggerContextMenu(rightClickMenu_, hWnd_, ContextPoint::FromClient(pt)); + if (result > 0) { rightClickCallback_(result); } diff --git a/Windows/GEDebugger/SimpleGLWindow.h b/Windows/GEDebugger/SimpleGLWindow.h index c6ebb1c104..caf90b8b6d 100644 --- a/Windows/GEDebugger/SimpleGLWindow.h +++ b/Windows/GEDebugger/SimpleGLWindow.h @@ -22,6 +22,7 @@ #include "Common/GPU/OpenGL/GLSLProgram.h" #include "Common/CommonWindows.h" +#include "Windows/W32Util/ContextMenu.h" struct SimpleGLWindow { static const wchar_t *windowClass; @@ -116,7 +117,7 @@ struct SimpleGLWindow { } // Called first with 0 that it's opening, then the selected item. - void SetRightClickMenu(HMENU menu, std::function callback) { + void SetRightClickMenu(ContextMenuID menu, std::function callback) { rightClickCallback_ = callback; rightClickMenu_ = menu; } @@ -173,5 +174,5 @@ protected: std::function redrawCallback_; std::function hoverCallback_; std::function rightClickCallback_; - HMENU rightClickMenu_; + ContextMenuID rightClickMenu_; }; diff --git a/Windows/GEDebugger/TabState.cpp b/Windows/GEDebugger/TabState.cpp index 275adfd565..66eec95cff 100644 --- a/Windows/GEDebugger/TabState.cpp +++ b/Windows/GEDebugger/TabState.cpp @@ -17,10 +17,10 @@ #include "Common/Common.h" #include "Windows/resource.h" -#include "Windows/main.h" #include "Windows/InputBox.h" #include "Windows/GEDebugger/GEDebugger.h" #include "Windows/GEDebugger/TabState.h" +#include "Windows/W32Util/ContextMenu.h" #include "GPU/GPUState.h" #include "GPU/GeDisasm.h" #include "GPU/Common/GPUDebugInterface.h" @@ -28,8 +28,6 @@ using namespace GPUBreakpoints; -const int POPUP_SUBMENU_ID_GEDBG_STATE = 9; - // TODO: Show an icon or something for breakpoints, toggle. static const GenericListViewColumn stateValuesCols[] = { { L"Name", 0.50f }, @@ -876,7 +874,7 @@ void CtrlStateValues::OnRightClick(int row, int column, const POINT &point) { POINT screenPt(point); ClientToScreen(GetHandle(), &screenPt); - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_GEDBG_STATE); + HMENU subMenu = GetContextMenu(ContextMenuID::GEDBG_STATE); SetMenuDefaultItem(subMenu, ID_REGLIST_CHANGE, FALSE); // Ehh, kinda ugly. @@ -886,7 +884,7 @@ void CtrlStateValues::OnRightClick(int row, int column, const POINT &point) { ModifyMenu(subMenu, ID_GEDBG_WATCH, MF_BYCOMMAND | MF_STRING, ID_GEDBG_WATCH, L"Add Watch"); } - switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, GetHandle(), 0)) + switch (TriggerContextMenu(ContextMenuID::GEDBG_STATE, GetHandle(), ContextPoint::FromClient(point))) { case ID_DISASM_TOGGLEBREAKPOINT: if (IsCmdBreakpoint(info.cmd)) { diff --git a/Windows/MainThread.h b/Windows/MainThread.h deleted file mode 100644 index 6f70f09bee..0000000000 --- a/Windows/MainThread.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index 980b07bca3..72374b749b 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -233,10 +233,6 @@ namespace MainWindow g_Config.iInternalResolution = 0; } - // Taking auto-texture scaling into account - if (g_Config.iTexScalingLevel == TEXSCALING_AUTO) - setTexScalingMultiplier(0); - NativeMessageReceived("gpu_resized", ""); } @@ -768,7 +764,7 @@ namespace MainWindow if (disasmWindow) SendMessage(disasmWindow->GetDlgHandle(), WM_COMMAND, IDC_STOPGO, 0); else - Core_EnableStepping(pause); + Core_EnableStepping(pause, "ui.lost_focus", 0); } } diff --git a/Windows/MainWindow.h b/Windows/MainWindow.h index 0a35aebdf1..38c239c615 100644 --- a/Windows/MainWindow.h +++ b/Windows/MainWindow.h @@ -51,7 +51,6 @@ namespace MainWindow RESOLUTION_9X = 9, RESOLUTION_MAX = 32, - TEXSCALING_AUTO = 0, TEXSCALING_OFF = 1, TEXSCALING_2X = 2, TEXSCALING_3X = 3, diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 0ddec3aff7..1cab6eccc1 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -188,7 +188,9 @@ namespace MainWindow { // We only reload this initially and when a menu is actually opened. if (!menuShaderInfoLoaded) { - ReloadAllPostShaderInfo(); + // This is on Windows where we don't currently blacklist any vendors, or similar. + // TODO: Figure out how to have the GPU data while reloading the post shader info. + ReloadAllPostShaderInfo(nullptr); menuShaderInfoLoaded = true; } @@ -394,7 +396,7 @@ namespace MainWindow { if (GetUIState() == UISTATE_INGAME) { browsePauseAfter = Core_IsStepping(); if (!browsePauseAfter) - Core_EnableStepping(true); + Core_EnableStepping(true, "ui.boot", 0); } W32Util::MakeTopMost(GetHWND(), false); @@ -614,14 +616,13 @@ namespace MainWindow { if (disasmWindow) SendMessage(disasmWindow->GetDlgHandle(), WM_COMMAND, IDC_STOPGO, 0); else - Core_EnableStepping(true); + Core_EnableStepping(true, "ui.break", 0); } noFocusPause = !noFocusPause; // If we pause, override pause on lost focus break; case ID_EMULATION_PAUSE: NativeMessageReceived("pause", ""); - Core_EnableStepping(false); break; case ID_EMULATION_STOP: @@ -776,7 +777,6 @@ namespace MainWindow { } break; - case ID_TEXTURESCALING_AUTO: setTexScalingMultiplier(TEXSCALING_AUTO); break; case ID_TEXTURESCALING_OFF: setTexScalingMultiplier(TEXSCALING_OFF); break; case ID_TEXTURESCALING_2X: setTexScalingMultiplier(TEXSCALING_2X); break; case ID_TEXTURESCALING_3X: setTexScalingMultiplier(TEXSCALING_3X); break; @@ -1198,7 +1198,6 @@ namespace MainWindow { } static const int texscalingitems[] = { - ID_TEXTURESCALING_AUTO, ID_TEXTURESCALING_OFF, ID_TEXTURESCALING_2X, ID_TEXTURESCALING_3X, @@ -1206,14 +1205,16 @@ namespace MainWindow { ID_TEXTURESCALING_5X, ID_TEXTURESCALING_6X, }; - if (g_Config.iTexScalingLevel < TEXSCALING_AUTO) - g_Config.iTexScalingLevel = TEXSCALING_AUTO; + if (g_Config.iTexScalingLevel < TEXSCALING_OFF) + g_Config.iTexScalingLevel = TEXSCALING_OFF; else if (g_Config.iTexScalingLevel > TEXSCALING_MAX) g_Config.iTexScalingLevel = TEXSCALING_MAX; for (int i = 0; i < ARRAY_SIZE(texscalingitems); i++) { - CheckMenuItem(menu, texscalingitems[i], MF_BYCOMMAND | ((i == g_Config.iTexScalingLevel) ? MF_CHECKED : MF_UNCHECKED)); + // OFF is 1, skip 0. + bool selected = i + 1 == g_Config.iTexScalingLevel; + CheckMenuItem(menu, texscalingitems[i], MF_BYCOMMAND | (selected ? MF_CHECKED : MF_UNCHECKED)); } if (g_Config.iGPUBackend == (int)GPUBackend::OPENGL && !gl_extensions.OES_texture_npot) { diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index d9b881f0f5..efd5279466 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -936,6 +936,7 @@ + $(IntDir)%(Filename)2.obj @@ -947,7 +948,6 @@ $(IntDir)%(Filename)2.obj $(IntDir)%(Filename)2.obj - @@ -1472,9 +1472,9 @@ + - @@ -1661,7 +1661,6 @@ - diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 537972bafa..3179c6effe 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -76,9 +76,6 @@ Windows\W32Util - - Windows\W32Util - Windows\W32Util @@ -271,6 +268,9 @@ Other Platforms\Android + + Windows\W32Util + @@ -294,9 +294,6 @@ Windows\W32Util - - Windows\W32Util - Windows\W32Util @@ -541,6 +538,9 @@ Other Platforms\Android + + Windows\W32Util + @@ -590,9 +590,6 @@ Other Platforms\Qt - - Resource Files - Resource Files diff --git a/Windows/W32Util/ContextMenu.cpp b/Windows/W32Util/ContextMenu.cpp new file mode 100644 index 0000000000..9e31320047 --- /dev/null +++ b/Windows/W32Util/ContextMenu.cpp @@ -0,0 +1,63 @@ +// Copyright (c) 2021- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include "Windows/W32Util/ContextMenu.h" +#include "Windows/resource.h" + +static HMENU g_hPopupMenus; + +void ContextMenuInit(HINSTANCE inst) { + g_hPopupMenus = LoadMenu(inst, (LPCWSTR)IDR_POPUPMENUS); +} + +ContextPoint ContextPoint::FromCursor() { + ContextPoint result; + GetCursorPos(&result.pos_); + return result; +} + +ContextPoint ContextPoint::FromClient(const POINT &clientPoint) { + ContextPoint result; + result.pos_ = clientPoint; + result.isClient_ = true; + return result; +} + +ContextPoint ContextPoint::FromEvent(LPARAM lParam) { + ContextPoint result; + result.pos_.x = LOWORD(lParam); + result.pos_.y = HIWORD(lParam); + result.isClient_ = true; + return result; +} + +HMENU GetContextMenu(ContextMenuID which) { + return GetSubMenu(g_hPopupMenus, (int)which); +} + +int TriggerContextMenu(ContextMenuID which, HWND wnd, const ContextPoint &pt) { + POINT pos = pt.pos_; + if (pt.isClient_) { + ClientToScreen(wnd, &pos); + } + + HMENU menu = GetContextMenu(which); + if (!menu) + return -1; + + return TrackPopupMenuEx(menu, TPM_RIGHTBUTTON | TPM_RETURNCMD, pos.x, pos.y, wnd, 0); +} diff --git a/Windows/W32Util/ContextMenu.h b/Windows/W32Util/ContextMenu.h new file mode 100644 index 0000000000..7bddf6691a --- /dev/null +++ b/Windows/W32Util/ContextMenu.h @@ -0,0 +1,47 @@ +// Copyright (c) 2021- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#pragma once + +#include "Common/CommonWindows.h" + +// Must match the order in ppsspp.rc. +enum class ContextMenuID { + MEMVIEW = 0, + DISASM = 1, + REGLIST = 2, + BREAKPOINTLIST = 3, + THREADLIST = 4, + NEWBREAKPOINT = 5, + DISPLAYLISTVIEW = 6, + GEDBG_STATE = 7, + GEDBG_PREVIEW = 8, +}; + +struct ContextPoint { + static ContextPoint FromCursor(); + static ContextPoint FromClient(const POINT &clientPoint); + static ContextPoint FromEvent(LPARAM lParam); + + POINT pos_{}; + bool isClient_ = false; +}; + +void ContextMenuInit(HINSTANCE inst); + +HMENU GetContextMenu(ContextMenuID); +int TriggerContextMenu(ContextMenuID which, HWND wnd, const ContextPoint &pt); diff --git a/Windows/W32Util/PropertySheet.cpp b/Windows/W32Util/PropertySheet.cpp deleted file mode 100644 index be56607b5f..0000000000 --- a/Windows/W32Util/PropertySheet.cpp +++ /dev/null @@ -1,187 +0,0 @@ -#include "Windows/stdafx.h" -#include "Misc.h" -#include "PropertySheet.h" -#include "Common/Data/Encoding/Utf8.h" - -#include - -namespace W32Util -{ - bool centered; - - PropSheet::PropSheet() - { - watermark = 0; - header = 0; - icon = 0; - } - - int CALLBACK PropSheet::Callback(HWND hwndDlg, UINT uMsg, LPARAM lParam) - { - switch (uMsg) { - case PSCB_INITIALIZED: - { - } - return 0; - } - return 0; - } - - void PropSheet::Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage, bool floating, bool wizard) - { - HPROPSHEETPAGE *pages = new HPROPSHEETPAGE[list.size()]; - PROPSHEETPAGE page; - //common settings - memset((void*)&page,0,sizeof(PROPSHEETPAGE)); - page.dwSize = sizeof(PROPSHEETPAGE); - page.hInstance = hInstance; - - int i=0; - for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++, i++) - { - if (wizard) - { - if (i == 0 || i == list.size()-1) - page.dwFlags = PSP_HIDEHEADER; - else - page.dwFlags = PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE; - } - else - { - page.dwFlags = PSP_USETITLE; - } - page.pszTemplate = iter->resource; - page.pfnDlgProc = Tab::TabDlgProc; - page.pszTitle = iter->title; - page.pszHeaderTitle = wizard?iter->title:0; - page.pszHeaderSubTitle = wizard?iter->hdrSubTitle:0; - page.lParam = (LPARAM)iter->tab; - pages[i] = CreatePropertySheetPage(&page); - } - - PROPSHEETHEADER sheet; - memset(&sheet,0,sizeof(sheet)); - sheet.dwSize = sizeof(PROPSHEETHEADER); - sheet.hInstance = hInstance; - sheet.hwndParent = hParent; - sheet.pszbmWatermark = watermark; - sheet.pszbmHeader = header; - - if (icon) - sheet.hIcon = icon; - - if (wizard) - sheet.dwFlags = PSH_USECALLBACK | PSH_WIZARD97 | (watermark?PSH_WATERMARK:0) | (header?PSH_HEADER:0); - else - sheet.dwFlags = PSH_USECALLBACK | PSH_PROPTITLE; - - if (floating) - sheet.dwFlags |= PSH_MODELESS; - //else - // sheet.dwFlags |= PSH_NOAPPLYNOW; - - if (icon) - sheet.dwFlags |= PSH_USEHICON; - - sheet.pszCaption = ConvertUTF8ToWString(title).c_str(); - sheet.nPages = (UINT)list.size(); - sheet.phpage = pages; - sheet.nStartPage = startpage; - sheet.pfnCallback = (PFNPROPSHEETCALLBACK)Callback; - - if (wizard) - { - NONCLIENTMETRICS ncm = {0}; - ncm.cbSize = sizeof(ncm); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); - - //Create the intro/end title font - LOGFONT TitleLogFont = ncm.lfMessageFont; - TitleLogFont.lfWeight = FW_BOLD; - lstrcpy(TitleLogFont.lfFaceName, TEXT("Verdana Bold")); - //StringCchCopy(TitleLogFont.lfFaceName, 32, TEXT("Verdana Bold")); - - HDC hdc = GetDC(NULL); //gets the screen DC - INT FontSize = 12; - TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * FontSize / 72; - hTitleFont = CreateFontIndirect(&TitleLogFont); - ReleaseDC(NULL, hdc); - } - else - hTitleFont = 0; - - centered=false; - PropertySheet(&sheet); - if (!floating) - { - for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++) - { - delete iter->tab; - } - DeleteObject(hTitleFont); - } - delete [] pages; - } - void PropSheet::Add(Tab *tab, LPCTSTR resource, LPCTSTR title, LPCTSTR subtitle) - { - tab->sheet = this; - list.push_back(Page(tab,resource,title,subtitle)); - } - - - void WizExteriorPage::Init(HWND hDlg) - { - HWND hwndControl = GetDlgItem(hDlg, captionID); - //SetWindowFont(hwndControl, sheet->GetTitleFont(), TRUE); - SendMessage(hwndControl,WM_SETFONT,(WPARAM)sheet->GetTitleFont(),0); - } - - INT_PTR Tab::TabDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) - { - Tab *tab = (Tab *)GetWindowLongPtr(hDlg, GWLP_USERDATA); - switch(message) - { - case WM_INITDIALOG: - { - if (!centered) //HACK - { - CenterWindow(GetParent(hDlg)); - centered=true; - } - LPARAM l = ((LPPROPSHEETPAGE)lParam)->lParam; - tab = (Tab *)l; - SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)l); - tab->Init(hDlg); - } - break; - - case WM_COMMAND: - tab->Command(hDlg,wParam); - break; - case WM_NOTIFY: - { - LPPSHNOTIFY lppsn = (LPPSHNOTIFY) lParam; - HWND sheet = lppsn->hdr.hwndFrom; - switch(lppsn->hdr.code) { - case PSN_APPLY: - tab->Apply(hDlg); - break; - case PSN_SETACTIVE: - PropSheet_SetWizButtons(GetParent(hDlg), - (tab->HasPrev()?PSWIZB_BACK:0) | - (tab->HasNext()?PSWIZB_NEXT:0) | - (tab->HasFinish()?PSWIZB_FINISH:0)); - break; - case PSN_WIZNEXT: - tab->Apply(hDlg); //maybe not always good - break; - case PSN_WIZBACK: - case PSN_RESET: //cancel - break; - } - } - break; - } - return 0; - } -} diff --git a/Windows/W32Util/PropertySheet.h b/Windows/W32Util/PropertySheet.h deleted file mode 100644 index 29e7814e8c..0000000000 --- a/Windows/W32Util/PropertySheet.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - -#include - -namespace W32Util -{ - class PropSheet; - - class Tab - { - public: - PropSheet *sheet; //back pointer .. - virtual void Init(HWND hDlg) {} - virtual void Command(HWND hDlg, WPARAM wParam) {} - virtual void Apply(HWND hDlg) {} - virtual bool HasPrev() {return true;} - virtual bool HasFinish() {return false;} - virtual bool HasNext() {return true;} - static INT_PTR __stdcall TabDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - }; - - - class WizExteriorPage : public Tab - { - INT captionID; - public: - WizExteriorPage(INT caption) {captionID = caption;} - void Init(HWND hDlg); - }; - - - class WizFirstPage : public WizExteriorPage - { - public: - WizFirstPage(INT caption) : WizExteriorPage(caption) {} - bool HasPrev() {return false;} - }; - - - class WizLastPage : public WizExteriorPage - { - public: - WizLastPage(INT caption) : WizExteriorPage(caption) {} - bool HasNext() {return false;} - bool HasFinish() {return true;} - }; - - - class WizInteriorPage : public Tab - { - public: - }; - - class PropSheet - { - LPCTSTR watermark; - LPCTSTR header; - HFONT hTitleFont; - HICON icon; - struct Page final { - Page(Tab *_tab, LPCTSTR _resource, LPCTSTR _title, LPCTSTR _subtitle = nullptr) - : tab(_tab), resource(_resource), title(_title), hdrSubTitle(_subtitle) {} - Tab *tab; - LPCTSTR resource; - LPCTSTR title; - LPCTSTR hdrSubTitle; - }; - public: - PropSheet(); - typedef std::vector DlgList; - DlgList list; - void SetWaterMark(LPCTSTR _watermark) {watermark=_watermark;} - void SetHeader(LPCTSTR _header) {header=_header;} - void SetIcon(HICON _icon) {icon = _icon;} - void Add(Tab *tab, LPCTSTR resource, LPCTSTR title, LPCTSTR subtitle = 0); - void Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage=0, bool floating = false, bool wizard = false); - HFONT GetTitleFont() {return hTitleFont;} - static int CALLBACK Callback(HWND hwndDlg, UINT uMsg, LPARAM lParam); - }; -} diff --git a/Windows/XPTheme.h b/Windows/XPTheme.h deleted file mode 100644 index 01be3a9679..0000000000 --- a/Windows/XPTheme.h +++ /dev/null @@ -1,625 +0,0 @@ -// Windows Template Library - WTL version 7.0 -// Copyright (C) 1997-2002 Microsoft Corporation -// All rights reserved. -// -// This file is a part of the Windows Template Library. -// The code and information is provided "as-is" without -// warranty of any kind, either expressed or implied. - - -#pragma once - -#include -//#include -#include -#pragma comment(lib, "uxtheme.lib") - -// Note: To create an application that also runs on older versions of Windows, -// use delay load of uxtheme.dll and ensure that no calls to the Theme API are -// made if theming is not supported. It is enough to check if m_hTheme is NULL. -// Example: -// if(m_hTheme != NULL) -// { -// DrawThemeBackground(dc, BP_PUSHBUTTON, PBS_NORMAL, &rect, NULL); -// DrawThemeText(dc, BP_PUSHBUTTON, PBS_NORMAL, L"Button", -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, 0, &rect); -// } -// else -// { -// dc.DrawFrameControl(&rect, DFC_BUTTON, DFCS_BUTTONPUSH); -// dc.DrawText(_T("Button"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); -// } -// -// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, -// and add uxtheme.dll in the Linker.Input.Delay Loaded DLLs section of the -// project properties. -#if (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) -#pragma comment(lib, "delayimp.lib") -#pragma comment(linker, "/delayload:uxtheme.dll") -#endif //(_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) - - -// Classes in this file -// -// CTheme -// CThemeImpl - - -namespace WTL -{ - -// CTheme - wrapper for theme handle - -class CTheme -{ -public: -// Data members - HTHEME m_hTheme; - static int m_nIsThemingSupported; - -// Constructor - CTheme() : m_hTheme(NULL) - { - IsThemingSupported(); - } - -// Operators and helpers - bool IsThemeNull() const - { - return (m_hTheme == NULL); - } - - CTheme& operator =(HTHEME hTheme) - { - m_hTheme = hTheme; - return *this; - } - - operator HTHEME() const - { - return m_hTheme; - } - - void Attach(HTHEME hTheme) - { - m_hTheme = hTheme; - } - - HTHEME Detach() - { - HTHEME hTheme = m_hTheme; - m_hTheme = NULL; - return hTheme; - } - -// Theme support helper - static bool IsThemingSupported() - { - if(m_nIsThemingSupported == -1) - { - // ::EnterCriticalSection(&_Module.m_csStaticDataInit); - if(m_nIsThemingSupported == -1) - { - HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); - m_nIsThemingSupported = (hThemeDLL != NULL) ? 1 : 0; - if(hThemeDLL != NULL) - ::FreeLibrary(hThemeDLL); - } - // ::LeaveCriticalSection(&_Module.m_csStaticDataInit); - } - - //ATLASSERT(m_nIsThemingSupported != -1); - return (m_nIsThemingSupported == 1); - } - -// Operations and theme properties - HTHEME OpenThemeData(HWND hWnd, LPCWSTR pszClassList) - { - if(!IsThemingSupported()) - return NULL; - - //ATLASSERT(m_hTheme == NULL); - m_hTheme = ::OpenThemeData(hWnd, pszClassList); - return m_hTheme; - } - - HRESULT CloseThemeData() - { - HRESULT hRet = S_FALSE; - if(m_hTheme != NULL) - { - hRet = ::CloseThemeData(m_hTheme); - if(SUCCEEDED(hRet)) - m_hTheme = NULL; - } - return hRet; - } - - HRESULT DrawThemeBackground(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, LPCRECT pClipRect = NULL) - { - return ::DrawThemeBackground(m_hTheme, hDC, nPartID, nStateID, pRect, pClipRect); - } - - HRESULT DrawThemeText(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect) - { - return ::DrawThemeText(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, dwTextFlags2, pRect); - } - - HRESULT GetThemeBackgroundContentRect(HDC hDC, int nPartID, int nStateID, LPCRECT pBoundingRect, LPRECT pContentRect) const - { - return ::GetThemeBackgroundContentRect(m_hTheme, hDC, nPartID, nStateID, pBoundingRect, pContentRect); - } - - HRESULT GetThemeBackgroundExtent(HDC hDC, int nPartID, int nStateID, LPCRECT pContentRect, LPRECT pExtentRect) const - { - return ::GetThemeBackgroundExtent(m_hTheme, hDC, nPartID, nStateID, pContentRect, pExtentRect); - } - - HRESULT GetThemePartSize(HDC hDC, int nPartID, int nStateID, LPRECT pRect, enum THEMESIZE eSize, LPSIZE pSize) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemePartSize(m_hTheme, hDC, nPartID, nStateID, pRect, eSize, pSize); - } - - HRESULT GetThemeTextExtent(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeTextExtent(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, pBoundingRect, pExtentRect); - } -#undef UNICODE -// HRESULT GetThemeTextMetrics(HDC hDC, int nPartID, int nStateID, PTEXTMETRIC pTextMetric) const -// { - //ATLASSERT(m_hTheme != NULL); -// return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, pTextMetric); -// } - - HRESULT GetThemeBackgroundRegion(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HRGN* pRegion) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeBackgroundRegion(m_hTheme, hDC, nPartID, nStateID, pRect, pRegion); - } - - HRESULT HitTestThemeBackground(HDC hDC, int nPartID, int nStateID, DWORD dwOptions, LPCRECT pRect, HRGN hrgn, POINT ptTest, WORD* pwHitTestCode) const - { - //ATLASSERT(m_hTheme != NULL); - return ::HitTestThemeBackground(m_hTheme, hDC, nPartID, nStateID, dwOptions, pRect, hrgn, ptTest, pwHitTestCode); - } - - HRESULT DrawThemeEdge(HDC hDC, int nPartID, int nStateID, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect = NULL) - { - //ATLASSERT(m_hTheme != NULL); - return ::DrawThemeEdge(m_hTheme, hDC, nPartID, nStateID, pDestRect, uEdge, uFlags, pContentRect); - } - - HRESULT DrawThemeIcon(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HIMAGELIST himl, int nImageIndex) - { - //ATLASSERT(m_hTheme != NULL); - return ::DrawThemeIcon(m_hTheme, hDC, nPartID, nStateID, pRect, himl, nImageIndex); - } - - BOOL IsThemePartDefined(int nPartID, int nStateID) const - { - //ATLASSERT(m_hTheme != NULL); - return ::IsThemePartDefined(m_hTheme, nPartID, nStateID); - } - - BOOL IsThemeBackgroundPartiallyTransparent(int nPartID, int nStateID) const - { - //ATLASSERT(m_hTheme != NULL); - return ::IsThemeBackgroundPartiallyTransparent(m_hTheme, nPartID, nStateID); - } - - HRESULT GetThemeColor(int nPartID, int nStateID, int nPropID, COLORREF* pColor) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeColor(m_hTheme, nPartID, nStateID, nPropID, pColor); - } - - HRESULT GetThemeMetric(HDC hDC, int nPartID, int nStateID, int nPropID, int* pnVal) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeMetric(m_hTheme, hDC, nPartID, nStateID, nPropID, pnVal); - } - - HRESULT GetThemeString(int nPartID, int nStateID, int nPropID, LPWSTR pszBuff, int cchMaxBuffChars) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeString(m_hTheme, nPartID, nStateID, nPropID, pszBuff, cchMaxBuffChars); - } - - HRESULT GetThemeBool(int nPartID, int nStateID, int nPropID, BOOL* pfVal) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeBool(m_hTheme, nPartID, nStateID, nPropID, pfVal); - } - - HRESULT GetThemeInt(int nPartID, int nStateID, int nPropID, int* pnVal) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeInt(m_hTheme, nPartID, nStateID, nPropID, pnVal); - } - - HRESULT GetThemeEnumValue(int nPartID, int nStateID, int nPropID, int* pnVal) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeEnumValue(m_hTheme, nPartID, nStateID, nPropID, pnVal); - } - - HRESULT GetThemePosition(int nPartID, int nStateID, int nPropID, LPPOINT pPoint) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemePosition(m_hTheme, nPartID, nStateID, nPropID, pPoint); - } - -// HRESULT GetThemeFont(int nPartID, HDC hDC, int nStateID, int nPropID, LOGFONT* pFont) const -// { -// //ATLASSERT(m_hTheme != NULL); -// return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); -// } - - HRESULT GetThemeRect(int nPartID, int nStateID, int nPropID, LPRECT pRect) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeRect(m_hTheme, nPartID, nStateID, nPropID, pRect); - } - - HRESULT GetThemeMargins(HDC hDC, int nPartID, int nStateID, int nPropID, LPRECT pRect, PMARGINS pMargins) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeMargins(m_hTheme, hDC, nPartID, nStateID, nPropID, pRect, pMargins); - } - - HRESULT GetThemeIntList(int nPartID, int nStateID, int nPropID, INTLIST* pIntList) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeIntList(m_hTheme, nPartID, nStateID, nPropID, pIntList); - } - - HRESULT GetThemePropertyOrigin(int nPartID, int nStateID, int nPropID, enum PROPERTYORIGIN* pOrigin) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemePropertyOrigin(m_hTheme, nPartID, nStateID, nPropID, pOrigin); - } - - HRESULT GetThemeFilename(int nPartID, int nStateID, int nPropID, LPWSTR pszThemeFileName, int cchMaxBuffChars) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeFilename(m_hTheme, nPartID, nStateID, nPropID, pszThemeFileName, cchMaxBuffChars); - } - - COLORREF GetThemeSysColor(int nColorID) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysColor(m_hTheme, nColorID); - } - - HBRUSH GetThemeSysColorBrush(int nColorID) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysColorBrush(m_hTheme, nColorID); - } - - int GetThemeSysSize(int nSizeID) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysSize(m_hTheme, nSizeID); - } - - BOOL GetThemeSysBool(int nBoolID) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysBool(m_hTheme, nBoolID); - } - -// HRESULT GetThemeSysFont(int nFontID, LOGFONT* plf) const -// { - //ATLASSERT(m_hTheme != NULL); -// return ::GetThemeSysFont(m_hTheme, nFontID, plf); -// } - - HRESULT GetThemeSysString(int nStringID, LPWSTR pszStringBuff, int cchMaxStringChars) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysString(m_hTheme, nStringID, pszStringBuff, cchMaxStringChars); - } - - HRESULT GetThemeSysInt(int nIntID, int* pnValue) const - { - //ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysInt(m_hTheme, nIntID, pnValue); - } -}; - -__declspec(selectany) int CTheme::m_nIsThemingSupported = -1; - - -// CThemeImpl - theme support implementation - -// Derive from this class to implement window with theme support. -// Example: -// class CMyThemeWindow : public CWindowImpl, public CThemeImpl -// { -// ... -// BEGIN_MSG_MAP(CMyThemeWindow) -// CHAIN_MSG_MAP(CThemeImpl) -// ... -// END_MSG_MAP() -// ... -// }; -// -// If you set theme class list, the class will automaticaly open/close/reopen theme data. - - -// Helper for drawing theme client edge -#if 0 -inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0) -{ - //ATLASSERT(hTheme != NULL); - //ATLASSERT(::IsWindow(hWnd)); - - CWindowDC dc(hWnd); - if(dc.IsNull()) - return false; - - // Get border size - int cxBorder = GetSystemMetrics(SM_CXBORDER); - int cyBorder = GetSystemMetrics(SM_CYBORDER); - if(SUCCEEDED(::GetThemeInt(hTheme, nPartID, nStateID, TMT_SIZINGBORDERWIDTH, &cxBorder))) - cyBorder = cxBorder; - - RECT rect; - ::GetWindowRect(hWnd, &rect); - - // Remove the client edge from the update region - int cxEdge = GetSystemMetrics(SM_CXEDGE); - int cyEdge = GetSystemMetrics(SM_CYEDGE); - ::InflateRect(&rect, -cxEdge, -cyEdge); - CRgn rgn; - rgn.CreateRectRgnIndirect(&rect); - if(rgn.IsNull()) - return false; - - if(hRgnUpdate != NULL) - rgn.CombineRgn(hRgnUpdate, rgn, RGN_AND); - - ::OffsetRect(&rect, -rect.left, -rect.top); - - ::OffsetRect(&rect, cxEdge, cyEdge); - dc.ExcludeClipRect(&rect); - ::InflateRect(&rect, cxEdge, cyEdge); - - ::DrawThemeBackground(hTheme, dc, nPartID, nStateID, &rect, NULL); - - // Use background brush too, since theme border might not cover everything - if(cxBorder < cxEdge && cyBorder < cyEdge) - { - if(hBrush == NULL) -// need conditional code because types don't match in winuser.h -#ifdef _WIN64 - hBrush = (HBRUSH)::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND); -#else - hBrush = (HBRUSH)UlongToPtr(::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND)); -#endif - - ::InflateRect(&rect, cxBorder - cxEdge, cyBorder - cyEdge); - dc.FillRect(&rect, hBrush); - } - - ::DefWindowProc(hWnd, WM_NCPAINT, (WPARAM)rgn.m_hRgn, 0L); - - return true; -} - - -// Theme extended styles -#define THEME_EX_3DCLIENTEDGE 0x00000001 -#define THEME_EX_THEMECLIENTEDGE 0x00000002 - -template -class CThemeImpl : public TBase -{ -public: -// Data members - LPWSTR m_lpstrThemeClassList; - DWORD m_dwExtendedStyle; // theme specific extended styles - -// Constructor & destructor - CThemeImpl() : m_lpstrThemeClassList(NULL), m_dwExtendedStyle(0) - { } - - ~CThemeImpl() - { - delete m_lpstrThemeClassList; - } - -// Attributes - bool SetThemeClassList(LPCWSTR lpstrThemeClassList) - { - if(m_lpstrThemeClassList != NULL) - { - delete m_lpstrThemeClassList; - m_lpstrThemeClassList = NULL; - } - - if(lpstrThemeClassList == NULL) - return true; - - int cchLen = lstrlenW(lpstrThemeClassList) + 1; - ATLTRY(m_lpstrThemeClassList = new WCHAR[cchLen]); - if(m_lpstrThemeClassList == NULL) - return false; - - bool bRet = (lstrcpyW(m_lpstrThemeClassList, lpstrThemeClassList) != NULL); - if(!bRet) - { - delete m_lpstrThemeClassList; - m_lpstrThemeClassList = NULL; - } - return bRet; - } - - bool GetThemeClassList(LPWSTR lpstrThemeClassList, int cchListBuffer) const - { - int cchLen = lstrlenW(m_lpstrThemeClassList) + 1; - if(cchListBuffer < cchLen) - return false; - - return (lstrcpyW(lpstrThemeClassList, m_lpstrThemeClassList) != NULL); - } - - LPCWSTR GetThemeClassList() const - { - return m_lpstrThemeClassList; - } - - DWORD SetThemeExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - return dwPrevStyle; - } - - DWORD GetThemeExtendedStyle() const - { - return m_dwExtendedStyle; - } - -// Operations - HTHEME OpenThemeData() - { - T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - //ATLASSERT(m_lpstrThemeClassList != NULL); - if(m_lpstrThemeClassList == NULL) - return NULL; - CloseThemeData(); - return TBase::OpenThemeData(pT->m_hWnd, m_lpstrThemeClassList); - } - - HTHEME OpenThemeData(LPCWSTR pszClassList) - { - if(!SetThemeClassList(pszClassList)) - return NULL; - return OpenThemeData(); - } - - HRESULT SetWindowTheme(LPCWSTR pszSubAppName, LPCWSTR pszSubIDList) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::SetWindowTheme(pT->m_hWnd, pszSubAppName, pszSubIDList); - } - - HTHEME GetWindowTheme() const - { - if(!IsThemingSupported()) - return NULL; - - const T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::GetWindowTheme(pT->m_hWnd); - } - - HRESULT EnableThemeDialogTexture(BOOL bEnable) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::EnableThemeDialogTexture(pT->m_hWnd, bEnable); - } - - BOOL IsThemeDialogTextureEnabled() const - { - if(!IsThemingSupported()) - return FALSE; - - const T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::IsThemeDialogTextureEnabled(pT->m_hWnd); - } - - HRESULT DrawThemeParentBackground(HDC hDC, LPRECT pRect = NULL) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DrawThemeParentBackground(pT->m_hWnd, hDC, pRect); - } - -// Message map and handlers - // Note: If you handle any of these messages in your derived class, - // it is better to put CHAIN_MSG_MAP at the start of your message map. - BEGIN_MSG_MAP(CThemeImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged) - MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) - END_MSG_MAP() - - LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - if(m_lpstrThemeClassList != NULL) - OpenThemeData(); - bHandled = FALSE; - return 1; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - CloseThemeData(); - bHandled = FALSE; - return 1; - } - - LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - CloseThemeData(); - if(m_lpstrThemeClassList != NULL) - OpenThemeData(); - bHandled = FALSE; - return 1; - } - - LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - //ATLASSERT(::IsWindow(pT->m_hWnd)); - LRESULT lRet = 0; - bHandled = FALSE; - if(IsThemingSupported() && ((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)) - { - if((m_dwExtendedStyle & THEME_EX_3DCLIENTEDGE) != 0) - { - lRet = ::DefWindowProc(pT->m_hWnd, uMsg, wParam, lParam); - bHandled = TRUE; - } - else if((m_hTheme != NULL) && ((m_dwExtendedStyle & THEME_EX_THEMECLIENTEDGE) != 0)) - { - HRGN hRgn = (wParam != 1) ? (HRGN)wParam : NULL; - if(pT->DrawThemeClientEdge(hRgn)) - bHandled = TRUE; - } - } - return lRet; - } - -// Drawing helper - bool DrawThemeClientEdge(HRGN hRgnUpdate) - { - T* pT = static_cast(this); - return AtlDrawThemeClientEdge(m_hTheme, pT->m_hWnd, hRgnUpdate, NULL, 0, 0); - } -}; - -#endif -}; //namespace WTL - diff --git a/Windows/bitmap1.bmp b/Windows/bitmap1.bmp deleted file mode 100644 index 83887f2dfb..0000000000 Binary files a/Windows/bitmap1.bmp and /dev/null differ diff --git a/Windows/main.cpp b/Windows/main.cpp index ecfe18fa47..59ee239d7d 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -65,6 +65,7 @@ #if PPSSPP_API(ANY_GL) #include "Windows/GEDebugger/GEDebugger.h" #endif +#include "Windows/W32Util/ContextMenu.h" #include "Windows/W32Util/DialogManager.h" #include "Windows/W32Util/ShellUtil.h" @@ -101,17 +102,20 @@ static std::string gpuDriverVersion; static std::string restartArgs; -HMENU g_hPopupMenus; int g_activeWindow = 0; static std::thread inputBoxThread; static bool inputBoxRunning = false; void OpenDirectory(const char *path) { - PIDLIST_ABSOLUTE pidl = ILCreateFromPath(ConvertUTF8ToWString(ReplaceAll(path, "/", "\\")).c_str()); + SFGAOF flags; + PIDLIST_ABSOLUTE pidl = nullptr; + HRESULT hr = SHParseDisplayName(ConvertUTF8ToWString(ReplaceAll(path, "/", "\\")).c_str(), nullptr, &pidl, 0, &flags); + if (pidl) { - SHOpenFolderAndSelectItems(pidl, 0, NULL, 0); - ILFree(pidl); + if (SUCCEEDED(hr)) + SHOpenFolderAndSelectItems(pidl, 0, nullptr, 0); + CoTaskMemFree(pidl); } } @@ -312,6 +316,8 @@ bool System_GetPropertyBool(SystemProperty prop) { #endif case SYSPROP_CAN_JIT: return true; + case SYSPROP_HAS_KEYBOARD: + return true; default: return false; } @@ -665,10 +671,8 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin timeBeginPeriod(1); // TODO: Evaluate if this makes sense to keep. + ContextMenuInit(_hInstance); MainWindow::Init(_hInstance); - - g_hPopupMenus = LoadMenu(_hInstance, (LPCWSTR)IDR_POPUPMENUS); - MainWindow::Show(_hInstance); HWND hwndMain = MainWindow::GetHWND(); diff --git a/Windows/main.h b/Windows/main.h index 8f04b0ede4..890acc845c 100644 --- a/Windows/main.h +++ b/Windows/main.h @@ -31,7 +31,6 @@ extern CMemoryDlg *memoryWindow; extern CGEDebugger* geDebuggerWindow; #endif -extern HMENU g_hPopupMenus; extern int g_activeWindow; enum { WINDOW_MAINWINDOW, WINDOW_CPUDEBUGGER, WINDOW_GEDEBUGGER }; diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index efa65b894c..3be958474c 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -39,15 +39,6 @@ END -///////////////////////////////////////////////////////////////////////////// -// -// IMAGE -// - -IDB_IMAGE_PSP IMAGE "pspmode.png" - - - ///////////////////////////////////////////////////////////////////////////// // // RT_MANIFEST @@ -74,7 +65,6 @@ BEGIN "G", ID_DEBUG_GEDEBUGGER, VIRTKEY, CONTROL, NOINVERT "L", ID_DEBUG_LOG, VIRTKEY, CONTROL, NOINVERT "M", ID_DEBUG_MEMORYVIEW, VIRTKEY, CONTROL, NOINVERT - "R", ID_DEBUG_REGISTERS, VIRTKEY, CONTROL, NOINVERT VK_F3, ID_FILE_SAVESTATE_NEXT_SLOT_HC, VIRTKEY, NOINVERT VK_F2, ID_FILE_QUICKSAVESTATE_HC, VIRTKEY, NOINVERT VK_F4, ID_FILE_QUICKLOADSTATE_HC, VIRTKEY, NOINVERT @@ -90,8 +80,8 @@ END IDR_DEBUGACCELS ACCELERATORS BEGIN "B", ID_DEBUG_ADDBREAKPOINT, VIRTKEY, CONTROL, NOINVERT - "R", ID_DEBUG_DSIPLAYREGISTERLIST, VIRTKEY, CONTROL, NOINVERT - "L", ID_DEBUG_DSIPLAYFUNCTIONLIST, VIRTKEY, CONTROL, NOINVERT + "R", ID_DEBUG_DISPLAYREGISTERLIST, VIRTKEY, CONTROL, NOINVERT + "L", ID_DEBUG_DISPLAYFUNCTIONLIST, VIRTKEY, CONTROL, NOINVERT "1", ID_DEBUG_DISPLAYMEMVIEW, VIRTKEY, CONTROL, NOINVERT "2", ID_DEBUG_DISPLAYBREAKPOINTLIST, VIRTKEY, CONTROL, NOINVERT "3", ID_DEBUG_DISPLAYTHREADLIST, VIRTKEY, CONTROL, NOINVERT @@ -140,7 +130,7 @@ BEGIN VALUE "FileDescription", "PPSSPP" VALUE "FileVersion", PPSSPP_WIN_VERSION_STRING VALUE "InternalName", "PPSSPPEmu" - VALUE "LegalCopyright", "Copyright (C) 2006-2015 by Henrik Rydgård" + VALUE "LegalCopyright", "Copyright (C) 2006-2021 by Henrik Rydgård" VALUE "LegalTrademarks", "All product names are trademarks of their respective owners." VALUE "OriginalFilename", "PPSSPP.exe" VALUE "ProductName", "PPSSPP" @@ -639,7 +629,6 @@ BEGIN POPUP "Texture Scaling", ID_OPTIONS_TEXTURESCALING_MENU BEGIN MENUITEM "Off", ID_TEXTURESCALING_OFF - MENUITEM "Auto", ID_TEXTURESCALING_AUTO MENUITEM "&2x", ID_TEXTURESCALING_2X MENUITEM "&3x", ID_TEXTURESCALING_3X MENUITEM "&4x", ID_TEXTURESCALING_4X @@ -703,18 +692,12 @@ BEGIN MENUITEM "Toggle Breakpoint", ID_DISASM_TOGGLEBREAKPOINT MENUITEM "Follow Branch", ID_DISASM_FOLLOWBRANCH MENUITEM SEPARATOR - MENUITEM "Show Dynarec Results", ID_DISASM_DYNARECRESULTS MENUITEM "Go to in Memory View", ID_DISASM_GOTOINMEMORYVIEW MENUITEM SEPARATOR - MENUITEM "Kill Function", ID_DISASM_ADDHLE MENUITEM "Rename Function...", ID_DISASM_RENAMEFUNCTION MENUITEM "Remove Function", ID_DISASM_REMOVEFUNCTION MENUITEM "Add Function Here", ID_DISASM_ADDFUNCTION END - POPUP "funclist" - BEGIN - MENUITEM "Kill Function", ID_FUNCLIST_KILLFUNCTION - END POPUP "reglist" BEGIN MENUITEM "Go to in Memory View", ID_REGLIST_GOTOINMEMORYVIEW @@ -723,10 +706,6 @@ BEGIN MENUITEM "Copy Value", ID_REGLIST_COPYVALUE MENUITEM "Change...", ID_REGLIST_CHANGE END - POPUP "controls" - BEGIN - MENUITEM "Disable", ID_CONTROLS_KEY_DISABLE - END POPUP "breakpointlist" BEGIN MENUITEM "Enable", ID_DISASM_DISABLEBREAKPOINT diff --git a/Windows/pspmode.png b/Windows/pspmode.png deleted file mode 100644 index 402d250210..0000000000 Binary files a/Windows/pspmode.png and /dev/null differ diff --git a/Windows/resource.h b/Windows/resource.h index 44288a3501..acdddf300c 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -11,52 +11,26 @@ #define IDC_RAM 107 #define IDC_STEPOVER 108 #define IDC_TABDATATYPE 109 -#define IDC_CALLSTACK 110 #define ID_MEMVIEW_GOTOINDISASM 112 -#define ID_DISASM_DYNARECRESULTS 113 #define IDI_PPSSPP 115 -#define IDD_CONFIG 116 #define IDI_STOPDISABLE 118 #define ID_DEBUG_DISASSEMBLY 119 -#define ID_DEBUG_REGISTERS 120 #define WHEEL_DELTA 120 #define ID_DEBUG_LOG 121 -#define ID_DEBUG_BREAKPOINTS 122 #define ID_FILE_OPEN_NEW_INSTANCE 123 #define ID_FILE_LOADSTATEFILE 126 #define ID_FILE_SAVESTATEFILE 127 #define ID_EMULATION_RESET 130 #define IDD_ABOUTBOX 133 #define ID_DEBUG_LOADMAPFILE 134 -#define ID_CONFIG_RESOLUTION 141 #define ID_OPTIONS_FULLSCREEN 154 -#define ID_OPTIONS_SETTINGS 155 -#define ID_OPTIONS_SHOWERRORS 158 -#define ID_PLUGINS_LOADDEFAULTPLUGINS 159 #define IDD_MEMORY 160 #define ID_DEBUG_MEMORYVIEW 161 #define IDR_ACCELS 162 -#define ID_FILE_BOOTDVD 166 -#define ID_OPTIONS_ENABLEFRAMEBUFFER 167 #define IDR_POPUPMENUS 169 -#define ID_DEBUG_MEMORYCHECKS 173 -#define IDD_DIALOG2 186 -#define IDD_MEMORYSEARCH 187 -#define ID_DEBUG_MEMORYSEARCH 188 -#define ID_DEBUG_EXPERIMENT 189 -#define IDR_MENU2 190 #define ID_DISASM_GOTOINMEMORYVIEW 197 #define ID_DISASM_TOGGLEBREAKPOINT 198 #define ID_MEMVIEW_DUMP 199 -#define ID_OPTIONS_LOGGPFIFO 200 -#define ID_VIEW_TOOLBAR202 202 -#define ID_VIEW_STATUSBAR 203 -#define ID_HELP_INDEX204 204 -#define ID_HELP_ 206 -#define ID_HELP_HOMEPAGE 208 -#define ID_DEBUG_COMPILESIGNATUREFILE 209 -#define ID_DEBUG_USESIGNATUREFILE 210 -#define ID_DEBUG_UNLOADALLSYMBOLS 211 #define ID_DEBUG_RESETSYMBOLTABLE 212 #define IDI_STOP 223 #define IDD_INPUTBOX 226 @@ -73,8 +47,8 @@ #define ID_DEBUG_STEPINTO 244 #define ID_DEBUG_RUNTOLINE 245 #define ID_DEBUG_STEPOUT 246 -#define ID_DEBUG_DSIPLAYREGISTERLIST 247 -#define ID_DEBUG_DSIPLAYFUNCTIONLIST 248 +#define ID_DEBUG_DISPLAYREGISTERLIST 247 +#define ID_DEBUG_DISPLAYFUNCTIONLIST 248 #define ID_MEMVIEW_COPYADDRESS 249 #define IDD_GEDEBUGGER 250 #define IDD_TABDISPLAYLISTS 251 @@ -88,50 +62,21 @@ #define IDC_ADDRESS 1002 #define IDC_DEBUG_COUNT 1003 #define IDC_SEARCH_BOX 1004 -#define IDC_MEMORY 1006 -#define IDC_SH4REGISTERS 1007 -#define IDC_REGISTERS 1007 -#define IDC_BREAKPOINTS 1008 #define IDC_STEP 1009 #define IDC_VERSION 1010 -#define IDC_UP 1014 -#define IDC_DOWN 1015 -#define IDC_BREAKPOINTS_LIST 1015 -#define IDC_ADD 1016 -#define IDC_BREAKPOINT_EDIT 1017 -#define IDC_REMOVE 1018 -#define IDC_REMOVE_ALL 1019 -#define IDC_REGISTER_TAB 1019 -#define IDC_HIDE 1020 -#define IDC_TOGGLEBREAKPOINT 1049 -#define IDC_STAGE 1059 #define IDC_MEMVIEW 1069 #define IDC_GOTOLR 1070 #define IDC_GOTOINT 1071 #define IDC_MEMSORT 1073 -#define IDC_ALLFUNCTIONS 1075 -#define IDC_RESULTS 1093 #define IDC_SYMBOLS 1097 -#define IDC_X86ASM 1098 #define IDC_INPUTBOX 1098 #define IDC_MODENORMAL 1099 #define IDC_MODESYMBOLS 1100 -#define IDC_LOG_SHOW 1101 #define IDC_SEARCH_RESULTS 1102 -#define IDC_UPDATELOG 1108 -#define IDC_SETPC 1118 -#define IDC_UPDATEMISC 1134 -#define IDC_CODEADDRESS 1135 -#define IDC_BLOCKNUMBER 1136 -#define IDC_PREVBLOCK 1138 #define IDC_REGIONS 1142 #define IDC_REGLIST 1146 #define IDC_VALUENAME 1148 -#define IDC_FILELIST 1150 -#define IDC_BROWSE 1159 #define IDC_SHOWVFPU 1161 -#define IDC_LISTCONTROLS 1162 -#define IDC_FORCE_INPUT_DEVICE 1163 #define IDC_BREAKPOINTLIST 1164 #define IDC_DEBUGMEMVIEW 1165 #define IDC_BREAKPOINT_OK 1166 @@ -176,8 +121,6 @@ #define ID_FILE_EXIT 40000 #define ID_DEBUG_SAVEMAPFILE 40001 -#define ID_DISASM_ADDHLE 40002 -#define ID_FUNCLIST_KILLFUNCTION 40003 #define ID_DISASM_RUNTOHERE 40004 #define ID_MEMVIEW_COPYVALUE_8 40005 #define ID_DISASM_COPYINSTRUCTIONDISASM 40006 @@ -233,9 +176,6 @@ #define ID_TEXTURESCALING_DEPOSTERIZE 40057 #define ID_TEXTURESCALING_BICUBIC 40058 #define ID_TEXTURESCALING_HYBRID_BICUBIC 40059 -#define IDB_IMAGE_PSP 40060 -#define IDC_STATIC_IMAGE_PSP 40061 -#define ID_CONTROLS_KEY_DISABLE 40062 #define ID_OPTIONS_TOPMOST 40063 #define ID_HELP_OPENFORUM 40064 #define ID_OPTIONS_VSYNC 40065 @@ -306,7 +246,6 @@ #define IDC_GEDBG_STEPFRAME 40134 #define IDC_GEDBG_BREAKTEX 40135 #define ID_OPTIONS_PAUSE_FOCUS 40136 -#define ID_TEXTURESCALING_AUTO 40137 #define IDC_GEDBG_STEPPRIM 40138 #define ID_DISASM_ADDFUNCTION 40139 #define ID_DISASM_REMOVEFUNCTION 40140 diff --git a/Windows/version.rc b/Windows/version.rc index 1c6d3982b1..fb19eeb0ae 100644 --- a/Windows/version.rc +++ b/Windows/version.rc @@ -27,7 +27,7 @@ BEGIN VALUE "FileDescription", "PPSSPP" VALUE "FileVersion", PPSSPP_WIN_VERSION_STRING VALUE "InternalName", "PPSSPPEmu" - VALUE "LegalCopyright", "Copyright (C) 2006-2019 by Henrik Rydgård" + VALUE "LegalCopyright", "Copyright (C) 2006-2021 by Henrik Rydgård" VALUE "LegalTrademarks", "All product names are trademarks of their respective owners." VALUE "OriginalFilename", "PPSSPP.exe" VALUE "ProductName", "PPSSPP" diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index f4f594b79f..2ae4d17046 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -3,8 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" package="org.ppsspp.ppsspp" android:installLocation="auto" - android:versionCode="111030000" - android:versionName="1.11.3.0"> + android:versionCode="112030000" + android:versionName="1.12.3.0"> @@ -55,8 +55,8 @@ android:name=".PpssppActivity" android:configChanges="locale|keyboard|keyboardHidden|navigation|uiMode" android:label="@string/app_name" - android:theme="@style/ppsspp_style"> - + android:theme="@style/ppsspp_style" + android:exported="true"> @@ -106,7 +106,8 @@ + android:label="@string/shortcut_name" + android:exported="true"> diff --git a/android/ab.sh b/android/ab.sh index 08520d1a28..8f07b59605 100755 --- a/android/ab.sh +++ b/android/ab.sh @@ -1,6 +1,7 @@ cp -r ../assets/flash0 assets/ cp -r ../assets/lang assets/ cp -r ../assets/shaders assets/ +cp -r ../assets/debugger assets/ cp ../assets/langregion.ini assets/langregion.ini cp ../assets/compat.ini assets/compat.ini cp ../assets/Roboto-Condensed.ttf assets/Roboto-Condensed.ttf diff --git a/android/assets/font_atlas_luna.meta b/android/assets/font_atlas_luna.meta new file mode 100644 index 0000000000..05cc025278 Binary files /dev/null and b/android/assets/font_atlas_luna.meta differ diff --git a/android/assets/font_atlas_luna.zim b/android/assets/font_atlas_luna.zim new file mode 100644 index 0000000000..04fb533245 Binary files /dev/null and b/android/assets/font_atlas_luna.zim differ diff --git a/android/assets/ppge_atlas_luna.meta b/android/assets/ppge_atlas_luna.meta index aae0915cb3..1119284691 100644 Binary files a/android/assets/ppge_atlas_luna.meta and b/android/assets/ppge_atlas_luna.meta differ diff --git a/android/assets/ppge_atlas_luna.zim b/android/assets/ppge_atlas_luna.zim index 3009762b6e..cf413d407c 100644 Binary files a/android/assets/ppge_atlas_luna.zim and b/android/assets/ppge_atlas_luna.zim differ diff --git a/android/assets/ui_atlas_luna.meta b/android/assets/ui_atlas_luna.meta index 9574df7b60..572acf3052 100644 Binary files a/android/assets/ui_atlas_luna.meta and b/android/assets/ui_atlas_luna.meta differ diff --git a/android/assets/ui_atlas_luna.zim b/android/assets/ui_atlas_luna.zim index 24f9f66b73..935cb32639 100644 Binary files a/android/assets/ui_atlas_luna.zim and b/android/assets/ui_atlas_luna.zim differ diff --git a/android/build.gradle b/android/build.gradle index 9605836a96..dde528b343 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -44,7 +44,7 @@ android { } } } - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { applicationId 'org.ppsspp.ppssppluna' if (androidGitVersion.name() != "unknown" && androidGitVersion.code() >= 14000000) { @@ -60,7 +60,7 @@ android { new File("versioncode.txt").write(androidGitVersion.code().toString()) minSdkVersion 9 - targetSdkVersion 30 + targetSdkVersion 31 if (project.hasProperty("ANDROID_VERSION_CODE") && project.hasProperty("ANDROID_VERSION_NAME")) { versionCode ANDROID_VERSION_CODE versionName ANDROID_VERSION_NAME diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 3e911bb34c..37f4314a98 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -420,6 +420,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/Debugger/WebSocket/GameSubscriber.cpp \ $(SRC)/Core/Debugger/WebSocket/GPUBufferSubscriber.cpp \ $(SRC)/Core/Debugger/WebSocket/GPURecordSubscriber.cpp \ + $(SRC)/Core/Debugger/WebSocket/GPUStatsSubscriber.cpp \ $(SRC)/Core/Debugger/WebSocket/HLESubscriber.cpp \ $(SRC)/Core/Debugger/WebSocket/InputBroadcaster.cpp \ $(SRC)/Core/Debugger/WebSocket/InputSubscriber.cpp \ diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 7b2f2079f2..b707653ddf 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -170,6 +170,7 @@ static float g_safeInsetTop = 0.0; static float g_safeInsetBottom = 0.0; static jmethodID postCommand; +static jmethodID getDebugString; static jobject nativeActivity; static volatile bool exitRenderLoop; @@ -484,11 +485,31 @@ bool System_GetPropertyBool(SystemProperty prop) { } else { return false; } + case SYSPROP_HAS_KEYBOARD: + return true; default: return false; } } +std::string Android_GetInputDeviceDebugString() { + if (!nativeActivity) { + return "(N/A)"; + } + auto env = getEnv(); + jstring param = env->NewStringUTF("InputDevice"); + + jstring str = (jstring)env->CallObjectMethod(nativeActivity, getDebugString, param); + if (!str) { + return "(N/A)"; + } + + const char *charArray = env->GetStringUTFChars(str, 0); + std::string retVal = charArray; + env->DeleteLocalRef(str); + return retVal; +} + std::string GetJavaString(JNIEnv *env, jstring jstr) { if (!jstr) return ""; @@ -501,7 +522,9 @@ std::string GetJavaString(JNIEnv *env, jstring jstr) { extern "C" void Java_org_ppsspp_ppsspp_NativeActivity_registerCallbacks(JNIEnv *env, jobject obj) { nativeActivity = env->NewGlobalRef(obj); postCommand = env->GetMethodID(env->GetObjectClass(obj), "postCommand", "(Ljava/lang/String;Ljava/lang/String;)V"); + getDebugString = env->GetMethodID(env->GetObjectClass(obj), "getDebugString", "(Ljava/lang/String;)Ljava/lang/String;"); _dbg_assert_(postCommand); + _dbg_assert_(getDebugString); Android_RegisterStorageCallbacks(env, obj); Android_StorageSetNativeActivity(nativeActivity); diff --git a/android/jni/app-android.h b/android/jni/app-android.h index d4cb8d2fee..9c78672561 100644 --- a/android/jni/app-android.h +++ b/android/jni/app-android.h @@ -11,7 +11,11 @@ #include "Common/File/Path.h" #include "Common/File/AndroidStorage.h" -#if PPSSPP_PLATFORM(ANDROID) && !defined(__LIBRETRO__) +#if PPSSPP_PLATFORM(ANDROID) + +std::string Android_GetInputDeviceDebugString(); + +#if !defined(__LIBRETRO__) #include @@ -22,5 +26,6 @@ class AndroidLogger : public LogListener { public: void Log(const LogMessage &message) override; }; +#endif #endif diff --git a/android/src/org/ppsspp/ppsspp/InputDeviceState.java b/android/src/org/ppsspp/ppsspp/InputDeviceState.java index 972920712f..d117b53167 100644 --- a/android/src/org/ppsspp/ppsspp/InputDeviceState.java +++ b/android/src/org/ppsspp/ppsspp/InputDeviceState.java @@ -8,6 +8,8 @@ import android.view.InputDevice.MotionRange; import android.view.KeyEvent; import android.view.MotionEvent; +import java.lang.annotation.Target; + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) public class InputDeviceState { private static final String TAG = "InputDeviceState"; @@ -17,27 +19,95 @@ public class InputDeviceState { private InputDevice mDevice; private int[] mAxes; + private int sources; + InputDevice getDevice() { return mDevice; } @TargetApi(19) - void logAdvanced(InputDevice device) { - Log.i(TAG, "Vendor ID:" + device.getVendorId() + " productId: " + device.getProductId()); + static void logAdvanced(InputDevice device) { + Log.i(TAG, "Vendor ID:" + device.getVendorId() + " productId: " + device.getProductId() + " sources: " + String.format("%08x", device.getSources())); + } + + @TargetApi(19) + public String getDebugString() { + String str = mDevice.getName() + " sources: " + String.format("%08x", sources) + "\n classes: "; + + String[] classes = { "BUTTON ", "POINTER ", "TRACKBALL ", "POSITION ", "JOYSTICK " }; + for (int i = 0; i < 5; i++) { + if ((sources & (1 << i)) != 0) { + str += classes[i]; + } + } + str += "\n "; + + // Check the full identifications. + if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) { + str += "GAMEPAD "; + } + + if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) { + str += "KEYBOARD"; + if (mDevice.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { + str += "(alpha) "; + } else { + str += " "; + } + } + + if ((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) { + str += "JOYSTICK "; + } + if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) { + str += "DPAD "; + } + if ((sources & InputDevice.SOURCE_HDMI) == InputDevice.SOURCE_HDMI) { + // what? + str += "HDMI "; + } + if ((sources & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) { + str += "MOUSE "; + } + if ((sources & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE) { + str += "MOUSE_RELATIVE "; + } + if ((sources & InputDevice.SOURCE_ROTARY_ENCODER) == InputDevice.SOURCE_ROTARY_ENCODER) { + str += "ROTARY_ENCODER "; + } + if ((sources & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS) { + str += "STYLUS "; + } + if ((sources & InputDevice.SOURCE_TOUCHPAD) == InputDevice.SOURCE_TOUCHPAD) { + str += "TOUCHPAD "; + } + if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) { + str += "TOUCHSCREEN "; + } + if ((sources & InputDevice.SOURCE_TOUCH_NAVIGATION) == InputDevice.SOURCE_TOUCH_NAVIGATION) { + str += "TOUCH_NAVIGATION "; + } + if ((sources & InputDevice.SOURCE_BLUETOOTH_STYLUS) == InputDevice.SOURCE_BLUETOOTH_STYLUS) { + str += "BLUETOOTH_STYLUS "; + } + str += "\n"; + return str; } public InputDeviceState(InputDevice device) { - int sources = device.getSources(); - if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { + sources = device.getSources(); + // First, anything that's a gamepad is a gamepad, even if it has a keyboard or pointer. + if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) { + this.deviceId = NativeApp.DEVICE_ID_PAD_0; + } else if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { this.deviceId = NativeApp.DEVICE_ID_KEYBOARD; + } else if ((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || + (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) { + this.deviceId = NativeApp.DEVICE_ID_PAD_0; } else if ((sources & InputDevice.SOURCE_CLASS_POINTER) == InputDevice.SOURCE_CLASS_POINTER) { this.deviceId = NativeApp.DEVICE_ID_MOUSE; - } else if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || - (sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || - (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD)) { - this.deviceId = NativeApp.DEVICE_ID_PAD_0; } else { - // Built-in buttons like Back etc. + // Built-in device buttons like Back etc. this.deviceId = NativeApp.DEVICE_ID_DEFAULT; } diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index b62af3fbc3..87a6ddf4be 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -930,6 +930,21 @@ public abstract class NativeActivity extends Activity { return state; } + protected String getInputDeviceDebugString() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + String buffer = ""; + for (InputDeviceState input : inputPlayers) { + buffer += input.getDebugString(); + } + if (buffer.length() == 0) { + buffer = "(no devices)"; + } + return buffer; + } else { + return "(input device debug not available before Android Kitkat)"; + } + } + public boolean IsXperiaPlay() { return android.os.Build.MODEL.equals("R800a") || android.os.Build.MODEL.equals("R800i") || android.os.Build.MODEL.equals("R800x") || android.os.Build.MODEL.equals("R800at") || android.os.Build.MODEL.equals("SO-01D") || android.os.Build.MODEL.equals("zeus"); } @@ -1118,30 +1133,39 @@ public abstract class NativeActivity extends Activity { return; } if (requestCode == RESULT_LOAD_IMAGE) { - Uri selectedImage = data.getData(); - if (selectedImage != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - NativeApp.sendMessage("bgImage_updated", selectedImage.toString()); - } else { - String[] filePathColumn = {MediaStore.Images.Media.DATA}; - Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); - if (cursor != null) { - cursor.moveToFirst(); - int columnIndex = cursor.getColumnIndex(filePathColumn[0]); - String picturePath = cursor.getString(columnIndex); - cursor.close(); - - NativeApp.sendMessage("bgImage_updated", picturePath); + try { + Uri selectedImage = data.getData(); + if (selectedImage != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + NativeApp.sendMessage("bgImage_updated", selectedImage.toString()); + } else { + String[] filePathColumn = {MediaStore.Images.Media.DATA}; + Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); + if (cursor != null) { + cursor.moveToFirst(); + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); + String picturePath = cursor.getString(columnIndex); + cursor.close(); + NativeApp.sendMessage("bgImage_updated", picturePath); + } } } + } catch (Exception e) { + Log.w(TAG, "Exception receiving image: " + e.toString()); } } else if (requestCode == RESULT_OPEN_DOCUMENT) { Uri selectedFile = data.getData(); if (selectedFile != null) { - // Grab permanent permission so we can show it in recents list etc. - if (Build.VERSION.SDK_INT >= 19) { - getContentResolver().takePersistableUriPermission(selectedFile, Intent.FLAG_GRANT_READ_URI_PERMISSION); + try { + // Grab permanent permission so we can show it in recents list etc. + if (Build.VERSION.SDK_INT >= 19) { + getContentResolver().takePersistableUriPermission(selectedFile, Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + } catch (Exception e) { + Log.w(TAG, "Exception getting permissions for document: " + e.toString()); } + // Even if we got an exception getting permissions, try to pass along the file. Maybe this version of Android + // doesn't need it. Log.i(TAG, "Browse file finished:" + selectedFile.toString()); NativeApp.sendMessage("browse_fileSelect", selectedFile.toString()); } @@ -1150,7 +1174,13 @@ public abstract class NativeActivity extends Activity { if (selectedDirectoryUri != null) { String path = selectedDirectoryUri.toString(); Log.i(TAG, "Browse folder finished: " + path); - getContentResolver().takePersistableUriPermission(selectedDirectoryUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + try { + getContentResolver().takePersistableUriPermission(selectedDirectoryUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + } catch (Exception e) { + Log.w(TAG, "Exception getting permissions for document: " + e.toString()); + } + // Even if we got an exception getting permissions, try to pass along the file. Maybe this version of Android + // doesn't need it. If we can't access it, we'll fail in some other way later. DocumentFile documentFile = DocumentFile.fromTreeUri(this, selectedDirectoryUri); Log.i(TAG, "Document name: " + documentFile.getUri()); /* diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 95e684659b..3142995042 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -135,6 +135,14 @@ public class PpssppActivity extends NativeActivity { }); } + public String getDebugString(String str) { + if (str.equals("InputDevice")) { + return getInputDeviceDebugString(); + } else { + return "bad debug string: " + str; + } + } + public int openContentUri(String uriString, String mode) { try { Uri uri = Uri.parse(uriString); diff --git a/assets/compat.ini b/assets/compat.ini index 7bdae07aff..cab17aca1e 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -230,6 +230,18 @@ ULES00719 = true ULES00599 = true ULUS10188 = true +# Digimon World Re:Digitize +ULJS00496 = true +NPJH50588 = true +ULAS42319 = true + +# NOVA: Near Orbit Vanguard Alliance +NPUZ00179 = true +NPEZ00222 = true + +# Street Riders (only region found. See #14746) +ULES00276 = true + [ClearToRAM] # SOCOM Navy Seals games require this. See issue #8973. # Navy Seals : Tactical Strike @@ -251,10 +263,16 @@ UCUS98645 = true # Fireteam Bravo 2 Demo UCUS98677 = true UCUS98691 = true -# Fireteam Bravo 3 -NPHG00032 = true -UCUS98716 = true -UCES01242 = true + +# DBZ Tenkaichi Tag Team, see issue #14283 +ULJS00311 = true +ULAS42247 = true +ULUS10537 = true +ULUS10737 = true +ULJS19067 = true +ULAS42318 = true +NPUH90087 = true # demo +NPEH90042 = true # demo [Force04154000Download] # This applies a hack to Dangan Ronpa, its demo, and its sequel. @@ -441,9 +459,6 @@ ULJM05359 = true ULJM05885 = true NPJH50825 = true ULKS46157 = true -# GOW : JP/Korean -UCJS10114 = true -UCKS45084 = true # GOW : Ghost of Sparta UCUS98737 = true UCAS40323 = true @@ -611,6 +626,10 @@ ULJM05091 = true # GachiTora! Abarenbou Kyoushi in High School need it to render shadows properly (see #14136) ULJS00355 = true NPJH50409 = true +# MegaMan Maverick Hunter X (see #10085) +ULES00251 = true +ULUS10068 = true +ULJM05043 = true [DisableAccurateDepth] # Midnight Club: LA Remix @@ -801,6 +820,11 @@ UCAS40347 = true UCJS10038 = true UCJS18013 = true +# Megaman Maverick Hunter X (see #10085) +ULES00251 = true +ULUS10068 = true +ULJM05043 = true + # Note! This whole flag is disabled temporarily by appending "Disabled" to its name). See 7914 [YugiohSaveFixDisabled] # The cause of Yu-gi-oh series 's bad save (cannot save) are load "save status" and use cwcheat, @@ -865,8 +889,6 @@ NPJH50017 = true # The GOW games are very heavy and render as fast as they can. They benefit greatly from # capping the framerate at 60fps. -UCJS10114 = true -UCKS45084 = true # GOW : Ghost of Sparta UCUS98737 = true UCAS40323 = true @@ -967,6 +989,26 @@ ULES01495 = true # Atari Classics Evolved ULUS10325 = true +# Kurohyou 2: Ryu ga Gotoku Ashura Hen (Japan) +NPJH50562 = true +NPJH50333 = true + +# Silent Hill Origin +ULUS10285 = true +ULES00869 = true + +# Resistance Retribution +UCES01184 = true +UCUS98668 = true + +# Spider-Man 3 +ULES00938 = true +ULUS10317 = true + +# NBA 2K13 +ULUS10598 = true +ULES01578 = true + [JitInvalidationHack] # This is an absolutely awful hack that somehow prevents issues when clearing the JIT, # if the game has copied code with EmuHack opcodes or something. Hopefully will be able @@ -1118,6 +1160,15 @@ UCES00001 = true UCKS45008 = true NPJG00059 = true +#Socom FireTeam Bravo 3 / Navy Seals Portable. See issue #11814 +UCES01242 = true +UCUS98716 = true +NPHG00032 = true +NPJG00035 = true +UCJS10102 = true +NPEG90024 = true # demo +NPJG90068 = true # demo + [MpegAvcWarmUp] # God Eater issue #13527 ,It is custom mpeg library that required sceMpegGetAvcAu return ERROR_MPEG_NO_DATA but break FIFA 14 issue #14086 # God Eater 1 @@ -1142,3 +1193,14 @@ NPJH50352 = true ULUS10563FV = true ULJS19081 = true NPJH50352 = true + +# Field Commander, see issue #10209 +ULUS10088 = true +ULES00335 = true +ULKS46070 = true + +# Valkyrie Profile Lenneth (last video crash, see #6008) +ULUS10107 = true +ULJM05101 = true +ULES00724 = true +ULJM05320 = true diff --git a/assets/debugger b/assets/debugger new file mode 160000 index 0000000000..36ad6b19b2 --- /dev/null +++ b/assets/debugger @@ -0,0 +1 @@ +Subproject commit 36ad6b19b22de2075a01a4f0c765e3ef514dc38f diff --git a/assets/font_atlas_luna.meta b/assets/font_atlas_luna.meta new file mode 100644 index 0000000000..05cc025278 Binary files /dev/null and b/assets/font_atlas_luna.meta differ diff --git a/assets/font_atlas_luna.zim b/assets/font_atlas_luna.zim new file mode 100644 index 0000000000..04fb533245 Binary files /dev/null and b/assets/font_atlas_luna.zim differ diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 4dc4b4c4ee..50cd64fe93 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -9,49 +9,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = ‎(إعادة التشغيل مطلوبة) الخلفية الصوتية +Audio Error = Audio Error AudioBufferingForBluetooth = ‎معادلة مصادقة البلوتوث (بطئ) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = ‎DSound (متكامل) Enable Sound = ‎تفعيل الصوت Global volume = ‎الصوت العام Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = ‎WASAPI (سريع) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = ‎حساسية المحور التناظري +Analog Binding = Analog Binding Analog Limiter = ‎محدد التناظري Analog Mapper High End = ‎مخطط التناظري النهاية العظمي (حساسية المحور) Analog Mapper Low End = ‎مخطط التناظري نهاية دنيا (المنطقة الميتة المعكوسة) Analog Mapper Mode = ‎وضع تخطيط التناظري +Analog Settings = Analog Settings Analog Stick = ‎عصا تناظرية +Analog Style = Analog Style AnalogLimiter Tip = ‎حينما يتم ضغط زر تحديد التناظر Auto = ‎تلقائي Auto-centering analog stick = ‎تنصيف العصا التناظرية تلقائياً Auto-hide buttons after seconds = ‎إخفاء الأزرار تلقائياً بعد ثواني +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = ‎شفافية الأزرار Button style = ‎شكل الأزرار +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = ‎معايرة +Calibrated = Calibrated Calibration = ‎المعايرة +Circular stick input = Circular stick input Classic = ‎كلاسيكي Combo Key Setting = ‎إعدادات مفتاح الكومبو Combo Key Setup = ‎تجهيز مفتاح الكومبو Confine Mouse = ‎حجز مؤشر الماوس في حدود نافذة البرنامج Control Mapping = ‎تخطيط التحكم -Custom layout... = ‎تعديل نسق إعدادات اللمس... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = ‎تعديل نسق إعدادات اللمس... Customize tilt = ‎إمالة مخصصة... D-PAD = D-Pad -Deadzone Radius = ‎مساحة المنطقة الميتة +Deadzone radius = ‎مساحة المنطقة الميتة DInput Analog Settings = ‎DI إعدادت الدخل التناظري الخاص بـ Disable D-Pad diagonals (4-way touch) = ‎(4طرق للمس)تعطيل أقطار D-Pad +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = ‎الإستجابة اللمسية (الإهتزاز) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = ‎تخطي أزرعة التحكم حينما لا يكون في التركيز Ignore Windows Key = ‎تعطيل مفتاح الوندوز Invert Axes = ‎عكس المحاور @@ -63,6 +85,7 @@ L/R Trigger Buttons = ‎L/R أزارار التفعيل Landscape = ‎الخلفية الواسعة Landscape Auto = Landscape auto Landscape Reversed = ‎الخلفية الواسعة معكوسة +Low end radius = Low end radius Mouse = ‎إعدادات الماوس Mouse sensitivity = ‎حساسية الماوس Mouse smoothing = ‎تنعيم حركة الماوس @@ -73,21 +96,32 @@ OnScreen = ‎تحكم لمس الشاشة Portrait = ‎طولية Portrait Reversed = ‎طولية معكوسة PSP Action Buttons = ‎PSP أزرار الأفعال الخاصة بـ +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = ‎تدوير الشاشة seconds, 0 : off = ثواني, 0 = ‎مغلق +Sensitivity (scale) = Sensitivity (scale) Sensitivity = ‎الحساسية +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = ‎أظهر زر قائمة التوقف المؤقت +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = ‎حدود رفيعة Tilt Base Radius = Tilt base radius Tilt Input Type = ‎نوع الإدخال المنطقة Tilt Sensitivity along X axis = ‎X حساسية المنطقة علي طول محور Tilt Sensitivity along Y axis = ‎Y حساسية المنطقة علي طول محور To Calibrate = ‎لتقوم بالمعايرة, ضع الجهاز عل سطح مستوي وإضغط "معايرة". +Toggle mode = Toggle mode Touch Control Visibility = ‎شفافية تحكم اللمس Use custom right analog = Use custom right analog Use Mouse Control = ‎إستخدم تحكم الماوس Visibility = ‎الشفافية +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -107,6 +141,7 @@ Refresh Rate = ‎معدل التحديث #Font = Trebuchet MS About PPSSPP... = ‎&عن البرنامج... Auto = ‎&تلقائي +Auto Max Quality = Auto Max &Quality Backend = ‎&خلفية التصيير(إعادة تشغيل PPSSPP) Bicubic = &Bicubic Break = Break @@ -158,6 +193,7 @@ More Settings... = ‎&إعدادات إضافية... Nearest = ‎&الأقرب Non-Buffered Rendering = ‎&تخطي تأثيرات الصقل (غير مصقول, أسرع) Off = ‎&مغلق +Open Chat = Open Chat Open Directory... = ‎إفتح مسار&... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -237,6 +273,7 @@ No block = ‎لا بوك Prev = ‎السابق Random = ‎عشوائي Replace textures = ‎إستبدال الرسوم +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -282,10 +319,13 @@ DeleteConfirmGameConfig = ‎هل تود حقاً مسح الإعدادات له DeleteFailed = ‎غير قادر علي مسح البيانات. Deleting = ‎يمسح\nمن فضلك إنتظر... Disable All = ‎عطل الكل +Dumps = Dumps Edit = Edit Enable All = ‎فعل الكل Enter = ‎إدخال +Filter = Filter Finish = ‎إنهاء +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -308,8 +348,10 @@ Save = ‎حفظ Save completed = ‎الحفظ إكتمل. Saving = ‎يحفظ\nمن فضلك إنتظر... SavingFailed = ‎غير قادر علي حفظ البيانات. +Search = Search Select = ‎حدد Shift = ‎شفت +Skip = Skip Snap = Snap Space = ‎مسافة SSID = SSID @@ -384,6 +426,7 @@ ZIP file detected (Require WINRAR) = ‎الملف مضغوط (ZIP).\nمن فض [Game] Asia = ‎أسيا +Calculate CRC = Calculate CRC ConfirmDelete = ‎مسح Create Game Config = ‎أنشي إعدادت للعبة Create Shortcut = ‎إصنع إختصار @@ -438,6 +481,7 @@ Auto = ‎تلقائي Auto (1:1) = ‎تلقائي (1:1) Auto (same as Rendering) = ‎تلقائي (مثل حجم التصيير) Auto FrameSkip = ‎تخطي الإطار التلقائي +Auto Max Quality = Auto Max Quality Auto Scaling = ‎تكبير تلقائي Backend = ‎الخلفي Balanced = ‎متناسق @@ -563,11 +607,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = ‎ضبط تلقائي Autoconfigure for device = ‎إعداد تلقائي للعبة +Bind All = Bind All Clear All = ‎إخلاء الكل Default All = ‎إرجاع للإفتراضي Map a new key for = ‎خريطة مفتاح جديدة لـ Map Key = ‎خريطة مفتاح Map Mouse = ‎خريطة الفأرة +Replace = Replace +Show PSP = Show PSP Test Analogs = ‎إختبر التناظر You can press ESC to cancel. = ‎يمكنك ضغط علي زر الخروج للإلغاء. @@ -576,7 +623,7 @@ Browse = ‎تصفح... Buy PPSSPP Gold = Buy PPSSPP Gold Choose folder = Choose folder Credits = ‎الحقوق -‎PPSSPP Homebrew Store = ‎PPSSPP Homebrew Store +PPSSPP Homebrew Store = ‎PPSSPP Homebrew Store Exit = ‎خروج Game Settings = ‎الإعدادات Games = ‎الألعاب @@ -593,6 +640,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = ‎إلغاء التثبيت +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -618,11 +666,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = ‎الدائرة Cross = ‎الأكس +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = ‎قائمة المطوريين +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -639,10 +698,11 @@ OpenChat = Open chat Pause = ‎توقف مؤقت R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -656,6 +716,11 @@ Select = ‎تحديد SpeedToggle = ‎تفعيل السرعة Square = ‎مربع Start = ‎بدء +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = ‎تفعيل وضع الشاشة الكاملة @@ -667,10 +732,39 @@ Vol + = Vol + Vol - = Vol - Wlan = ‎الواي فاي +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -682,6 +776,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -701,12 +796,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = ‎الشبكة تُطلق +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset (0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -740,6 +839,8 @@ Rewind = ‎إرجاع Save State = ‎حفظ الحالة Settings = ‎الإعدادات Switch UMD = ‎تبديل الـ UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -770,6 +871,7 @@ Scanlines = Scanlines (CRT) Sharpen = ‎تنعيم الحواف SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -836,6 +938,8 @@ Stopping.. = ‎يتوقف... [Reporting] Bad = ‎سئ +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = ‎بيناتك يتم تقديمها في الخلفية. FeedbackDesc = ‎كيف حال المحاكاة? إجعلنا نحن والمجتمع يعرف! FeedbackDisabled = ‎تقارير سرفر التكامل يجب تفعيلها. @@ -861,6 +965,7 @@ Perfect Description = ‎تشغيل ممتاز للعبة كلها - عظيم! Plays = ‎يلعب Plays Description = ‎شغالة بالكامل لكن ليس من غير أخطاء ReportButton = ‎تبليغ عن مراجعة +Show disc CRC = Show disc CRC Speed = ‎السرعة Submit Feedback = ‎تقديم مراجعتك SuggestionConfig = See reports on website for good settings. @@ -879,9 +984,11 @@ Date = Date Filename = Filename No screenshot = ‎لا لقطة شاشة None yet. Things will appear here after you save. = ‎ليس بعد. الأشياء سوف تظهر هنا بعد الحفظ. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = ‎حفظ البيانات Save States = ‎حفظ الحالة Savedata Manager = ‎مدير حفظ الحالة +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -894,6 +1001,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = ‎الحالة تم تحميلها +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! @@ -908,6 +1017,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = ‎السرعة: إعتيادية +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -941,6 +1051,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -964,6 +1075,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -985,8 +1097,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = ‎تغيير الأسم المستعار ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1020,7 +1135,6 @@ General = ‎العام Grid icon size = Grid icon size Help the PPSSPP team = ‎ساعد فريق البرنامج Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = ‎المترجم @@ -1030,14 +1144,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = ‎تم إدخال الذاكرة MHz, 0:default = ميجا هرتز, 0 = ‎الإفتراضي MMDDYYYY = ‎شهر يوم سنة +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = ‎PSP ليست لعبة Off = ‎مغلق Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = ‎PSP موديل PSP Settings = ‎PSP إعدادات PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = ‎تسجيل الصوت Record Display = ‎سجل الفيديو Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1061,8 +1180,10 @@ Storage full = ‎الذاكرة ممتلئة Sustained performance mode = ‎وضع الأداء المتواصل Time Format = ‎صيغة الوقت UI = اجهة +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = ‎إستخدم صيغة الفيديو الأقل تأثيراً (FFV1) Use O to confirm = ‎إستخدم O علي إنه زر التأكيد Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1071,6 +1192,7 @@ Use X to confirm = ‎إستخدم X علي إنه زر التأكيد VersionCheck = ‎إبحث عن نسخة جديدة من البرنامج WARNING: Android battery save mode is on = ‎تحذير: وضع حفظ الطاقة في الأندرويد مُفعل WARNING: Battery save mode is on = ‎تحذير: وضع حفظ البطارية مُفعل +Waves = Waves YYYYMMDD = ‎سنة شهر يوم [Upgrade] diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 5387a6ebc8..58d31e16f9 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Səs Açıq Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Buttons opacity Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Control mapping -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Ekran Kontrolları Açıq Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &Directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Silinir\nZəhmət Olmasa Gözləyin... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Gir +Filter = Filter Finish = Bitir +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = Qeyd edildi Saving = Qeyd edilir\nZəhmət Olmasa Gözləyin... SavingFailed = Unable to save data. +Search = Search Select = Seç Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Create shortcut @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Clear all Default All = Restore defaults Map a new key for = Map a new key for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -568,7 +615,7 @@ Browse = Browse... Buy PPSSPP Gold = Buy PPSSPP Gold Choose folder = Choose folder Credits = Tanıtım -‎PPSSPP Homebrew Store = PPSSPP Homebrew Store +PPSSPP Homebrew Store = PPSSPP Homebrew Store Exit = Çıxış Game Settings = Settings Games = Games @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Yaddaşda Saxla Settings = Ayarlar Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = State loaded +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Speed: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Change nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = General Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP settings PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Time format UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Use O as confirmation button Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Use X as confirmation button VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 64bb02c5c2..66cbdbfcad 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Включи звук Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Автоматично Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Прозрачност на бутоните Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Класик Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Избиране на контроли -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone радиус +Deadzone radius = Deadzone радиус DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Изключи D-Pad диагонали (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (вибрация) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Игнорирай Windows клавиша (попречва показването на Start меню) Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Пейзаж Landscape Auto = Landscape auto Landscape Reversed = Обърнат пейзаж +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Управление с докосване на екрана Portrait = Портрет Portrait Reversed = Обърнат портрет PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Въртене на екрана seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Чувствителност +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Покажи бутон „Пауза“ +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Видимост +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Arial About PPSSPP... = &Относно PPSSPP... Auto = &Автоматично +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = Още настройки... Nearest = &Най-близко Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Изключено +Open Chat = Open Chat Open Directory... = Отвори директория... Open from MS:/PSP/GAME... = Отвори от MS:/PSP/GAME... Open Memory Stick = Отвори от мемори стик @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Сигурни ли сте, че искате да възстановите всички първоначални настойки?\nКонтролите не са променени.\n\n\nНе може да върнете това действие.\nМоля рестартирайте PPSSPP за да бъдат приложени промените. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Изтриване\nМоля изчакайте... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Enter +Filter = Filter Finish = Край +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Запази Save completed = Съхраняването завършено. Saving = Съхраняване\nМоля изчакайте... SavingFailed = Unable to save data. +Search = Search Select = Select Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Файла е архивиран (ZIP).\nМ [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Изтрий Create Game Config = Create game config Create Shortcut = Създай пряк път @@ -430,6 +473,7 @@ Auto = Автоматично Auto (1:1) = Автоматично (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Автоматично пропускане на кадри +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Изчисти всички Default All = Първоначални Map a new key for = Избери нов клавиш за Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Надолу Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Пауза R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Надясно -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Превърти до начало Save State = Запази състояние Settings = Settings Switch UMD = Смени UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Изостряне SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = Състояние заредено +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Неуспех при зареждане на състояние: Записа не съществува! LoadStateWrongVersion = Неуспех при зареждане на състояние: Записа е за по-стара версия на PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Speed: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Промени емулираната процесорна честота на PSP (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Промени прякор ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Основни Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = ммддгггг +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP серия PSP Settings = PSP настройки PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Час UI = Потребителски интерфейс +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Използвай O за потвърждение Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Използвай X за потвърждение VersionCheck = Провери за нова версия на PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = ггггммдд [Upgrade] diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 8e385a5f08..cc6ee0902b 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Motor d'àudio (requereix reiniciar) +Audio Error = Audio Error AudioBufferingForBluetooth = Memòria intermèdia en Bluetooth (lent) Auto = Automàtic Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Activeu el so Global volume = Volum global Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (ràpid) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Limitador analògic Analog Mapper High End = Assignació analòg. bàsica (sensibilitat d'eixos) Analog Mapper Low End = Assignació analòg. avançada (inverteix la zona morta) Analog Mapper Mode = Mode d'assignació analògica +Analog Settings = Analog Settings Analog Stick = Palanca analògica +Analog Style = Analog Style AnalogLimiter Tip = Quan es pitja el botó del limitador analògic Auto = Automàtic Auto-centering analog stick = Centrament automàtic de la palanca analògica Auto-hide buttons after seconds = Oculteu els botons després de +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Transparència dels botons Button style = Estil dels botons +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibreu la creueta +Calibrated = Calibrated Calibration = Calibraació +Circular stick input = Circular stick input Classic = Clàssic Combo Key Setting = Paràmetres dels botons combo Combo Key Setup = Configureu els botons combo Confine Mouse = Trap mouse within window/display area Control Mapping = Assigneu els botons -Custom layout... = Personalitzeu els botons +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Personalitzeu els botons Customize tilt = Personalitzeu l'acceleròmetre... D-PAD = Creueta -Deadzone Radius = Radi de zona inactiva +Deadzone radius = Radi de zona inactiva DInput Analog Settings = Paràmetres analògics DInput Disable D-Pad diagonals (4-way touch) = Desactiveu els diagonals de la creueta +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Vibració hàptica +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignoreu els comandaments amb la pantalla inactiva Ignore Windows Key = Ignoreu la tecla de Windows Invert Axes = Invertiu els eixos @@ -55,6 +77,7 @@ L/R Trigger Buttons = Botons L/R Landscape = Horitzontal Landscape Auto = Landscape auto Landscape Reversed = Horitzontal invertit +Low end radius = Low end radius Mouse = Configuració del ratolí Mouse sensitivity = Sensibilitat del ratolí Mouse smoothing = Suavitat del ratolí @@ -65,21 +88,32 @@ OnScreen = Mostreu els botons tàctils a la pantalla Portrait = Vertical Portrait Reversed = Vertical invertit PSP Action Buttons = Botons d'acció de la PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotació de la pantalla seconds, 0 : off = seconds, 0 = no +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensibilitat +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Mostreu el botó de menú +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Vores fines Tilt Base Radius = Tilt base radius Tilt Input Type = Tipus de control de l'acceleròmetre Tilt Sensitivity along X axis = Sensibilitat d'inclinació de l'eix X Tilt Sensitivity along Y axis = Sensibilitat d'inclinació de l'eix Y To Calibrate = Per a la calibració, poseu l'aparell en una superfície plana i pitgeu «Calibreu» +Toggle mode = Toggle mode Touch Control Visibility = Visibilitat del control tàctil Use custom right analog = Use custom right analog Use Mouse Control = Utilitzeu el control del ratolí Visibility = Visibilitat +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Paràmetres analògics XInput @@ -99,6 +133,7 @@ Refresh Rate = Freqüència de refrescament #Font = Trebuchet MS About PPSSPP... = &Quant a PPSSPP... Auto = &Automàtic +Auto Max Quality = Auto Max &Quality Backend = Motor &gràfic (requereix reiniciar) Bicubic = &Bicúbic Break = Break @@ -150,6 +185,7 @@ More Settings... = Més &paràmetres... Nearest = &El més proper Non-Buffered Rendering = &Renderitzat sense memòria intermèdia (més ràpid) Off = &No +Open Chat = Open Chat Open Directory... = Obriu &directori... Open from MS:/PSP/GAME... = O&briu des de from «MS:/PSP/GAME»... Open Memory Stick = Obriu «&Memory Stick» @@ -229,6 +265,7 @@ No block = No bloquis Prev = Anterior Random = Aleatori Replace textures = Reemplaceu textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Esteu segur que voleu restablir els ajustaments de fàbrica?\nEls canvis en els controls no s'esborraran.\n\nAixò no es pot desfer.\nReinicia PPSSPP per a que els canvis tenguin efecte. RestoreGameDefaultSettings = Esteu segur que voleu restablir els paràmetres de joc\na els paràmetres per defecte de PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Esborrant\nEspera un moment... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Confirmar +Filter = Filter Finish = Finalizar +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = Guardat completat Saving = Guardant\nEspera un moment... SavingFailed = Unable to save data. +Search = Search Select = Seleccionar Shift = Canviar +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Create shortcut @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Clear all Default All = Restore defaults Map a new key for = Map a new key for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Guardar estat Settings = Configuració Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = State loaded +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Velocitat: estàndard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Change nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = General Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP settings PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Time format UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Use O as confirmation button Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Use X as confirmation button VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 2fdb0ecfa8..4933e504c2 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Zvukové jádro (vyžaduje restart) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (kompatibilní) Enable Sound = Povolit zvuk Global volume = Celková hlasitost Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (rychlé) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analogový omezovač Analog Mapper High End = Vršek analogového mapovače (citlivost osy) Analog Mapper Low End = Spodek analogového mapovače (převrácené pásmo necitlivosti) Analog Mapper Mode = Režim analogového mapovače +Analog Settings = Analog Settings Analog Stick = Analogová páčka +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Automatické vystředění analogové páčky Auto-hide buttons after seconds = Automaticky skrýt tlačítka po určité době +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Průhlednost tlačítek Button style = Styl tlačítek +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibrovat +Calibrated = Calibrated Calibration = Kalibrace +Circular stick input = Circular stick input Classic = Klasický Combo Key Setting = Nastavování kombinačních kláves Combo Key Setup = Nastavení kombinačních kláves Confine Mouse = Trap mouse within window/display area Control Mapping = Mapování ovládání -Custom layout... = Upravit rozdělení dotykového ovládání... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Upravit rozdělení dotykového ovládání... Customize tilt = Přizpůsobit náklon... D-PAD = D-Pad -Deadzone Radius = Poloměr mrtvé zóny +Deadzone radius = Poloměr mrtvé zóny DInput Analog Settings = Nastavení analogu DInput Disable D-Pad diagonals (4-way touch) = Zakázat diagonální D-Pad (čtyřsměrný dotek) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Hmatová odezva (vibrace) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignorovat gamepad pokud okno není aktivní Ignore Windows Key = Zakázat klávesu Windows Invert Axes = Převrátit osy @@ -55,6 +77,7 @@ L/R Trigger Buttons = Levé/Pravé tlačítko spínače Landscape = Na šířku Landscape Auto = Landscape auto Landscape Reversed = Na šířku obráceně +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Dotykové ovládání na obrazovce Portrait = Na výšku Portrait Reversed = Na výšku obráceně PSP Action Buttons = Tlačítka činností PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Otočení obrazovky seconds, 0 : off = vteřin, 0 = vypnuto +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Citlivost +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Zobrazit tlačítko Nabídky při pozastavení +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Tenké okraje Tilt Base Radius = Tilt base radius Tilt Input Type = Typ vstupu náklonu Tilt Sensitivity along X axis = Citlivost náklonu podle osy X Tilt Sensitivity along Y axis = Citlivost náklonu podle osy Y To Calibrate = Pro kalibraci mějte zařízení na rovném povrchu a stiskněte "Kalibrovat". +Toggle mode = Toggle mode Touch Control Visibility = Viditelnost dotykového ovládání Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Viditelnost +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Nastavení analogu XInput @@ -99,6 +133,7 @@ Refresh Rate = Frekvence obnoveni #Font = Trebuchet MS About PPSSPP... = &O PPSSPP... Auto = &Automaticky +Auto Max Quality = Auto Max &Quality Backend = V&ykreslovací Jádro (Restartuje PPSSPP) Bicubic = &Bikubická Break = Break @@ -150,6 +185,7 @@ More Settings... = D&alší nastavení... Nearest = &Nejbližší Non-Buffered Rendering = &Přeskočit efekty vyrovnávací paměti (rychlejší, neukládá se do paměti) Off = &Vypnuto +Open Chat = Open Chat Open Directory... = &Otevřít adresář... Open from MS:/PSP/GAME... = O&tevřít z MS:/PSP/GAME... Open Memory Stick = Otevřít &paměťovou kartu @@ -229,6 +265,7 @@ No block = Žádný blok Prev = Předchozí Random = Náhodné Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Jste si jisti obnovou všech nastavení zpět na jejich výchozí hodnoty?\nNastavení kontroly mapování nebude změněno.\n\nToto nelze vrátit zpět.\nPo obnově nastavení prosím restartujte PPSSPP. RestoreGameDefaultSettings = Jste si jisti obnovou nastavení hry\nzpět na výchozí hodnoty PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Opravdu chcete smazat nastavení této hry? DeleteFailed = Nelze smazat data. Deleting = Probíhá mazání\nČekejte prosím... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Potvrdit +Filter = Filter Finish = Potvrdit +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Uložit Save completed = Ukládání dokončeno. Saving = Ukládání\nČekejte prosím... SavingFailed = Nelze uložit data. +Search = Search Select = Vybrat Shift = Shift +Skip = Skip Snap = Snap Space = Mezera SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Soubor je komprimován (ZIP).\nNejdříve h [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Smazat Create Game Config = Vytvořit nastavení hry Create Shortcut = Vytvořit zkratku @@ -430,6 +473,7 @@ Auto = Automaticky Auto (1:1) = Automatické (1:1) Auto (same as Rendering) = Automaticky (stejné jako rozlišení vykreslování) Auto FrameSkip = Automatické přeskakování snímků +Auto Max Quality = Auto Max Quality Auto Scaling = Automatické zvětšení Backend = Jádro Balanced = Vyrovnané @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Automatické nastavení Autoconfigure for device = Automaticky nastavit pro zařízení +Bind All = Bind All Clear All = Vše vyčistit Default All = Obnovit výchozí Map a new key for = Mapovat novou klávesu pro Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Vyzkoušet You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Odepnout +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Výměna osy Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Menu pro vývojáře +Double tap button = Double tap button Down = Dpad Dolů Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pauza R = R RapidFire = Rychlá palba +Record = Record Remote hold = Remote hold Rewind = Přetočit Right = Dpad Doprava -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = PravýAn.Dolů RightAn.Left = PravýAn.Doleva RightAn.Right = PravýAn.Doprava @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Přepnutí rychlosti Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Navštívit fórum Ad Hoc Multiplayer AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Změnit IP adresu serveru PRO ad hoc (localhost Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Síť zavedena +None = None Please change your Port Offset = Please change your port offset Port offset = Odchylka portu (0 = Kompatibilita s PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Přetočit Save State = Uložit stav Settings = Nastavení Switch UMD = Přepnout UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Skenovací řádky (CRT) Sharpen = Zostřit SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Zvyšovač rozlišení Spline36 VideoSmoothingAA = VideoSmoothingAA Vignette = Viněta @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Špatná +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = Jaká je emulace? Dejte nám a komunitě vědět! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Jde hrát Plays Description = Fully playable but might be with glitches ReportButton = Zpětná vazba +Show disc CRC = Show disc CRC Speed = Rychlost Submit Feedback = Odeslat zpětnou vazbu SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = Žádný snímek obazovky None yet. Things will appear here after you save. = Zatím žádné. Položky zde budou zobrazeny, až uložíte hru. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Data uložených her Save States = Uložené stavy Savedata Manager = Správa uložených dat +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = VAROVÁNÍ: Zjištěny GLTools, můžou způsobovat problémy In menu = In menu Load savestate failed = Načtení uloženého stavu selhalo Loaded State = Stav načten +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Nepodařilo se načíst stav: Uložený stav neexistuje! LoadStateWrongVersion = Nepodařilo se načíst stav: Stav je pro starší verzi PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Rychlost: standardní +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Uložit celé ISO do RAM Change CPU Clock = Změnit hodiny emulovaného procesoru PSP (nestabilní) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Změnit přezdívku ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Obecné Grid icon size = Grid icon size Help the PPSSPP team = Pomozte týmu PPSSPP Host (bugs, less lag) = Hostitel (chyby, zasekává se méně) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = výchozí MMDDYYYY = MMDDRRRR +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Toto není hra PSP Off = Vypnuto Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Model PSP PSP Settings = Nastavení PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Úložiště je plné Sustained performance mode = Sustained performance mode Time Format = Formát času UI = Uživatelské rozhraní +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Použít O jako tlačítko potvrzení Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Použít X jako tlačítko potvrzení VersionCheck = Zkontrolovat dostupnost nové verze PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = RRRRMMDD [Upgrade] diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index e6ff6ea9bf..1da2da4fbc 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Lyd backend +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-venlig buffer (langsommere) Auto = Automatisk Device = Device +Disabled = Disabled DSound (compatible) = DirectSound (kompatibel) Enable Sound = Aktiver lyd Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (hurtig) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog begrænser Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (om dødzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = Når den analoge begrænser knap er trykket ned Auto = Automatisk Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-gem knapper efter sekunder +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Knapgennemsigtighed Button style = Knap stil +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibrer +Calibrated = Calibrated Calibration = Kalibrering +Circular stick input = Circular stick input Classic = Klassisk Combo Key Setting = Combo key indstillinger Combo Key Setup = Combo key opsætning Confine Mouse = Begræns mus indenfor vindue/skærmområde Control Mapping = Ændre tasteplaceringen -Custom layout... = Tilpas layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Tilpas layout... Customize tilt = Tilpas tilt... D-PAD = D-Pad -Deadzone Radius = Dødzone radius +Deadzone radius = Dødzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Deaktiver D-Pad diagonaler (4-vejs touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptisk feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignorer gamepads når ikke i fokus Ignore Windows Key = Ignorer Windows taste Invert Axes = Omvendte akser @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger knapper Landscape = Landskab Landscape Auto = Landscape auto Landscape Reversed = Omvendt landskab +Low end radius = Low end radius Mouse = Instillinger af mus Mouse sensitivity = Følsomhed af muss Mouse smoothing = Udjævning af mus @@ -65,21 +88,32 @@ OnScreen = Touch billedskærmsknapper Portrait = Portræt Portrait Reversed = Omvendt portræt PSP Action Buttons = PSP action knapper +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Skærm rotation seconds, 0 : off = sekunder, 0 = slukket +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Følsomhed +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Vis pause menu knap +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Tynde rammer Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt følsomhed langs X aksen Tilt Sensitivity along Y axis = Tilt følsomhed langs Y aksen To Calibrate = Hold enheden på flad overflade for at kalibrere og tryk på "Kalibrer". +Toggle mode = Toggle mode Touch Control Visibility = Touch kontrol synlighed Use custom right analog = Use custom right analog Use Mouse Control = Brug musekontol Visibility = Synlighed +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog indstillinger @@ -99,6 +133,7 @@ Refresh Rate = Opdateringsrate #Font = Trebuchet MS About PPSSPP... = &Om PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Genstarter PPSSPP) Bicubic = &Bicubisk Break = Break @@ -150,6 +185,7 @@ More Settings... = &Flere indstillinger... Nearest = &Nærmest Non-Buffered Rendering = &Skip buffer effekter (ikke-bufferet, hurtigere) Off = &Slukket +Open Chat = Open Chat Open Directory... = &Åben katalog... Open from MS:/PSP/GAME... = Å&ben fra MS:/PSP/GAME... Open Memory Stick = Åben h&ukommelsesstick @@ -229,6 +265,7 @@ No block = Ingen blokering Prev = Forrige Random = Tilfældig Replace textures = Erstat textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Er du sikker på at du vil sætte indstillinger tilbage til standard?\nIndstilling af tasteplacering ændres ikke.\n\n\nDu kan ikke fortryde.\nGenstart venligst PPSSPP for at ændringer aktiveres. RestoreGameDefaultSettings = Er du sikker på at du vil nustille de spilspecifikke\nindstillinger tilbage til standard? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Vil du virkelig slette opsætningen for dette spil? DeleteFailed = Ikke muligt at slette data. Deleting = Sletter\nVent venligst... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Enter +Filter = Filter Finish = Slut +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Gem Save completed = Gemt. Saving = Gemmer\nVent venligst... SavingFailed = Ikke muligt at gemme data. +Search = Search Select = Vælg Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Fil er pakket (ZIP).\nPak venligst ud førs [Game] Asia = Asien +Calculate CRC = Calculate CRC ConfirmDelete = Slet Create Game Config = Opret data konfiguration Create Shortcut = Opret genvej @@ -430,6 +473,7 @@ Auto = Automatisk Auto (1:1) = Automatisk (1:1) Auto (same as Rendering) = Automatisk (Samme som renderingsopløsning) Auto FrameSkip = Automatisk frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanceret @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Autokonfigration Autoconfigure for device = Autokonfiguration af enhed +Bind All = Bind All Clear All = Slet alt Default All = Sæt til standard Map a new key for = Map en ny taste for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analoge You can press ESC to cancel. = Du kan trykke Esc for at afbryde. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Ombyt akser Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad ned Dpad = Dpad Frame Advance = Frame Fremad @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Hurtigskydning +Record = Record Remote hold = Remote hold Rewind = Spol tilbage Right = Dpad højre -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = HøjreAn.Ned RightAn.Left = HøjreAn.Venstre RightAn.Right = HøjreAn.Højre @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Ændre hastighed Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Besøg Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Ændre PRO ad hoc server IP adresse (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Netværk er initialiseret +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP kompatibilitet) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Spol tilbage Save State = Gem spil-status Settings = Indstillinger Switch UMD = Skift UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlinier (CRT) Sharpen = Gør skarpere SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 opskalere VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Dårlig +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Dine data indsendes i baggrunden. FeedbackDesc = Hvordan er emulateringen? Lad os og gruppen vide det! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Fejlfri emulation for hele spillet - fantastisk! Plays = Spiller Plays Description = Fuldt spilbart men kan have små fejl ReportButton = Raporter feedback +Show disc CRC = Show disc CRC Speed = Hastighed Submit Feedback = Send feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = ADVARSEL: GLTools detekteret, kan give problemer In menu = In menu Load savestate failed = Hentning af spil-status fejlede Loaded State = Indlæste status +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Kunne ikke hente status: Spil-status eksisterer ikke! LoadStateWrongVersion = Kunne ikke hente stauts: Spil-status er for en ældre version af PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Hastighed: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI Dump startet. AVI Dump stopped. = AVI Dump stoppet. Cache ISO in RAM = Cache hele ISO i RAM Change CPU Clock = Ændre emulerede PSPs CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Ændre kaldenavn ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Generel Grid icon size = Grid icon size Help the PPSSPP team = Hjælp PPSSPP holdet Host (bugs, less lag) = Host (fejl, færre forsinkelser) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Fortolker @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Hukommelsesstik indsat MHz, 0:default = MHz, 0 = standard MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP indstillinger PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Optag lyd Record Display = Optag skærm Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Tidsformat UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Brug tabsfri Video Codec (FFV1) Use O to confirm = Brug O som bekræftelsesknap Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Brug X som bekræftelsesknap VersionCheck = Søg efter ny version af PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index a39f4c9378..95b11b81b3 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Lautstärke für wechselnde Geschwindigkeit/Turbo Audio backend = Ton-Backend (Neustart erforderlich) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-freundliche Pufferung (langsamer) Auto = Automatisch Device = Gerät +Disabled = Disabled DSound (compatible) = DirectSound (kompatibel) Enable Sound = Ton einschalten Global volume = Lautstärke Microphone = Microphone Microphone Device = Microphone device Mute = Stumm -Switch on new audio device = Neues Tonausgabegerät anschalten +Reverb volume = Reverb volume +Use new audio devices automatically = Neues Tonausgabegerät anschalten Use global volume = Benutze globale Lautstärke WASAPI (fast) = WASAPI (schnell) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Empfindlichkeit der Analogachsen +Analog Binding = Analog Binding Analog Limiter = Analogbegrenzer Analog Mapper High End = Empfindlichkeit der Achsen Analog Mapper Low End = Tote Zone umkehren Analog Mapper Mode = Analogstick Achsen +Analog Settings = Analog Settings Analog Stick = Analogstick +Analog Style = Analog Style AnalogLimiter Tip = Wenn die Analogbegrenzer-Taste gedrückt ist Auto = Automatisch Auto-centering analog stick = Analogstick automatisch zentrieren Auto-hide buttons after seconds = Steuerung ausblenden nach ... +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Tastentransparenz Button style = Tastenstil +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibriere Steuerkreuz +Calibrated = Calibrated Calibration = Kalibrierung +Circular stick input = Circular stick input Classic = Klassisch Combo Key Setting = Kombo-Tasten Einstellung Combo Key Setup = Kombo-Tasten Setup Confine Mouse = Maus in Fenster/sichtbaren Bereich einsperren Control Mapping = Tastenbelegung ändern -Custom layout... = Layout anpassen +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Layout anpassen Customize tilt = Neigung anpassen D-PAD = Steuerkreuz -Deadzone Radius = Radius für tote Zone +Deadzone radius = Radius für tote Zone DInput Analog Settings = DInput Analog Einstellungen Disable D-Pad diagonals (4-way touch) = Deaktiviere D-Pad Diagonalen (4-Wege-Touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Leuchtende Ränder HapticFeedback = Haptisches Feedback (Vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignoriere Gamepads falls nicht fokusiert Ignore Windows Key = Ignoriere Windowstaste Invert Axes = Invertiere Achsen @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R Schultertasten Landscape = Querformat Landscape Auto = Querformat auto Landscape Reversed = Querformat umgekehrt +Low end radius = Low end radius Mouse = Einstellung für Maussteuerung Mouse sensitivity = Mausempfindlichkeit Mouse smoothing = Mausglättung @@ -65,21 +88,32 @@ OnScreen = Touch Bildschirmtasten Portrait = Hochformat Portrait Reversed = Hochformat umgekehrt PSP Action Buttons = PSP Aktionstasten +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Bildschirmausrichtung seconds, 0 : off = Sekunden, 0 = Aus +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Empfindlichkeit +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Zeige Pause-Taste +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Dünne Ränder Tilt Base Radius = Tilt base radius Tilt Input Type = Eingabetyp für Neigen Tilt Sensitivity along X axis = Neigungsempfindlichkeit über X-Achse Tilt Sensitivity along Y axis = Neigungsempfindlichkeit über Y-Achse To Calibrate = Für eine Kalibrierung legen Sie ihr Gerät auf eine flache Oberfläche und drücken "Kalibrieren". +Toggle mode = Toggle mode Touch Control Visibility = Sichtbarkeit der Touchsteuerung Use custom right analog = Use custom right analog Use Mouse Control = Benutze Maussteuerung Visibility = Sichtbarkeit +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput Analog Einstellungen @@ -96,6 +130,7 @@ Refresh Rate = Wiederholfrequenz [DesktopUI] # If your language does not show well with the default font, you can use Font to specify a different one. # Just add it to your language's ini file and uncomment it (remove the # by Font). +Auto Max Quality = Auto Max &Quality Font = Roboto Condensed About PPSSPP... = Über PPSSPP... Auto = Automatisch @@ -150,6 +185,7 @@ More Settings... = Mehr Einstellungen... Nearest = Nächster Nachbar Non-Buffered Rendering = Über&springe Puffereffekte (ungepuffert, schneller) Off = Aus +Open Chat = Open Chat Open Directory... = Öffne Verzeichnis... Open from MS:/PSP/GAME... = Öffne aus MS:/PSP/GAME... Open Memory Stick = Öffne Memorystick @@ -229,6 +265,7 @@ No block = Kein Block Prev = Vorheriges Random = Zufall Replace textures = Texturen ersetzen +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Sind Sie sicher, dass Sie alle Standardeinstellungen\n(außer die Tastenbelegung) wiederherstellen wollen?\n\nDies kann nicht rückgängig gemacht werden.\n\nBitte starten Sie PPSSPP nach Wiederherstellung neu. RestoreGameDefaultSettings = Wollen Sie wirklich die spielspezifischen Einstellungen\nauf die Werkseinstellungen von PPSSPP zurücksetzen? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Wollen Sie wirklich die spielspezifischen Einstellunge DeleteFailed = Daten konnten nicht gelöscht werden. Deleting = Löschen\nBitte warten... Disable All = Alle deaktivieren +Dumps = Dumps Edit = Edit Enable All = Alle aktivieren Enter = Eingabe +Filter = Filter Finish = Fertig +GE Frame Dumps = GE Frame Dumps Grid = Gitter Inactive = Inaktiv InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Speichern Save completed = Speichern abgeschlossen Saving = Speichern\nBitte warten... SavingFailed = Daten konnten nicht gespeichert werden. +Search = Search Select = Auswahl Shift = Umschalt +Skip = Skip Snap = Einrasten Space = Leertaste SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Datei ist komprimiert (ZIP).\nBitte zuerst [Game] Asia = Asien +Calculate CRC = Calculate CRC ConfirmDelete = Löschen Create Game Config = Erstelle Spielkonfig. Create Shortcut = Verknüpfung erstellen @@ -430,6 +473,7 @@ Auto = Automatisch Auto (1:1) = Automatisch (1:1) Auto (same as Rendering) = Automatisch (Renderauflösung) Auto FrameSkip = Autom. Bilder überspringen +Auto Max Quality = Auto Max Quality Auto Scaling = Auto Skalierung Backend = Grafik-Backend Balanced = Ausgeglichen @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP Datei beinhaltet keine PSP Software [KeyMapping] Autoconfigure = Autokonfiguration Autoconfigure for device = Autokonfiguration für Gerät +Bind All = Bind All Clear All = Alle löschen Default All = Zurücksetzen Map a new key for = Drücke zuzuweisende Taste für Map Key = Taste zuweisen Map Mouse = Maus zuweisen +Replace = Replace +Show PSP = Show PSP Test Analogs = Analogsticks testen You can press ESC to cancel. = Drücken Sie ESC zum abbrechen. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP speichert in temporären Speicher SavesAreTemporaryGuidance = Extrahiere PPSSPP um Veränderungen speichern zu können SavesAreTemporaryIgnore = Ignoriere Warnung UnpinPath = Losheften +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Achsen invertieren Circle = Kreis Cross = Kreuz +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Entwicklermenü +Double tap button = Double tap button Down = Steuerkreuz Runter Dpad = Steuerkreuz Frame Advance = Einzelbildaufnahme @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Schnellfeuer +Record = Record Remote hold = Remote hold Rewind = Zurückspulen Right = Steuerkreuz Rechts -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = Rechter Analogstick Runter RightAn.Left = Rechter Analogstick Links RightAn.Right = Rechter Analogstick Rechts @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Geschw. ändern Square = Viereck Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texturspeicherung Texture Replacement = Texturersetzung Toggle Fullscreen = Vollbild umschalten @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Besuche das Adhoc Multiplayer Forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = proAdhocServer IP-Adresse ändern (localhost = m Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Ungültige IP oder Hostnamen Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Netzwerk initialisiert +None = None Please change your Port Offset = Please change your port offset Port offset = Portverschiebung (0 = PSP Kompatibilität) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Zurückspulen Save State = Stand speichern Settings = Einstellungen Switch UMD = UMD wechseln +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines Sharpen = Schärfen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = UpscaleSpline36 VideoSmoothingAA = Video Bildglättung Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stoppe... [Reporting] Bad = Schlecht +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Deine Daten werden im Hintergrund versendet. FeedbackDesc = Wie ist die Emulation? Lass es uns und die Community wissen! FeedbackDisabled = Kompatibilitätsberichte müssen aktiviert sein. @@ -853,6 +957,7 @@ Perfect Description = Einwandfreie Emulation des Spiels - Großartig! Plays = Spielbar Plays Description = Komplett spielbar mit vereinzelnten Glitches ReportButton = Feedback geben +Show disc CRC = Show disc CRC Speed = Geschwindigkeit Submit Feedback = Feedback absenden SuggestionConfig = Für gute Einstellungen Berichte auf der Webseite ansehen. @@ -871,9 +976,11 @@ Date = Datum Filename = Dateiname No screenshot = Kein Screenshot None yet. Things will appear here after you save. = Keine gespeicherten Daten zum Anzeigen vorhanden. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Speicherdaten Save States = Speicherstände Savedata Manager = Speicherdatenverwaltung +Showing matches for '%1'. = Showing matches for '%1'. Size = Größe [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNUNG: GLTools erkannt, dies kann zu Problemen führen. In menu = Im Menü Load savestate failed = Laden des Speicherstandes fehlgeschlagen Loaded State = Spielstand geladen +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Geladen. Speicher im Spiel, starte neu und lade für weniger Fehler. LoadStateDoesntExist = Fehler beim Laden des Spielstandes: Spielstand existiert nicht! LoadStateWrongVersion = Fehler beim Laden des Spielstandes: Spielstand ist für eine alte Version von PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Speichern von Texturen wurde deaktiviert. saveNewTextures_true = Texturen werden nun im Speicher abgelegt. SpeedCustom2 = Geschwindigkeit: Alternativ 2 standard = Geschwindigkeit: Normal +State load undone = State load undone Untitled PSP game = Titelloses PSP Spiel [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger vorhanden Device Info = Geräteinfo +Directories = Directories Display Information = Bildschirminformation Driver Version = Treiberversion EGL Extensions = EGL Erweiterungen @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exklusiv Sample rate = Abtastrate Shading Language = Shadersprache +Storage = Storage Sustained perf mode = Anhaltener Hochleistungsmodus System Information = System Information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI Dump gestartet. AVI Dump stopped. = AVI Dump gestoppt. Cache ISO in RAM = ISO in RAM zwischenspeichern Change CPU Clock = CPU-Takt ändern (instabil) -Change Memory Stick folder = Ändere Memory Stick Ordner -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick Ordner +Memory Stick size = Memory Stick size Change Nickname = Spitznamen ändern ChangingMemstickPath = Speicherstände oder ähnliche Daten werden nicht in diesen Ordner kopiert.\n\nÄndere Ordner auf dem Memorystick?? ChangingMemstickPathInvalid = Dieser Pfad sollte nicht genutzt werden um Memory Stick Dateien zu speichern. @@ -1012,7 +1127,6 @@ General = Allgemein Grid icon size = Grid icon size Help the PPSSPP team = PPSSPP Team helfen Host (bugs, less lag) = Host (Fehlerbehaftet, weniger Lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memorystick Ordner Memory Stick inserted = MemoryStick eingelegt MHz, 0:default = MHz, 0 = Standard MMDDYYYY = MMTTJJJJ +Moving background = Moving background Newest Save = Neuester Spielstand +No animation = No animation Not a PSP game = Kein PSP Spiel Off = Aus Oldest Save = Ältester Spielstand +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP Modell PSP Settings = PSP Einstellungen PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Ton aufzeichnen Record Display = Bildschirm aufzeichnen Reset Recording on Save/Load State = Zurücksetzen der Aufnahme bei Laden/Speichern eines Standes @@ -1053,8 +1172,10 @@ Storage full = Speicherplatz voll Sustained performance mode = Anhaltener Hochleistungsmodus Time Format = Zeitformat UI = Benutzeroberfläche +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Benutze verlustfreien Videocodec (FFV1) Use O to confirm = O als Bestätigungstaste Use output buffer (with overlay) for recording = Benutze Ausgangspuffer (mit Einblendung) für Aufnahme @@ -1063,6 +1184,7 @@ Use X to confirm = X als Bestätigungstaste VersionCheck = Überprüfe auf neue Versionen von PPSSPP WARNING: Android battery save mode is on = WARNUNG: Android Energiesparmodus ist eingeschaltet WARNING: Battery save mode is on = WARNUNG: Energiesparmodus ist eingeschaltet +Waves = Waves YYYYMMDD = JJJJMMTT [Upgrade] diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index d769f85016..4c542bc857 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Padenni suarana Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Patembussi dikita tombolo'na Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Atoro'i tombolna -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Tobolo'na jo layar sentu Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &Masala PPSSPP... Auto = &Yamesa +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Mate +Open Chat = Open Chat Open Directory... = Bukka' &Ngenan... Open from MS:/PSP/GAME... = Bu&kka' jio mai MS:/PSP/GAME... Open Memory Stick = Bukka' &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Dihapusmi\nTajammi... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Enter +Filter = Filter Finish = Mangkami +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = Mangkami dianna. Saving = Di'annai\nTajammi... SavingFailed = Unable to save data. +Search = Search Select = Pillei Shift = Angka'i +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Garaganni shortcut @@ -430,6 +473,7 @@ Auto = Ia mesa Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Paccingngi nasan Default All = Poleboko' nasan Map a new key for = Garaganni tombol baru Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Jiong Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Paus R = R RapidFire = RapidFire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Kanan -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = AnKanan.Jiong RightAn.Left = AnKanan.Kiri RightAn.Right = AnKanan.Kanan @@ -648,6 +708,11 @@ Select = Select SpeedToggle = SpeedToggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Save malassi Settings = Pangngaturan Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = Tibukka'mi loadna +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Eda nabisa tiload mane: Eda memangpa savena! LoadStateWrongVersion = Eda nabisa tiload mane: Save to jolora te' PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Lassinna: standar +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Sullei lassinna to CPU (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Sullei Nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Yato biasa Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = Pangngaturan PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Matumbai to wattu? UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = O yake yamo Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = X yake yamo VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index c6c4979f2a..8b00343aad 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -25,49 +25,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Enable sound Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Buttons opacity Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Control mapping -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -79,6 +101,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -89,21 +112,32 @@ OnScreen = On-screen touch controls Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off Sensitivity = Sensitivity +Sensitivity (scale) = Sensitivity (scale) +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -123,6 +157,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &backend (restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -174,6 +209,7 @@ More Settings... = &More settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -253,6 +289,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -298,10 +335,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Deleting\nPlease wait... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Enter +Filter = Filter Finish = Finish +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -324,8 +364,10 @@ Save = Save Save completed = Save completed. Saving = Saving\nPlease wait... SavingFailed = Unable to save data. +Search = Search Select = Select Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -400,6 +442,7 @@ ZIP file detected (Require WINRAR) = File is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Create shortcut @@ -454,6 +497,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -487,7 +531,6 @@ Display layout editor = Display layout editor Display Resolution (HW scaler) = Display resolution (HW scaler) Dump next frame to log = Dump next frame to log Enable Cardboard VR = Enable Cardboard VR -Features = Features FPS = FPS Frame Rate Control = Framerate control Frame Skipping = Frame skipping @@ -504,6 +547,7 @@ Hybrid + Bicubic = Hybrid + Bicubic Ignore camera notch when centering = Ignore camera notch when centering Internal Resolution = Internal resolution Lazy texture caching = Lazy texture caching (speedup) +Lazy texture caching Tip = Faster, but can cause text problems in a few games Linear = Linear Low = Low LowCurves = Spline/Bezier curves quality @@ -580,11 +624,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Clear all Default All = Restore defaults Map a new key for = Map a new key for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -610,6 +657,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -635,11 +683,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 +Custom 10 = Custom 10 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -656,10 +715,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -673,6 +733,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -685,9 +750,9 @@ Vol - = Vol - Wlan = WLAN [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -699,6 +764,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -718,12 +784,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset (0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -757,6 +827,8 @@ Rewind = Rewind Save State = Save state Settings = Settings Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -787,6 +859,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = Video Smoothing AA Vignette = Vignette @@ -831,6 +904,35 @@ Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Written in C++ for speed and portability +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +Skip for now = Skip for now +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [RemoteISO] Browse Games = Browse games Local Server Port = Local server port @@ -853,6 +955,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -878,6 +982,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -896,9 +1001,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -912,6 +1019,8 @@ In menu = In menu Load savestate failed = Load savestate failed Loaded State = State loaded Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! norewind = No rewind save states available. @@ -925,6 +1034,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Speed: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -958,6 +1068,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -981,6 +1092,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -1002,8 +1114,8 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Change nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1026,10 +1138,13 @@ Dynarec (JIT) = Dynarec (JIT) Emulation = Emulation Enable Cheats = Enable cheats Enable Compatibility Server Reports = Enable compatibility server reports +Error: load undo state is from a different game = Error: load undo state is from a different game Failed to load state. Error in the file system. = Failed to load state. Error in the file system. Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. Fast (lag on slow storage) = Fast (lag on slow storage) Fast Memory = Fast memory (unstable) +Floating symbols = Floating symbols Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) frames, 0:off = frames, 0 = off Games list settings = Games list settings @@ -1037,7 +1152,6 @@ General = General Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1047,14 +1161,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP settings PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1079,7 +1198,9 @@ Sustained performance mode = Sustained performance mode Time Format = Time format UI = UI UI Sound = UI sound +UI background animation = UI background animation undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Use O as confirmation button Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1088,6 +1209,7 @@ Use X to confirm = Use X as confirmation button VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 211a74da7f..e687a3b598 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -1,60 +1,83 @@ [Audio] Alternate speed volume = Alternar velocidad de sonido Audio backend = Motor de audio (requiere reiniciar) +Audio Error = Audio Error AudioBufferingForBluetooth = Búfer compatible con bluetooth (lento) Auto = Automático Device = Dispositivo -DSound (compatible) = DSound (compatible) +Disabled = Deshabilitado +DSound (compatible) = DirectSound (compatible) Enable Sound = Activar sonido Global volume = Volumen global Microphone = Micrófono Microphone Device = Dispositivo de entrada Mute = Silenciar -Switch on new audio device = Cambiar a dispositivo de audio nuevo -Use global volume = Usar volúmen global +Reverb volume = Reverb volume +Use new audio devices automatically = Cambiar a dispositivo de audio nuevo +Use global volume = Usar volumen global WASAPI (fast) = WASAPI (rápido) [Controls] -Analog auto-rotation speed = Velocidad auto rotación del analóg. +Analog Binding = Asignar análogo +Analog Settings = Ajustes del análogo +Analog Style = Estilo del análogo +Auto-rotation speed = Velocidad auto rotación del analóg. Analog Axis Sensitivity = Sensibilidad de los ejes analóg. -Analog Limiter = Limitador analógico +Analog Limiter = Limitador del análogo Analog Mapper High End = Asignación analóg. básica (sensibilidad de ejes) Analog Mapper Low End = Asignación analóg. avanzada (invierte la zona muerta) Analog Mapper Mode = Modo de asignación analógica Analog Stick = Stick analógico -AnalogLimiter Tip = Cuando se pulsa el botón del limitador analógico +AnalogLimiter Tip = Cuando se pulsa el botón del limitador del analógo Auto = Automática -Auto-centering analog stick = Auto-centrado del stick analógico -Auto-hide buttons after seconds = Ocultar botones después de -Binds = Mapear +Auto-centering analog stick = Auto-centrado del analógo +Auto-hide buttons after seconds = Ocultar botones después de (en segundos) +Auto-switch = Auto-switch +Base tilt position = Base tilt position +Binds = Asignaciones +Button Binding = Button Binding Button Opacity = Transparencia de botones Button style = Estilo de botones +Calibrate Analog Stick = Calibrar análogo Calibrate D-Pad = Calibrar cruceta +Calibrated = Calibrado Calibration = Calibración +Circular stick input = Circular stick input Classic = Clásico Combo Key Setting = Ajustes de botones combo Combo Key Setup = Configurar botones combo... Confine Mouse = Fijar el ratón al área de la ventana/pantalla Control Mapping = Asignar botones -Custom layout... = Diseño personalizado... +Custom Key Setting = Custom Key Setting +Customize = Personalizar +Customize Touch Controls = Editar pantalla táctil Customize tilt = Personalizar acelerómetro D-PAD = Cruceta -Deadzone Radius = Radio de zona inactiva +Deadzone radius = Radio de zona inactiva DInput Analog Settings = Ajustes analógicos DInput Disable D-Pad diagonals (4-way touch) = Desactivar diagonales de cruceta +Disable diagonal input = Deshabilitar mov. diagonal +Double tap = Doble toque +Enable gesture control = Habilitar gestos +Enable standard shortcut keys = Habilitar teclas de atajo +Gesture = Gestos +Gesture mapping = Ajustes de gestos Glowing borders = Bordes brillantes HapticFeedback = Vibración háptica +Hide touch analog stick background circle = Ocultar círculo del análogo +Icon = Icon Ignore gamepads when not focused = Ignorar mandos con pantalla inactiva Ignore Windows Key = Ignorar tecla de Windows Invert Axes = Invertir ejes Invert Tilt along X axis = Invertir inclinación del eje X Invert Tilt along Y axis = Invertir inclinación del eje Y -Keep this button pressed when right analog is pressed = Presionar este botón cuando el analóg. derecho se presione +Keep this button pressed when right analog is pressed = Presionar este botón cuando el análogo derecho se presione Keyboard = Ajustes de teclado L/R Trigger Buttons = botones L/R Landscape = Horizontal Landscape Auto = Horizontal Automático Landscape Reversed = Horizontal invertido +Low end radius = Radio inferior Mouse = Ajustes de ratón Mouse sensitivity = Sensibilidad del ratón Mouse smoothing = Suavidad del ratón @@ -65,31 +88,42 @@ OnScreen = Controles táctiles en pantalla Portrait = Vertical Portrait Reversed = Vertical invertido PSP Action Buttons = Botones de acción +Raw input = Raw input +Reset to defaults = Restaurar ajustes +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotación de pantalla seconds, 0 : off = segundos, 0 = no +Sensitivity (scale) = Sensibilidad (escala) Sensitivity = Sensibilidad -Show right analog = Motrar analógico derecho -Show Touch Pause Menu Button = Mostrar botón de menú +Shape = Shape +Show right analog = Mostrar análogo derecho +Show Touch Pause Menu Button = Mostrar botón del menú +Swipe = Deslizar hacia +Swipe sensitivity = Sensibilidad del deslizado +Swipe smoothing = Fluidez del deslizado Thin borders = Bordes finos Tilt Base Radius = Radio base de inclinación Tilt Input Type = Tipo de control del acelerómetro Tilt Sensitivity along X axis = Sensibilidad de inclinación del eje X Tilt Sensitivity along Y axis = Sensibilidad de inclinación del eje Y To Calibrate = Para calibrar, pon el aparato en una superficie plana y presiona "Calibrar". +Toggle mode = Toggle mode Touch Control Visibility = Visibilidad del control táctil Use custom right analog = Usar analógico derecho personalizado Use Mouse Control = Usar el control del ratón Visibility = Mostrar... +Visible = Visible X = X X + Y = X + Y -XInput Analog Settings = Ajustes analógicos XInput +XInput Analog Settings = Ajustes del análogo XInput Y = Y [CwCheats] Cheats = Trucos Edit Cheat File = Editar archivo de trucos Enable/Disable All = Activar/desactivar todos los trucos -Import Cheats = Importar "cheat.db" +Import Cheats = Importar archivo cheat.db Options = Opciones Refresh Rate = Frecuencia de actualización @@ -99,6 +133,7 @@ Refresh Rate = Frecuencia de actualización #Font = Trebuchet MS About PPSSPP... = &Acerca de PPSSPP... Auto = &Automático +Auto Max Quality = Máx. calidad automática Backend = Motor &gráfico (requiere reiniciar) Bicubic = &Bicúbico Break = Romper @@ -150,6 +185,7 @@ More Settings... = Más &opciones... Nearest = &Cercano Non-Buffered Rendering = &Saltar efectos del búfer (rápido) Off = &No +Open Chat = Abrir ventana de chat Open Directory... = &Abrir carpeta... Open from MS:/PSP/GAME... = A&brir desde "ms0:/PSP/GAME"... Open Memory Stick = Abrir "&Memory Stick" @@ -229,6 +265,7 @@ No block = No bloquear Prev = Anterior Random = Aleatorio Replace textures = Reemplazar texturas +Reset = Reset Reset limited logging = Reiniciar registro limitado RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\nLos cambios en los controles no se borrarán.\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. RestoreGameDefaultSettings = ¿Seguro que quieres reestablecer los ajustes del juego\na los ajustes por defecto de PPSSPP? @@ -274,35 +311,40 @@ DeleteConfirmGameConfig = ¿Seguro que quieres borrar la configuración de este DeleteFailed = los datos no se pudieron borrar. Deleting = Borrando\nEspera un momento... Disable All = Desactivar todo +Dumps = Volcados Edit = Editar Enable All = Activar todo Enter = Intro +Filter = Filtrar Finish = Terminar +GE Frame Dumps = Volcados de fotogramas GE Grid = Cuadrícula Inactive = Inactivo InternalError = Ha ocurrido un error interno. Load = Cargar Load completed = Carga completada. Loading = Cargando\nEspera un momento... -LoadingFailed = Los datos no se pudieron cargar. +LoadingFailed = Los datos del juego no se pudieron cargar. Move = Posición Network Connection = Conexión de red NEW DATA = NUEVOS DATOS DE PARTIDA No = No ObtainingIP = Obteniendo direcciónnn IP.\nPor favor espera... OK = Aceptar -Old savedata detected = Detectados datos de partida antiguos. +Old savedata detected = Se han detectado datos del juego antiguos. Options = Opciones Reset = Reiniciar Resize = Tamaño Retry = Reintentar Save = Guardar -Save completed = Guardado completado. +Save completed = Los datos del juego han sido almacenados. Saving = Guardando\nEspera un momento... -SavingFailed = Los datos no se pudieron guardar. +SavingFailed = Los datos del juego no se pudieron guardar. +Search = Buscar Select = Seleccionar Shift = Alternar -Snap = Malla +Skip = Saltar +Snap = Capturar Space = Espacio SSID = SSID Submit = Enviar @@ -324,16 +366,16 @@ Could not save screenshot file = No se pudo guardar la captura de pantalla. D3D9or11 = ¿Direct3D 9? (o "no" para Direct3D 11) D3D11CompilerMissing = D3DCompiler_47.dll no encontrado. Por favor instala. O presiona Sí para probar con Direct3D 9. D3D11InitializationError = Error de inicialización de Direct3D 11. -D3D11Missing = Tu sistema operativo no incluye D3D11. Por favor ejecuta Windows Update.\n\nPresiona Sí para probar con Direct3D 9. -D3D11NotSupported = Tu GPU parece que no soporta Direct3D 11.\n\n¿Quieres probar de nuevo con Direct3D 9? +D3D11Missing = Esta versión de Windows no soporta D3D11. Por favor ejecuta Windows Update.\n\nPresiona Sí para probar con Direct3D 9. +D3D11NotSupported = Tu GPU no es compatible con Direct3D 11.\n\n¿Quieres probar de nuevo con Direct3D 9? Disk full while writing data = El disco se ha llenado durante la escritura de datos. -ELF file truncated - can't load = Archivo ELF defectuoso - No se puede cargar -Error loading file = Error al cargar el archivo -Error reading file = Error al leer el archivo +ELF file truncated - can't load = Archivo ELF defectuoso: No se puede cargar. +Error loading file = Error al cargar el archivo. +Error reading file = Error al leer el archivo. Failed initializing CPU/Memory = Fallo inicializando CPU o memoria. -Failed to identify file = No se pudo identificar el archivo +Failed to identify file = No se pudo identificar el archivo. Failed to load executable: = Fallo al cargar el ejecutable: -File corrupt = Archivo corrupto +File corrupt = Archivo corrupto. Game disc read error - ISO corrupt = Error de lectura: ISO corrupta. GenericAllStartupError = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico. GenericBackendSwitchCrash = PPSSPP falló durante la inicialización de los gráficos. Prueba a actualizar los controladores gráficos.\n\nSe ha cambiado el motor gráfico: @@ -341,29 +383,29 @@ GenericDirect3D9Error = Error al iniciar los gráficos. Prueba a actualizar tu c GenericGraphicsError = Error de los gráficos. GenericOpenGLError = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico.\n\n¿Quieres probar cambiando a DirectX 9?\n\nMensaje de error: GenericVulkanError = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico.\n\n¿Quieres probar cambiando a OpenGL?\n\nMensaje de error: -InsufficientOpenGLDriver = Soporte insuficiente del controlador OpenGL detectado.\n\nTu tarjeta gráfica indica que no soporta OpenGL 2.0. ¿Quieres probar a usar DirectX en su lugar?\n\nPor ahora DirectX es compatible con menos juegos, pero con tu tarjeta gráfica puede que sea la única opción disponible.\n\nVisita los foros en "https://forums.ppsspp.org" para más información. +InsufficientOpenGLDriver = Soporte insuficiente del controlador OpenGL detectado.\n\nTu tarjeta gráfica indica que no soporta OpenGL 2.0. ¿Quieres probar a usar DirectX en su lugar?\n\nPor ahora DirectX es compatible con menos juegos, pero con tu tarjeta gráfica puede que sea la única opción disponible.\n\nVisita los foros en https://forums.ppsspp.org para más información. Just a directory. = Sólo es una carpeta. Missing key = Clave perdida. MsgErrorCode = Código de error: -MsgErrorSavedataDataBroken = Los datos de guardado se ha corrompido. +MsgErrorSavedataDataBroken = Los datos de guardado están dañados. MsgErrorSavedataMSFull = Memory Stick llena. Revisa tu almacenamiento. MsgErrorSavedataNoData = Aviso: ningún archivo de guardado encontrado. -MsgErrorSavedataNoMS = Memory Stick no instertada. +MsgErrorSavedataNoMS = Memory Stick no insertada. No EBOOT.PBP, misidentified game = Falta el "EBOOT.PBP", juego mal identificado Not a valid disc image. = Imagen de disco no válida. -OpenGLDriverError = Error del controlador OpenGL +OpenGLDriverError = Error del controlador OpenGL. PPSSPP doesn't support UMD Music. = PPSSPP no soporta UMDs de Música. PPSSPP doesn't support UMD Video. = PPSSPP no soporta UMDs de Vídeo. -PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP reproduce juegos de PSP, no de PlayStation 1 o 2. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP solamente puede ejecutar juegos de PSP, no de PlayStation 1 o 2. PPSSPPDoesNotSupportInternet = De momento PPSSPP no soporta las funciones de red para actualizaciones de juegos, DLCs o PSN. PS1 EBOOTs are not supported by PPSSPP. = PPSSPP no puede ejecutar los EBOOTs de PS1. -PSX game image detected. = El archivo es una imagen "MODE2", y PPSSPP no soporta juegos de PSX. +PSX game image detected. = El archivo es una imagen MODE2, y PPSSPP no soporta juegos de PSX. RAR file detected (Require UnRAR) = Es un archivo comprimido (en RAR).\nPor lo que necesita ser descomprimido (usa UnRAR). RAR file detected (Require WINRAR) = Es un archivo comprimido (en RAR).\nPor lo que necesita ser descomprimido (usa WinRAR). Running slow: try frameskip, sound is choppy when slow = Funcionando lento: prueba a activar el salto de cuadros, el sonido se entrecorta. -Running slow: Try turning off Software Rendering = Funcionando lento: prueba a desactivar "renderizado por software" +Running slow: Try turning off Software Rendering = Funcionando lento: prueba a desactivar el renderizado por software. Save encryption failed. This save won't work on real PSP = Error al cifrar los datos guardados. No funcionarán en una PSP real. -textures.ini filenames may not be cross-platform = Los nombres del archivo "textures.ini" no pueden ser multiplataforma. +textures.ini filenames may not be cross-platform = Los nombres del archivo textures.ini no pueden ser multiplataforma. This is a saved state, not a game. = Esto es un estado de guardado, no un juego. This is save data, not a game. = Esto es un dato de guardado, no un juego. Unable to create cheat file, disk may be full = No se pudo crear el archivo de trucos, el dico podría estar lleno. @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Es un archivo comprimido (en ZIP).\nPor lo [Game] Asia = Asia +Calculate CRC = Calcular valor CRC ConfirmDelete = Confirmar Create Game Config = Crear config. del juego Create Shortcut = Crear acceso directo @@ -389,7 +432,7 @@ Homebrew = Homebrew Hong Kong = Hong Kong InstallData = Instalación de datos Japan = Japón -Korea = Korea +Korea = Corea MB = MB One moment please... = Un momento por favor... Play = Jugar @@ -397,7 +440,7 @@ Remove From Recent = Borrar de recientes SaveData = Datos Setting Background = Ajustar imagen de fondo Show In Folder = Mostrar en carpeta -USA = USA +USA = América Use UI background = Usar imagen de fondo [Graphics] @@ -430,16 +473,17 @@ Auto = Automático Auto (1:1) = Automático (1:1) Auto (same as Rendering) = Automático (igual a la de renderizado) Auto FrameSkip = Salto de cuadros automático +Auto Max Quality = Máx. calidad automática Auto Scaling = Autoescalado Backend = Motor gráfico Balanced = Equilibrado Bicubic = Bicúbico BlockTransfer Tip = Algunos juegos necesitan esta opción para evitar errores gráficos. -BlockTransferRequired = AVISO: Este juego requiere activar Simular efectos "block transfer". +BlockTransferRequired = AVISO: Este juego requiere activar los efectos de transferencia de bloque. Both = Ambos -Buffer graphics commands (faster, input lag) = Comandos de búfer gráfico (faster, input lag) +Buffer graphics commands (faster, input lag) = Comandos de búfer gráfico (puede generar input lag) Buffered Rendering = Dibujado por búfer -BufferedRenderingRequired = AVISO: este juego requiere "modo de renderizado" en "por búfer". +BufferedRenderingRequired = AVISO: este juego requiere modo de renderizado por búfer. Camera = Cámara Camera Device = Dispositivo de cámara Cardboard Screen Size = Tamaño de pantalla (en % del área visual) @@ -448,7 +492,7 @@ Cardboard Screen Y Shift = Desplazamiento vertical (en % del espacio en blanco) Cardboard VR Settings = Ajustes de "Google Cardboard VR" Cheats = Trucos Clear Speedhack = Limpiar memoria de cuadro en el primer uso (rápido) -ClearSpeedhack Tip = A veces más rápido (sobre todo en móviles). Puede causar errores gráficos +ClearSpeedhack Tip = A veces más rápido (sobre todo en móviles). Puede causar errores gráficos. CPU Core = Núcleo de CPU Debugging = Depuración DefaultCPUClockRequired = AVISO: Este juego requiere reloj de CPU por defecto. @@ -459,7 +503,7 @@ Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 Disable slower effects (speedup) = Desactivar efectos más lentos (rápido) Disabled = Desactivado -Display layout editor = Editor del área de pantalla... +Display layout editor = Editor del área de pantalla Display Resolution (HW scaler) = Resolución de pantalla (escalado por hardware) Dump next frame to log = Volcar siguiente cuadro al registro Enable Cardboard VR = Activar Cardboard VR @@ -483,7 +527,7 @@ Linear = Lineal Low = Baja LowCurves = Calidad de curvas Bézier LowCurves Tip = Aumenta/reduce significativamente el renderizado de curvas Bézier -Lower resolution for effects (reduces artifacts) = Efectos en baja resolución (reduce errores gráficos) +Lower resolution for effects (reduces artifacts) = Efectos en baja resolución\n(reduce errores gráficos por escalado) Manual Scaling = Escalado manual Medium = Intermedia Mode = Modo @@ -504,12 +548,12 @@ Postprocessing effect = Efecto de postprocesado Postprocessing Shader = Shader de postprocesado Recreate Activity = Recrear actividad Render duplicate frames to 60hz = Renderizar cuadros duplicados a 60Hz -RenderDuplicateFrames Tip = Puede hacer la imagen más fluida in juegos con una tasa de cuadros más baja +RenderDuplicateFrames Tip = Puede hacer la imagen más fluida in juegos con una tasa de cuadros más baja. Rendering Mode = Modo de renderizado Rendering Resolution = Resolución de renderizado -RenderingMode NonBuffered Tip = Rápido, pero no se verá nada en algunos juegos +RenderingMode NonBuffered Tip = Rápido, pero no se verá nada en algunos juegos. Retain changed textures = Mantener texturas cambiadas -RetainChangedTextures Tip = Hace muchos juegos más lentos, pero unos pocos mucho más rápidos +RetainChangedTextures Tip = Hace muchos juegos más lentos, pero unos pocos mucho más rápidos. Rotation = Rotación Safe = Seguro Screen layout = Diseño de pantalla @@ -527,17 +571,17 @@ Texture Filter = Filtro de texturas Texture Filtering = Filtrado de texturas Texture Scaling = Escalado de texturas Texture Shader = Shader de textura -Turn off Hardware Tessellation - unsupported = Desactiva "teselado por hardware": no soportado +Turn off Hardware Tessellation - unsupported = Desactivando teselado por hardware: no soportado. Unlimited = Ilimitado Up to 1 = Hasta 1 Up to 2 = Hasta 2 Upscale Level = Nivel de escalado Upscale Type = Tipo de escalado -UpscaleLevel Tip = Exigente CPU - algunos escalados se pueden retrasar para evitar tirones +UpscaleLevel Tip = Exige consumo de CPU, algunos escalados se pueden retrasar para evitar tirones. Use all displays = Usar todas las pantallas Vertex Cache = Caché de vértices -VertexCache Tip = Rápido, pero puede causar parpadeo temporal -VSync = Sincronización vertical +VertexCache Tip = Rápido, pero puede causar parpadeo temporal. +VSync = Sincronía vertical (VSync) Vulkan = Vulkan Window Size = Tamaño de ventana xBRZ = xBRZ @@ -548,18 +592,21 @@ Install = Instalar Install game from ZIP file? = ¿Instalar juego desde archivo ZIP? Install textures from ZIP file? = ¿Instalar texturas desde archivo ZIP? Installed! = ¡Instalado! -Texture pack doesn't support install = Pack de texturas no soporte instalación -Zip archive corrupt = Archivo ZIP corrupto -Zip file does not contain PSP software = El archivo ZIP no contiene software de PSP +Texture pack doesn't support install = El paquete de texturas no es compatible con la instalación. +Zip archive corrupt = El archivo ZIP está dañado. +Zip file does not contain PSP software = El archivo ZIP no contiene software de PSP. [KeyMapping] Autoconfigure = Autoconfigurar Autoconfigure for device = Autoconfigurar para dispositivo +Bind All = Bind All Clear All = Borrar todo Default All = Restaurar Map a new key for = Pulsa una tecla para Map Key = Mapear tecla Map Mouse = Mapear ratón +Replace = Replace +Show PSP = Show PSP Test Analogs = Probar analóg. You can press ESC to cancel. = Puedes presionar ESC para cancelar. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP está guardando en almacenamiento temporal SavesAreTemporaryGuidance = Extraer PPSSPP en algún lado para guardar permanentemente SavesAreTemporaryIgnore = Ignorar avisos UnpinPath = Desanclar +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = Sitio oficial [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Rotación automática analóg. (CW) AxisSwap = Invertir ejes Circle = Círculo Cross = Equis +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad abajo D-pad left = D-pad izquierda D-pad right = D-pad derecha D-pad up = D-pad arriba DevMenu = DevMenu +Double tap button = Botón de doble toque Down = Cruceta abajo Dpad = Cruceta Frame Advance = Avanzar fotograma @@ -631,10 +690,11 @@ OpenChat = Abrir Chat Pause = Pausa R = R RapidFire = Fuego rápido +Record = Record Remote hold = Mantener remoto Rewind = Rebobinar Right = Cruceta derecha -Right Analog Stick (tap to customize) = Stick analógico derecho (toca para configurar) +Right Analog Stick = Análogo derecho RightAn.Down = StickDer. abaj. RightAn.Left = StickDer. izq. RightAn.Right = StickDer. der. @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Alternar veloc. Square = Cuadrado Start = Start +Swipe Down = Deslizar hacia abajo +Swipe Left = Deslizar hacia la izq. +Swipe Right = Deslizar hacia la der. +Swipe Up = Deslizar hacia arriba +tap to customize = tap to customize Texture Dumping = Volcar texturas Texture Replacement = Reemplazar texturas Toggle Fullscreen = Cambiar a pantalla completa @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visitar foro de juego en red AdHoc Server = Servidor AdHoc AdhocServer Failed to Bind Port = Servidor Adhoc falló al unir puerto. +AM: Data from Unknown Port = AM: Datos de puerto desconocido Auto = Automático Bottom Center = Inferior centrado Bottom Left = Inferior izquierda @@ -673,7 +767,8 @@ Change Mac Address = Cambiar dirección MAC Change proAdhocServer Address = Cambiar dirección de proAdhocServer (localhost = varias instancias) Chat = Chat Chat Button Position = Posición del botón de chat -Chat Here = Chat aquí +Chat Here = Escribe aquí +Chat message = Mensaje de Chat Chat Screen Position = Posición del chat Disconnected from AdhocServer = Desconectado del servidor Adhoc DNS Error Resolving = Resolviendo error DNS @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Fallo al unirse a la IP localhost Failed to Bind Port = Fallo al unir puerto Failed to connect to Adhoc Server = Fallo al conectar al servidor Adhoc Forced First Connect = Primera conexión forzada (más rápida) +GM: Data from Unknown Port = GM: Datos de puerto desconocido +Hostname = Hostname Invalid IP or hostname = IP o nombre host inválido Minimum Timeout = Tiempo de espera mínimo (en ms, 0 por defecto) Misc = Otros ajustes (por defecto = compatibilidad) Network Initialized = Juego en red iniciado +None = None Please change your Port Offset = Por favor cambia el offset del puerto. Port offset = Variar puerto de red (0 = compatible con PSP) +PPSSPP Ad-Hoc Wiki Page = Página wiki sobre PPSSPP Ad-Hoc proAdhocServer Address: = Dirección del servidor Adhoc: Quick Chat 1 = Chat rápido 1 Quick Chat 2 = Chat rápido 2 @@ -708,13 +807,13 @@ Quick Chat 5 = Chat rápido 5 QuickChat = Chat rápido Send = Enviar Send Discord Presence information = Enviar información a Discord "Rich Presence" -TCP No Delay = TCP Sin retardo (más rápido) +TCP No Delay = TCP sin retrasos (más rápido) Top Center = Superior centrado Top Left = Superior izquierda Top Right = Superior derecha Unable to find UPnP device = Dispositivo UPnP no encontrado UPnP (port-forwarding) = UPnP (redirección de puertos) -UPnP need to be reinitialized = UPnP debe reinicializarse +UPnP need to be reinitialized = La función de UPnP debe reinicializarse. UPnP use original port = Usar puerto UPnP de PSP (más compatible) Validating address... = Validando dirección... WLAN Channel = Canal WLAN @@ -732,6 +831,8 @@ Rewind = Rebobinar Save State = Guardar estado Settings = Ajustes generales Switch UMD = Cambiar UMD +Undo last load = Deshacer carga de estado +Undo last save = Deshacer guard. de estado [PostShaders] (duplicated setting, previous slider will be used) = (configuración duplicada, se usará la anterior) @@ -747,7 +848,7 @@ Cartoon = Dibujos animados ColorCorrection = Corrección de color Contrast = Contraste CRT = Pantalla de tubo (CRT) -FXAA = FXAA +FXAA = Antialiasing por FXAA Gamma = Gamma Grayscale = Escala de grises Intensity = Intensidad @@ -756,14 +857,15 @@ Natural = Colores naturales NaturalA = Colores naturales (sin difuminar) Off = No Power = Poder -PSPColor = PSP color +PSPColor = Paleta de colores PSP Saturation = Saturación Scanlines = Monitor con "scanlines" Sharpen = Afilado SSAA(Gauss) = Super muestreo AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Escalado en Spline36 -VideoSmoothingAA = Vídeo suavizado AA +VideoSmoothingAA = Suavizado de vídeo AA Vignette = Viñeta [PSPCredits] @@ -797,7 +899,7 @@ tools = Software libre utilizado: # Add translators1-6 for up to 6 lines of translator credits. # Leave extra lines blank. 4 contributors per line seems to look best. translators1 = PpmeiS, Puniasterus y Swyter. -translators2 = +translators2 = KAGE-008 (nueva revisión) translators3 = translators4 = translators5 = @@ -828,6 +930,8 @@ Stopping.. = Parando... [Reporting] Bad = Malos +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Tus datos están siendo enviados en segundo plano. FeedbackDesc = ¿Cómo va el juego? ¡Que lo sepa la comunidad! FeedbackDisabled = El servicio de informes de compatibilidad debe estar habilitado. @@ -853,8 +957,9 @@ Perfect Description = Emulación fluida durante todo el juego - ¡genial! Plays = Jugable Plays Description = 100% jugable pero puede haber errores gráficos ReportButton = Informar de error +Show disc CRC = Show disc CRC Speed = Velocidad -Submit Feedback = Enviar feedback +Submit Feedback = Enviar comentario SuggestionConfig = Ver reportes en la web para una buena configuración. SuggestionCPUSpeed0 = Desactivar bloqueo de velocidad CPU. SuggestionDowngrade = Volver a una versión de PPSSPP más antigua (por favor reportar error). @@ -864,28 +969,32 @@ SuggestionsWaiting = Enviando y verificando feedback de otros usuarios... SuggestionUpgrade = Actualizar a una build de PPSSPP más reciente. SuggestionVerifyDisc = Verifica que tu ISO es una copia válida del disco. Unselected Overall Description = ¿Cómo de bien va el juego? -View Feedback = Ver todos los feedbacks +View Feedback = Ver comentarios [Savedata] Date = Fecha Filename = Nombre No screenshot = Sin captura de pantalla None yet. Things will appear here after you save. = No hay datos. Una vez guardes partida aparecerán aquí. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Datos Save States = Estados Savedata Manager = Administrador de partidas guardadas +Showing matches for '%1'. = Showing matches for '%1'. Size = Tamaño [Screen] Cardboard VR OFF = Cardboard VR apagado Chainfire3DWarning = AVISO: "Chainfire3D" detectado, puede causar problemas. -Failed to load state = Error al cargar el estado -Failed to save state = Error al guardar el estado +Failed to load state = Error al cargar el estado. +Failed to save state = Error al guardar el estado. fixed = Velocidad: alternativa GLToolsWarning = AVISO: "GLTools" detectado, puede causar problemas. In menu = En menú -Load savestate failed = Error al cargar el estado guardado -Loaded State = Estado cargado +Load savestate failed = Error al cargar el estado guardado. +Loaded State = Estado cargado. +Loaded. Game may refuse to save over different savedata. = Cargado. El juego puede no guardar sobre datos distintos. +Loaded. Game may refuse to save over newer savedata. = Cargado. El juego puede no guardar sobre datos más actuales. Loaded. Save in game, restart, and load for less bugs. = Cargado. Guarda la partida, reinicia, y recarga para menos errores. LoadStateDoesntExist = Error al cargar el estado: no existe el archivo. LoadStateWrongVersion = Error al cargar el estado: el archivo es de una versión anterior de PPSSPP. @@ -895,11 +1004,12 @@ PressESC = Presiona Esc para abrir el menú de pausa. replaceTextures_false = Las texturas no serán reemplazadas. replaceTextures_true = Reemplazo de texturas activado. Save State Failed = Error al guardar el estado. -Saved State = Estado guardado +Saved State = Estado guardado. saveNewTextures_false = Guardado de texturas desactivado. saveNewTextures_true = Las texturas serán guardadas en disco. SpeedCustom2 = Velocidad: Alternar 2 standard = Velocidad: estándar +State load undone = Se ha revertido la carga del estado. Untitled PSP game = Juego de PSP sin título. [Store] @@ -918,28 +1028,29 @@ Uninstall = Desinstalar (none detected) = (ninguno detectado) 3D API = API 3D ABI = Arquitectura -API Version = Versión de API +API Version = Versión del API Audio Information = Información del audio Board = Placa -Build Config = Info. compilación -Build Configuration = Configuración de la compilación +Build Config = Info. de la compilación +Build Configuration = Info. de la compilación Built by = Compilado por -Core Context = Context de núcleo +Core Context = Contexto de núcleo Cores = Núcleos CPU Extensions = Extensiones CPU CPU Information = Información de la CPU CPU Name = Nombre -D3DCompiler Version = Versión D3DCompiler +D3DCompiler Version = Versión del compilador D3D Debug = Desarrollo Debugger Present = Depurador presente Device Info = Info. del dispositivo +Directories = Directorios Display Information = Información de la pantalla Driver Version = Versión de controlador EGL Extensions = Extensiones EGL Frames per buffer = Cuadros por búfer GPU Information = Información de la GPU -High precision float range = Alta precisión de rango flotante -High precision int range = Rango de alta precisión de int +High precision float range = Rango de alta precisión (flotante) +High precision int range = Rango de alta precisión (enteros) Lang/Region = Idioma/Región Memory Page Size = Tamaño de página de memoria Native Resolution = Resolución nativa @@ -950,17 +1061,18 @@ OpenGL Extensions = Extensiones OpenGL Optimal frames per buffer = Cuadros por búfer óptimos Optimal sample rate = Frecuencia de muestreo óptima OS Information = Información del Sistema Operativo -PPSSPP build = Compilación PPSSPP +PPSSPP build = Compilación de PPSSPP Refresh rate = frecuencia de actualización -Release = Lanzamiento +Release = Estable RW/RX exclusive = RW/RX exclusivo Sample rate = Frecuencia de muestreo -Shading Language = Lenguaje de sombreado +Shading Language = Lenguaje de shader +Storage = Almacenamiento Sustained perf mode = Modo de rendimiento sostenido System Information = Información del sistema System Name = Nombre System Version = Versión del sistema -Threads = Hilos +Threads = Cantidad hilos Vendor = Modelo Vendor (detected) = Proveedor Version Information = Información de la versión @@ -973,12 +1085,15 @@ Vulkan Features = Funciones Vulkan 24HR = 24 horas Auto = Automático Auto Load Savestate = Carga automática de estados de guardado -AVI Dump started. = Volcado AVI iniciado -AVI Dump stopped. = Volcado AVI parado +AVI Dump started. = Grabación iniciada. +AVI Dump stopped. = Grabación detenida. Cache ISO in RAM = Cargar ISO completa en RAM Change CPU Clock = Velocidad CPU PSP (inestable) -Change Memory Stick folder = Cambiar directorio de Memory Stick -Change Memory Stick Size = Cambiar tamaño de Memory Stick (GB) +Error: load undo state is from a different game = Error: el estado es de otro juego. +Failed to load state for load undo. Error in the file system. = Falló la reversión del estado debido a un error del archivo. +Floating symbols = Símbolos flotantes +Memory Stick folder = Directorio de Memory Stick +Memory Stick size = Cambiar tamaño de Memory Stick (GB) Change Nickname = Cambiar apodo PSP ChangingMemstickPath = Partidas guardadas, estados y otros datos no serán copiados a este directorio.\n\n¿Cambiar directorio de la Memory Stick? ChangingMemstickPathInvalid = Esa ruta no se pudo utilizar para guardar los archivos de la Memory Stick. @@ -990,12 +1105,12 @@ Clear UI background = Borrar imagen de fondo Confirmation Button = Botón de confirmación Date Format = Formato de fecha Day Light Saving = Horario de verano -DDMMYYYY = DD/MM/AAAA +DDMMYYYY = Día/Mes/Año Decrease size = Reducir tamaño Developer Tools = Herramientas de desarrollo -Display Extra Info = Mostrar información extra +Display Extra Info = Mostrar información adicional Display Games on a grid = Mostrar "Juegos" en una cuadrícula -Display Homebrew on a grid = Mostrar "Homebrew && Demos" en una cuadrícula +Display Homebrew on a grid = Mostrar "Homebrew y Demos" en una cuadrícula Display Recent on a grid = Mostrar "Recientes" en una cuadrícula Dynarec (JIT) = Dynarec (JIT) Emulation = Emulación @@ -1012,29 +1127,33 @@ General = General Grid icon size = Tamaño de iconos de cuadrícula Help the PPSSPP team = Ayuda al equipo de PPSSPP Host (bugs, less lag) = Anfitrión (errores, menos lag) -I/O on thread (experimental) = E/S en hilo (experimental) Ignore bad memory accesses = Ignorar malos accesos a la memoria Increase size = Aumentar tamaño Interpreter = Intérprete IO timing method = Método de sincronización de E/S -IR Interpreter = IR intérprete +IR Interpreter = Intérprete IR Memory Stick Folder = Directorio de la Memory Stick Memory Stick inserted = Memory Stick insertada MHz, 0:default = MHz, 0 = predeterminado -MMDDYYYY = MM/DD/AAAA +MMDDYYYY = Mes/Día/Año +Moving background = Fondo en movimiento Newest Save = Partida guardada más reciente +No animation = Sin animación Not a PSP game = No es un juego de PSP Off = No Oldest Save = Partida guardada más antigua +Path does not exist! = La ruta no existe. +PSP Memory Stick = PSP Memory Stick PSP Model = Modelo de PSP PSP Settings = Ajustes de PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Juegos recientes Record Audio = Grabar audio Record Display = Grabar pantalla Reset Recording on Save/Load State = Reiniciar grabación al cargar/guardar estado Restore Default Settings = Reestablecer ajustes -Rewind Snapshot Frequency = Frecuencia de rebobinado instantánea (+ memoria) +Rewind Snapshot Frequency = Frecuencia de rebobinado\n(consume memoria) Save path in installed.txt = Carpeta de guardado en "installed.txt" Save path in My Documents = Carpeta de guardado en "Mis documentos" Savestate Slot = Ranura de estado guardado @@ -1043,27 +1162,30 @@ Screenshots as PNG = Capturas en PNG Set UI background... = Definir imagen de fondo... Show ID = Mostrar ID Show region flag = Mostrar bandera de región -Simulate UMD delays = Simular retardo UMD -Slot 1 = Slot 1 -Slot 2 = Slot 2 -Slot 3 = Slot 3 -Slot 4 = Slot 4 -Slot 5 = Slot 5 +Simulate UMD delays = Simular retraso del UMD +Slot 1 = Ranura 1 +Slot 2 = Ranura 2 +Slot 3 = Ranura 3 +Slot 4 = Ranura 4 +Slot 5 = Ranura 5 Storage full = No queda espacio Sustained performance mode = Modo de rendimiento sostenido Time Format = Formato de hora UI = Interfaz de usuario +UI background animation = Animación del fondo de UI UI Sound = Sonido de interfaz undo %c = Restaurar %c +USB = USB Use Lossless Video Codec (FFV1) = Usar codec de vídeo sin pérdida (FFV1) -Use O to confirm = Confirmar con el botón O +Use O to confirm = Confirmar con el botón ○ Use output buffer (with overlay) for recording = Usar salida de búfer (con capa) para grabar -Use system native keyboard = Usar sistema nativo de teclado -Use X to confirm = Confirmar con el botón X +Use system native keyboard = Usar teclado nativo del sistema +Use X to confirm = Confirmar con el botón × VersionCheck = Buscar actualizaciones de PPSSPP WARNING: Android battery save mode is on = AVISO: el ahorro de batería Android está activado WARNING: Battery save mode is on = AVISO: el ahorro de batería está activado -YYYYMMDD = AAAA/MM/DD +Waves = Ondas +YYYYMMDD = Año/Mes/Día [Upgrade] Details = Detalles diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index c8d0d7bbac..5e00c96e88 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -1,95 +1,129 @@ [Audio] -Alternate speed volume = Alternar velocidad de volumén +Alternate speed volume = Alternar velocidad de volumen Audio backend = Motor de audio (req. reiniciar) -AudioBufferingForBluetooth = Buffer amigable con Bluetooth (enlentece) +Audio Error = Audio Error +AudioBufferingForBluetooth = Búfer amigable con Bluetooth (enlentece) Auto = Automático Device = Dispositivo +Disabled = Deshabilitado DSound (compatible) = DirectSound (compatible) -Enable Sound = Activar Sonido +Enable Sound = Activar sonido Global volume = Volumen global Microphone = Micrófono Microphone Device = Dispositivo de entrada Mute = Silenciar -Switch on new audio device = Cambiar al nuevo dispositivo de audio +Reverb volume = Reverb volume +Use new audio devices automatically = Cambiar al nuevo dispositivo de audio Use global volume = Usar volumen global WASAPI (fast) = WASAPI (rápido) [Controls] -Analog auto-rotation speed = Vel. de rotación auto. de Analog -Analog Axis Sensitivity = Sensibilidad de ejes de Analog -Analog Limiter = Limitador de Analog +Analog Binding = Asignar análogo +Analog Settings = Config. del análogo +Analog Style = Estilo del análogo +Auto-rotation speed = Vel. de rotación auto. del análogo +Analog Axis Sensitivity = Sensibilidad de ejes del análogo +Analog Limiter = Limitador del análogo Analog Mapper High End = Asignación Analog básica (sensibilidad de ejes) Analog Mapper Low End = Asignación Analog avanzada (invierte la zona muerta) Analog Mapper Mode = Modo de asignación de Analog Analog Stick = Analog stick -AnalogLimiter Tip = Cuando se presiona el botón de Limitador de Analog +AnalogLimiter Tip = Cuando se presiona el botón del limitador del análogo Auto = Automática -Auto-centering analog stick = Auto-centrado del Analog stick -Auto-hide buttons after seconds = Ocultar botones después de segundos -Binds = Enlazados +Auto-centering analog stick = Auto-centrado del análogo +Auto-hide buttons after seconds = Ocultar botones después de (en segundos) +Auto-switch = Auto-switch +Base tilt position = Base tilt position +Binds = Asignaciones +Button Binding = Button Binding Button Opacity = Transparencia de botones Button style = Estilo de botones -Calibrate D-Pad = Calibrar +Calibrate Analog Stick = Calibrar análogo +Calibrate D-Pad = Calibrar cruceta +Calibrated = Calibrado Calibration = Calibración +Circular stick input = Circular stick input Classic = Clásico Combo Key Setting = Ajustes de botones combo Combo Key Setup = Configurar botones combo... Confine Mouse = Fijar el ratón al área de la ventana/pantalla Control Mapping = Asignar botones -Custom layout... = Editar pantalla táctil... -Customize tilt = Personalizar acelerómetro... -D-PAD = D-Pad -Deadzone Radius = Radio de zona inactiva +Custom Key Setting = Custom Key Setting +Customize = Personalizar +Customize Touch Controls = Editar pantalla táctil +Customize tilt = Personalizar acelerómetro +D-PAD = Cruceta +Deadzone radius = Radio de zona inactiva DInput Analog Settings = Configuraciones de Analog de DInput -Disable D-Pad diagonals (4-way touch) = Desactivar diagonales de D-Pad\n(Toque de 4 direcciones) +Disable D-Pad diagonals (4-way touch) = Desactivar diagonales de la cruceta +Disable diagonal input = Deshabilitar mov. diagonal +Double tap = Doble toque +Enable gesture control = Habilitar gestos +Enable standard shortcut keys = Habilitar teclas de atajo +Gesture = Gestos +Gesture mapping = Configurac. de gestos Glowing borders = Bordes brillantes HapticFeedback = Vibración háptica +Hide touch analog stick background circle = Ocultar círculo del análogo +Icon = Icon Ignore gamepads when not focused = Ignorar pads con pantalla inactiva Ignore Windows Key = Ignorar tecla de Windows Invert Axes = Invertir ejes Invert Tilt along X axis = Invertir inclinación del eje X Invert Tilt along Y axis = Invertir inclinación del eje Y -Keep this button pressed when right analog is pressed = Mantenga presionada esta tecla cuando el analog derecho es presionado +Keep this button pressed when right analog is pressed = Pulsa esta tecla cuando se usa el análogo derecho Keyboard = Ajustes de teclado L/R Trigger Buttons = botones L/R Landscape = Apaisado Landscape Auto = Apaisado automático Landscape Reversed = Apaisado invertido +Low end radius = Radio inferior Mouse = Ajustes de ratón Mouse sensitivity = Sensibilidad del ratón Mouse smoothing = Suavidad del ratón MouseControl Tip = Puedes controlar el ratón en la pantalla de controles presionando el icono 'M'. -None (Disabled) = None (Desactivado) +None (Disabled) = Desactivado Off = Off OnScreen = Controles en pantalla Portrait = Retrato Portrait Reversed = Retrato invertido PSP Action Buttons = Botones de acción PSP +Raw input = Raw input +Reset to defaults = Restaurar config. +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotación de pantalla -seconds, 0 : off = Segundos, 0 = apagado +seconds, 0 : off = Segundos, 0 = No +Sensitivity (scale) = Sensibilidad (escala) Sensitivity = Sensibilidad -Show right analog = Mostrar Analog derecho -Show Touch Pause Menu Button = Mostrar botón de menú Pause +Shape = Shape +Show right analog = Mostrar análogo derecho +Show Touch Pause Menu Button = Mostrar botón del menú +Swipe = Deslizar hacia +Swipe sensitivity = Sensibilidad del deslizado +Swipe smoothing = Fluidez del deslizado Thin borders = Bordes finos Tilt Base Radius = Radio base de inclinación Tilt Input Type = Tipo de control del acelerómetro Tilt Sensitivity along X axis = Sensibilidad de inclinación del eje X Tilt Sensitivity along Y axis = Sensibilidad de inclinación del eje Y To Calibrate = Para calibrar, pon el aparato en una superficie plana y presiona "Calibrar". +Toggle mode = Toggle mode Touch Control Visibility = Visibilidad de pantalla táctil Use custom right analog = Usar Analog derecho personalizado Use Mouse Control = Usar el control del ratón Visibility = Visibilidad +Visible = Visible X = X X + Y = X + Y -XInput Analog Settings = Configuraciones de Analog de XInput +XInput Analog Settings = Configuraciones del análogo de XInput Y = Y [CwCheats] -Cheats = Trampas -Edit Cheat File = Editar archivo de trampas -Enable/Disable All = Activar/desactivar todas las trampas -Import Cheats = Importar cheat.db +Cheats = trucos +Edit Cheat File = Editar archivo de trucos +Enable/Disable All = Activar/desactivar todos los trucos +Import Cheats = Importar archivo cheat.db Options = Opciones Refresh Rate = Frecuencia de actualización @@ -99,6 +133,7 @@ Refresh Rate = Frecuencia de actualización #Font = VL Gothic About PPSSPP... = &Acerca de PPSSPP... Auto = &Automático +Auto Max Quality = Máx. calidad automática Backend = Motor &gráfico (requiere reiniciar) Bicubic = &Bicúbico Break = Romper @@ -117,7 +152,7 @@ Display Rotation = Rotación de pantalla Dump Next Frame to Log = &Volcar siguiente cuadro a registro Emulation = &Emulación Enable Chat = Activar chat -Enable Cheats = Activar &trampas +Enable Cheats = Activar &trucos Enable Sound = Activar s&onido Exit = &Salir Extract File... = E&xtraer archivo... @@ -148,8 +183,9 @@ Log Console = Consola de re&gistros... Memory View... = Visor de &memoria... More Settings... = Más &opciones... Nearest = &Cercano -Non-Buffered Rendering = &Saltar efectos por búfer (Desactiva búfer, rápido) +Non-Buffered Rendering = &Saltar efectos por búfer (rápido) Off = &No +Open Chat = Abrir ventana de chat Open Directory... = &Abrir carpeta... Open from MS:/PSP/GAME... = A&brir desde ms0:/PSP/GAME... Open Memory Stick = Abrir &Memory Stick @@ -184,7 +220,7 @@ Switch UMD = Cambiar &UMD Take Screenshot = Capturar &pantalla Texture Filtering = &Filtrado de texturas Texture Scaling = &Escalado de texturas -Use Lossless Video Codec (FFV1) = Usar codec de Video sin pérdida (&FFV1) +Use Lossless Video Codec (FFV1) = Usar codec de vídeo sin pérdida (&FFV1) Use output buffer for video = Usar salida de búfer para vídeo Vertex Cache = &Caché de vértices VSync = Sincronización &vertical @@ -229,6 +265,7 @@ No block = No bloquear Prev = Atras Random = Aleatorio Replace textures = Remplazar texturas +Reset = Reset Reset limited logging = Reiniciar registro límitado RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\nLos cambios en los controles no se borrarán.\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. RestoreGameDefaultSettings = ¿Seguro que quieres reestablecer los ajustes del juego\na los ajustes por defecto de PPSSPP? @@ -274,40 +311,45 @@ DeleteConfirmGameConfig = ADVERTENCIA:\nLos archivos de preferencias de este jue DeleteFailed = Los archivos no se pudieron borrar. Deleting = Borrando\nPor favor espere... Disable All = Apagar todo -Edit = Edit +Dumps = Volcados +Edit = Editar Enable All = Activar todo Enter = Confirmar +Filter = Filtrar Finish = Terminar +GE Frame Dumps = Volcados de cuadros GE Grid = Cuadrícula Inactive = Inactivo InternalError = Ha ocurrido una falla interna. Load = Abrir Load completed = Datos cargados. Loading = Cargando\nPor favor espere... -LoadingFailed = Los datos no se pudieron cargar. +LoadingFailed = Los datos del juego no se pudieron cargar. Move = Mover Network Connection = Conexión de red NEW DATA = CREAR DATOS No = No -ObtainingIP = Obteniendo dirección IP.\nEspere un momento... +ObtainingIP = Obteniendo dirección IP.\nEspera un momento... OK = OK -Old savedata detected = Detectados datos de partida antiguos. +Old savedata detected = Se han detectado datos del juego antiguos. Options = Opciones Reset = Reiniciar Resize = Tamaño Retry = Reintentar Save = Guardar -Save completed = Datos almacenados. +Save completed = Los datos del juego han sido almacenados. Saving = Guardando\nPor Favor espere... -SavingFailed = Los datos no se pudieron guardar. +SavingFailed = Los datos del juego no se pudieron guardar. +Search = Buscar Select = Seleccionar Shift = Alternar -Snap = Chasquido +Skip = Saltar +Snap = Capturar Space = Espacio SSID = SSID Submit = Enviar Supported = Soportado -There is no data = Aquí no hay datos. +There is no data = No se han encontrado datos del juego. Toggle All = Cambiar todo Toggle List = Cambiar lista Unsupported = No es soportado @@ -322,36 +364,36 @@ A PSP game couldn't be found on the disc. = No se detecta el juego de PSP en el Cannot boot ELF located outside mountRoot. = No puede iniciar ELF localizado fuera de mountRoot. Could not save screenshot file = No se pudo guardar la captura de pantalla. D3D9or11 = ¿Direct3D 9? (o "no" para Direct3D 11) -D3D11CompilerMissing = No se encuentra el archivo D3DCompiler_47.dll.\nEste archivo es requisito para iniciar Direct3D 11, por lo cual debe instalarlo.\n¿Quieres cambiar a Direct3D 9? -D3D11InitializationError = No se ha inicializado correctamente Direct3D 11 -D3D11Missing = Tu versión de Windows no soporta D3D11. Utilice Windows Update por favor.\n¿Quieres cambiar a Direct3D 9? -D3D11NotSupported = Tu GPU no soporta Direct3D 11.\n¿Quieres cambiar a Direct3D 9? +D3D11CompilerMissing = No se encuentra el archivo D3DCompiler_47.dll.\nEste archivo es requisito para iniciar Direct3D 11, por lo cual debe estar instalado.\n¿Quieres cambiar a Direct3D 9? +D3D11InitializationError = No se ha podido inicializar Direct3D 11. +D3D11Missing = Esta versión de Windows no soporta D3D11. Intenta actualizar versión de Windows.\n¿Quieres cambiar a Direct3D 9? +D3D11NotSupported = Tu GPU no es compatible con Direct3D 11.\n¿Quieres cambiar a Direct3D 9? Disk full while writing data = El disco se ha llenado durante la escritura de datos. -ELF file truncated - can't load = Archivo ELF truncado: no se puede cargar -Error loading file = Error al cargar archivo. +ELF file truncated - can't load = Archivo ELF corrupto: no se puede cargar. +Error loading file = Error al cargar el archivo. Error reading file = Error al leer el archivo. Failed initializing CPU/Memory = Falló al iniciar CPU o memoria. Failed to identify file = No se pudo identificar el archivo. Failed to load executable: = Falló al cargar ejecutable: -File corrupt = Archivo corrupto +File corrupt = Archivo corrupto. Game disc read error - ISO corrupt = Falló al cargar disco de juego: ISO corrupta. -GenericAllStartupError = Falló al iniciar los gráficos de cualquier API. Intenta actualizar los drivers de los gráficos y de otros. -GenericBackendSwitchCrash = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\nLa API de los gráficos ha sido cambiado: -GenericDirect3D9Error = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos y el runtime de DirectX 9.\n\n¿Quieres probar a usar OpenGL 2.0 en su lugar?\n\nMensaje de error: +GenericAllStartupError = Fallo al iniciar los gráficos de cualquier API. Intenta actualizar los drivers de los gráficos y de otros. +GenericBackendSwitchCrash = Fallo al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\nLa API de los gráficos ha sido cambiado: +GenericDirect3D9Error = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos y el runtime de DirectX 9.\n\n¿Quieres probar a usar OpenGL en su lugar?\n\nMensaje de error: GenericGraphicsError = Error de graficos GenericOpenGLError = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\n¿Quieres probar a usar DirectX 9 en su lugar?\n\nMensaje de error: -GenericVulkanError = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\n¿Quieres probar a usar OpenGL 2.0 en su lugar?\n\nMensaje de error: +GenericVulkanError = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\n¿Quieres probar a usar OpenGL en su lugar?\n\nMensaje de error: InsufficientOpenGLDriver = Soporte insuficiente del driver OpenGL detectado.\n\nTu tarjeta gráfica indica que no soporta OpenGL 2.0. ¿Quieres probar a usar DirectX en su lugar?\n\nPor ahora DirectX es compatible con menos juegos, pero con tu tarjeta gráfica puede que sea la única opción disponible.\n\nVisita los foros en https://forums.ppsspp.org para más información. Just a directory. = Sólo es una carpeta. Missing key = No se encuentra la tecla. MsgErrorCode = Código de error: -MsgErrorSavedataDataBroken = Los datos de guardado se dañaron. +MsgErrorSavedataDataBroken = Los datos de guardado están dañados. MsgErrorSavedataMSFull = Memory Stick está lleno. Verifica el espacio. MsgErrorSavedataNoData = ADVERTENCIA: no se encontró datos de guardado. MsgErrorSavedataNoMS = No se insertó la Memory Stick. No EBOOT.PBP, misidentified game = Falta el archivo EBOOT.PBP, juego mal identificado. Not a valid disc image. = No es un disco válido. -OpenGLDriverError = Error del driver OpenGL +OpenGLDriverError = Error del driver OpenGL. PPSSPP doesn't support UMD Music. = PPSSPP no soporta canciones de UMD. PPSSPP doesn't support UMD Video. = PPSSPP no soporta videos de UMD. PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP solo soporta juegos de PSP y no soporta juegos de PS1 o PS2. @@ -360,22 +402,23 @@ PS1 EBOOTs are not supported by PPSSPP. = PPSSPP no soporta los EBOOTs de PS1. PSX game image detected. = El archivo es una imagen MODE2 y esa imagen es de PS1, por lo cual PPSSPP no la soporta. RAR file detected (Require UnRAR) = Se ha detectado un archivo RAR.\nUtiliza UnRar para descomprimirlo. RAR file detected (Require WINRAR) = Se ha detectado un archivo RAR.\nUtiliza WinRar para descomprimirlo. -Running slow: try frameskip, sound is choppy when slow = Se ejecuta lento:\nIntenta saltar cuadros, puede sonar mal debido a la ralentización. -Running slow: Try turning off Software Rendering = Se ejecuta lento:\nIntenta desactivar "renderizado por software". +Running slow: try frameskip, sound is choppy when slow = Se ejecuta lento: Intenta saltar cuadros (el audio puede sonar mal). +Running slow: Try turning off Software Rendering = Se ejecuta lento: Intenta desactivar renderizado por software. Save encryption failed. This save won't work on real PSP = Falló al encriptar los datos guardados. No funcionarán en una PSP real. -textures.ini filenames may not be cross-platform = Los nombres del archivo "textures.ini" pueden no ser multiplataforma. +textures.ini filenames may not be cross-platform = Los nombres del archivo textures.ini pueden no ser multiplataforma. This is a saved state, not a game. = Este es un estado guardado en vez de un juego. This is save data, not a game. = Esta es una carpeta de datos guardado en vez de un juego. -Unable to create cheat file, disk may be full = No se pudo crear el archivo de trampas, el disco podría estar lleno. +Unable to create cheat file, disk may be full = No se pudo crear el archivo de trucos, el disco podría estar lleno. Unable to initialize rendering engine. = No se pudo inicializar el motor de renderizado. Unable to write savedata, disk may be full = No se pudieron escribir los datos de guardado, el disco podría estar lleno. Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = ADVERTENCIA: VRAM lleno, reduciendo escalado y cambiando al modo cache lento. -Warning: Video memory FULL, switching to slow caching mode = ADVERTENCIA: VRAM lleno, cambiando al modo cache lento. +Warning: Video memory FULL, switching to slow caching mode = ADVERTENCIA: VRAM lleno, cambiando al modo de caché lento. ZIP file detected (Require UnRAR) = Se ha detectado un archivo ZIP.\nUtiliza UnRar para descomprimirlo. ZIP file detected (Require WINRAR) = Se ha detectado un archivo ZIP.\nUtiliza compresores como WinRar o WinZip para descomprimirlo. [Game] Asia = Asia +Calculate CRC = Calcular valor CRC ConfirmDelete = Borrar Create Game Config = Crear config. del juego Create Shortcut = Crear acceso directo @@ -391,13 +434,13 @@ InstallData = Instalación de datos Japan = Japón Korea = Corea MB = MB -One moment please... = Espere un momento... +One moment please... = Espera un momento... Play = Jugar -Remove From Recent = Borrar de "recientes" +Remove From Recent = Borrar de recientes SaveData = Datos Setting Background = Configurar fondo Show In Folder = Mostrar en carpeta -USA = Norte y\nLatinoamérica +USA = América Use UI background = Usar fondo como interfaz [Graphics] @@ -430,28 +473,29 @@ Auto = Automático Auto (1:1) = Automático (1:1) Auto (same as Rendering) = Automático (igual a la de renderizado) Auto FrameSkip = Salto de cuadros automático +Auto Max Quality = Máx. calidad automática Auto Scaling = Escalado automático Backend = Motor gráfico Balanced = Balanceado Bicubic = Bicúbico BlockTransfer Tip = Algunos juegos requieren activarlo para corregir gráficos. -BlockTransferRequired = Advertencia: Este juego requiere activar Simular efectos de transferencia de bloque. +BlockTransferRequired = Advertencia: Este juego requiere activar los efectos de transferencia de bloque. Both = Ambos -Buffer graphics commands (faster, input lag) = Comandos gráficos de búfer (acelera, lag de controles) +Buffer graphics commands (faster, input lag) = Comandos gráficos de búfer (puede generar input lag) Buffered Rendering = Renderizado con Buffer -BufferedRenderingRequired = Advertencia: Este juego requiere renderizado puesto a buffer. +BufferedRenderingRequired = Advertencia: Este juego requiere modo de renderizado por búfer. Camera = Cámara Camera Device = Dispositivo de cámara Cardboard Screen Size = Tamaño de pantalla (en % del área visual) Cardboard Screen X Shift = Desplazamiento X (en % del espacio en blanco) Cardboard Screen Y Shift = Desplazamiento Y (en % del espacio en blanco) Cardboard VR Settings = Configurar Google Cardboard VR -Cheats = Trampas -Clear Speedhack = Limpia los búfers de frames al primer uso (hackea velocidad) -ClearSpeedhack Tip = A veces acelera (la mayoría en disposiivos móviles), pero puede causar glitches +Cheats = Trucos +Clear Speedhack = Limpia los búfers de frames al primer uso (acelera) +ClearSpeedhack Tip = A veces acelera (la mayoría en dispositivos móviles), pero puede causar errores gráficos. CPU Core = Núcleo de CPU Debugging = Depuración -DefaultCPUClockRequired = ADVERTENCIA: Este juego req. poner por défecto el reloj de CPU. +DefaultCPUClockRequired = ADVERTENCIA: Este juego requiere reloj de CPU en valores por defecto. Deposterize = Deposterizado Deposterize Tip = Arregla glitches de banda visual en texturas causadas por el escalado. Device = Dispositivo @@ -459,14 +503,14 @@ Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 Disable slower effects (speedup) = Desactivar efectos más lentos (rápido) Disabled = Apagado -Display layout editor = Editor del área de pantalla... +Display layout editor = Editor del área de pantalla Display Resolution (HW scaler) = Resolución de pantalla (escalado por HW) Dump next frame to log = Volcar siguiente cuadro al registro Enable Cardboard VR = Activar Cardboard VR FPS = FPS Frame Rate Control = Control de Framerate -Frame Skipping = Salto de Frames -Frame Skipping Type = Tipo de Salto de Frames +Frame Skipping = Salto de cuadros +Frame Skipping Type = Tipo de salto de cuadros FullScreen = Pantalla completa Hack Settings = Ajustes de hacks (puede causar glitches) Hardware Tessellation = Teselado por Hardware @@ -483,7 +527,7 @@ Linear = Lineal Low = Baja LowCurves = Calidad de curvas bézier/Spline LowCurves Tip = Controla la calidad de las curvas renderizadas, pero solo se utiliza en ciertos juegos. -Lower resolution for effects (reduces artifacts) = Efectos en baja resolución\n(reduce artefactos) +Lower resolution for effects (reduces artifacts) = Efectos en baja resolución\n(reduce errores gráficos por escalado) Manual Scaling = Escalado manual Medium = Media Mode = Modo @@ -503,13 +547,13 @@ Performance = Rendimiento Postprocessing effect = Efectos de postprocesado Postprocessing Shader = Shader de postprocesado Recreate Activity = Recrear actividad -Render duplicate frames to 60hz = Procesar frames duplicados a 60 Hz -RenderDuplicateFrames Tip = Puede hacer que el framerate sea más suave en juegos que se ejecutan a framerates más bajos +Render duplicate frames to 60hz = Procesar cuadros duplicados a 60 Hz +RenderDuplicateFrames Tip = Puede hacer que la fluidez sea más suave en juegos con tasas de cuadros bajas. Rendering Mode = Modo de renderizado Rendering Resolution = Resolución de renderizado -RenderingMode NonBuffered Tip = Acelera, pero no puede dibujar en algunos juegos -Retain changed textures = Retener texturas cambiadas\n(A veces se ralentiza) -RetainChangedTextures Tip = Ralentiza muchos juegos, pero acelera algunos +RenderingMode NonBuffered Tip = Acelera, pero no podrá generar gráficos en algunos juegos. +Retain changed textures = Mantener texturas cambiadas +RetainChangedTextures Tip = Ralentiza muchos juegos, pero acelera algunos. Rotation = Rotación Safe = Seguro Screen layout = Disposición de pantalla @@ -520,24 +564,24 @@ Simulate Block Transfer = Simular efectos de transferencia de bloque SoftGPU Tip = Actualmente ENLENTECE mucho Software Rendering = Renderizado por software (experimental) Software Skinning = Skineado por software -SoftwareSkinning Tip = Combina dibujados de modelo de skineado en la CPU. Acelera muchos juegos pero enlentece otros. +SoftwareSkinning Tip = Combina dibujados de modelo de skineado en la CPU. Acelera muchos juegos pero ralentiza otros. Speed = Velocidad Stretching = Estirar Texture Filter = Filtro de texturas Texture Filtering = Filtrado de texturas Texture Scaling = Escalado de texturas Texture Shader = Texture shader -Turn off Hardware Tessellation - unsupported = Desactivando Teselado por Hardware: no es soportado +Turn off Hardware Tessellation - unsupported = Desactivando Teselado por Hardware: no es soportado. Unlimited = Ilimitado Up to 1 = Hasta 1 Up to 2 = Hasta 2 Upscale Level = Nivel de escalado Upscale Type = Tipo de escalado -UpscaleLevel Tip = Consume tanta CPU - Cierto escalado se retrasa para evitar cortes +UpscaleLevel Tip = Consume tanta CPU. Cierto escalado se retrasa para evitar caídas de cuadros. Use all displays = Usar todas las muestras Vertex Cache = Caché con Vértices -VertexCache Tip = Acelera, pero puede fallar temporalmente -VSync = VSync +VertexCache Tip = Acelera, pero puede causar parpadeos en ocasiones. +VSync = Sincronía vertical (VSync) Vulkan = Vulkan Window Size = Tamaño de ventana xBRZ = xBRZ @@ -548,18 +592,21 @@ Install = Instalar Install game from ZIP file? = ¿Instalar juego desde un archivo ZIP? Install textures from ZIP file? = ¿Instalar texturas desde un archivo ZIP? Installed! = ¡Instalado! -Texture pack doesn't support install = El paquete de texturas no es compatible con la instalación -Zip archive corrupt = Archivo ZIP corrupto -Zip file does not contain PSP software = El archivo ZIP no contiene software PSP +Texture pack doesn't support install = El paquete de texturas no es compatible con la instalación. +Zip archive corrupt = El archivo ZIP está dañado. +Zip file does not contain PSP software = El archivo ZIP no contiene software de PSP. [KeyMapping] Autoconfigure = Autoconfigurar Autoconfigure for device = Autoconfigurar para dispositivo +Bind All = Ocultar todo Clear All = Borrar todo Default All = Restaurar Map a new key for = Presiona una tecla para Map Key = Asignar tecla Map Mouse = Asignar ratón +Replace = Reemplazar +Show PSP = Mostrar PSP Test Analogs = Probar analogs You can press ESC to cancel. = Puedes presionar Esc para cancelar. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP está guardando en almacenamiento temporal SavesAreTemporaryGuidance = Extraer PPSSPP en cualquier parte para guardar para siempre SavesAreTemporaryIgnore = Ignorar advertencias UnpinPath = Desanclar +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Rotación analógica automática (CW) AxisSwap = Invertir ejes Circle = ○ Cross = × +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = PDM Abajo D-pad left = PDM Izquierda D-pad right = PDM Derecha D-pad up = PDM Arriba DevMenu = Menú Depuración +Double tap button = Botón de doble toque Down = Abajo Dpad = Punto de mira Frame Advance = Avanzar Frame @@ -631,10 +690,11 @@ OpenChat = Abrir chat Pause = Pausa R = R RapidFire = Disparo rápido +Record = Record Remote hold = Mantener remotamente Rewind = Retroceso Right = Derecha -Right Analog Stick (tap to customize) = Analog stick derecho\n(Toca para personalizar) +Right Analog Stick = Análogo derecho RightAn.Down = An.Der. abaj. RightAn.Left = An.Der. izq. RightAn.Right = An.Der. der. @@ -643,11 +703,16 @@ Rotate Analog (CCW) = Rotación analógica (CCW) Rotate Analog (CW) = Rotación analógica (CW) Save State = Guardar estado Screen = Pantalla -Screenshot = Capturapantalla +Screenshot = Capturar pantalla Select = Select SpeedToggle = Alternar veloc. Square = □ Start = Start +Swipe Down = Deslizar hacia abajo +Swipe Left = Deslizar hacia la izq. +Swipe Right = Deslizar hacia la der. +Swipe Up = Deslizar hacia arriba +tap to customize = tap to customize Texture Dumping = Dumpear textura Texture Replacement = Remplazo de textura Toggle Fullscreen = Alternar pantalla completa @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Actualmente contiene datos de PSP +Create or Choose a PSP folder = Seleccionar o crear carpeta PSP +Current = Actual +DataCanBeShared = Datos pueden moverse entre PPSSPP regular/Gold +DataCannotBeShared = ¡Datos NO pueden moverse entre PPSSPP regular/Gold! +DataWillBeLostOnUninstall = ADVERTENCIA: ¡Datos pueden borrarse al desinstalar PPSSPP! +DataWillStay = Datos pueden mantenerse incluso si desinstalas PPSSPP. +Done! = ¡Hecho! +EasyUSBAccess = Acceso USB fácil +Failed to move some files! = ¡Falló al mover algunos archivos! +Failed to save config = Falló al guardar configuración +Free space = Espacio disponible +Manually specify PSP folder = Especificar manualmente la carpeta PSP +MemoryStickDescription = Seleccionar donde se guarda los datos de PSP (Memory Stick) +Move Data = Mover datos +Selected PSP Data Folder = Carpeta de datos PSP seleccionado +No data will be changed = Sin cambios en los datos +PPSSPP will restart after the change = PPSSPP se reiniciará trás el cambio. +Skip for now = Saltar por ahora +Starting move... = Iniciando movida... +That folder doesn't work as a memstick folder. = Esa carpeta deja de funcionar como carpeta de Memory Stick. +USBAccessThrough = Acceso USB en la carpeta Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = Acceso USB en la carpeta Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Usar datos privados de la App +Use PSP folder at root of storage = Usar carpeta de PSP como carpeta raíz +Welcome to PPSSPP! = Bienvenido a PPSSPP! +WhatsThis = ¿Que es esto? + [Networking] -Adhoc Multiplayer forum = Visitar foro de juego en red -AdHoc Server = Servidor Ad Hoc -AdhocServer Failed to Bind Port = Servidor Ad hoc falló al unir puerto. +AdHoc Server = Servidor Adhoc +AdhocServer Failed to Bind Port = Servidor Adhoc falló al unir puerto. +AM: Data from Unknown Port = AM: Datos de puerto desconocido Auto = Auto Bottom Center = Abajo Bottom Left = Abajo Izquierda @@ -670,58 +764,63 @@ Bottom Right = Abajo Derecha Center Left = Izquierda Center Right = Derecha Change Mac Address = Cambiar dirección MAC -Change proAdhocServer Address = Cambiar dirección IP de\nservidor PRO ad hoc (localhost = multiples instancias) +Change proAdhocServer Address = Cambiar dirección IP de\nservidor PRO Adhoc (localhost = multiples instancias) Chat = Chat Chat Button Position = Posición del botón de chat -Chat Here = Escriba aquí +Chat Here = Escribe aquí +Chat message = Mensaje de Chat Chat Screen Position = Posición de la pantalla de chat -Disconnected from AdhocServer = Desconectado del servidor ad hoc +Disconnected from AdhocServer = Desconectado del servidor Adhoc DNS Error Resolving = Resolviendo error DNS -Enable built-in PRO Adhoc Server = Activar servidor ad hoc PRO integrado +Enable built-in PRO Adhoc Server = Activar servidor Adhoc PRO integrado Enable network chat = Activar chat de red Enable networking = Activar juego en red/WLAN\n(beta, puede dañar juegos) Enable UPnP = Activar UPnP (necesita algunos segundos para detectar) -EnableQuickChat = Activar quick chat -Enter a new PSP nickname = Ingrese un nuevo nombre de usuario de PSP +EnableQuickChat = Activar chat rápido +Enter a new PSP nickname = Ingresa un nuevo nombre de usuario de PSP Enter Quick Chat 1 = Entrar quick chat 1 Enter Quick Chat 2 = Entrar quick chat 2 Enter Quick Chat 3 = Entrar quick chat 3 Enter Quick Chat 4 = Entrar quick chat 4 Enter Quick Chat 5 = Entrar quick chat 5 Error = Error -Failed to Bind Localhost IP = Failed to bind localhost IP -Failed to Bind Port = Failed to bind port -Failed to connect to Adhoc Server = Fallo al conectar al servidor ad hoc +Failed to Bind Localhost IP = Fallo al unirse a la IP localhost +Failed to Bind Port = Fallo al unir puerto +Failed to connect to Adhoc Server = Fallo al conectar al servidor Adhoc Forced First Connect = Primera conexión forzada (más rápida) +GM: Data from Unknown Port = GM: Datos de puerto desconocido +Hostname = Hostname Invalid IP or hostname = IP o nombre de host no válido Minimum Timeout = Tiempo de espera mínimo (en ms, 0 = por defecto) Misc = Otros ajustes (por defecto = compatibilidad con PSP) Network Initialized = Juego en red iniciado +None = None Please change your Port Offset = Por favor cambia el offset del puerto. Port offset = Variar puerto de red (0 = compatibilidad con PSP) +PPSSPP Ad-Hoc Wiki Page = Página wiki sobre PPSSPP Ad-Hoc proAdhocServer Address: = Dirección del servidor Adhoc: -Quick Chat 1 = Quick chat 1 -Quick Chat 2 = Quick chat 2 -Quick Chat 3 = Quick chat 3 -Quick Chat 4 = Quick chat 4 -Quick Chat 5 = Quick chat 5 -QuickChat = Quick chat +Quick Chat 1 = Chat rápido 1 +Quick Chat 2 = Chat rápido 2 +Quick Chat 3 = Chat rápido 3 +Quick Chat 4 = Chat rápido 4 +Quick Chat 5 = Chat rápido 5 +QuickChat = Chat rápido Send = Enviar Send Discord Presence information = Enviar información al Discord "Rich Presence" -TCP No Delay = TCP No Delay (faster TCP) +TCP No Delay = TCP sin retrasos (más rápido) Top Center = Arriba Top Left = Arriba Izquierda Top Right = Arriba Derecha Unable to find UPnP device = No se encuentra el dispositivo UPnP UPnP (port-forwarding) = UPnP (redirección de puertos) -UPnP need to be reinitialized = UPnP debe reinicializarse +UPnP need to be reinitialized = La función de UPnP debe reinicializarse. UPnP use original port = Usar puerto UPnP de PSP (activado = más compatible con PSP ) Validating address... = Validando dirección ... WLAN Channel = Canal WLAN You're in Offline Mode, go to lobby or online hall = Estás en modo fuera de línea, ve al lobby o sala en línea [Pause] -Cheats = Trampas +Cheats = Trucos Continue = Continuar Create Game Config = Crear config. del juego Delete Game Config = Borrar config. del juego @@ -732,6 +831,8 @@ Rewind = Rebobinar Save State = Guardar estado Settings = Ajustes generales Switch UMD = Cambiar UMD +Undo last load = Deshacer carga de estado +Undo last save = Deshacer guard. de estado [PostShaders] (duplicated setting, previous slider will be used) = (configuraciones duplicadas, se usará la anterior) @@ -739,15 +840,15 @@ Switch UMD = Cambiar UMD 5xBR = 5×BR 5xBR-lv2 = 5×BR-lv2 AAColor = AA + Color -Amount = Amontonado +Amount = Cantidad Black border = Borde negro -Bloom = resplandecedor +Bloom = Resplandor Brightness = Brillo Cartoon = Caricaturas -ColorCorrection = Corregir color -Contrast = Contrast -CRT = Pantalla TV (CRT) -FXAA = FXAA Antialiasing +ColorCorrection = Corrección de color +Contrast = Contraste +CRT = Pantalla de tubo (CRT) +FXAA = Antialiasing por FXAA Gamma = Gamma Grayscale = Escala de grises Intensity = Intensidad @@ -756,14 +857,15 @@ Natural = Colores naturales NaturalA = Colores naturales (sin desenfoques) Off = Apagado Power = Power -PSPColor = PSP color -Saturation = Saturation -Scanlines = Líneas de escáneo (CRT) +PSPColor = Paleta de colores PSP +Saturation = Saturación +Scanlines = Líneas de escaneo (CRT) Sharpen = Afilado -SSAA(Gauss) = Supersampleado AA (Gauss) +SSAA(Gauss) = Super muestreo AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Escalado en Spline36 -VideoSmoothingAA = Vídeo suavizado AA +VideoSmoothingAA = Suavizado de vídeo AA Vignette = Viñeta [PSPCredits] @@ -796,8 +898,8 @@ tools = Software libre utilizado: # Add translators or contributors who translated PPSSPP into your language here. # Add translators1-6 for up to 6 lines of translator credits. # Leave extra lines blank. 4 contributors per line seems to look best. -translators1 = VR0 -translators2 = +translators1 = VR0, KAGE-008 +translators2 = translators3 = translators4 = translators5 = @@ -828,6 +930,8 @@ Stopping.. = Deteniendo... [Reporting] Bad = Mal +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Tus datos se están enviando al fondo. FeedbackDesc = ¿Cómo va el juego? ¡Que lo sepa la comunidad! FeedbackDisabled = El servidor de reportes debe activarse. @@ -853,8 +957,9 @@ Perfect Description = Perfecta emulación para este juego. Plays = Jugable Plays Description = Perfecta jugabilidad pero puede tener glitches. ReportButton = Informar de error +Show disc CRC = Show disc CRC Speed = Velocidad -Submit Feedback = Enviar feedback +Submit Feedback = Enviar comentario SuggestionConfig = Ver reportes en la web para una buena configuración. SuggestionCPUSpeed0 = Apagar bloqueo de velocidad CPU. SuggestionDowngrade = Volver a una versión de PPSSPP más antigua (por favor reportar error). @@ -864,28 +969,32 @@ SuggestionsWaiting = Enviando y verificando feedback de otros usuarios... SuggestionUpgrade = Actualizar a una build de PPSSPP más reciente. SuggestionVerifyDisc = Verifica que tu ISO es una copia válida del disco. Unselected Overall Description = ¿Como podrá emular este juego? -View Feedback = Ver feedback +View Feedback = Ver comentarios [Savedata] Date = Fecha Filename = Nombre de archivo No screenshot = No hay capturas de pantalla. None yet. Things will appear here after you save. = No hay datos. Una vez que guardes partida aparecerán aquí. +Nothing matching '%1' was found. = No se encuentra la coincidencia con '%1'. Save Data = Datos Save States = Estados Savedata Manager = Administrador de partidas guardadas +Showing matches for '%1'. = Mostrando coincidencias para '%1'. Size = Tamaño [Screen] Cardboard VR OFF = Cardboard VR apagado Chainfire3DWarning = ADVERTENCIA: Chainfire3D detectado, puede causar problemas. -Failed to load state = Error al abrir el estado -Failed to save state = Error al guardar el estado +Failed to load state = Error al abrir el estado. +Failed to save state = Error al guardar el estado. fixed = Velocidad: fija GLToolsWarning = ADVERTENCIA: GLTools detectado, puede causar problemas. In menu = En menú -Load savestate failed = Falló al abrir el estado -Loaded State = Cargado estado +Load savestate failed = Falló al abrir el estado. +Loaded State = Estado cargado. +Loaded. Game may refuse to save over different savedata. = Cargado. El juego puede no guardar sobre datos distintos. +Loaded. Game may refuse to save over newer savedata. = Cargado. El juego puede no guardar sobre datos más actuales. Loaded. Save in game, restart, and load for less bugs. = Cargado. Guarda la partida, reinicia, y recarga para menos bugs. LoadStateDoesntExist = Error al cargar: no existe el archivo. LoadStateWrongVersion = Error al cargar: archivo incompatible con esta versión o está dañado. @@ -900,6 +1009,7 @@ saveNewTextures_false = No se guarda las texturas. saveNewTextures_true = Las texturas se guardan en el almacenamiento local. SpeedCustom2 = VEL: Alternada 2 standard = VEL: Normal +State load undone = Se ha revertido la carga del estado. Untitled PSP game = Juego de PSP sin título. [Store] @@ -917,50 +1027,52 @@ Uninstall = Desinstalar %d bytes = %d bytes (none detected) = (No se ha detectado) 3D API = API 3D -ABI = ABI -API Version = Versión de la API +ABI = Arquitectura +API Version = Versión del API Audio Information = Info de audio Board = Placa -Build Config = Configuración de construcción -Build Configuration = Configuración de construcción -Built by = Construído por +Build Config = Info. de la compilación +Build Configuration = Info. de la compilación +Built by = Compilado por Core Context = Contexto de núcleo Cores = Núcleos CPU Extensions = Extensiones de CPU CPU Information = Info de CPU CPU Name = Nombre D3DCompiler Version = Versión del compilador D3D -Debug = Depuración +Debug = Desarrollo Debugger Present = Depurador presente Device Info = Info de dispositivo +Directories = Directorios Display Information = Info de tamaño Driver Version = Versión de driver EGL Extensions = Extensiones EGL -Frames per buffer = Frames por buffer +Frames per buffer = Cuadros por búfer GPU Information = Info de GPU -High precision float range = High precision float range -High precision int range = Rango interno de gran presición +High precision float range = Rango de alta precisión (flotante) +High precision int range = Rango de alta precisión (enteros) Lang/Region = Idioma/Región -Memory Page Size = Tamaño de páginado -Native Resolution = Resulusión nátiva +Memory Page Size = Tamaño de página de memoria +Native Resolution = Resolución nativa OGL Extensions = Extensiones OGL OpenGL ES 2.0 Extensions = Extensiones OpenGL ES 2.0 OpenGL ES 3.0 Extensions = Extensiones OpenGL ES 3.0 OpenGL Extensions = Extensiones OpenGL -Optimal frames per buffer = Frames por buffer Óptimos -Optimal sample rate = Rango de muestra óptima +Optimal frames per buffer = Cuadros por búfer óptimos +Optimal sample rate = Frecuencia de muestreo óptima OS Information = Info de sistema -PPSSPP build = Construcción de PPSSPP +PPSSPP build = Compilación de PPSSPP Refresh rate = Tasa de refresco -Release = Lanzamiento +Release = Estable RW/RX exclusive = Exclusivo de RW/RX Sample rate = Ratio de muestra Shading Language = Lenguaje de shader +Storage = Almacenamiento Sustained perf mode = Modo rendimiento sostenido System Information = Información del sistema System Name = Nombre System Version = Versión del sistema -Threads = Temas +Threads = Cantidad hilos Vendor = Vendor Vendor (detected) = Vendor (detectado) Version Information = Info de versión @@ -977,93 +1089,103 @@ AVI Dump started. = Grabación iniciada. AVI Dump stopped. = Grabación detenida. Cache ISO in RAM = Cargar ISO completa en RAM Change CPU Clock = Cambiar velocidad de CPU de PSP (inestable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: el estado es de otro juego. +Failed to load state for load undo. Error in the file system. = Falló la reversión del estado debido a un error del archivo. +Floating symbols = Símbolos flotantes +Memory Stick folder = Carpeta del Memory Stick +Memory Stick size = Tamaño del Memory Stick Change Nickname = Cambiar nombre de usuario ChangingMemstickPath = Datos de juego, estados guardados, y otros archivos no son copiados a esta carpeta.\n\n¿Quieres cambiar de carpeta de Memory Stick? ChangingMemstickPathInvalid = Esta carpeta no se usa para guardar archivos de Memory Stick. ChangingMemstickPathNotExists = No existe esta carpeta.\n\nDatos de juego, estados guardados, y otros archivos no son copiados a esta carpeta.\n\n¿Crearás una nueva carpeta de Memory Stick? -Cheats = Trampas +Cheats = Trucos Clear Recent = Destruir "recientes" Clear Recent Games List = Borrar lista de juegos recientes Clear UI background = Borrar fondo de interfaz Confirmation Button = Botón de confirmación Date Format = Formato de fecha Day Light Saving = Horario de verano -DDMMYYYY = DDMMYYYY +DDMMYYYY = Día/Mes/Año Decrease size = Reducir tamaño Developer Tools = Herramientas de desarrollador -Display Extra Info = Display extra info +Display Extra Info = Mostrar información adicional Display Games on a grid = Mostrar "Juegos" en una cuadrícula Display Homebrew on a grid = Mostrar "Homebrew y Demos" en una cuadrícula Display Recent on a grid = Mostrar "Reciente" en una cuadrícula Dynarec (JIT) = Dynarec (JIT) Emulation = Emulación -Enable Cheats = Activar trampas +Enable Cheats = Activar trucos Enable Compatibility Server Reports = Activar reportes de compatibilidad Failed to load state. Error in the file system. = Falló al cargar el estado. Hubo un fallo en el sistema de archivos. Failed to save state. Error in the file system. = Falló al guardar el estado. Hubo un fallo en el sistema de archivos. Fast (lag on slow storage) = Rápido (lag en almac. lento) Fast Memory = Memoria Rápida (inestable) Force real clock sync (slower, less lag) = Forzar sinc. real de reloj (lento, menos lag) -frames, 0:off = frames, 0 = apagar +frames, 0:off = frames, 0 = No Games list settings = Configuración de la lista de juegos General = General Grid icon size = Tamaño de icono de cuadrícula Help the PPSSPP team = Ayuda al equipo de PPSSPP Host (bugs, less lag) = Anfitrión (con bugs pero menos lag) -I/O on thread (experimental) = I/O on thread (experimental) -Ignore bad memory accesses = Ignore bad memory accesses +Ignore bad memory accesses = Ignorar malos accesos a la memoria Increase size = Aumentar tamaño -Interpreter = Interprete -IO timing method = Método de sincronización\nde E/S -IR Interpreter = Interprete IR +Interpreter = Intérprete +IO timing method = Método de sincronización de E/S +IR Interpreter = Intérprete IR Memory Stick Folder = Carpeta de Memory Stick Memory Stick inserted = Memory Stick insertada MHz, 0:default = MHz, 0 = por defecto -MMDDYYYY = MMDDYYYY +MMDDYYYY = Mes/Día/Año +Moving background = Fondo en movimiento Newest Save = Nuevos datos de guardado +No animation = Sin animación Not a PSP game = No es un juego de PSP -Off = Apagado +Off = No Oldest Save = Antiguos datos de guardado +Path does not exist! = La ruta no existe. +PSP Memory Stick = PSP Memory Stick PSP Model = Modelo de PSP PSP Settings = Ajustes de PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Juegos recientes Record Audio = Grabar Audio Record Display = Grabar pantalla Reset Recording on Save/Load State = Reiniciar grabación al abrir/guardar estados Restore Default Settings = Reestablecer ajustes -Rewind Snapshot Frequency = Frecuencia de retroceso de\ninstantánea (ahoga memoria) +Rewind Snapshot Frequency = Frecuencia de rebobinado\n(consume memoria) Save path in installed.txt = Guardar ruta en installed.txt -Save path in My Documents = Guardar ruta en Documents\n(Mis documentos en Windows XP) +Save path in My Documents = Guardar ruta en Documentos Savestate Slot = Ranura de estado guardado Savestate slot backups = Copias de seguridad de estado guardado Screenshots as PNG = Capturas en PNG Set UI background... = Colocar fondo de interfaz... Show ID = Mostrar ID Show region flag = Mostrar bandera de región -Simulate UMD delays = Simular retraso de UMD -Slot 1 = Slot 1 -Slot 2 = Slot 2 -Slot 3 = Slot 3 -Slot 4 = Slot 4 -Slot 5 = Slot 5 +Simulate UMD delays = Simular retraso del UMD +Slot 1 = Ranura 1 +Slot 2 = Ranura 2 +Slot 3 = Ranura 3 +Slot 4 = Ranura 4 +Slot 5 = Ranura 5 Storage full = Almacenamiento lleno Sustained performance mode = Modo de rendimiento sostenido Time Format = Formato de hora UI = Interfaz de usuario -UI Sound = UI sound +UI background animation = Animación del fondo de UI +UI Sound = Sonido de interfaz undo %c = Restaurar %c +USB = USB Use Lossless Video Codec (FFV1) = Usar codec de vídeo sin pérdida (FFV1) Use O to confirm = Confirmar con ○ Use output buffer (with overlay) for recording = Usar búfer de salida (con overlay) para grabar -Use system native keyboard = Use system native keyboard +Use system native keyboard = Usar teclado nativo del sistema Use X to confirm = Confirmar con × VersionCheck = Buscar actualizaciones de PPSSPP -WARNING: Android battery save mode is on = ADVERTENCIA: Modo ahorro activado en Android -WARNING: Battery save mode is on = ADVERTENCIA: Modo ahorro activado -YYYYMMDD = YYYYMMDD +WARNING: Android battery save mode is on = ADVERTENCIA: Modo ahorro de energía activado en Android +WARNING: Battery save mode is on = ADVERTENCIA: Modo ahorro de energía activado +Waves = Ondas +YYYYMMDD = Año/Mes/Día [Upgrade] Details = Detalles diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index bc590e6ce3..b48a5face4 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = ‎صدا (نیاز به ریستارت) API +Audio Error = Audio Error AudioBufferingForBluetooth = ‎بافر مناسب هندزفری بلوتوث (کند تر) Auto = ‎اتوماتیک Device = Device +Disabled = Disabled DSound (compatible) = ‎DSound (پشتیبانی بهتر) Enable Sound = ‎فعال کردن صدا Global volume = ‎بلندی صدا Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = ‎WASAPI (سریع) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = ‎حساسیت محور آنالوگ +Analog Binding = Analog Binding Analog Limiter = ‎محدود کننده آنالوگ Analog Mapper High End = ‎تنظیم حد بالای آنالوگ (حساسیت محور) Analog Mapper Low End = ‎تنظیم حد پایین آنالوگ (معکوس کننده ناحیه غیر فعال) Analog Mapper Mode = ‎نوع تنظیم کننده آنالوگ +Analog Settings = Analog Settings Analog Stick = ‎دسته آنالوگ +Analog Style = Analog Style AnalogLimiter Tip = ‎هنگامی که دکمه محدود کننده آنالوگ فشرده شود Auto = ‎اتوماتیک Auto-centering analog stick = ‎تنظیم مرکز آنالوگ به صورت خودکار Auto-hide buttons after seconds = ‎مخفی کردن دکمه ها به صورت خودکار (به ثانیه) +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = ‎شفافیت دکمه ها Button style = ‎تم دکمه ها +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = ‎کالیبره کردن +Calibrated = Calibrated Calibration = ‎کالیبره کردن +Circular stick input = Circular stick input Classic = ‎کلاسیک Combo Key Setting = ‎تنظیم کلید های ترکیبی Combo Key Setup = ‎تنظیم کلید های ترکیبی Confine Mouse = ‎محدود کردن موس به ناحیه درون پنجره Control Mapping = ‎تنظیمات کنترلر -Custom layout... = ‎...ویرایش چیدمان دکمه های تاچ +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = ‎...ویرایش چیدمان دکمه های تاچ Customize tilt = ‎تنظیمات شتاب سنج D-PAD = D-Pad -Deadzone Radius = ‎شعاع ناحیه غیر فعال +Deadzone radius = ‎شعاع ناحیه غیر فعال DInput Analog Settings = ‎DInput تنظیمات آنالوگ Disable D-Pad diagonals (4-way touch) = ‎غیر فعال کردن جهت های قطری (تاچ ۴ جهته) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = ‎لرزش +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = ‎هنگامی که پنجره فعال نباشد گیم پد کار نکند Ignore Windows Key = ‎غیر فعال کردن کلید ویندوز Invert Axes = ‎معکوس کردن محورها @@ -55,6 +77,7 @@ L/R Trigger Buttons = ‎L/R دکمه های Landscape = ‎افقی Landscape Auto = Landscape auto Landscape Reversed = ‎افقی وارونه +Low end radius = Low end radius Mouse = ‎تنظیمات موس Mouse sensitivity = ‎حساسیت موس Mouse smoothing = ‎روان کردن حرکت موس @@ -65,21 +88,32 @@ OnScreen = ‎نمایش کنترل های لمسی Portrait = ‎عمودی Portrait Reversed = ‎عمودی وارونه PSP Action Buttons = ‎Action دکمه های +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = ‎چرخش صفحه seconds, 0 : off = ‎به ثانیه، 0 : خاموش +Sensitivity (scale) = Sensitivity (scale) Sensitivity = ‎حساسیت +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = ‎نمایش دکمه توقف بازی +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = ‎حاشیه نازک Tilt Base Radius = Tilt base radius Tilt Input Type = ‎...استفاده از شتاب سنج به عنوان Tilt Sensitivity along X axis = ‎X حساسیت شتاب سنج در جهت Tilt Sensitivity along Y axis = ‎Y حساسیت شتاب سنج در جهت To Calibrate = ‎برای کالیبره کردن، دستگاه را روی سطح صافی گذاشته و "کالیبره کردن" را بزنید +Toggle mode = Toggle mode Touch Control Visibility = ‎نشان دادن دکمه های تاچ Use custom right analog = Use custom right analog Use Mouse Control = ‎استفاده از موس Visibility = ‎نمایش +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = ‎XInput تنظیمات آنالوگ @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = ‎...PPSSPP درباره Auto = ‎اتوماتیک +Auto Max Quality = Auto Max &Quality Backend = ‎Rendering &Backend (ریستارت میشود PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = ‎...تنظیمات بیشتر Nearest = ‎نزدیک ترین Non-Buffered Rendering = ‎رد کردن اثرات بافر (سریع تر) Off = ‎خاموش +Open Chat = Open Chat Open Directory... = ‎... بازکردن مسیر Open from MS:/PSP/GAME... = ‎MS:/PSP/GAME... بازکردن از Open Memory Stick = ‎بازکردن مموری استیک @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = ‎آیا شما می خواهید که تمامی تنظیمات به حالت اولیه خود باز گردند؟\n.تنظیمات کنترلر هیچ تغییری نمی کنند\n\n\n.تنظیمات دیگر قابل بازیابی نخواهند بود\n.پس از تایید شبیه ساز را دوباره راه اندازی کنید RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = ‎در حال حذف کردن\n...منتظر بمانید Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = ‎ورود +Filter = Filter Finish = ‎پایان +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = ‎ذخیره Save completed = ‎.ذخیره تکمیل شد Saving = ‎در حال ذخیره\n...منتظر بمانید SavingFailed = Unable to save data. +Search = Search Select = ‎انتخاب Shift = ‎تغییر +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = ‎\n.فشرده سازی شده است ZIP [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = ‎ساخت میانبر @@ -430,6 +473,7 @@ Auto = ‎اتوماتیک Auto (1:1) = Auto (1:1) Auto (same as Rendering) = ‎خودکار (مانند رزولوشن رندرینگ) Auto FrameSkip = ‎پرش فریم خودکار +Auto Max Quality = Auto Max Quality Auto Scaling = ‎تنظیم سایز خودکار Backend = ‎گرافیکی API Balanced = ‎متعادل @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = ‎پاکسازی همه Default All = ‎پیشفرض همه Map a new key for = ‎برای این دکمه یک کلید انتخاب کنید Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = ‎وبسایت شبیه ساز [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Down Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = RapidFire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = SpeedToggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = ‎به عقب رفتن Save State = ‎ذخیره سریع Settings = ‎تنظیمات Switch UMD = ‎تغییر دیسک +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = ‎بارگیری شد +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = ‎!خطا در بارگیری: هیچ ذخیره ی سریعی پیدا نشد LoadStateWrongVersion = ‎!است PPSSPP خطا در بارگیری: ذخیره موجود برای ورژن های پایین تر @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = ‎سرعت: استاندارد +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = ‎در رم ISO کش کردن کل Change CPU Clock = ‎(ناپایدار) CPU تغییر سرعت -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = ‎تغییر نام ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = ‎عمومی Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = ‎دستگاه (دارای باگ، لگ کمتر) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = ‎گذاشته شده PSP مموری در MHz, 0:default = MHz, 0 = ‎پیش فرض MMDDYYYY = ‎سال/روز/ماه +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = ‎نیست PSP بازی Off = ‎خاموش Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = ‎PSP مدل PSP Settings = ‎PSP تنظیمات PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = ‎ضبط صدا Record Display = ‎ضبط صفحه Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = ‎حاقظه پر است Sustained performance mode = Sustained performance mode Time Format = ‎فرمت زمان UI = ‎زبان برنامه +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = ‎برای قبول کردن O استفاده از Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = ‎برای قبول کردن X استفاده از VersionCheck = ‎PPSSPP بررسی آخرین ورژن WARNING: Android battery save mode is on = ‎هشدار: حالت ذخیره باتری اندروید فعال است WARNING: Battery save mode is on = ‎هشدار: حالت ذخیره باتری فعال است +Waves = Waves YYYYMMDD = ‎روز/ماه/سال [Upgrade] diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 9e77589ad4..b0dc5389a6 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Ota äänet käyttöön Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Painikkeiden peittävyys Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Control mapping -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Kosketusnäytön kontrollit Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &Directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Poistetaan\nOdota... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Enter +Filter = Filter Finish = Valmis +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = Tallennus onnistui. Saving = Tallentaa\nOdota... SavingFailed = Unable to save data. +Search = Search Select = Valitse Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Create shortcut @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Clear all Default All = Restore defaults Map a new key for = Map a new key for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Tallenna tilanne Settings = Asetukset Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = Tilanne ladattu +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Tilanteen lataaminen epäonnistui: Tallennusta ei ole olemassa! LoadStateWrongVersion = Tilanteen lataaminen epäonnistui: Tallennus on vanhemmalle PPSSPP-versiolle! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Nopeus: normaali +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Vaihda nimimerkkiä ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = General Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP settings PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Time format UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Use O as confirmation button Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Use X as confirmation button VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 0d4fb9dd62..86b1667ea9 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = Volume en vitesse alternative Audio backend = Back-end du son (redémarrage requis) +Audio Error = Audio Error AudioBufferingForBluetooth = Mémoire tampon adaptée au Bluetooth (+ lent) Auto = Automatique Device = Périphérique de sortie +Disabled = Disabled DSound (compatible) = DirectSound (compatible) Enable Sound = Activer le son Global volume = Volume global Microphone = Micro Microphone Device = Micro Mute = Muet -Switch on new audio device = Basculer sur le nouveau périphérique de sortie +Reverb volume = Reverb volume +Use new audio devices automatically = Basculer sur le nouveau périphérique de sortie Use global volume = Utiliser le volume global WASAPI (fast) = WASAPI (rapide) [Controls] -Analog auto-rotation speed = Vitesse de rotation automatique du stick analogique +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = Vitesse de rotation automatique du stick analogique Analog Axis Sensitivity = Sensibilité des axes analogiques Analog Limiter = Limiteur analogique Analog Mapper High End = Assignation analogique avancée (sensibilité des axes) @@ -26,24 +32,40 @@ AnalogLimiter Tip = Quand le bouton "Limiteur analogique" est pressé Auto = Automatique Auto-centering analog stick = Centrage automatique du stick analogique Auto-hide buttons after seconds = Cacher automatiquement les boutons après... +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Assignation +Button Binding = Button Binding Button Opacity = Transparence des boutons Button style = Style des boutons +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Étalonner +Calibrated = Calibrated Calibration = Étalonnage +Circular stick input = Circular stick input Classic = Classique Combo Key Setting = Paramétrage des touches combo Combo Key Setup = Paramétrer les touches combo Confine Mouse = Capturer la souris dans la fenêtre/zone d'affichage Control Mapping = Réassignation des touches -Custom layout... = Disposition personnalisée... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Disposition personnalisée... Customize tilt = Personnaliser inclinaison analogique... D-PAD = Croix directionnelle -Deadzone Radius = Rayon de la zone morte +Deadzone radius = Rayon de la zone morte DInput Analog Settings = Réglages analogiques DirectInput Disable D-Pad diagonals (4-way touch) = Désactiver les diagonales de la croix directionnelle +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Bordures lumineuses HapticFeedback = Retour haptique (vibrations) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignorer manettes si non ciblé Ignore Windows Key = Ignorer la touche Windows (désactive le Menu Démarrer) Invert Axes = Inversement des axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = Gâchettes L/R Landscape = Paysage Landscape Auto = Paysage automatique Landscape Reversed = Paysage inversé +Low end radius = Low end radius Mouse = Paramètres de la souris Mouse sensitivity = Sensibilité de la souris Mouse smoothing = Lissage du déplacement de la souris @@ -65,21 +88,32 @@ OnScreen = Commandes tactiles Portrait = Portrait Portrait Reversed = Portrait inversé PSP Action Buttons = Boutons d'action +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotation de l'écran seconds, 0 : off = secondes, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensibilité +Shape = Shape Show right analog = Afficher le stick droit Show Touch Pause Menu Button = Afficher le bouton Pause tactile +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Bordures fines Tilt Base Radius = Modifier la zone morte avec l'inclinaison analogique Tilt Input Type = Type inclinaison analogique Tilt Sensitivity along X axis = Sensibilité de l'inclinaison analogique sur l'axe X Tilt Sensitivity along Y axis = Sensibilité de l'inclinaison analogique sur l'axe Y To Calibrate = Pour étalonner, poser l'appareil sur une surface plane et presser "Étalonner". +Toggle mode = Toggle mode Touch Control Visibility = Visibilité des commandes tactiles Use custom right analog = Utiliser le stick droit personnalisé Use Mouse Control = Utiliser la souris dans les jeux Visibility = Visibilité +Visible = Visible X = Axe X X + Y = Axe X + axe Y XInput Analog Settings = Réglages analogiques XInput @@ -99,6 +133,7 @@ Refresh Rate = Taux de rafraîchissement #Font = ??? About PPSSPP... = &À propos de PPSSPP... Auto = &Automatique +Auto Max Quality = Auto Max &Quality Backend = Rendu &back-end (redémarre PPSSPP) Bicubic = &Bicubique Break = Arrêter @@ -150,6 +185,7 @@ More Settings... = &Plus de paramètres... Nearest = Le plus &proche Non-Buffered Rendering = &Pas d'effets en mémoire tampon (hack de vitesse) Off = &Désactivé +Open Chat = Open Chat Open Directory... = Ouvrir &répertoire... Open from MS:/PSP/GAME... = Ouvrir depuis ms0:/PSP/&GAME/... Open Memory Stick = Ouvrir la &Memory Stick @@ -229,6 +265,7 @@ No block = Pas de bloc Prev = Précédent Random = Aléatoire Replace textures = Remplacer les textures +Reset = Reset Reset limited logging = Réinitialiser le journal limité RestoreDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres (sauf\nla réassignation des commandes) par défaut ?\n\nVous ne pourrez pas revenir en arrière.\nVeuillez redémarrer PPSSPP pour appliquer\nles changements. RestoreGameDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres\nspécifiques au jeu à leur valeur par défaut de PPSSPP ? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Voulez-vous vraiment supprimer les paramètres pour ce DeleteFailed = Suppression impossible. Deleting = Suppression\nVeuillez patienter... Disable All = Tout désactiver +Dumps = Dumps Edit = Éditer Enable All = Tout activer Enter = Entrer +Filter = Filter Finish = Terminer +GE Frame Dumps = GE Frame Dumps Grid = Grille Inactive = Inactif InternalError = Une erreur interne est survenue. @@ -300,8 +340,10 @@ Save = Sauvegarder Save completed = Sauvegarde terminée. Saving = Sauvegarde\nVeuillez patienter... SavingFailed = Sauvegarde impossible. +Search = Search Select = Sélectionner Shift = Majuscule +Skip = Skip Snap = Aligner Space = Espace SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Le fichier est compressé (.zip).\nVeuillez [Game] Asia = Asie +Calculate CRC = Calculate CRC ConfirmDelete = Confirmer Create Game Config = Créer config. de jeu Create Shortcut = Créer un raccourci @@ -430,6 +473,7 @@ Auto = Automatique Auto (1:1) = Automatique (1:1) Auto (same as Rendering) = Automatique (comme la définition du rendu) Auto FrameSkip = Saut d'images automatique +Auto Max Quality = Auto Max Quality Auto Scaling = Mise à l'échelle auto Backend = Rendu back-end Balanced = Équilibré @@ -555,11 +599,14 @@ Zip file does not contain PSP software = Le fichier ZIP ne contient pas de logic [KeyMapping] Autoconfigure = Configuration automatique Autoconfigure for device = Configuration automatique pour l'appareil +Bind All = Bind All Clear All = Réinitialiser Default All = Par défaut Map a new key for = Choisir une nouvelle touche pour Map Key = Assigner une touche Map Mouse = Assigner un contrôle de souris +Replace = Replace +Show PSP = Show PSP Test Analogs = Tester sticks You can press ESC to cancel. = Vous pouvez presser "Échap" pour annuler. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP sauvegarde actuellement dans un emplacement temporair SavesAreTemporaryGuidance = Extrayez PPSSPP quelque part pour sauvegarder de façon permanente SavesAreTemporaryIgnore = Ignorer l'avertissement UnpinPath = Détacher +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = Visiter le site officiel [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Rotation auto stick analogique (horaire) AxisSwap = Inverser axes Circle = Rond Cross = Croix +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = Bas croix directionnelle D-pad left = Gauche croix directionnelle D-pad right = Droite croix directionnelle D-pad up = Haut croix directionnelle DevMenu = Outils développement +Double tap button = Double tap button Down = Bas Dpad = Croix directionnelle Frame Advance = Avance d'image @@ -631,10 +690,11 @@ OpenChat = Ouvrir chat Pause = Pause R = R RapidFire = Tir rapide +Record = Record Remote hold = Verrouillage distant Rewind = Rembobiner Right = Droite -Right Analog Stick (tap to customize) = Stick analogique droit (toucher pour personnaliser) +Right Analog Stick = Right Analog Stick RightAn.Down = Bas stick droit RightAn.Left = Gauche stick droit RightAn.Right = Droite stick droit @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Choix vitesse Square = Carré Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Extraire textures Texture Replacement = Remplacer textures Toggle Fullscreen = Plein écran @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visiter le forum "Ad Hoc Multiplayer" AdHoc Server = Serveur ad hoc AdhocServer Failed to Bind Port = Échec de liaison du port par le serveur ad hoc +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Automatique Bottom Center = En bas au centre Bottom Left = En bas à gauche @@ -674,6 +768,7 @@ Change proAdhocServer Address = Modifier l'adresse IP du serveur ad hoc (localho Chat = Chat Chat Button Position = Position du bouton de chat Chat Here = Écrire ici +Chat message = Chat message Chat Screen Position = Position de la zone de chat Disconnected from AdhocServer = Déconnecté du serveur ad hoc DNS Error Resolving = Erreur DNS pour résoudre @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Échec de liaison de l'IP localhost Failed to Bind Port = Échec de liaison du port Failed to connect to Adhoc Server = Échec de connexion au serveur ad hoc Forced First Connect = Première connexion forcée (connexion plus rapide) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = IP ou nom de domaine invalide Minimum Timeout = Temps d'expiration minimum (forçage en ms, 0 = par défaut) Misc = Divers (par défaut = compatibilité PSP) Network Initialized = Réseau initialisé ! +None = None Please change your Port Offset = Veuillez changer votre décalage de port Port offset = Décalage de port (0 = compatibilité PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Adresse du serveur ad hoc : Quick Chat 1 = Chat rapide 1 Quick Chat 2 = Chat rapide 2 @@ -732,6 +831,8 @@ Rewind = Rembobinage Save State = Sauvegarder état Settings = Paramètres Switch UMD = Changer d'UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (paramètre dupliqué, l'ajustement précédent sera utilisé) @@ -762,6 +863,7 @@ Scanlines = Lignes de balayage Sharpen = Plus net SSAA(Gauss) = Anticrénelage supersampling (Gauss) Tex4xBRZ = 4×BRZ +TexMMPX = MMPX UpscaleSpline36 = Upscaling Spline36 VideoSmoothingAA = Anticrénelage des vidéos Vignette = Vignette @@ -819,6 +921,8 @@ Stopping.. = Arrêt en cours... [Reporting] Bad = Mauvais +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Transmission des données en tâche de fond... FeedbackDesc = Comment est l'émulation ? Partagez vos impressions avec nous et la communauté ! FeedbackDisabled = L'envoi des rapports de compatibilité doit être activé. @@ -844,6 +948,7 @@ Perfect Description = Émulation parfaite pour le jeu entier, super ! Plays = Jouable Plays Description = Pleinement jouable mais bugs possibles ReportButton = Évaluer l'émulation +Show disc CRC = Show disc CRC Speed = Vitesse Submit Feedback = Envoyer l'évaluation SuggestionConfig = Consultez les rapports sur le site pour de meilleurs paramètres. @@ -862,9 +967,11 @@ Date = Date Filename = Nom de fichier No screenshot = Pas de capture d'écran None yet. Things will appear here after you save. = Rien à afficher pour le moment.\nDes choses apparaîtront ici lorsque vous sauvegarderez. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Sauvegardes Save States = États Savedata Manager = Gestionnaire de sauvegardes +Showing matches for '%1'. = Showing matches for '%1'. Size = Taille [Screen] @@ -877,6 +984,8 @@ GLToolsWarning = Avertissement : GLTools détecté, cela peut poser des problèm In menu = Dans les menus Load savestate failed = Échec du chargement de l'état Loaded State = État chargé ! +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Chargé.\nSauvegarder dans le jeu, redémarrer,\net charger la sauvegarde pour moins de bugs. LoadStateDoesntExist = Échec du chargement de l'état :\nl'état n'existe pas ! LoadStateWrongVersion = Échec du chargement de l'état :\nl'état appartient à une ancienne version de PPSSPP ! @@ -891,6 +1000,7 @@ saveNewTextures_false = La sauvegarde des textures a été désactivée. saveNewTextures_true = Les textures seront maintenant sauvegardées\nsur votre espace de stockage. SpeedCustom2 = Vitesse alternative 2 standard = Vitesse normale +State load undone = State load undone Untitled PSP game = Jeu PSP sans titre [Store] @@ -924,6 +1034,7 @@ D3DCompiler Version = Version de D3DCompiler Debug = Débogage Debugger Present = Débogueur présent Device Info = Informations sur l'appareil +Directories = Directories Display Information = Informations d'affichage Driver Version = Version du pilote EGL Extensions = Extensions EGL @@ -947,6 +1058,7 @@ Release = Release RW/RX exclusive = Exclusif RW/RX Sample rate = Taux d'échantillonnage Shading Language = Language de shading +Storage = Storage Sustained perf mode = Mode performance prolongée System Information = Informations système System Name = Nom @@ -968,8 +1080,11 @@ AVI Dump started. = Dump AVI démarré AVI Dump stopped. = Dump AVI stoppé Cache ISO in RAM = Mettre l'ISO en cache dans la RAM Change CPU Clock = Fréquence du CPU de la PSP émulé (instable) -Change Memory Stick folder = Changer le dossier de la Memory Stick -Change Memory Stick Size = Changer la taille de la Memory Stick (Go) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Changer le dossier de la Memory Stick +Memory Stick size = Changer la taille de la Memory Stick (Go) Change Nickname = Changer de pseudo ChangingMemstickPath = Les sauvegardes, états, et autres données ne peuvent pas être enregistrés dans ce dossier.\n\nChanger le dossier de la Memory Stick ? ChangingMemstickPathInvalid = Ce chemin ne peut pas être utilisé pour enregistrer des fichiers de la Memory Stick. @@ -1003,7 +1118,6 @@ General = Général Grid icon size = Taille des icônes Help the PPSSPP team = Aider l'équipe de PPSSPP Host (bugs, less lag) = Hôte (bugs, moins de lag) -I/O on thread (experimental) = Entrées/Sorties sur fil d'exécution Ignore bad memory accesses = Ignorer les mauvais accès mémoire Increase size = Augmenter la taille Interpreter = Interpréteur @@ -1013,14 +1127,19 @@ Memory Stick Folder = Dossier de la Memory Stick Memory Stick inserted = Memory Stick insérée MHz, 0:default = MHz, 0 = par déf. MMDDYYYY = MMJJAAAA +Moving background = Moving background Newest Save = Le plus récent état +No animation = No animation Not a PSP game = Ce n'est pas un jeu PSP. Off = Désactivé Oldest Save = Le plus ancien état +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Modèle de PSP PSP Settings = Paramètres de la PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Enregistrer le son Record Display = Enregistrer l'affichage Reset Recording on Save/Load State = Redémarrer l'enregistrement lors de la sauvegarde/chargement d'état @@ -1044,8 +1163,10 @@ Storage full = Espace de stockage plein. Sustained performance mode = Mode performance prolongée Time Format = Format de l'heure UI = Interface utilisateur +UI background animation = UI background animation UI Sound = Sons de l'interface utilisateur undo %c = secours %c +USB = USB Use Lossless Video Codec (FFV1) = Utiliser un codec vidéo sans perte (FFV1) Use O to confirm = Utiliser O Use output buffer (with overlay) for recording = Utiliser une mémoire tampon pour l'enregistrement (inclut les messages) @@ -1054,6 +1175,7 @@ Use X to confirm = Utiliser X VersionCheck = Vérifier s'il existe une nouvelle version de PPSSPP WARNING: Android battery save mode is on = AVERTISSEMENT : Le mode d'économie de batterie d'Android est activé. WARNING: Battery save mode is on = AVERTISSEMENT : Le mode d'économie de batterie est activé. +Waves = Waves YYYYMMDD = AAAAMMJJ [Upgrade] diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index a9c9ecbe68..49de157da5 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Motor de audio (require reiniciar) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Automático Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Activar son Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (rápido) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Limitador analóxico Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Stick analóxico +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Automática Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Transparencia de botóns Button style = Estilo de botóns +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrar +Calibrated = Calibrated Calibration = Calibración +Circular stick input = Circular stick input Classic = Clásico Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Asignar botóns -Custom layout... = Deseño personalizado... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Deseño personalizado... Customize tilt = Personalizar acelerómetro D-PAD = D-Pad -Deadzone Radius = Radio de zona inactiva +Deadzone radius = Radio de zona inactiva DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Desactivar diagonais do D-Pad +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Vibración háptica +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Ignorar tecla de Windows Invert Axes = Invertir eixes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Horizontal Landscape Auto = Landscape auto Landscape Reversed = Horizontal invertido +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Controis táctiles en pantalla Portrait = Vertical Portrait Reversed = Vertical invertido PSP Action Buttons = Botóns de acción +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotación de pantalla seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensibilidade +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Mostrar botón de menú +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Bordes finos Tilt Base Radius = Tilt base radius Tilt Input Type = Tipo de control do acelerómetro Tilt Sensitivity along X axis = Sensibilidade de inclinación do eixe X Tilt Sensitivity along Y axis = Sensibilidade de inclinación do eixe Y To Calibrate = Para calibrar, pon o aparello nunha superficie plana e presiona "Calibrar". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Mostrar... +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Frecuencia de actualización #Font = Trebuchet MS About PPSSPP... = &Acerca de PPSSPP... Auto = &Automático +Auto Max Quality = Auto Max &Quality Backend = Motor &gráfico (require reiniciar) Bicubic = &Bicúbico Break = Break @@ -150,6 +185,7 @@ More Settings... = Máis &opcións... Nearest = &Cercano Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Non +Open Chat = Open Chat Open Directory... = &Abrir carpeta... Open from MS:/PSP/GAME... = A&brir dende ms0:/PSP/GAME... Open Memory Stick = Abrir &Memory Stick @@ -229,6 +265,7 @@ No block = Non bloquear Prev = Anterior Random = Aleatorio Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Seguro que queres volver ós axustes de fábrica?\nOs cambios nos controis non se borrarán.\n\nNon podes desfacer isto.\nReinicia PPSSPP para que os cambios teñan efecto. RestoreGameDefaultSettings = Seguro que queres reestablecer os axustes do xogo\nós axustes por defecto de PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Seguro que queres borrar a configuración deste xogo? DeleteFailed = Os datos non se puideron borrar. Deleting = Borrando\nEspera un momento... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Intro +Filter = Filter Finish = Terminar +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Gardar Save completed = Gardado completado. Saving = Gardando\nAgarda un momento... SavingFailed = Os datos non se puideron gardar. +Search = Search Select = Seleccionar Shift = Alternar +Skip = Skip Snap = Snap Space = Espacio SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Arquivo comprimido (ZIP).\nNecesita ser des [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Confirmar Create Game Config = Crear config. do xogo Create Shortcut = Crear acceso directo @@ -430,6 +473,7 @@ Auto = Automático Auto (1:1) = Automático (1:1) Auto (same as Rendering) = Automático (igual á de renderizado) Auto FrameSkip = Salto de cadros automático +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Motor gráfico Balanced = Balanceado @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Autoconfigurar Autoconfigure for device = Autoconfigurar para dispositivo +Bind All = Bind All Clear All = Borrar todo Default All = Restaurar Map a new key for = Pulsa unha tecla para Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Probar analóx. You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = Sitio oficial [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Invertir eixes Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = D-Pad Abaixo Dpad = D-Pad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pausa R = R RapidFire = Fogo rápido +Record = Record Remote hold = Remote hold Rewind = Rebobinar Right = D-Pad Dereita -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = AnDer.Abaixo RightAn.Left = AnDer.Esquerda RightAn.Right = AnDer.Dereita @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Alternar veloc. Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visitar foro de xogo en rede AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Cambiar IP de proAdhocServer (localhost = multip Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Rede inicializada +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rebobinar Save State = Gardar estado Settings = Axustes xerais Switch UMD = Cambiar UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Afiado SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 «upscaler» VideoSmoothingAA = VideoSmoothingAA Vignette = Viñeta @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Malos +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = Como vai o xogo? Que o saiba a comunidade! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Xogable Plays Description = Fully playable but might be with glitches ReportButton = Informar de erro +Show disc CRC = Show disc CRC Speed = Velocidade Submit Feedback = Enviar informe SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = AVISO: GLTools detectado, pode causar problemas. In menu = In menu Load savestate failed = Erro ó cargar o estado gardado Loaded State = Estado cargado +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Erro ó cargar o estado: non existe o arquivo. LoadStateWrongVersion = Erro ó cargar o estado: o arquivo é dunha versión anterior de PPSSPP. @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Velocidad: estándar +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cargar ISO completa en RAM Change CPU Clock = Velocidade CPU PSP (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Cambiar alcume PSP ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Xeral Grid icon size = Grid icon size Help the PPSSPP team = Axuda ó equipo de PPSSPP Host (bugs, less lag) = Anfitrión (Erros, menos lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MM/DD/AAAA +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Modelo de PSP PSP Settings = Axustes de PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Formato de hora UI = Interfaz de usuario +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Confirmar co botón O Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Confirmar co botón X VersionCheck = Buscar actualizacións de PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = AAAA/MM/DD [Upgrade] diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 418a988740..bd7a60a15f 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Backend ήχου (Απ. Επανεκκίνηση) +Audio Error = Audio Error AudioBufferingForBluetooth = Buffer φιλικό για Bluetooth (αργό) Auto = Αυτόματο Device = Συσκευή +Disabled = Disabled DSound (compatible) = DSound (συμβατό) Enable Sound = Ενεργοποίηση Ήχου Global volume = Γενική ένταση Microphone = Microphone Microphone Device = Microphone device Mute = Σίγαση -Switch on new audio device = Ενεργοποίηση νέας συσκευής ήχου +Reverb volume = Reverb volume +Use new audio devices automatically = Ενεργοποίηση νέας συσκευής ήχου Use global volume = Χρήση γενικής έντασης WASAPI (fast) = WASAPI (γρήγορο) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Ευαισθησία αναλογικού άξονα +Analog Binding = Analog Binding Analog Limiter = Περιορισμός αναλογικού Analog Mapper High End = High-end mapper αναλογικού μοχλού (Ευαισθησία αξόνων) Analog Mapper Low End = Low-end mapper αναλογικού μοχλού (αντιστροφή ορίων) Analog Mapper Mode = Λειτουργία mapper αναλογικού +Analog Settings = Analog Settings Analog Stick = Αναλογικός μοχλός +Analog Style = Analog Style AnalogLimiter Tip = Όταν το κουμπί περιορισμού αναλογικού είναι πατημένο Auto = Αυτόματο Auto-centering analog stick = Αυτόματος κεντρισμός αναλογικού μοχλού Auto-hide buttons after seconds = Αυτόματη απόκρυψη κουμπιών (χρονικό όριο) +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Διαφάνεια Κουμπιών Button style = Στυλ Κουμπιών +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Βαθμονόμηση +Calibrated = Calibrated Calibration = Βαθμονόμηση ψηφιακού πληκρολογίου +Circular stick input = Circular stick input Classic = Κλασικό Combo Key Setting = Ρύθμιση συνδιασμού κουμπιών Combo Key Setup = Διάταξη συνδιασμού κουμπιών Confine Mouse = Εγκλωβισμός ποντικιού μέσα στην περιοχή παραθύρου/οθόνης Control Mapping = Χαρτογράφηση κουμπιών -Custom layout... = Προσαρμοσμένη διάταξη... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Προσαρμοσμένη διάταξη... Customize tilt = Προσαρμογή κλίσης... D-PAD = Ψηφιακό πληκτρολόγιο -Deadzone Radius = Ακτίνα ορίων +Deadzone radius = Ακτίνα ορίων DInput Analog Settings = Ρυθμίσεις Αναλογικού DInput Disable D-Pad diagonals (4-way touch) = Απενεργοποίηση διαγωνίων ψηφιακού πληκρολογίου +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Φωτιζόμενα σύνορα HapticFeedback = Απτική Ανάδραση (δόνηση) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Αγνόηση χειριστήριου όταν το παράθυρο δεν είναι σε πρώτο πλάνο Ignore Windows Key = Αγνόηση πλήκτρου Windows Invert Axes = Αντιστροφή αξόνων @@ -55,6 +77,7 @@ L/R Trigger Buttons = Πλήκτρα σκανδάλης L/R Landscape = Τοπίο Landscape Auto = Τοπίο αυτόματο Landscape Reversed = Τοπίο (αναστροφή) +Low end radius = Low end radius Mouse = Ρυθμίσεις ποντικιού Mouse sensitivity = Ευαισθησία ποντικιού Mouse smoothing = Εξομάλυνση ποντικιού @@ -65,21 +88,32 @@ OnScreen = Χειριστήριο Οθόνης Αφής Portrait = Πορτραίτο Portrait Reversed = Πορτραίτο (αναστροφή) PSP Action Buttons = Πλήκτρα δράσης PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Περιστροφή οθόνης seconds, 0 : off = δευτερόλεπτα, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Ευαισθησία +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Εμφάνιση απτικού κουμπιού μενού παύσης +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Λεπτά διαχωριστικά Tilt Base Radius = Tilt base radius Tilt Input Type = Τύπο εισόδου κλίσης Tilt Sensitivity along X axis = Ευαισθησία οριζόντιου άξονα Tilt Sensitivity along Y axis = Ευαισθησία κάθετου άξονα To Calibrate = Για τη βαθμονόμηση, αφήστε τη συσκευή σε μια επίπεδη επιφάνεια και πατήστε "Βαθμονόμηση". +Toggle mode = Toggle mode Touch Control Visibility = Ορατότητα πλήκτρων αφής Use custom right analog = Use custom right analog Use Mouse Control = Χρήση ελέγχου του ποντικιού Visibility = Ορατότητα +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Ρυθμίσεις Αναλογικού XInput @@ -99,6 +133,7 @@ Refresh Rate = Ρυθμός ανανέωσης #Font = Trebuchet MS About PPSSPP... = &Περί του PPSSPP... Auto = &Αυτόματο +Auto Max Quality = Auto Max &Quality Backend = Σύστημα Υποστήριξης (επανεκκινεί το PPSSPP) Bicubic = &Διακυβική Break = Break @@ -150,6 +185,7 @@ More Settings... = Περισσότερες Ρυθμίσεις... Nearest = Κοντινότερο Non-Buffered Rendering = &Παράκαμψη εφέ buffer (γρηγορότερο) Off = &Off +Open Chat = Open Chat Open Directory... = Άνοιγμα Φακέλου... Open from MS:/PSP/GAME... = Άνοιγμα από MS:/PSP/GAME... Open Memory Stick = Άνοιγμα Memory Stick @@ -229,6 +265,7 @@ No block = Κανένα block Prev = Προηγούμενο Random = Τυχαίο Replace textures = Αντικαταστήστε τις υφές +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Είστε σίγουροι ότι θέλετε να επαναφέρετε όλες τις ρυθμίσεις πίσω στις \nπροεπιλογές τους; Οι ρυθμίσεις χαρτογράφισης κουμπιών δεν θα αλλάξουν.\n\nΔεν μπορείτε να αναιρέσετε αυτή την επιλογή.\nΠαρακαλούμε επανεκκινήστε το PPSSPP για να \nτεθούν σε ισχύ οι αλλαγές. RestoreGameDefaultSettings = Είστε σίγουροι ότι θέλετε να επαναφέρετε τις ρυθμίσεις παιχνιδιού\nστις προεπιλεγμένες του PPSSPP; @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Είστε σίγουροι ότι θέλετε να DeleteFailed = ΑΔΥΝΑΜΙΑ ΔΙΑΓΡΑΦΗΣ ΔΕΔΟΜΕΝΩΝ. Deleting = ΔΙΑΓΡΑΦΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ... Disable All = ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΟΛΩΝ +Dumps = Dumps Edit = Edit Enable All = ΕΝΕΡΓΟΠΟΙΗΣΗ ΟΛΩΝ Enter = Enter +Filter = Filter Finish = ΤΕΛΟΣ +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = ΑΝΕΝΕΡΓΟ InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = ΑΠΟΘΗΚΕΥΣΗ Save completed = ΑΠΟΘΗΚΕΥΣΗ ΟΛΟΚΛΗΡΩΘΗΚΕ. Saving = ΑΠΟΘΗΚΕΥΣΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ... SavingFailed = ΑΔΥΝΑΜΙΑ ΑΠΟΘΗΚΕΥΣΗΣ ΔΕΔΟΜΕΝΩΝ. +Search = Search Select = Select Shift = Shift +Skip = Skip Snap = Snap Space = ΚΕΝΟ SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Το αρχείο είναι συμπισμ [Game] Asia = Ασία +Calculate CRC = Calculate CRC ConfirmDelete = Διαγραφή Create Game Config = Δημιουργία ρυθμίσεων παιχνιδιού Create Shortcut = Δημιουργία Συντόμευσης @@ -430,6 +473,7 @@ Auto = Αυτόματο Auto (1:1) = Αυτόματο (1:1) Auto (same as Rendering) = Αυτόματο (ίσο με την Ανάλυση Απεικόνισης) Auto FrameSkip = Αυτόματη Παράκαμψη Καρέ +Auto Max Quality = Auto Max Quality Auto Scaling = Αυτόματη Κλιμάκωση Backend = Σύστημα Υποστήριξης Balanced = Εξισορροπημένη @@ -555,11 +599,14 @@ Zip file does not contain PSP software = Το αρχείο ZIP δεν περιέ [KeyMapping] Autoconfigure = Αυτόματη ρύθμιση Autoconfigure for device = Αυτόματη ρύθμιση για τη συσκευή +Bind All = Bind All Clear All = Καθαρισμός Default All = Επαναφορά Map a new key for = Πατήστε ένα πλήκτρο για το Map Key = ΡύΘμιση κουμπιού Map Mouse = ΡύΘμιση ποντικού +Replace = Replace +Show PSP = Show PSP Test Analogs = Δοκιμή Αναλογικού Μοχλού You can press ESC to cancel. = Μπορείτε να πατήσετε Esc για ακύρωση. @@ -585,6 +632,7 @@ SavesAreTemporary = Το PPSSPP αποθηκεύει σε προσωρινή μ SavesAreTemporaryGuidance = Εξαγάγετε PPSSPP κάπου για να αποθηκεύσετε μόνιμα SavesAreTemporaryIgnore = Αγνόηση προειδοποίησης UnpinPath = Ξεκαρφίτσωμα +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Ανταλλαγή αξόνων Circle = Ο Cross = X +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Μενού Προγραμματιστών +Double tap button = Double tap button Down = Κάτω Dpad = Ψηφιακό pad Frame Advance = Επόμενο καρέ @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Πάυση R = R RapidFire = Ταχεία βολή +Record = Record Remote hold = Remote hold Rewind = Αντιστροφή Right = Δεξιά -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = ΔεξίΑν.Κάτω RightAn.Left = ΔεξίΑν.Αριστερά RightAn.Right = ΔεξίΑν.Δεξιά @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Κουμπί Ταχύτητας Square = Τετράγωνο Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Εξαγωγή υφών Texture Replacement = Αντικατάσταση υφών Toggle Fullscreen = Λειτουργεία πλήρους οθόνης @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Επισκευθείτε το Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Αλλαγή διεύθυνσης IP proAdhocSer Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Μη έγκυρη IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Δίκτυο Εκκινήθηκε +None = None Please change your Port Offset = Please change your port offset Port offset = Offset πήλης(0 = για συμβατότητα PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Επαναφορά προς τα πίσω Save State = Γρ. Αποθ/ση Settings = Ρυθμίσεις Switch UMD = Αλλαγή UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Γραμμές Σάρωσης (CRT) Sharpen = Όξυνση SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Διακοπή... [Reporting] Bad = Κακά +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Τα δεδομένα σας υποβάλλονται στο παρασκήνιο. FeedbackDesc = Πώς είναι η εξομοίωση; Πείτε το σε εμάς και την κοινότητα! FeedbackDisabled = Οι αναφορές διακομιστή συμβατότητας πρέπει να είναι ενεργοποιημένες. @@ -853,6 +957,7 @@ Perfect Description = Άψογη προσομοίωση για ολόκληρο Plays = Πάιζει Plays Description = Παίζει με μικροπροβλήματα που δεν επηρεάζουν το παιχνίδι ReportButton = Αναφορά κριτικής +Show disc CRC = Show disc CRC Speed = Ταχύτητα Submit Feedback = Υποβολή αξιολόγησης SuggestionConfig = Δείτε τις αναφορές στον ιστότοπο για καλές ρυθμίσεις. @@ -871,9 +976,11 @@ Date = Ημερομηνία Filename = Ονομα αρχείου No screenshot = Χωρίς στιγμιότυπο οθόνης None yet. Things will appear here after you save. = Τίποτα προς το παρόν. Θα εμφανιστούν στοιχεία αφότου πραγματοποιήσετε αποθήκευση. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Δεδομένα αποθήκευσης Save States = Σημεία Αποθήκευσης Savedata Manager = Διαχειριστής δεδομένων αποθήκευσης +Showing matches for '%1'. = Showing matches for '%1'. Size = Μέγεθος [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = ΠΡΟΣΟΧΗ: Η εφαρμογή GLTools εντοπίστη In menu = Σε menu Load savestate failed = Σφάλμα φόρτωσης σημείου αποθήκευσης Loaded State = Σημείο αποθήκευσης φορτώθηκε +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Φορτώθηκε. Αποθηκεύστε στο παιχνίδι, κάντε επανεκκίνηση και φορτώστε για λιγότερα σφάλματα. LoadStateDoesntExist = Σφάλμα φόρτωσης σημείου: Το σημείο αποθήκευσης δεν υπάρχει! LoadStateWrongVersion = Σφάλμα φόρτωσης σημείου: Το σημείο αποθήκευσης είναι για μία παλαιότερη έκδοση του PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Αποθήκευση υφών απενεργοποιημ saveNewTextures_true = Οι υφές θα αποθηκευτούν στο αποθηκευτικό σας χώρο. SpeedCustom2 = Ταχύτητα: εναλλακτική 2 standard = Ταχύτητα: κανονική +State load undone = State load undone Untitled PSP game = Παιχνίδι PSP χωρίς τίτλο [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = Έκδοση D3DCompiler Debug = Εντοπισμός σφαλμάτων Debugger Present = Παρουσία πρόγραμματος εντοπισμού σφαλμάτων Device Info = Πληροφορίες συσκευής +Directories = Directories Display Information = Πληροφορίες οθόνης Driver Version = Έκδοση Driver EGL Extensions = Επεκτάσεις EGL @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX αποκλειστικό Sample rate = Ρυθμός δειγματοληψίας Shading Language = Γλώσσα σκίασης +Storage = Storage Sustained perf mode = Διατηρημένη λειτουργία απόδοσης System Information = Πληροφορίες συστήματος System Name = Όνομα @@ -977,8 +1089,11 @@ AVI Dump started. = Καταγραφή AVI ξεκίνησε. AVI Dump stopped. = Καταγραφή AVI σταμάτησε. Cache ISO in RAM = Προσωρινή αποθήκευση ISO σε RAM Change CPU Clock = Αλλαγή συχνότητας CPU (unstable) -Change Memory Stick folder = Αλλαγή φακέλου Memory Stick -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Αλλαγή φακέλου Memory Stick +Memory Stick size = Memory Stick size Change Nickname = Αλλαγή Ψευδωνύμου ChangingMemstickPath = Τα δεδομένα αποθήκευσης παιχνιδιών, καταστάσεων και άλλων δεδομένων δεν θα αντιγραφούν σε αυτόν τον φάκελο.\n\nΑλλαγή του φακέλου Memory Stick; ChangingMemstickPathInvalid = Αυτή η διαδρομή δεν μπορεί να χρησιμοποιηθεί για αποθήκευση αρχείων Memory Stick. @@ -1012,7 +1127,6 @@ General = Γενικά Grid icon size = Grid icon size Help the PPSSPP team = Βοηθήστε την ομάδα του PPSSPP Host (bugs, less lag) = Host (σφάλματα, λιγότερη καθυστέρηση) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Διερμηνέας @@ -1022,14 +1136,19 @@ Memory Stick Folder = Φόκελος Memory Stick Memory Stick inserted = Εισήχθη Memory Stick MHz, 0:default = MHz, 0 = προεπιλογή MMDDYYYY = ΜΜΗΗΧΧΧΧ +Moving background = Moving background Newest Save = Νεότερο αρχείο αποθήκευσης +No animation = No animation Not a PSP game = Δεν είναι παιχνίδι PSP Off = Off Oldest Save = Παλαιότερο αρχείο αποθήκευσης +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Μοντέλο PSP PSP Settings = Ρυθμίσεις PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Καταγραφή Ήχου Record Display = Καταγραφή Εικόνας Reset Recording on Save/Load State = Επαναφορά της εγγραφής κατή την Αποθήκευση/Φόρτωση σημείου αποθήκευσης @@ -1053,8 +1172,10 @@ Storage full = Μνήμη πλήρης Sustained performance mode = Διατηρημένη λειτουργία απόδοσης Time Format = Μορφή Ώρας UI = Διεπαφή χρήστη +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Χρήση μη απολεστικού κωδικοποιητή (FFV1) Use O to confirm = O Use output buffer (with overlay) for recording = Χρησιμοποιήστε το buffer εξόδου (με επικάλυψη) για εγγραφή @@ -1063,6 +1184,7 @@ Use X to confirm = X VersionCheck = Έλεγχος νέων εκδόσεων PPSSPP WARNING: Android battery save mode is on = ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η λειτουργία εξοικονόμησης ενέργειας Android είναι ενεργοποιημένη WARNING: Battery save mode is on = ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η λειτουργία εξοικονόμησης ενέργειας είναι αναμμένη +Waves = Waves YYYYMMDD = ΧΧΧΧΜΜΗΗ [Upgrade] diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index e515f2e6fb..bd6b7745b0 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = אפשר שמע Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = אטימות מקשים Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = מיפוי מקשים -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = מקשי מגע על המסך Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = פתח &קובץ... Open from MS:/PSP/GAME... = פ&תח מ MS:/PSP/GAME... Open Memory Stick = פתח &זיכרון @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = ...ןתמה אנא ...קחומ Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = סנכה +Filter = Filter Finish = םייס +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = .המלשוה הרימש Saving = ...ןתמה אנא ...רמוש SavingFailed = Unable to save data. +Search = Search Select = רחב Shift = העבר +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = צור קיצור דרך @@ -430,6 +473,7 @@ Auto = אוטומטי Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = נקה הכל Default All = החזר הכל Map a new key for = מיפוי מקש נוסף ל Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = לאתר [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = v Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = עצור R = R RapidFire = RapidFire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = > -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = ג'וייס' ימני v RightAn.Left = ג'וייס' ימני > RightAn.Right = ג'וייס' ימני < @@ -648,6 +708,11 @@ Select = Select SpeedToggle = שינוי מהירות Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = שמור מצב Settings = הגדרות Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = מצב נטען +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = לא הצליח לטעון את המצב: המצב שמור אינו קיים! LoadStateWrongVersion = לא הצליח לטעון את המצב: המצב הוא שמירה שמיועדת לגרסה ישנה יותר של PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = מהירות סטנדרטית +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = שנה קצב מעבד (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = שנה כינוי ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = כללי Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = שנה/יום/חודש +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = הגדרות PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = תבנית זמן UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = כדי להסכים O השתמש במקש Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = כדי להסכים X השתמש במקש VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = יום/חודש/שנה [Upgrade] diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index ec53371f56..6a1e35b28d 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = עמש רשפא Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = םישקמ תומיטא Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = םישקמ יופימ -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = ךסמה לע עגמ ישקמ Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &Directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = ...ןתמה אנא ...קחומ Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = סנכה +Filter = Filter Finish = םייס +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = .המלשוה הרימש Saving = ...ןתמה אנא ...רמוש SavingFailed = Unable to save data. +Search = Search Select = רחב Shift = העבר +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Create shortcut @@ -430,6 +473,7 @@ Auto = יטמוטוא Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = לכה הקנ Default All = לכה רזחה Map a new key for = ףסונ שקמ יופימ Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = רתאל [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = v Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = עצור R = R RapidFire = RapidFire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = > -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = v ינמי 'סייו'ג RightAn.Left = < ינמי 'סייו'ג RightAn.Right = > ינמי 'סייו'ג @@ -648,6 +708,11 @@ Select = Select SpeedToggle = תוריהמ יוניש Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = בצמ רומש Settings = תורדגה Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = ןעטנ בצמ +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = !םייק וניא רומש בצמה :בצמה תא ןועטל חילצה אל LoadStateWrongVersion = !PPSSPP לש רתוי הנשי הסרגל תדעוימש הרימש אוה בצמה :בצמה תא ןועטל חילצה אל @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = תיטרדנטס תוריהמ +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = דבעמ בצק הנש (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = יוניכ הנש ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = יללכ Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = שדוח/םוי/הנש +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP תורדגה PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = ןמז תינבת UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = שקמב שמתשה O םיכסהל ידכ Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = שקמב שמתשה X םיכסהל ידכ VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = הנש/שדוח/םוי [Upgrade] diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index e240529b63..d5b4e0a866 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = Naizmjenična brzina zvuka Audio backend = Poslužitelj zvuka (ponovo pokrenuti) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-prijateljski poliranje (sporije) Auto = Automatski Device = Uređaj +Disabled = Disabled DSound (compatible) = DSound (kompatibilno) Enable Sound = Uključi zvuk Global volume = Opća glasnoća Microphone = Microphone Microphone Device = Microphone device Mute = Priguši -Switch on new audio device = Promijeni trenutni uređaj +Reverb volume = Reverb volume +Use new audio devices automatically = Promijeni trenutni uređaj Use global volume = Koristi opću glasnoću WASAPI (fast) = WASAPI (brzo) [Controls] -Analog auto-rotation speed = Auto-Rotacija analogne brzine +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = Auto-Rotacija analogne brzine Analog Axis Sensitivity = Senzitivnost analogne osi Analog Limiter = Analogni ograničivač Analog Mapper High End = Postavljanje senzitivnost osi @@ -26,24 +32,40 @@ AnalogLimiter Tip = Kada je analog limiter tipka pritisnuta Auto = Automatski Auto-centering analog stick = Auto-centriranje analog stick-a Auto-hide buttons after seconds = Auto-sakrij tipke nakon sekundi +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Prozirnost tipki Button style = Stil tipki +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibriraj +Calibrated = Calibrated Calibration = Kalibracija +Circular stick input = Circular stick input Classic = Klasično Combo Key Setting = Postavke combo tipki Combo Key Setup = Postavljanje combo tipki Confine Mouse = Zaključaj miš u window/display području Control Mapping = Namještanje kontrola -Custom layout... = Izmijeni raspored dodirnih kontrola... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Izmijeni raspored dodirnih kontrola... Customize tilt = Izmijeni tilt... D-PAD = D-Pad -Deadzone Radius = Radijus mrtve zone +Deadzone radius = Radijus mrtve zone DInput Analog Settings = Postavke DInput analoga Disable D-Pad diagonals (4-way touch) = Isključi D-Pad dijagonale (4-smjerni dodir) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Svijetleći rubovi HapticFeedback = Povratna informacija (vibracija) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignoriraj gamepade kada nije fokusirano Ignore Windows Key = Isključi Windows tipku Invert Axes = Izmijeni osi @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Orijentacija Landscape Auto = Auto orijentacija Landscape Reversed = Obrnuta orijentacija +Low end radius = Low end radius Mouse = Postavke miša Mouse sensitivity = Senzitivnost miša Mouse smoothing = Izglađivanje miša @@ -65,21 +88,32 @@ OnScreen = Dodirne kontrole na ekranu Portrait = Portret Portrait Reversed = Obrnuti portret PSP Action Buttons = PSP akcijske kontrole +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotacija ekrana seconds, 0 : off = sekunde, 0 = isključeno +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Osjetljivost +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Prikaži tipku za izbornik pauze +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Tanki rubovi Tilt Base Radius = Tilt base radius Tilt Input Type = Tip ulaza tilta Tilt Sensitivity along X axis = Tilt senzitivnost X osi Tilt Sensitivity along Y axis = Tilt senzitivnost Y osi To Calibrate = Za kalibraciju, drži uređaj na ravnoj površini i pritisni "Kalibriraj". +Toggle mode = Toggle mode Touch Control Visibility = Vidljivost dodirnih kontroli Use custom right analog = Use custom right analog Use Mouse Control = Koristi miš za kontrole Visibility = Vidljivost +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput postavke analoga @@ -99,6 +133,7 @@ Refresh Rate = Brzina osvježavanja #Font = Trebuchet MS About PPSSPP... = &O PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Poslužitelj &renderanja (restarta PPSSPP) Bicubic = &Bikubično Break = Pokvari @@ -150,6 +185,7 @@ More Settings... = &Više postavki... Nearest = &Najbliže Non-Buffered Rendering = &Preskoči bufferane efekte (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Otvori &direktorij... Open from MS:/PSP/GAME... = O&tvori iz MS:/PSP/GAME... Open Memory Stick = Otvori &Memorijsku Karticu @@ -229,6 +265,7 @@ No block = Nema bloka Prev = Prošlo Random = Nasumično Replace textures = Zamijeni teksture +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Jesi li siguran da želiš vratiti sve postavke na zadano?\nPostavke kontroli nisu izmijenjene.\n\nNe možeš poništiti ovo.\nPonovo pokrenite PPSSPP za izmijenu postavki. RestoreGameDefaultSettings = Jesi li siguran da želiš vratiti igrom-specifične postavke \nna PPSSPP zadane postavke? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Želiš li izbrisati postavke za ovu igru? DeleteFailed = Nije moguće izbrisati datu. Deleting = Brisanje\nPričekajte... Disable All = Isključi sve +Dumps = Dumps Edit = Edit Enable All = Uključi sve Enter = Enter +Filter = Filter Finish = Dovrši +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Neaktivno InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Spremi Save completed = Spremanje dovršeno. Saving = Spremanje\nPričekajte... SavingFailed = Nije moguće spremiti datu. +Search = Search Select = Select Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Datoteka je pakirana (ZIP).\nPrvo raspakira [Game] Asia = Azija +Calculate CRC = Calculate CRC ConfirmDelete = Izbriši Create Game Config = Kreiraj postavke igre Create Shortcut = Kreiraj prečac @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (isto kao Prikazna rezolucija) Auto FrameSkip = Auto preskakanje frame-ova +Auto Max Quality = Auto Max Quality Auto Scaling = Auto mjerenje Backend = Backend Balanced = Balansirano @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP datoteka ne sadrži PSP software [KeyMapping] Autoconfigure = Automatski konfiguriraj Autoconfigure for device = Automatski konfiguriraj za sve uređaje +Bind All = Bind All Clear All = Obriši sve Default All = Vrati na zadano Map a new key for = Postavi novu tipku za Map Key = Postavi tipku Map Mouse = Postavi miš +Replace = Replace +Show PSP = Show PSP Test Analogs = Testiraj analoge You can press ESC to cancel. = Možes pritisnuti ESC za odustati. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP sprema u privremenom prostoru SavesAreTemporaryGuidance = Extractaj PPSSPP negdje za trajno spremanje SavesAreTemporaryIgnore = Ignoriraj upozorenje UnpinPath = Otkvači mapu +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analogna rotacija (CW) AxisSwap = Izmijena Osi Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Dolje Dpad = Dpad Frame Advance = Ubrzavanje Frameova @@ -631,10 +690,11 @@ OpenChat = Otvori chat Pause = Pauza R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Desno -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Tipka za ubrzavanje Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Odlaganje tekstura Texture Replacement = Mijenjanje tesktura Toggle Fullscreen = Uključi puni zaslon @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Posjeti Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Promijeni PRO ad hoc server IP addresu (localhos Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Nevažeći IP ili domaćin Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Veza Uspostavljena +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset (0 = PSP kompatibilnost) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Premotaj Save State = Spremi state Settings = Postavke Switch UMD = Promijeni UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Naoštriti SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 nadograđivač VideoSmoothingAA = Video ublaživanja AA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Zaustavljanje... [Reporting] Bad = Loše +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Tvoji podaci se šalju u pozadini. FeedbackDesc = Kakva je emulacija? Dajte nama i drugima do znanja! FeedbackDisabled = Prijavljivanje kompatibilnosti servera mora biti uključeno. @@ -853,6 +957,7 @@ Perfect Description = Emulacija bez grešaka za cijelu igru - odlično! Plays = Playovi Plays Description = Potpuno moguće za igrati, ali možda sa glitchevima ReportButton = Prijavi povratne informacije +Show disc CRC = Show disc CRC Speed = Brzina Submit Feedback = Pošalji povratne informacije SuggestionConfig = Vidi prijave na web stranici za dobre opcije. @@ -871,9 +976,11 @@ Date = Datum Filename = Ime datoteke No screenshot = Nema snimke zaslona None yet. Things will appear here after you save. = Još ništa. Stvari će se ovdje pojaviti nakon što nešto spremiš. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Izbornik savedate +Showing matches for '%1'. = Showing matches for '%1'. Size = Veličina [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = UPOZORENJE: GLTools uočen, može stvarati probleme. In menu = In menu Load savestate failed = Učitavanje savestate-a nije moguće Loaded State = State učitan +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Učitano. Spremi u igri, ponovo pokreni, i učitaj za manje bugova. LoadStateDoesntExist = Nije moguće učitati state: Savestate ne postoji! LoadStateWrongVersion = Nije moguće učitati state: Savestate je za stariju verziju PPSSPP-a! @@ -900,6 +1009,7 @@ saveNewTextures_false = Spremanje tekstura je isključeno. saveNewTextures_true = Teksture ce sada biti spremljene u datotekama. SpeedCustom2 = Speed: alternate 2 standard = Speed: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler verzija Debug = Otklanjanje grešaka Debugger Present = Otklanjivač grešaka prisutan Device Info = Informacije o uređaju +Directories = Directories Display Information = Informacije o prikazu Driver Version = Verzija drivera EGL Extensions = EGL nastavci @@ -956,6 +1067,7 @@ Release = Pusti RW/RX exclusive = RW/RX ekskluzivno Sample rate = Brzina sample-ova Shading Language = Jezik sjenčanja +Storage = Storage Sustained perf mode = Održiv perf način System Information = Informacije sustava System Name = Ime sustava @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump započelo AVI Dump stopped. = AVI dump zaustavljeno Cache ISO in RAM = Predmemorija puna ISO-a u RAM-u Change CPU Clock = Promijeni emulaciju PSP-ovog CPU sata (nestabilno) -Change Memory Stick folder = Promijeni mapu Memorijskoga sticka -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Promijeni mapu Memorijskoga sticka +Memory Stick size = Memory Stick size Change Nickname = Promijeni nadimak ChangingMemstickPath = Spremljene igre, save state-ovi, i drugi podatci neće biti kopirani na ovu mapu.\n\nPromijeni mapu Memorijskoga sticka? ChangingMemstickPathInvalid = Taj put nije mogao biti korišten za spremanje datoteka Memorijskog sticka. @@ -1012,7 +1127,6 @@ General = Generalno Grid icon size = Veličina ikona na mreži Help the PPSSPP team = Pomozite PPSSPP timu Host (bugs, less lag) = Domaći (bugovi, manje šteka) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Tumač @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick mapa Memory Stick inserted = Memory Stick unesen MHz, 0:default = MHz, 0 = zadano MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Najnoviji save +No animation = No animation Not a PSP game = Nije PSP igra Off = Isključeno Oldest Save = Najstariji save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP opcije PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Snimi audio Record Display = Snimi prikaz Reset Recording on Save/Load State = Ponovo postavi snimak na Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Prostor pun Sustained performance mode = Način održive performanse Time Format = Format vremena UI = Felhasználói felület +UI background animation = UI background animation UI Sound = Felhasználói felület hangja undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Koristi neizgubiv Video Codec (FFV1) Use O to confirm = Koristi 0 kao gumb za potvrđivanje Use output buffer (with overlay) for recording = Koristi output ublaživač (sa overlay-om) za snimanje @@ -1063,6 +1184,7 @@ Use X to confirm = Koristi X kao gumb za potvrđivanje VersionCheck = Provjerite za nove verzije PPSSPP-a WARNING: Android battery save mode is on = UPOZORENJE: Način uštede baterije u Androidu je uključen WARNING: Battery save mode is on = UPOZORENJE: Način uštede baterije je uključen +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 2165c061ec..50416ca7ca 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = Alternatív sebesség hangereje Audio backend = Audió backend (újraindítás szükséges) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-barát buffer (lassabb) Auto = Auto Device = Eszköz +Disabled = Disabled DSound (compatible) = DSound (kompatibilis) Enable Sound = Hang engedélyezése Global volume = Globális hangerő Microphone = Microphone Microphone Device = Microphone device Mute = Némítás -Switch on new audio device = Új eszköz észlelésekor átváltás rá +Reverb volume = Reverb volume +Use new audio devices automatically = Új eszköz észlelésekor átváltás rá Use global volume = Globális hangerő használata WASAPI (fast) = WASAPI (gyors) [Controls] -Analog auto-rotation speed = Automata analóg forgató sebessége +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = Automata analóg forgató sebessége Analog Axis Sensitivity = Analóg tengely érzékenysége Analog Limiter = Analóg korlátozó Analog Mapper High End = Analóg leképezés felső-vég (tengely érzékenység) @@ -26,24 +32,40 @@ AnalogLimiter Tip = Miközben az Analóg Korlátozó gombot nyomva tartod Auto = Auto Auto-centering analog stick = Analóg kar visszaállítása középre Auto-hide buttons after seconds = Gombok elrejtése X másodperc után +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Gombok +Button Binding = Button Binding Button Opacity = Gombok átlátszósága Button style = Gombok stílusa +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = D-Pad kalibrálása +Calibrated = Calibrated Calibration = Kalibrálás +Circular stick input = Circular stick input Classic = Klasszikus Combo Key Setting = Gomb-kombó beállítás Combo Key Setup = Gomb-kombók definiálása Confine Mouse = Egérkurzor rögzítése az ablakhoz Control Mapping = Gombok beállítása -Custom layout... = Elrendezés testreszabása… +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Elrendezés testreszabása… Customize tilt = Döntés testreszabása… D-PAD = D-Pad -Deadzone Radius = Holtzóna sugara +Deadzone radius = Holtzóna sugara DInput Analog Settings = DInput analóg beállítások Disable D-Pad diagonals (4-way touch) = D-Pad átlóinak letiltása (4-irányú érintés) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Világító szélek HapticFeedback = Haptikus visszajelzés (rezgés) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Gamepad figyelmen kívül hagyása, ha nincs fókuszban Ignore Windows Key = Windows billentyű kikapcsolása Invert Axes = Tengelyek megfordítása @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R ravasz gombok Landscape = Fekvő Landscape Auto = Automatikus fekvő Landscape Reversed = Fordított fekvő +Low end radius = Low end radius Mouse = Egér beállítások Mouse sensitivity = Egér érzékenység Mouse smoothing = Egér simítás @@ -65,21 +88,32 @@ OnScreen = Érintőképernyős irányítás Portrait = Álló Portrait Reversed = Fordított álló PSP Action Buttons = PSP akció gombok +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Képernyő elforgatása seconds, 0 : off = másodperc, 0 = ki +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Érzékenység +Shape = Shape Show right analog = Jobb oldali analóg kar megjelenítése Show Touch Pause Menu Button = Szünet gomb megjelenítése +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Vékony szélek Tilt Base Radius = Döntés alapsugara Tilt Input Type = Döntési bevitel típusa Tilt Sensitivity along X axis = X tengely menti döntés érzékenysége Tilt Sensitivity along Y axis = X tengely menti döntés érzékenysége To Calibrate = A kalibrációhoz hagyd az eszközt egy sima felületen, és nyomd meg a "Kalibrálás"-t. +Toggle mode = Toggle mode Touch Control Visibility = Érintőképernyős irányítás láthatósága Use custom right analog = Személyre szabott jobb analog kar Use Mouse Control = Egér bevitel használata Visibility = Láthatóság +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analóg beállítások @@ -99,6 +133,7 @@ Refresh Rate = Frissítési gyakoriság #Font = Trebuchet MS About PPSSPP... = PPSSPP &névjegye… Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Renderelési &backend (újraindítás szükséges) Bicubic = &Bicubic Break = Megállítás @@ -150,6 +185,7 @@ More Settings... = &Egyéb beállítások… Nearest = Leg&közelebbi Non-Buffered Rendering = Bufferelt effektek kihagyá&sa (nem bufferelt, gyorsabb) Off = &Ki +Open Chat = Open Chat Open Directory... = Ma&ppa megnyitása… Open from MS:/PSP/GAME... = Megnyitás MS:/PSP/&GAME-ből… Open Memory Stick = Memory &Stick megnyitása @@ -229,6 +265,7 @@ No block = Nincs blokk Prev = Előző Random = Véletlenszerű Replace textures = Textúrák kicserélése +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Biztos vagy benne, hogy mindent az alapértelmezettre állítasz?\nA gombbeállítások nem változnak.\n\n\nNem vonható vissza.\nIndítsd újra a PPSSPP-t a beállítások érvényesítéséhez. RestoreGameDefaultSettings = Biztos vagy benne, hogy minden játék-specifikus beállítást\nvisszaállítáasz a PPSSPP alapértelmezettre? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Biztosan törölni akarod a játék beállításait? DeleteFailed = Törlés sikertelen. Deleting = Törlés\nKérlek várj... Disable All = Mind kikapcsolása +Dumps = Dumps Edit = Edit Enable All = Mind bekapcsolása Enter = Belép +Filter = Filter Finish = Kész +GE Frame Dumps = GE Frame Dumps Grid = Rács Inactive = Inaktív InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Mentés Save completed = Mentve. Saving = Mentés\nKérlek várj... SavingFailed = Mentés sikertelen. +Search = Search Select = Kiválaszt Shift = Shift +Skip = Skip Snap = Igazít Space = Szóköz SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = A fájl tömörített (ZIP).\nElőbb csomag [Game] Asia = Ázsia +Calculate CRC = Calculate CRC ConfirmDelete = Törlés Create Game Config = Új játékbeállítás Create Shortcut = Parancsikon létrehozása @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (renderelési felbontással megegyező) Auto FrameSkip = Automatikus képkocka kihagyás +Auto Max Quality = Auto Max Quality Auto Scaling = Automatikus skálázás Backend = Backend Balanced = Kiegyensúlyozott @@ -555,11 +599,14 @@ Zip file does not contain PSP software = A ZIP fájl nem tartalmaz PSP szoftvert [KeyMapping] Autoconfigure = Automatikus beállítás Autoconfigure for device = Eszköz auto-beállítása +Bind All = Bind All Clear All = Összes törlése Default All = Összeset alapért. Map a new key for = Új gomb beállítása ehhez: Map Key = Billentyű társítása Map Mouse = Egér társítása +Replace = Replace +Show PSP = Show PSP Test Analogs = Analóg teszt You can press ESC to cancel. = Megszakításhoz használj ESC-et. @@ -585,6 +632,7 @@ SavesAreTemporary = A PPSSPP ideiglenes tárba ment SavesAreTemporaryGuidance = A tartós mentéshez csomagold ki valahova a PPSSPP-t SavesAreTemporaryIgnore = Figyelmen kívül hagyás UnpinPath = Felold +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Tengely csere Circle = Kör Cross = Kereszt +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad Le D-pad left = D-pad Balra D-pad right = D-pad Jobbra D-pad up = D-pad Fel DevMenu = DevMenu +Double tap button = Double tap button Down = D-Pad Le Dpad = D-Pad Frame Advance = Köv. képkocka @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Szünet R = R RapidFire = Gyorstüzelés +Record = Record Remote hold = Távoli zár Rewind = Visszatekerés Right = D-Pad Jobbra -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = Jobb An. Le RightAn.Left = Jobb An. Balra RightAn.Right = Jobb An. Jobbra @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Seb. változtatása Square = Négyzet Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Textúra kiírás Texture Replacement = Textúra csere Toggle Fullscreen = Teljes képernyő @@ -659,10 +724,39 @@ Vol + = Hangerő + Vol - = Hangerő - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Ad Hoc többjátékos fórum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Alul középen Bottom Left = Alul bal old. @@ -674,6 +768,7 @@ Change proAdhocServer Address = ProAdhoc szerver címe (localhost = multiple ins Chat = Chat Chat Button Position = Chat gomb helye Chat Here = Írj ide... +Chat message = Chat message Chat Screen Position = Chat képernyő poziciója Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Érvénytelen IP vagy kiszolgáló név Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Hálózat inicializálva +None = None Please change your Port Offset = Please change your port offset Port offset = Port eltolás/offset (0 = PSP kompatibilitás) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Gyors üzenet 1 Quick Chat 2 = Gyors üzenet 2 @@ -732,6 +831,8 @@ Rewind = Visszatekerés Save State = Állapotmentés készítése Settings = Beállítások Switch UMD = UMD váltása +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Csíkozás Sharpen = Élesítés SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 felskálázó VideoSmoothingAA = VideoSmoothingAA Vignette = Vignetta @@ -828,6 +930,8 @@ Stopping.. = Leállítás alatt... [Reporting] Bad = Rossz +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = A jelentésed feltöltésre kerül a háttérben. FeedbackDesc = Hogy tetszik az alkalmazás? Áruld el véleményed nekünk és a közösségnek! FeedbackDisabled = A kompatibilitási jelentéseket engedélyezni kell. @@ -853,6 +957,7 @@ Perfect Description = A teljes játék emulálása hibátlan - remek! Plays = Játszható Plays Description = Végig játszható, de előfordulnak kisebb hibák. ReportButton = Vélemény jelentése +Show disc CRC = Show disc CRC Speed = Sebesség Submit Feedback = Vélemény elküldése SuggestionConfig = Nézd meg a jelentéseket a honlapon a megfelelő beállításokhoz. @@ -871,9 +976,11 @@ Date = Dátum Filename = Fájlnév No screenshot = Nincs kép None yet. Things will appear here after you save. = Itt jelennek majd meg a mentések. Még nincs semmi. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Mentés Save States = Állapotmentések Savedata Manager = Mentések kezelése +Showing matches for '%1'. = Showing matches for '%1'. Size = Méret [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = FIGYELMNEZTETÉS: GLTools észlelve, problémákat okozhat. In menu = Menüben Load savestate failed = Állapotmentés betöltése sikertelen Loaded State = Állapotmentés betöltve +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Betöltve. Ments a játékban, indítsd újra, és töltsd be a mentést kevesebb hibáért. LoadStateDoesntExist = Hiba az állapotmentés betöltése közben: Az állapotmentés nem létezik! LoadStateWrongVersion = Hiba az állapotmentés betöltése közben: Az állapotmentés egy régebbi PPSSPP verzióhoz való! @@ -900,6 +1009,7 @@ saveNewTextures_false = Textúra mentés letiltva. saveNewTextures_true = A textúrák mostantól el lesznek mentve a tárhelyeden. SpeedCustom2 = Sebesség: alternatív 2 standard = Sebesség: alapértelmezett +State load undone = State load undone Untitled PSP game = Névtelen PSP játék [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler verzió Debug = Hibakeresés Debugger Present = Debugger jelen Device Info = Eszközinfó +Directories = Directories Display Information = Megjelenítő információ Driver Version = Driver verzió EGL Extensions = EGL kiterjesztések @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exkluzív Sample rate = Mintavételezési ráta Shading Language = Shading nyelv +Storage = Storage Sustained perf mode = Fentartott teljesítmény mód System Information = Rendszerinformáció System Name = Név @@ -977,8 +1089,11 @@ AVI Dump started. = AVI írás indítva AVI Dump stopped. = AVI írás leállítva Cache ISO in RAM = Teljes ISO fájl RAM-ban tartása Change CPU Clock = Emulált CPU órajel változtatása (instabil) -Change Memory Stick folder = Memory Stick mappa megváltoztatása -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick mappa megváltoztatása +Memory Stick size = Memory Stick size Change Nickname = Becenév megváltoztatása ChangingMemstickPath = A mentések, állapotmentések és egyéb adatok nem kerülnek másolásra ebbe a mappába.\n\nMegváltoztatod a Memory Stick mappáját? ChangingMemstickPathInvalid = Ez az elérési útvonal nem használható Memory Stick fájlok mentésére. @@ -1012,7 +1127,6 @@ General = Általános Grid icon size = Ikonok mérete rácsnézetben Help the PPSSPP team = Segítsd a PPSSPP csapatát Host (bugs, less lag) = Host (hibák, kevesebb lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Méret növelése Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick mappa Memory Stick inserted = Memory Stick behelyezve MHz, 0:default = MHz, 0 = alapértelmezett MMDDYYYY = HHNNÉÉÉÉ +Moving background = Moving background Newest Save = Legújabb mentés +No animation = No animation Not a PSP game = Nem egy PSP játék Off = Ki Oldest Save = Legrégebbi mentés +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP modell PSP Settings = PSP beállítások PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Audió felvétele Record Display = Videó felvétele Reset Recording on Save/Load State = Felvétel leállítása állapotmentés készítésekor vagy betöltésekor @@ -1053,8 +1172,10 @@ Storage full = Tárhely megtelt Sustained performance mode = Fentartott teljesítmény mód Time Format = Idő formátuma UI = Felhasználói felület +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Veszteségmentes videó codec használata (FFV1) Use O to confirm = O gomb használata a megerősítéshez Use output buffer (with overlay) for recording = Kimeneti buffer alkalmazása (fedőréteggel) rögzítéskor @@ -1063,6 +1184,7 @@ Use X to confirm = X gomb használata a megerősítéshez VersionCheck = PPSSPP frissítés keresése WARNING: Android battery save mode is on = FIGYELEM: Android energiatakarékos üzemmód bekapcsolva! WARNING: Battery save mode is on = FIGYELEM: Energiatakarékós üzemmód bekapcsolva! +Waves = Waves YYYYMMDD = ÉÉÉÉHHNN [Upgrade] diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index c215de9fb4..35075caae1 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -1,97 +1,131 @@ [Audio] -Alternate speed volume = Alternate speed volume -Audio backend = Audio backend (butuh start ulang) -AudioBufferingForBluetooth = Bluetooth-friendly buffer (lambat) +Alternate speed volume = Kecepatan volume alternatif +Audio backend = Penata audio (perlu mulai ulang) +Audio Error = Kesalahan audio +AudioBufferingForBluetooth = Penyangga bluetooth (lambat) Auto = Otomatis -Device = Device -DSound (compatible) = DSound (cocok) +Device = Perangkat +Disabled = Nonaktif +DSound (compatible) = DSound (kompatibel) Enable Sound = Aktifkan suara Global volume = Volume global -Microphone = Microphone -Microphone Device = Microphone device -Mute = Mute -Switch on new audio device = Switch on new audio device -Use global volume = Use global volume +Microphone = Mikrofon +Microphone Device = Mikrofon perangkat +Mute = Tidak bersuara +Reverb volume = Volume bergema +Use new audio devices automatically = Gunakan perangkat audio baru secara otomatis +Use global volume = Gunakan volume global WASAPI (fast) = WASAPI (cepat) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed -Analog Axis Sensitivity = Analog axis sensitivity +Analog Axis Sensitivity = Sensitivitas sumbu analog +Analog Binding = Pengikatan analog Analog Limiter = Pembatas analog -Analog Mapper High End = Pemetaan analog high-end (sensitivitas sumbu) -Analog Mapper Low End = Pemetaan analog low-end (inverse deadzone) +Analog Mapper High End = Pemetaan analog kelas atas (sensitivitas sumbu) +Analog Mapper Low End = Pemetaan analog kelas bawah (zona mati terbalik) Analog Mapper Mode = Mode pemetaan analog -Analog Stick = Kemudi analog -AnalogLimiter Tip = When the analog limiter button is pressed +Analog Settings = Pengaturan analog +Analog Stick = Stik analog +Analog Style = Gaya analog +AnalogLimiter Tip = Ketika tombol pembatas analog ditekan Auto = Otomatis -Auto-centering analog stick = Penengahan otomatis kemudi analog -Auto-hide buttons after seconds = Sembunyi-tombol setelah beberapa detik -Binds = Binds +Auto-centering analog stick = Penengahan otomatis stik analog +Auto-hide buttons after seconds = Sembunyikan tombol setelah beberapa detik +Auto-rotation speed = Kecepatan rotasi otomatis +Auto-switch = Pengalihan otomatis +Base tilt position = Posisi kemiringan dasar +Binds = Pengikat +Button Binding = Pengikat tombol Button Opacity = Kegelapan tombol Button style = Gaya tombol -Calibrate D-Pad = Kalibrasi +Calibrate Analog Stick = Kalibrasi stik analog +Calibrate D-Pad = Kalibrasi D-Pad +Calibrated = Dikalibrasi Calibration = Kalibrasi +Circular stick input = Masukan stik melingkar Classic = Klasik Combo Key Setting = Pengaturan tombol kombinasi Combo Key Setup = Konfigurasi tombol kombinasi -Confine Mouse = Kurung tetikus di dalam area layar +Confine Mouse = Kunci mouse di area layar Control Mapping = Pemetaan kontrol -Custom layout... = Sunting tata letak kontrol sentuh... -Customize tilt = Sesuaikan kemiringan... +Custom Key Setting = Pengaturan kunci kustom +Customize = Sesuaikan +Customize Touch Controls = Sesuaikan tata letak kontrol sentuh +Customize tilt = Sesuaikan kemiringan D-PAD = D-Pad -Deadzone Radius = Radius mati -DInput Analog Settings = Pengaturan DInput analog +Deadzone radius = Radius mati +DInput Analog Settings = Pengaturan analog DInput Disable D-Pad diagonals (4-way touch) = Matikan D-Pad diagonal (sentuhan 4 arah) -Glowing borders = Glowing borders +Disable diagonal input = Nonaktifkan masukan diagonal +Double tap = Ketuk dua kali +Enable gesture control = Aktifkan kontrol gerakan +Enable standard shortcut keys = Aktifkan tombol pintas standar +Gesture = Gerak +Gesture mapping = Pemetaan gerakan +Glowing borders = Pinggiran bercahaya HapticFeedback = Umpan balik (getar) -Ignore gamepads when not focused = Abaikan kemudi ketika tidak fokus -Ignore Windows Key = Abaikan tombol Windows +Hide touch analog stick background circle = Sembunyikan lingkaran latar belakang sumbu analog sentuh +Icon = Ikon +Ignore gamepads when not focused = Abaikan gamepad saat tidak fokus +Ignore Windows Key = Abaikan tombol windows Invert Axes = Balikkan sumbu Invert Tilt along X axis = Balikkan kemiringan sepanjang sumbu X Invert Tilt along Y axis = Balikkan kemiringan sepanjang sumbu Y -Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed -Keyboard = Pengaturan kendali papan ketik -L/R Trigger Buttons = Tombol pelatuk L/R +Keep this button pressed when right analog is pressed = Terus tekan tombol ini saat analog kanan ditekan +Keyboard = Papan ketik +L/R Trigger Buttons = Tombol pemicu L/R Landscape = Lanskap -Landscape Auto = Landscape auto +Landscape Auto = Lanskap otomatis Landscape Reversed = Lanskap terbalik -Mouse = Pengaturan Mouse -Mouse sensitivity = Sentivitas Mouse -Mouse smoothing = Kelembutan Mouse -MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. -None (Disabled) = Tidak ada (dinonaktifkan) -Off = Matikan +Low end radius = Radius kelas atas +Mouse = Pengaturan mouse +Mouse sensitivity = Sentivitas mouse +Mouse smoothing = Kehalusan mouse +MouseControl Tip = Anda sekarang dapat memetakan mouse di layar pemetaan kontrol dengan menekan ikon 'M'. +None (Disabled) = Tidak ada (nonaktif) +Off = Mati OnScreen = Kontrol sentuh di layar Portrait = Tegak Portrait Reversed = Tegak terbalik PSP Action Buttons = Tombol aksi PSP +Raw input = Masukan mentah +Reset to defaults = Atur ulang ke pengaturan awal +Screen aligned to ground = Layar sejajar kebawah +Screen at right angle to ground = Layar pada sudut kanan kebawah Screen Rotation = Rotasi layar seconds, 0 : off = detik, 0 = mati +Sensitivity (scale) = Sensivitas (skala) Sensitivity = Sensitivitas -Show right analog = Show right analog +Shape = Bentuk +Show right analog = Tampilkan analog kanan Show Touch Pause Menu Button = Tampilkan tombol menu jeda +Swipe = Geser +Swipe sensitivity = Geser sensivitas +Swipe smoothing = Geser kehalusan Thin borders = Garis batas tipis -Tilt Base Radius = Tilt base radius +Tilt Base Radius = Radius kemiringan dasar Tilt Input Type = Jenis masukan kemiringan Tilt Sensitivity along X axis = Sensitivitas kemiringan sepanjang sumbu X Tilt Sensitivity along Y axis = Sensitivitas kemiringan sepanjang sumbu Y To Calibrate = Untuk mengkalibrasi, taruh perangkat di permukaan datar dan tekan "Kalibrasi". -Touch Control Visibility = Visibilitas kendali sentuh -Use custom right analog = Use custom right analog +Toggle mode = Mode peralihan +Touch Control Visibility = Visibilitas kontrol sentuh +Use custom right analog = Gunakan analog kanan kustom Use Mouse Control = Gunakan kontrol mouse Visibility = Visibilitas +Visible = Visibel X = X X + Y = X + Y XInput Analog Settings = Pengaturan analog XInput Y = Y [CwCheats] -Cheats = Curang -Edit Cheat File = Sunting berkas curang -Enable/Disable All = Hidupkan/matikan semua kecurangan +Cheats = Pengecoh +Edit Cheat File = Edit berkas pengecoh +Enable/Disable All = Hidupkan/matikan semua pengecoh Import Cheats = Impor dari cheat.db Options = Pilihan -Refresh Rate = Perbarui Penyegaran +Refresh Rate = Perbarui penyegaran [DesktopUI] # If your language does not show well with the default font, you can use Font to specify a different one. @@ -99,128 +133,130 @@ Refresh Rate = Perbarui Penyegaran #Font = Trebuchet MS About PPSSPP... = Tent&ang PPSSPP... Auto = Otomatis -Backend = Rendering &Backend (Start ulang PPSSPP) -Bicubic = &Bicubic -Break = Break -Break on Load = Break on load -Buffered Rendering = Pelukisan Tersangga -Buy Gold = Beli versi &Gold -Control Mapping... = Pemetaan K&ontrol... -Debugging = Debug -Deposterize = &Deposterize +Auto Max Quality = Otomatis kualitas maksimum +Backend = Bangun pelukisan &penata grafis (mulai ulang PPSSPP) +Bicubic = &Bikubik +Break = Rusak +Break on Load = Rusak pada pemuatan +Buffered Rendering = Pelukisan tersangga +Buy Gold = Beli versi &Emas +Control Mapping... = Pemetaan k&ontrol... +Debugging = Awakutu +Deposterize = &Deposterisasi Direct3D9 = &Direct3D9 -Direct3D11 = Direct3D &11 -Disassembly = &Disassembly... +Direct3D11 = Direct3D11 +Disassembly = &Pembongkaran... Discord = Discord Display Layout Editor = Penyunting tata letak tampilan... Display Rotation = Rotasi tampilan -Dump Next Frame to Log = D&ump Next Frame to Log +Dump Next Frame to Log = B&uang laju bingkai berikutnya untuk masuk Emulation = &Emulasi -Enable Chat = Enable chat -Enable Cheats = Hidupkan Penge&coh -Enable Sound = Hidupkan Suara +Enable Chat = Aktifkan pesan +Enable Cheats = Hidupkan penge&coh +Enable Sound = Hidupkan suara Exit = Keluar -Extract File... = Ekstrak Berkas... +Extract File... = Ekstrak berkas... File = Berkas -Frame Skipping = &Lewati Frame -Frame Skipping Type = Frame skipping type -Fullscreen = &Layar Penuh -Game Settings = Pengaturan Permainan +Frame Skipping = &Lewati laju bingkai +Frame Skipping Type = Jenis lewati laju bingkai +Fullscreen = &Layar penuh +Game Settings = Pengaturan permainan GE Debugger... = Awakutu GE... GitHub = Git&Hub -Hardware Transform = Transformasi Perangkat Keras +Hardware Transform = Transformasi perangkat keras Help = Bantuan Hybrid = &Hibrida Hybrid + Bicubic = Hibrida + Bikubik -Ignore Illegal Reads/Writes = Aba&ikan Pembacaan/Penulisan Ilegal -Ignore Windows Key = Abaikan Tombol Windows -Keep PPSSPP On Top = Tahan PPSSPP di Atas +Ignore Illegal Reads/Writes = Aba&ikan pembacaan/penulisan ilegal +Ignore Windows Key = Abaikan tombol windows +Keep PPSSPP On Top = Tahan PPSSPP di atas Landscape = Lanskap Landscape reversed = Lanskap terbalik Language... = Bahasa... Linear = &Linier Load = Muat... -Load .sym File... = Mu&at Berkas .sym... -Load Map File... = Muat Berkas &Map... -Load State = L&oad State -Load State File... = &Load State File... -Log Console = Konso&l Pencatat -Memory View... = Tampilan Memori... -More Settings... = Pengaturan Lainnya... +Load .sym File... = Mu&at berkas .sym... +Load Map File... = Muat berkas &peta... +Load State = M&uat Status +Load State File... = &Memuat berkas status... +Log Console = Konso&l pencatat +Memory View... = Tampilan memori... +More Settings... = Pengaturan lainnya... Nearest = Terdekat Non-Buffered Rendering = Lewati efek penyangga (tak-tersangga, lebih cepat) Off = Mati -Open Directory... = Buka &Direktori... +Open Chat = Buka opsi obrolan +Open Directory... = Buka &direktori... Open from MS:/PSP/GAME... = Buka dari MS:/PSP/GAME... Open Memory Stick = Buka &Memory Stick -Open New Instance = Open new instance +Open New Instance = Buka perumpamaan baru OpenGL = &OpenGL Pause = Jeda -Pause When Not Focused = Jeda Ketika Tidak Fokus +Pause When Not Focused = Jeda ketika tidak fokus Portrait = Tegak Portrait reversed = Tegak terbalik -Postprocessing Shader = Postprocessin&g Shader +Postprocessing Shader = Pemrosesan shader PPSSPP Forums = &Forum PPSSPP Record = Rekam -Record Audio = Rekam Suara -Record Display = Rekam Tampilan -Rendering Mode = M&ode Pelukisan -Rendering Resolution = &Resolusi Pelukisan -Reset = Tata Ulang -Reset Symbol Table = Tata Ulang Tabel Simbol +Record Audio = Rekam suara +Record Display = Rekam tampilan +Rendering Mode = M&ode pelukisan +Rendering Resolution = &Resolusi pelukisan +Reset = Atur ulang +Reset Symbol Table = Atur ulang tabel simbol Run = Jalankan -Save .sym File... = Simpan B&erkas .sym... -Save Map File... = &Simpan Berkas Peta... -Save State = Simp&an Posisi -Save State File... = &Simpan Berkas Posisi... -Savestate Slot = Saves&tate Slot -Screen Scaling Filter = Saringan P&enskala Layar -Show Debug Statistics = Tampilkan Statistik Debug -Show FPS Counter = Tampilkan Penghitung &FPS -Skip Number of Frames = Skip number of frames -Skip Percent of FPS = Skip percent of FPS +Save .sym File... = Simpan b&erkas .sym... +Save Map File... = &Simpan berkas Peta... +Save State = Simp&an status +Save State File... = &Simpan berkas status... +Savestate Slot = Simp&an slot status +Screen Scaling Filter = Penyaring p&enskala layar +Show Debug Statistics = Tampilkan statistik awakutu +Show FPS Counter = Tampilkan penghitung &FPS +Skip Number of Frames = Lewati nomor laju bingkai +Skip Percent of FPS = Lewati persen FPS Stop = Hentikan Switch UMD = Ganti UMD -Take Screenshot = Ambil &Tangkapan Layar -Texture Filtering = Penyaringan Tekstur -Texture Scaling = Penskala &Tekstur -Use Lossless Video Codec (FFV1) = Gunakan Lossless Video Codec (FFV1) -Use output buffer for video = Use output buffer for video -Vertex Cache = Tembolok &Vertex +Take Screenshot = Ambil &tangkapan layar +Texture Filtering = Penyaringan tekstur +Texture Scaling = Penskala &tekstur +Use Lossless Video Codec (FFV1) = Gunakan kompresi video (FFV1) +Use output buffer for video = Gunakan penyangga keluaran untuk video +Vertex Cache = Tembolok &vertex VSync = VS&ync Vulkan = Vulkan -Window Size = Ukuran Jendela +Window Size = Ukuran jendela www.ppsspp.org = Kunjungi www.&ppsspp.org xBRZ = &xBRZ [Developer] -Allocator Viewer = Allocator viewer (Vulkan) -Allow remote debugger = Allow remote debugger -Backspace = Spasi mundur +Allocator Viewer = Penampil pengalokasi (Vulkan) +Allow remote debugger = Izinkan awakutu jarak jauh +Backspace = Menghapus Block address = Alamat blok By Address = Berdasarkan alamat -Copy savestates to memstick root = Copy save states to Memory Stick root -Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Copy savestates to memstick root = Salin status simpan ke root Memory Stick +Create/Open textures.ini file for current game = Buat/Buka file textures.ini untuk permainan saat ini Current = Saat ini -Dev Tools = Development tools -DevMenu = DevMenu -Disabled JIT functionality = Disabled JIT functionality -Draw Frametimes Graph = Draw frametimes graph -Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot -Dump Frame GPU Commands = Dump frame GPU commands -Enable driver bug workarounds = Enable driver bug workarounds +Dev Tools = Alat pengembang +DevMenu = Menu pengembang +Disabled JIT functionality = Fungsi JIT dinonaktifkan +Draw Frametimes Graph = Gambar grafik sketsa waktu +Dump Decrypted Eboot = Buang EBOOT.BIN yang didekripsi pada pengaktifan ulang permainan +Dump Frame GPU Commands = Buang perintah laju bingkai GPU +Enable driver bug workarounds = Aktifkan solusi masalah driver Enable Logging = Hidupkan pencatat awakutu Enter address = Masukkan alamat FPU = FPU -Framedump tests = Framedump tests -Frame Profiler = Frame profiler -GPU Driver Test = GPU driver test -GPU Profile = GPU profile +Framedump tests = Tes pembuangan laju bingkai +Frame Profiler = Profil laju bingkai +GPU Driver Test = Tes driver GPU +GPU Profile = Profil GPU Jit Compare = Bandingkan Jit -JIT debug tools = JIT debug tools +JIT debug tools = Alat awakutu JIT Language = Bahasa Load language ini = Muat *.ini bahasa -Log Dropped Frame Statistics = Log dropped frame statistics +Log Dropped Frame Statistics = Log statistik laju bingkai yang jatuh Log Level = Tingkatan pencatat Log View = Tampilan pencatat Logging Channels = Kanal pencatatan @@ -228,59 +264,63 @@ Next = Sesudah No block = Tidak ada blok Prev = Sebelum Random = Acak -Replace textures = Replace textures -Reset limited logging = Reset limited logging -RestoreDefaultSettings = Apakah Anda yakin ingin mengembalikan semua pengaturan ke awal?\nPengaturan pemetaan kendali tidak berubah.\n\nAksi ini bersifat permanen.\nSilakan start ulang PPSSPP agar perubahan ini bisa diterapkan. +Replace textures = Ganti tekstur +Reset = Atur ulang +Reset limited logging = Setel ulang pencatatan terbatas +RestoreDefaultSettings = Apakah Anda yakin ingin mengembalikan semua pengaturan ke awal?\nPengaturan pemetaan kendali tidak berubah.\n\nAksi ini bersifat permanen.\nSilakan mulai ulang PPSSPP agar perubahan ini bisa diterapkan. RestoreGameDefaultSettings = Apakah Anda yakin ingin mengembalikan pengaturan permainan\nkembali ke pengaturan awal PPSSPP? -Resume = Resume +Resume = Lanjutkan Run CPU Tests = Jalankan pengujian CPU Save language ini = Simpan *.ini bahasa -Save new textures = Save new textures +Save new textures = Simpan tekstur baru Shader Viewer = Penampil shader Show Developer Menu = Tampilkan menu pengembang -Show on-screen messages = Show on-screen messages +Show on-screen messages = Tampilkan obrolan di layar Stats = Statistik System Information = Informasi sistem -Texture Replacement = Texture replacement +Texture Replacement = Penggantian tekstur Toggle Audio Debug = Alihkan awakutu audio Toggle Freeze = Alihkan pembekuan -Touchscreen Test = Touchscreen test +Touchscreen Test = Tes layar sentuh VFPU = VFPU [Dialog] * PSP res = * PSP res -Active = Active +Active = Aktif Back = Kembali Cancel = Batal Center = Tengah -ChangingGPUBackends = Pergantian GPU backend memerlukan start ulang PPSSPP. Start ulang sekarang? -ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? -Channel: = Channel: +ChangingGPUBackends = Pergantian penata GPU memerlukan start ulang PPSSPP. Mulai ulang sekarang? +ChangingInflightFrames = Mengubah penyangga perintah grafis membutuhkan PPSSPP untuk memulai ulang. Mulai ulang sekarang? +Channel: = Saluran: Choose PPSSPP save folder = Pilih folder simpanan PPSSPP -Confirm Overwrite = Apakah Anda ingin menimpa data? -Confirm Save = Apakah Anda ingin menyimpan data ini? +Confirm Overwrite = Apakah anda ingin menimpa data? +Confirm Save = Apakah anda ingin menyimpan data ini? ConfirmLoad = Muat data ini? -ConnectingAP = Connecting to the access point.\nPlease wait... -ConnectingPleaseWait = Connecting.\nPlease wait... -ConnectionName = Connection name -Corrupted Data = Corrupted data +ConnectingAP = Menghubungkan ke titik akses.\nHarap tunggu... +ConnectingPleaseWait = Menghubungkan.\nHarap tunggu... +ConnectionName = Nama koneksi +Corrupted Data = Data korup Delete = Hapus Delete all = Hapus semua Delete completed = Selesai menghapus. DeleteConfirm = Simpanan ini akan dihapus.\nAnda yakin ingin melanjutkan? DeleteConfirmAll = Apakah Anda ingin menghapus semua\ndata simpanan untuk permainan ini? -DeleteConfirmGame = Apakah Anda benar-benar ingin menghapus\npermainan ini dari pesawat? Aksi ini bersifat permanen. +DeleteConfirmGame = Apakah Anda benar-benar ingin menghapus\npermainan ini dari perangkat? Aksi ini bersifat permanen. DeleteConfirmGameConfig = Apakah Anda benar-benar ingin menghapus pengaturan untuk permainan ini? DeleteFailed = Tidak dapat menghapus data. Deleting = Menghapus\nMohon tunggu... -Disable All = Disable all +Disable All = Nonaktifkan semua +Dumps = Buang Edit = Edit -Enable All = Enable all -Enter = Enter +Enable All = Aktifkan semua +Enter = Masuk +Filter = Saring Finish = Selesai -Grid = Grid -Inactive = Inactive -InternalError = An internal error has occurred. +GE Frame Dumps = Buang laju bingkai GE +Grid = Kisi-kisi +Inactive = Tidak aktif +InternalError = Kesalahan internal telah terjadi. Load = Muat Load completed = Selesai memuat. Loading = Memuat\nMohon Tunggu... @@ -289,122 +329,125 @@ Move = Pindah Network Connection = Koneksi Jaringan NEW DATA = DATA BARU No = Tidak -ObtainingIP = Obtaining IP address.\nPlease wait... +ObtainingIP = Mendapatkan alamat IP.\nHarap tunggu... OK = Oke -Old savedata detected = Old savedata detected +Old savedata detected = Simpanan data lama terdeteksi Options = Pilihan -Reset = Tata Ulang -Resize = Resize +Reset = Atur ulang +Resize = Atur ulang ukuran Retry = Coba lagi Save = Simpan Save completed = Selesai menyimpan. Saving = Menyimpan\nMohon tunggu... SavingFailed = Tidak dapat menyimpan data. -Select = Select -Shift = Shift -Snap = Snap -Space = Space +Search = Cari +Select = Pilih +Shift = Geser +Skip = Lewati +Snap = Garis pinggir +Space = Spasi SSID = SSID Submit = Ajukan -Supported = Supported +Supported = Didukung There is no data = Tidak ada data. Toggle All = Alihkan semua -Toggle List = Toggle list -Unsupported = Unsupported -When you save, it will load on a PSP, but not an older PPSSPP = Setelah Anda menyimpan, ini akan dapat dimuat di PSP, namun tidak di PPSSPP lawas -When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Toggle List = Daftar pengalihan +Unsupported = Tidak didukung +When you save, it will load on a PSP, but not an older PPSSPP = Setelah anda menyimpan, ini akan dapat dimuat di PSP, namun tidak di PPSSPP lawas +When you save, it will not work on outdated PSP Firmware anymore = Saat anda menyimpan, itu tidak akan berfungsi lagi pada firmware PSP yang sudah lawas Yes = Ya -Zoom = Perbesaran +Zoom = Perbesar [Error] -7z file detected (Require 7-Zip) = berkas terkompresi (7z).\nMohon ekstrak dahulu (coba 7-Zip atau WinRAR). -A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. -Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +7z file detected (Require 7-Zip) = Berkas terkompresi (7z).\nMohon ekstrak dahulu (coba 7-Zip atau WinRAR). +A PSP game couldn't be found on the disc. = Sebuah permainan PSP tidak dapat ditemukan pada disk. +Cannot boot ELF located outside mountRoot. = Tidak dapat mem-boot ELF yang terletak di luar mountRoot. Could not save screenshot file = Tidak dapat menyimpan berkas tangkapan layar. -D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) -D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. -D3D11InitializationError = Direct3D 11 initialization error -D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. -D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +D3D9or11 = Direct3D 9? (atau "tidak" untuk Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll tidak ditemukan. Silakan instal. Atau tekan Ya untuk mencoba lagi menggunakan Direct3D 9 sebagai gantinya. +D3D11InitializationError = Kesalahan inisialisasi Direct3D 11 +D3D11Missing = Versi sistem operasi Anda tidak termasuk D3D11. Silakan jalankan Pembaruan Windows.\n\nTekan Ya untuk mencoba lagi menggunakan Direct3D 9 sebagai gantinya. +D3D11NotSupported = GPU Anda tampaknya tidak mendukung Direct3D 11.\n\nApakah Anda ingin mencoba lagi menggunakan Direct3D 9? Disk full while writing data = Penyimpanan penuh ketika menyimpan data. -ELF file truncated - can't load = ELF file truncated - can't load +ELF file truncated - can't load = File ELF terpotong - tidak dapat dimuat Error loading file = Tidak dapat memuat permainan. Error reading file = Kesalahan saat membaca berkas. -Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed initializing CPU/Memory = Gagal menginisialisasi CPU atau memori Failed to identify file = gagal mengidentifikasi berkas. -Failed to load executable: = Failed to load executable: -File corrupt = File corrupt -Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. -GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. -GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: -GenericDirect3D9Error = Gagal menginisiasi grafis. Coba tingkatkan penggerak grafis dan DirectX 9 runtime Anda.\n\nApakah Anda ingin mencoba beralih ke OpenGL?\n\nPesan galat: -GenericGraphicsError = Kesalahan pada Grafik -GenericOpenGLError = Gagal menginisiasi grafis. Coba tingkatkan penggerak grafis Anda.\n\nApakah Anda ingin mencoba beralih ke DirectX 9?\n\nPesan galat: -GenericVulkanError = Gagal menginisiasi grafis. Coba tingkatkan penggerak grafis Anda.\n\nApakah Anda ingin mencoba beralih ke OpenGL?\n\nPesan galat: -InsufficientOpenGLDriver = Penggerak OpenGL tidak mendukung!\n\nGPU Anda melaporkan bahwa tia tidak mendukung OpenGL 2.0. Apakah Anda ingin mencoba menggunakan DirectX saja?\n\nDirectX saat ini hanya cocok untuk beberapa permainan, namun hal ini menjadi satu-satunya pilihan bagi GPU Anda.\n\nKunjungi forum di https://forums.ppsspp.org untuk informasi lebih lanjut.\n\n -Just a directory. = hanya sebuah direktori. -Missing key = Missing key -MsgErrorCode = Error code: -MsgErrorSavedataDataBroken = Save data was corrupt. -MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. -MsgErrorSavedataNoData = Warning: no save data was found. -MsgErrorSavedataNoMS = Memory Stick not inserted. -No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. -Not a valid disc image. = Not a valid disc image. -OpenGLDriverError = Kesalahan pada penggerak OpenGL -PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. -PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. -PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +Failed to load executable: = Gagal memuat yang dapat dieksekusi: +File corrupt = Berkas korup +Game disc read error - ISO corrupt = Kesalahan pembacaan disk permainan: ISO rusak. +GenericAllStartupError = PPSSPP gagal memulai dengan penata grafis apa pun. Coba perbarui grafis Anda dan driver lainnya +GenericBackendSwitchCrash = PPSSPP mogok saat memulai.\n\nIni biasanya berarti masalah driver grafis. Coba tingkatkan driver grafis Anda.\n\nPenata grafis telah dialihkan: +GenericDirect3D9Error = Gagal menginisiasi grafis. Coba tingkatkan driver grafis dan DirectX 9 runtime Anda.\n\nApakah Anda ingin mencoba beralih ke OpenGL?\n\nPesan galat: +GenericGraphicsError = Kesalahan pada Grafis +GenericOpenGLError = Gagal menginisiasi grafis. Coba tingkatkan driver grafis Anda.\n\nApakah Anda ingin mencoba beralih ke DirectX 9?\n\nPesan galat: +GenericVulkanError = Gagal menginisiasi grafis. Coba tingkatkan driver grafis Anda.\n\nApakah Anda ingin mencoba beralih ke OpenGL?\n\nPesan galat: +InsufficientOpenGLDriver = Driver OpenGL tidak mendukung!\n\nGPU Anda melaporkan bahwa tia tidak mendukung OpenGL 2.0. Apakah Anda ingin mencoba menggunakan DirectX saja?\n\nDirectX saat ini hanya cocok untuk beberapa permainan, namun hal ini menjadi satu-satunya pilihan bagi GPU Anda.\n\nKunjungi forum di https://forums.ppsspp.org untuk informasi lebih lanjut.\n\n +Just a directory. = Hanya sebuah direktori. +Missing key = Kunci hilang +MsgErrorCode = Kesalahan Kode: +MsgErrorSavedataDataBroken = Simpanan data korup. +MsgErrorSavedataMSFull = Memory Stick penuh. Periksa ruang penyimpanan Anda. +MsgErrorSavedataNoData = Peringatan: tidak ada simpanan data yang ditemukan. +MsgErrorSavedataNoMS = Memory Stick tidak dimasukkan. +No EBOOT.PBP, misidentified game = tidak ada EBOOT.PBP, permainan salah diidentifikasi. +Not a valid disc image. = Bukan gambar disk yang valid +OpenGLDriverError = Kesalahan pada driver OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP tidak mendukung Musik UMD. +PPSSPP doesn't support UMD Video. = PPSSPP tidak mendukung Video UMD. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP memainkan permainan PSP, bukan permainan PlayStation 1 atau 2. PPSSPPDoesNotSupportInternet = PPSSPP saat ini tidak mendukung koneksi Internet untuk DLC, PSN, atau pembaruan permainan. PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT tidak didukung oleh PPSSPP. PSX game image detected. = Berkas tersebut adalah gambar MODE2. PPSSPP tidak mendukung permainan PS1. -RAR file detected (Require UnRAR) = berkas terkompresi (RAR).\nMohon ekstrak dahulu (coba UnRAR). -RAR file detected (Require WINRAR) = berkas terkompresi (RAR).\nMohon ekstrak dahulu (coba WinRAR). -Running slow: try frameskip, sound is choppy when slow = Berjalan lambat: coba frameskip, suara tidak lancar saat lamban -Running slow: Try turning off Software Rendering = Berjalan lambat: coba matikan "software rendering" +RAR file detected (Require UnRAR) = Berkas terkompresi (RAR).\nMohon ekstrak dahulu (coba UnRAR). +RAR file detected (Require WINRAR) = Berkas terkompresi (RAR).\nMohon ekstrak dahulu (coba WinRAR). +Running slow: try frameskip, sound is choppy when slow = Berjalan lambat: coba laju bingkai, suara tidak lancar saat lamban +Running slow: Try turning off Software Rendering = Berjalan lambat: coba matikan "Pelukisan perangkat lunak" Save encryption failed. This save won't work on real PSP = Enkripsi simpanan gagal. Simpanan ini tidak akan bekerja pada PSP asli. -textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. -This is a saved state, not a game. = This is a saved state, not a game. -This is save data, not a game. = This is save data, not a game. -Unable to create cheat file, disk may be full = Tidak dapat membuat berkas curang, penyimpanan mungkin penuh. -Unable to initialize rendering engine. = Unable to initialize rendering engine. +textures.ini filenames may not be cross-platform = Nama berkas "textures.ini" tidak boleh lintas platform. +This is a saved state, not a game. = Ini adalah status yang disimpan, bukan permainan. +This is save data, not a game. = Ini adalah simpanan data, bukan permainan. +Unable to create cheat file, disk may be full = Tidak dapat membuat berkas pengecoh, penyimpanan mungkin penuh. +Unable to initialize rendering engine. = Tidak dapat menginisialisasi mesin pelukisan. Unable to write savedata, disk may be full = Tidak dapat menulis simpanan, penyimpanan mungkin penuh. -Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Perhatian: Memori video PENUH, mengurangi penskalaan-atas dan berganti ke mode penembolokan lambat. -Warning: Video memory FULL, switching to slow caching mode = Perhatian: Memori video PENUH, berganti ke mode penembolokan lambat. -ZIP file detected (Require UnRAR) = berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba UnRAR). -ZIP file detected (Require WINRAR) = berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba WinRAR). +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Perhatian: Memori video penuh, mengurangi penskalaan-atas dan berganti ke mode penembolokan lambat. +Warning: Video memory FULL, switching to slow caching mode = Perhatian: Memori video penuh, berganti ke mode penembolokan lambat. +ZIP file detected (Require UnRAR) = Berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba UnRAR). +ZIP file detected (Require WINRAR) = Berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba WinRAR). [Game] Asia = Asia +Calculate CRC = Kalkulasi CRC ConfirmDelete = Hapus -Create Game Config = Buat konfig. permainan +Create Game Config = Buat konfigurasi permainan Create Shortcut = Buat jalan pintas Delete Game = Hapus permainan -Delete Game Config = Hapus konfig. permainan +Delete Game Config = Hapus konfigurasi permainan Delete Save Data = Hapus simpanan Europe = Eropa Game = Permainan Game Settings = Pengaturan permainan -Homebrew = Homebrew +Homebrew = Paket Permainan Hong Kong = Hong Kong -InstallData = Data install +InstallData = Instalasi data Japan = Jepang Korea = Korea MB = MB -One moment please... = One moment please... +One moment please... = Tolong tunggu sebentar... Play = Mainkan Remove From Recent = Hapus dari "Terbaru" -SaveData = Simpanan -Setting Background = Setting background -Show In Folder = Tampilkan di folder -USA = USA -Use UI background = Use UI background +SaveData = Simpanan data +Setting Background = Atur latar belakang +Show In Folder = Tampilkan di berkas +USA = Amerika Serikat +Use UI background = Gunakan latar belakang UI [Graphics] -% of the void = % of the void -% of viewport = % of viewport +% of the void = % dari kekosongan +% of viewport = % dari pandangan port %, 0:unlimited = %, 0 = tak terbatas -(supersampling) = (supersampling) +(supersampling) = (penghapus efek bergerigi membuat gambar menjadi lebih halus) (upscaling) = (skala-atas) 1x PSP = 1× PSP 2x = 2× @@ -423,88 +466,89 @@ Use UI background = Use UI background 10x PSP = 10× PSP 16x = 16× Aggressive = Agresif -Alternative Speed = Kec. alternatif (dalam %, 0 = tak terbatas) -Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Alternative Speed = Kecepatan alternatif (dalam %, 0 = tak terbatas) +Alternative Speed 2 = Kecepatan alternatif 2 (dalam %, 0 = tak terbatas) Anisotropic Filtering = Penyaringan anisotropik Auto = Otomatis Auto (1:1) = Otomatis (1:1) Auto (same as Rendering) = Otomatis (sama dengan resolusi pelukis) -Auto FrameSkip = Lewati Frame secara otomatis +Auto FrameSkip = Lewati laju bingkai secara otomatis +Auto Max Quality = Otomatis kualitas maksimum Auto Scaling = Penskala otomatis -Backend = Backend +Backend = Penata grafis Balanced = Seimbang Bicubic = Bikubik -BlockTransfer Tip = Beberapa game memerlukan opsi ini untuk menghindari kesalahan grafis. -BlockTransferRequired = Peringatan: Game ini membutuhkan "Simulasikan efek transfer blok" dalam keadaan menyala. +BlockTransfer Tip = Beberapa permainan memerlukan opsi ini untuk menghindari kesalahan grafis. +BlockTransferRequired = Peringatan: Permainan ini membutuhkan "Simulasikan efek transfer blok" dalam keadaan menyala. Both = Keduanya -Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffer graphics commands (faster, input lag) = Perintah grafis penyangga (lebih cepat, masukan lag) Buffered Rendering = Pelukisan tersangga -BufferedRenderingRequired = Peringatan: Game ini membutuhkan "mode pelukisan" yang ditetapkan "buffered". -Camera = Camera -Camera Device = Camera device +BufferedRenderingRequired = Peringatan: Permainan ini membutuhkan "Mode pelukisan" yang ditetapkan "Penyangga". +Camera = Kamera +Camera Device = Kamera perangkat Cardboard Screen Size = Ukuran layar (dalam % dari area layar) Cardboard Screen X Shift = X shift (dalam % dari ruang kosong) Cardboard Screen Y Shift = Y shift (dalam % dari ruang kosong) Cardboard VR Settings = Pengaturan Google Cardboard VR -Cheats = Cheats -Clear Speedhack = Clear framebuffers on first use (speed hack) -ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches -CPU Core = CPU core +Cheats = Pengecoh +Clear Speedhack = Hapus laju bingkai penyangga pada penggunaan pertama (peretasan cepat) +ClearSpeedhack Tip = Terkadang lebih cepat (kebanyakan di perangkat seluler), dapat menyebabkan gangguan +CPU Core = Inti CPU Debugging = Awakutu -DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. -Deposterize = Deposterize -Deposterize Tip = Fixes visual banding glitches in upscaled textures -Device = Device +DefaultCPUClockRequired = Peringatan: Permainan ini membutuhkan pewaktu CPU untuk disetel ke awal. +Deposterize = Deposterisasi +Deposterize Tip = Memperbaiki gangguan pita visual pada tekstur yang ditingkatkan +Device = Perangkat Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 Disable slower effects (speedup) = Matikan efek lambat (mempercepat) -Disabled = Disabled -Display layout editor = Penyunting tata letak tampilan +Disabled = Nonaktif +Display layout editor = Penyesuaian tata letak tampilan Display Resolution (HW scaler) = Resolusi tampilan (penskala HW) -Dump next frame to log = Dump next frame to log -Enable Cardboard VR = Enable Cardboard VR +Dump next frame to log = Buang laju bingkai selanjutnya untuk masuk +Enable Cardboard VR = Aktifkan Cardboard VR FPS = FPS -Frame Rate Control = Kontrol framerate -Frame Skipping = Lewati Frame -Frame Skipping Type = Frame skipping type +Frame Rate Control = Kontrol laju bingkai +Frame Skipping = Lewati laju bingkai +Frame Skipping Type = Jenis lewati laju bingkai FullScreen = Layar penuh Hack Settings = Retas pengaturan (menyebabkan kecacatan) -Hardware Tessellation = Hardware Tessellation +Hardware Tessellation = Pengujian perangkat keras Hardware Transform = Transformasi perangkat keras hardware transform error - falling back to software = Kesalahan perangkat keras, kembali ke perangkat lunak HardwareTessellation Tip = Menggunakan perangkat keras untuk menggambar kurva, selalu menggunakan kualitas yang tetap High = Tinggi Hybrid = Hibrida Hybrid + Bicubic = Hibrida + Bikubik -Ignore camera notch when centering = Ignore camera notch when centering +Ignore camera notch when centering = Abaikan pandangan kamera saat sedang fokus Internal Resolution = Resolusi internal Lazy texture caching = Perlambatan penembolokan tekstur (mempercepat) Linear = Linier Low = Rendah LowCurves = Kualitas kurva spline/bezier -LowCurves Tip = Hanya digunakan oleh beberapa permainan, mengontrol kualitas kurva Bezier dan splines +LowCurves Tip = Hanya digunakan oleh beberapa permainan, mengontrol kualitas kurva bezier dan spline Lower resolution for effects (reduces artifacts) = Resolusi efek lebih rendah (mengurangi artefak) Manual Scaling = Penskala manual Medium = Menengah Mode = Mode -Must Restart = Anda harus menstart ulang PPSSPP agar perubahan ini berfungsi. -Native device resolution = Resolusi asli pesawat +Must Restart = Anda harus memulai ulang PPSSPP agar perubahan ini berfungsi. +Native device resolution = Resolusi asli Nearest = Terdekat -No buffer = No buffer +No buffer = Tidak ada penyangga Non-Buffered Rendering = Lewati efek penyangga (tak tersangga, lebih cepat) None = Tidak ada -Number of Frames = Number of frames +Number of Frames = Nomor laju bingkai Off = Mati OpenGL = OpenGL Overlay Information = Tampilan Informasi -Partial Stretch = Partial stretch -Percent of FPS = Percent of FPS +Partial Stretch = Peregangan sebagian +Percent of FPS = Persen FPS Performance = Kinerja -Postprocessing effect = Postprocessing effects -Postprocessing Shader = Postprocessing shader -Recreate Activity = Recreate activity -Render duplicate frames to 60hz = Render duplicate frames to 60 Hz -RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Postprocessing effect = Efek pemrosesan +Postprocessing Shader = Pemrosesan shader +Recreate Activity = Buat ulang aktivitas +Render duplicate frames to 60hz = Pelukisan bingkai duplikat menjadi 60 Hz +RenderDuplicateFrames Tip = Dapat membuat laju bingkai lebih lancar dalam permainan yang berjalan pada laju bingkai yang lebih rendah Rendering Mode = Mode pelukisan Rendering Resolution = Resolusi pelukisan RenderingMode NonBuffered Tip = Lebih cepat, namun mungkin tidak ada gambar di beberapa permainan @@ -512,12 +556,12 @@ Retain changed textures = Tahan tekstur yang berubah (adakalanya lambat) RetainChangedTextures Tip = Membuat beberapa permainan lambat, namun beberapa lainnya sangat cepat Rotation = Rotasi Safe = Aman -Screen layout = Screen layout -Screen Scaling Filter = Saringan penskala layar +Screen layout = Tata letak layar +Screen Scaling Filter = Penyaring penskala layar Show Debug Statistics = Tampilkan statistik awakutu Show FPS Counter = Tampilkan penghitung FPS Simulate Block Transfer = Simulasikan efek transfer blok -SoftGPU Tip = Saat ini SANGAT lambat +SoftGPU Tip = Saat ini sangat lambat Software Rendering = Pelukisan perangkat lunak (eksperimen) Software Skinning = Pengkulitan perangkat lunak SoftwareSkinning Tip = Menggabungkan model berkulit pada CPU, lebih cepat di kebanyakan permainan @@ -526,15 +570,15 @@ Stretching = Peregangan Texture Filter = Penyaring tekstur Texture Filtering = Penyaringan tekstur Texture Scaling = Penskala tekstur -Texture Shader = Texture shader -Turn off Hardware Tessellation - unsupported = Matikan "hardware tessellation": Tidak didukung +Texture Shader = Tekstur shader +Turn off Hardware Tessellation - unsupported = Matikan "Pengujian perangkat keras": Tidak didukung Unlimited = Tak terbatas -Up to 1 = Up to 1 -Up to 2 = Up to 2 +Up to 1 = Hingga 1 +Up to 2 = Hingga 2 Upscale Level = Tingkat skala-atas Upscale Type = Jenis skala-atas -UpscaleLevel Tip = Berat di CPU - beberapa pengskala mungkin tertunda untuk menghindari kegagapan -Use all displays = Use all displays +UpscaleLevel Tip = Berat di CPU - beberapa penskala mungkin tertunda untuk menghindari kegagapan +Use all displays = Gunakan semua tampilan Vertex Cache = Tembolok vertex VertexCache Tip = Lebih cepat, namun dapat menyebabkan kedipan sementara VSync = VSync @@ -546,280 +590,338 @@ xBRZ = xBRZ Delete ZIP file = Hapus berkas ZIP Install = Pasang Install game from ZIP file? = Pasang permainan dari berkas ZIP? -Install textures from ZIP file? = Install textures from ZIP file? +Install textures from ZIP file? = Pasang tekstur dari file ZIP? Installed! = Terpasang! -Texture pack doesn't support install = Texture pack doesn't support install -Zip archive corrupt = ZIP archive corrupt -Zip file does not contain PSP software = ZIP file does not contain PSP software +Texture pack doesn't support install = Paket tekstur tidak mendukung pemasangan +Zip archive corrupt = Arzip ZIP korup +Zip file does not contain PSP software = File ZIP tidak mengandung perangkat lunak PSP [KeyMapping] Autoconfigure = Konfigurasi otomatis Autoconfigure for device = Konfigurasi otomatis untuk perangkat +Bind All = Ikat/simpan semua Clear All = Bersihkan semua -Default All = Kembalikan ke awal +Default All = Kembalikan ke pengaturan awal Map a new key for = Tombol kunci baru ditetapkan ke Map Key = Tetapkan kunci/tombol Map Mouse = Tetapkan mouse -Test Analogs = Uji analog -You can press ESC to cancel. = kamu dapat membatalkan dengan menekan ESC. +Replace = Timpa +Show PSP = Tampilkan PSP +Test Analogs = Penguji analog +You can press ESC to cancel. = Kamu dapat membatalkan dengan menekan ESC. [MainMenu] Browse = Telusuri... -Buy PPSSPP Gold = Buy PPSSPP Gold -Choose folder = Choose folder +Buy PPSSPP Gold = Beli PPSSPP Emas +Choose folder = Pilih berkas Credits = Kredit/Kontributor -PPSSPP Homebrew Store = PPSSPP Homebrew Store +PPSSPP Homebrew Store = Toko Paket Permainan PPSSPP Exit = Keluar Game Settings = Pengaturan Games = Permainan Give PPSSPP permission to access storage = Berikan PPSSPP izin untuk mengakses penyimpanan -Homebrew & Demos = Homebrew && Demos +Homebrew & Demos = Paket Permainan && Demos How to get games = Bagaimana caranya mendapatkan permainan? -How to get homebrew & demos = Bagaimana caranya mendapatkan homebrew && demos? -Load = Muat... -Loading... = Loading... +How to get homebrew & demos = Bagaimana caranya mendapatkan Paket Permainan && Demos? +Load = Muat Permainan +Loading... = Memuat... PinPath = Sematkan PPSSPP can't load games or save right now = PPSSPP tidak dapat memuat dan menyimpan permainan saat ini Recent = Terbaru -SavesAreTemporary = PPSSPP is saving in temporary storage -SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently -SavesAreTemporaryIgnore = Ignore warning +SavesAreTemporary = PPSSPP menyimpan di penyimpanan sementara +SavesAreTemporaryGuidance = Ekstrak PPSSPP di suatu tempat untuk menyimpan secara permanen +SavesAreTemporaryIgnore = Abaikan peringatan UnpinPath = Lepaskan +UseBrowseOrLoad = Gunakan Telusuri untuk memilih berkas permainan, atau Muat Permainan untuk memilih berkas permainan. www.ppsspp.org = www.ppsspp.org [MainSettings] Audio = Suara Controls = Kontrol -Graphics = Grafik -Networking = Jaringan +Graphics = Grafis +Networking = Koneksi System = Sistem Tools = Alat [MappableControls] -Alt speed 1 = Alt speed 1 -Alt speed 2 = Alt speed 2 -An.Down = Analog Bawah -An.Left = Analog Kiri -An.Right = Analog Kanan -An.Up = Analog Atas +Alt speed 1 = Kecepatan alternatif 1 +Alt speed 2 = Kecepatan alternatif 2 +An.Down = Analog bawah +An.Left = Analog kiri +An.Right = Analog kanan +An.Up = Analog atas Analog limiter = Pembatas analog -Analog Stick = Kendali analog -Audio/Video Recording = Audio/Video recording -Auto Analog Rotation (CCW) = Auto analog rotation (CCW) -Auto Analog Rotation (CW) = Auto analog rotation (CW) +Analog Stick = Pengendali analog +Audio/Video Recording = Perekam audio/video +Auto Analog Rotation (CCW) = Rotasi analog otomatis (CCW) +Auto Analog Rotation (CW) = Rotasi analog otomatis (CW) AxisSwap = Tukar sumbu -Circle = Circle -Cross = Cross -D-pad down = D-pad down -D-pad left = D-pad left -D-pad right = D-pad right -D-pad up = D-pad up -DevMenu = DevMenu +Circle = Lingkaran +Cross = Seberang +Custom 1 = Kustom 1 +Custom 10 = Kustom 10 +Custom 2 = Kustom 2 +Custom 3 = Kustom 3 +Custom 4 = Kustom 4 +Custom 5 = Kustom 5 +Custom 6 = Kustom 6 +Custom 7 = Kustom 7 +Custom 8 = Kustom 8 +Custom 9 = Kustom 9 +D-pad down = D-pad bawah +D-pad left = D-pad kiri +D-pad right = D-pad kanan +D-pad up = D-pad atas +DevMenu = Menu Pengembang +Double tap button = Tekan tombol dua kali Down = Dpad Bawah Dpad = Dpad -Frame Advance = Frame advance -Hold = Hold -Home = Home +Frame Advance = Memajukan Bingkai +Hold = Tahan +Home = Beranda L = L -Left = Dpad Kiri -Load State = Muat Posisi -Mute toggle = Mute toggle +Left = Dpad kiri +Load State = Muat status +Mute toggle = Matikan pengalihan Next Slot = Slot berikutnya -None = None -Note = Note -OpenChat = Open chat +None = Tidak ada +Note = Catatan +OpenChat = Buka obrolan Pause = Jeda R = R -RapidFire = Rapid-fire -Remote hold = Remote hold -Rewind = Rewind -Right = Dpad Kanan -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) -RightAn.Down = RightAn.Bawah -RightAn.Left = RightAn.Kiri -RightAn.Right = RightAn.Kanan -RightAn.Up = RightAn.Atas -Rotate Analog (CCW) = Rotate analog (CCW) -Rotate Analog (CW) = Rotate analog (CW) -Save State = Simpan Posisi -Screen = Screen -Screenshot = Screenshot -Select = Select -SpeedToggle = Speed toggle -Square = Square -Start = Start -Texture Dumping = Texture dumping -Texture Replacement = Texture replacement -Toggle Fullscreen = Toggle fullscreen -Toggle mode = Toggle mode -Triangle = Triangle -Fast-forward = Fast-forward +RapidFire = Tembakan beruntun +Record = Rekam +Remote hold = Pegangan jarak jauh +Rewind = Putar ulang +Right = Dpad kanan +Right Analog Stick = Stik analog kanan +RightAn.Down = Analog bawah kanan +RightAn.Left = Analog kiri kanan +RightAn.Right = Analog kanan kanan +RightAn.Up = Analog atas Kanan +Rotate Analog (CCW) = Rotasi analog (CCW) +Rotate Analog (CW) = Rotasi analog (CW) +Save State = Simpan status +Screen = Layar +Screenshot = Tangkapan layar +Select = Pilih +SpeedToggle = Kecepatan pengalihan +Square = Persegi +Start = Mulai +Swipe Down = Geser kebawah +Swipe Left = Geser kekiri +Swipe Right = Geser kekanan +Swipe Up = Geser keatas +tap to customize = Tekan untuk menyesuaikan +Texture Dumping = Pembuangan tekstur +Texture Replacement = Timpa tekstur +Toggle Fullscreen = Pengalihan layar penuh +Toggle mode = Mode pengalihan +Triangle = Segitiga +Fast-forward = Pemajuan cepat Up = Dpad Atas -Vol + = Vol + -Vol - = Vol - +Vol + = Volume + +Vol - = Volume - Wlan = WLAN +[MemStick] +Already contains PSP data = Sudah berisi data PSP +Create or Choose a PSP folder = Buat atau Pilih berkas PSP +Current = Saat ini +DataCanBeShared = Data bisa dibagikan antar PPSSPP reguler/emas +DataCannotBeShared = Data tidak bisa dibagi antar PPSSPP reguler/emas! +DataWillBeLostOnUninstall = Peringatan! Data akan hilang ketika Anda menghapus PPSSPP! +DataWillStay = Data akan tetap ada meskipun Anda menghapus PPSSPP. +Done! = Selesai! +EasyUSBAccess = Akses mudah USB +Failed to move some files! = Gagal memindahkan beberapa berkas! +Failed to save config = Gagal menyimpan konfigurasi +Free space = Penyimpanan bebas +Manually specify PSP folder = Tentukan berkas PSP secara manual +MemoryStickDescription = Pilih tempat menyimpan data PSP (Memory Stick) +Move Data = Pindah data +Selected PSP Data Folder = Pilih berkas data PSP +No data will be changed = Tidak ada data yang akan diubah +PPSSPP will restart after the change = PPSSPP akan mulai ulang setelah perubahan +Skip for now = Lewati untuk sekarang +Starting move... = Mulai pindah... +That folder doesn't work as a memstick folder. = Berkas itu tidak berfungsi sebagai berkas Memory Stick. +USBAccessThrough = Akses USB melalui Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = Akses USB melalui Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Gunakan data aplikasi pribadi +Use PSP folder at root of storage = Gunakan berkas PSP di root penyimpanan +Welcome to PPSSPP! = Selamat Datang di PPSSPP! +WhatsThis = Apa ini? + [Networking] -Adhoc Multiplayer forum = Kunjungi forum Ad Hoc Multiplayer -AdHoc Server = Ad hoc server -AdhocServer Failed to Bind Port = Ad hoc server failed to bind port -Auto = Auto -Bottom Center = Bottom center -Bottom Left = Bottom left -Bottom Right = Bottom right -Center Left = Center left -Center Right = Center right +AdHoc Server = Server Ad Hoc +AdhocServer Failed to Bind Port = Server Ad Hoc gagal memuat port +AM: Data from Unknown Port = AM: Data dari port tidak dikenal +Auto = Otomatis +Bottom Center = Tengah bawah +Bottom Left = Kiri bawah +Bottom Right = Kanan bawah +Center Left = Kiri tengah +Center Right = Kanan tengah Change Mac Address = Ganti alamat MAC -Change proAdhocServer Address = Ganti alamat IP pelayan PRO ad hoc (localhost = multiple instances) -Chat = Chat -Chat Button Position = Chat button position -Chat Here = Chat here -Chat Screen Position = Chat screen position -Disconnected from AdhocServer = Disconnected from ad hoc server -DNS Error Resolving = DNS error resolving -Enable built-in PRO Adhoc Server = Hidupkan pelayan PRO ad hoc bawaan -Enable network chat = Enable network chat -Enable networking = Hidupkan jaringan/WLAN (beta, mungkin merusak permainan) -Enable UPnP = Enable UPnP (need a few seconds to detect) -EnableQuickChat = Enable quick chat -Enter a new PSP nickname = Enter a new PSP nickname -Enter Quick Chat 1 = Enter quick chat 1 -Enter Quick Chat 2 = Enter quick chat 2 -Enter Quick Chat 3 = Enter quick chat 3 -Enter Quick Chat 4 = Enter quick chat 4 -Enter Quick Chat 5 = Enter quick chat 5 -Error = Error -Failed to Bind Localhost IP = Failed to bind localhost IP -Failed to Bind Port = Failed to bind port -Failed to connect to Adhoc Server = Failed to connect to ad hoc server -Forced First Connect = Forced first connect (faster connect) -Invalid IP or hostname = Invalid IP or hostname -Minimum Timeout = Minimum timeout (override in ms, 0 = default) -Misc = Miscellaneous (default = PSP compatibility) +Change proAdhocServer Address = Ganti alamat IP pelayan PRO ad hoc (lokal) +Chat = Obrolan +Chat Button Position = Posisi tombol obrolan +Chat Here = Obrolan disini +Chat message = Pesan obrolan +Chat Screen Position = Posisi layar obrolan +Disconnected from AdhocServer = Terputus dari server Ad Hoc +DNS Error Resolving = Penyelesaian kesalahan DNS +Enable built-in PRO Adhoc Server = Hidupkan pelayan PRO Ad Hoc bawaan +Enable network chat = Aktifkan jaringan obrolan +Enable networking = Hidupkan jaringan/WLAN +Enable UPnP = Aktifkan UPnP (perlu beberapa detik untuk mendeteksi) +EnableQuickChat = Aktifkan obrolan cepat +Enter a new PSP nickname = Masukkan nama panggilan PSP baru +Enter Quick Chat 1 = Masukan obrolan cepat 1 +Enter Quick Chat 2 = Masukan obrolan cepat 2 +Enter Quick Chat 3 = Masukan obrolan cepat 3 +Enter Quick Chat 4 = Masukan obrolan cepat 4 +Enter Quick Chat 5 = Masukan obrolan cepat 5 +Error = Kesalahan +Failed to Bind Localhost IP = Gagal memuat IP host lokal +Failed to Bind Port = Gagal memuat port +Failed to connect to Adhoc Server = Gagal terhubung ke server Ad Hoc +Forced First Connect = Sambungan pertama paksa (koneksi lebih cepat) +GM: Data from Unknown Port = GM: Data dari port tidak dikenal +Hostname = Nama Host +Invalid IP or hostname = IP atau nama host tidak valid +Minimum Timeout = Batas waktu minimum (batas dalam ms, 0 = bawaan) +Misc = Lain-lain (bawaan= kompatibilitas PSP) Network Initialized = Jaringan terinisiasi -Please change your Port Offset = Please change your port offset -Port offset = Port offset (0 = kecocokan dengan PSP) -proAdhocServer Address: = Ad hoc server address: -Quick Chat 1 = Quick chat 1 -Quick Chat 2 = Quick chat 2 -Quick Chat 3 = Quick chat 3 -Quick Chat 4 = Quick chat 4 -Quick Chat 5 = Quick chat 5 -QuickChat = Quick chat -Send = Send -Send Discord Presence information = Send Discord "Rich Presence" information -TCP No Delay = TCP No Delay (faster TCP) -Top Center = Top center -Top Left = Top left -Top Right = Top right -Unable to find UPnP device = Unable to find UPnP device -UPnP (port-forwarding) = UPnP (port forwarding) -UPnP need to be reinitialized = UPnP need to be reinitialized -UPnP use original port = UPnP use original port (enabled = PSP compatibility) -Validating address... = Validating address... -WLAN Channel = WLAN channel -You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall +None = Tidak ada +Please change your Port Offset = Harap ubah letak port Anda +Port offset = Letak port (0 = kecocokan dengan PSP) +PPSSPP Ad-Hoc Wiki Page = Halaman Wiki PPSSPP Ad-Hoc +proAdhocServer Address: = Ad Hoc alamat server: +Quick Chat 1 = Obrolan cepat 1 +Quick Chat 2 = Obrolan cepat 2 +Quick Chat 3 = Obrolan cepat 3 +Quick Chat 4 = Obrolan cepat 4 +Quick Chat 5 = Obrolan cepat 5 +QuickChat = Obrolan cepat +Send = Kirim +Send Discord Presence information = Kirim informasi "Kritik dan Saran" ke Discord +TCP No Delay = TCP tanpa penundaan (TCP lebih cepat) +Top Center = Tengah atas +Top Left = Kiri atas +Top Right = Kanan atas +Unable to find UPnP device = Tidak dapat menemukan perangkat UPnP +UPnP (port-forwarding) = UPnP (penerusan port) +UPnP need to be reinitialized = UPnP perlu diinisialisasi ulang +UPnP use original port = UPnP menggunakan port asli (diaktifkan = kompatibilitas PSP) +Validating address... = Validasi alamat... +WLAN Channel = Saluran WLAN +You're in Offline Mode, go to lobby or online hall = Anda dalam mode offline, pergi ke lobi atau aula online [Pause] Cheats = Pengecoh Continue = Lanjutkan -Create Game Config = Buat konfig. permainan -Delete Game Config = Hapus konfig. permainan +Create Game Config = Buat konfigurasi permainan +Delete Game Config = Hapus konfigurasi permainan Exit to menu = Keluar ke menu Game Settings = Pengaturan permainan -Load State = Muat posisi -Rewind = Rewind -Save State = Simpan posisi +Load State = Muat status +Rewind = Putar ulang +Save State = Simpan status Settings = Pengaturan Switch UMD = Ganti UMD +Undo last load = Urungkan pemuatan terakhir +Undo last save = Urungkan penyimpanan terakhir [PostShaders] -(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +(duplicated setting, previous slider will be used) = (pengaturan duplikat, penggeser sebelumnya akan digunakan) 4xHqGLSL = 4×HQ GLSL 5xBR = 5xBR 5xBR-lv2 = 5xBR-lv2 -AAColor = AA-Color -Amount = Amount -Black border = Black border -Bloom = Bloom -Brightness = Brightness +AAColor = Warna AA +Amount = Jumlah +Black border = Perbatasan Hitam +Bloom = Kembang +Brightness = Kecerahan Cartoon = Kartun -ColorCorrection = Color correction -Contrast = Contrast -CRT = CRT scanlines -FXAA = FXAA Antialiasing +ColorCorrection = Koreksi Warna +Contrast = Kontras +CRT = CRT +FXAA = Mengurangi Artifak Distorsi (FXAA) Gamma = Gamma Grayscale = Abu-abu -Intensity = Intensity +Intensity = Intensitas InverseColors = Warna Terbalik Natural = Warna Natural -NaturalA = Natural Colors (no blur) +NaturalA = Warna Natural (tidak kabur) Off = Mati -Power = Power -PSPColor = PSP color -Saturation = Saturation -Scanlines = Scanlines (CRT) +Power = Daya +PSPColor = Warna PSP +Saturation = Saturasi +Scanlines = Pindai Garis (CRT) Sharpen = Pertajam -SSAA(Gauss) = Supersampling AA (Gauss) +SSAA(Gauss) = SSAA (Gauss) Tex4xBRZ = 4xBRZ -UpscaleSpline36 = Spline36 Upscaler -VideoSmoothingAA = VideoSmoothingAA -Vignette = Vignette +TexMMPX = MMPX +UpscaleSpline36 = Spline36 Kelas Atas +VideoSmoothingAA = Penghalus Video AA +Vignette = Skema [PSPCredits] -all the forum mods = all the forum mods -build server = build server -Buy Gold = Beli versi Gold +all the forum mods = Semua forum mod +build server = Membangun server +Buy Gold = Beli versi Emas check = Lihat pula Dolphin, emulator Wii/GC terbaik: -CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +CheckOutPPSSPP = Lihat PPSSPP, emulator PSP yang luar biasa: https://www.ppsspp.org/ contributors = Kontributor: created = Dibuat oleh Discord = Discord info1 = PPSSPP dimaksudkan untuk tujuan pendidikan saja. info2 = Mohon pastikan bahwa Anda punya hak terhadap permainan -info3 = yang Anda mainkan dengan memiliki UMD atau membeli versi -info4 = unduhan digital dari toko PSN di PSP asli Anda. +info3 = Yang Anda mainkan dengan memiliki UMD atau membeli versi +info4 = Unduhan digital dari toko PSN di PSP asli Anda. info5 = PSP adalah merek dagang milik Sony, Inc. -iOS builds = iOS builds +iOS builds = Membangun iOS license = Perangkat lunak bebas di bawah GPL 2.0+ -list = daftar kecocokan, forum, dan informasi pengembangan +list = Daftar kecocokan, forum, dan informasi pengembangan PPSSPP Forums = Forum PPSSPP -Privacy Policy = Privacy policy +Privacy Policy = Kebijakan pribadi Share PPSSPP = Bagikan PPSSPP specialthanks = Ucapan terima kasih kepada: -specialthanksKeithGalocy = at NVIDIA (hardware, advice) -specialthanksMaxim = for his amazing Atrac3+ decoder work -testing = testing +specialthanksKeithGalocy = Untuk NVIDIA (perangkat keras, saran) +specialthanksMaxim = Untuk karya dekoder Atrac3+ yang luar biasa +testing = Penguji this translation by = Diterjemahkan oleh: title = Sebuah emulator PSP yang cepat dan portabel tools = Alat-alat bebas yang digunakan: # Add translators or contributors who translated PPSSPP into your language here. # Add translators1-6 for up to 6 lines of translator credits. # Leave extra lines blank. 4 contributors per line seems to look best. -translators1 = mupralsh +translators1 = PutuDesca translators2 = ubunteroz translators3 = niznet -translators4 = -translators5 = +translators4 = mupralsh +translators5 = eerdfz translators6 = Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Kunjungi situs: written = Ditulis dalam bahasa C++ demi kecepatan dan portabilitas [RemoteISO] -Browse Games = Jelajahi game +Browse Games = Telusuri permainan Local Server Port = Port pelayan lokal -Manual Mode Client = Manual mode client -Remote disc streaming = Remote disc streaming -Remote Port = Remote port -Remote Server = Remote server -Remote Subdirectory = Remote subdirectory +Manual Mode Client = Mode klien manual +Remote disc streaming = Pengendali disk streaming jarak jauh +Remote Port = Pengendali port jarak jauh +Remote Server = Pengandali server jarak jauh +Remote Subdirectory = Pengendali direktori jarak jauh RemoteISODesc = Permainan dalam daftar terkini akan dibagikan RemoteISOLoading = Terhubung, memuat daftar permainan... -RemoteISOScanning = Scanning... Click "share games" on your server device -RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOScanning = Memeriksa... Klik "bagikan permainan" di server perangkat anda +RemoteISOScanningTimeout = Memeriksa... periksa pengaturan firewall desktop Anda RemoteISOWifi = Catatan: Hubungkan kedua perangkat ke dalam jaringan WiFi yang sama -RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +RemoteISOWinFirewall = Peringatan: Windows firewall memblokir berbagi Settings = Pengaturan Share Games (Server) = Bagikan permainan (pelayan) Share on PPSSPP startup = Bagikan saat memulai PPSSPP @@ -828,6 +930,8 @@ Stopping.. = Menghentikan... [Reporting] Bad = Buruk +FeedbackCRCCalculating = Disk CRC: Perhitungan... +FeedbackCRCValue = Disk CRC: [VALUE] FeedbackDelayInfo = Data Anda akan dikirim di latar belakang. FeedbackDesc = Bagaimana emulasinya? Beritahu kami dan komunitas! FeedbackDisabled = Laporan kompatibilitas harus diaktifkan. @@ -837,14 +941,14 @@ FeedbackSubmitDone = Data anda telah terkirim. FeedbackSubmitFail = Tidak bisa mengirimkan data ke server. Coba perbarui PPSSPP. FeedbackThanks = Terima kasih atas umpan balik Anda! Gameplay = Gameplay -Graphics = Grafik +Graphics = Grafis Great = Bagus In-game = Dalam permainan In-game Description = Masuk dalam permainan, tapi terlalu berkutu untuk diselesaikan -Menu/Intro = Menu/Intro +Menu/Intro = Menu/Pembukaan Menu/Intro Description = Tidak dapat masuk dalam permainan Nothing = Tidak ada -Nothing Description = Rusak sama sekali +Nothing Description = Tidak ada deskripsi OK = Oke Open Browser = Buka peramban Overall = Keseluruhan @@ -853,54 +957,60 @@ Perfect Description = Emulasi sempurna untuk seluruh permainan - hebat! Plays = Bermain Plays Description = Sepenuhnya dapat dimainkan, tapi mungkin ada kesalahan. ReportButton = Laporkan umpan balik +Show disc CRC = Tampilkan disk CRC Speed = Kecepatan Submit Feedback = Ajukan umpan balik -SuggestionConfig = See reports on website for good settings. -SuggestionCPUSpeed0 = Disable locked CPU speed setting. -SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). -SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. -SuggestionsNone = This game isn't working for other users too. -SuggestionsWaiting = Submitting and checking other users feedback... -SuggestionUpgrade = Upgrade to a newer PPSSPP build. -SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +SuggestionConfig = Lihat laporan di situs web untuk pengaturan yang lebih baik. +SuggestionCPUSpeed0 = Nonaktifkan pengaturan kecepatan CPU yang terkunci. +SuggestionDowngrade = Turunkan versi ke versi PPSSPP yang lebih lama (harap laporkan masalah ini). +SuggestionsFound = Pengguna lain telah melaporkan hasil yang lebih baik. Ketuk "Lihat umpan balik" untuk detail selengkapnya. +SuggestionsNone = Permainan ini juga tidak berfungsi untuk pengguna lain. +SuggestionsWaiting = Mengirim dan memeriksa umpan balik pengguna lain... +SuggestionUpgrade = Tingkatkan ke versi PPSSPP yang lebih baru. +SuggestionVerifyDisc = Periksa apakah ISO Anda adalah salinan yang baik dari disk Anda. Unselected Overall Description = Seberapa baik permainannya berjalan? View Feedback = Lihat semua umpan balik [Savedata] -Date = Date -Filename = Filename -No screenshot = Tangkapan layar kosong -None yet. Things will appear here after you save. = Belum ada. Sesuatu akan muncul di sini setelah Anda menyimpan. +Date = Tanggal +Filename = Nama berkas +No screenshot = Tidak ada tangkapan layar +None yet. Things will appear here after you save. = Belum ada. Sesuatu akan muncul di sini setelah anda menyimpan. +Nothing matching '%1' was found. = Tidak ditemukan yang cocok dengan '%1'. Save Data = Simpan data -Save States = Simpanan posisi +Save States = Simpanan status Savedata Manager = Pengatur data simpanan -Size = Size +Showing matches for '%1'. = Menampilkan kecocokan untuk '%1'. +Size = Ukuran [Screen] -Cardboard VR OFF = Cardboard VR off -Chainfire3DWarning = PERINGATAN: Chainfire3D terdeteksi, mungkin akan menyebabkan masalah. -Failed to load state = Gagal memuat posisi permainan -Failed to save state = Gagal menyimpan posisi permainan +Cardboard VR OFF = Cardboard VR mati +Chainfire3DWarning = Peringatan: Chainfire3D terdeteksi, mungkin akan menyebabkan masalah. +Failed to load state = Gagal memuat status permainan +Failed to save state = Gagal menyimpan status permainan fixed = Kecepatan: alternatif GLToolsWarning = PERINGATAN: GLTools terdeteksi, mungkin akan menyebabkan masalah. -In menu = In menu -Load savestate failed = Gagal memuat simpanan posisi permainan -Loaded State = Posisi/keadaan termuat -Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +In menu = Dalam menu +Load savestate failed = Gagal memuat simpanan status permainan +Loaded State = Status/keadaan termuat +Loaded. Game may refuse to save over different savedata. = Sarat. Permainan mungkin menolak untuk menyimpan lebih dari simpanan data yang berbeda. +Loaded. Game may refuse to save over newer savedata. = Sarat. Permainan mungkin menolak untuk menyimpan lebih dari simpanan data yang lebih baru. +Loaded. Save in game, restart, and load for less bugs. = Sarat. Simpan dalam permainan, mulai ulang, dan muat untuk mengurangi kesalahan. LoadStateDoesntExist = Gagal memuat posisi permainan: Simpanan tidak ada! LoadStateWrongVersion = Gagal memuat posisi permainan: Simpanan ini untuk versi lawas dari PPSSPP! norewind = Tidak ada penyimpanan posisi permainan lawas yang tersedia. -Playing = Playing +Playing = Bermain PressESC = Tekan ESC untuk membuka menu jeda. -replaceTextures_false = Textures no longer are being replaced. -replaceTextures_true = Texture replacement is enabled. -Save State Failed = Gagal menyimpan posisi permainan! -Saved State = Posisi permainan tersimpan -saveNewTextures_false = Texture saving was disabled. -saveNewTextures_true = Textures will now be saved to your storage. -SpeedCustom2 = Speed: alternate 2 +replaceTextures_false = Tekstur tidak lagi diganti. +replaceTextures_true = Penggantian tekstur diaktifkan. +Save State Failed = Gagal menyimpan status permainan! +Saved State = Status permainan tersimpan +saveNewTextures_false = Penyimpanan tekstur dinonaktifkan. +saveNewTextures_true = Tekstur sekarang akan disimpan ke penyimpanan anda. +SpeedCustom2 = Kecepatan: alternatif 2 standard = Kecepatan: standar -Untitled PSP game = Untitled PSP game +State load undone = Pemuatan status dibatalkan +Untitled PSP game = Permainan PSP tanpa judul [Store] Already Installed = Sudah terpasang @@ -914,53 +1024,55 @@ Uninstall = Mencopot pemasangan [SysInfo] %d (%d per core, %d cores) = %d (%d perinti, %d inti) -%d bytes = %d bytes +%d bytes = %d bit (none detected) = (tidak ada yang terdeteksi) 3D API = 3D API ABI = ABI API Version = Versi API Audio Information = Informasi audio -Board = Board -Build Config = Konfig. pembuatan -Build Configuration = Konfigurasi Pembuatan +Board = Papan +Build Config = Konfigurasi pembuatan +Build Configuration = Konfigurasi pembuatan Built by = Dibuat oleh -Core Context = Core context +Core Context = Konteks inti Cores = Inti CPU Extensions = Ekstensi CPU CPU Information = Informasi CPU -CPU Name = Nama -D3DCompiler Version = D3DCompiler version +CPU Name = Nama CPU +D3DCompiler Version = Versi D3DCompiler Debug = Awakutu Debugger Present = Pengawakutu tersedia Device Info = Info perangkat -Display Information = Display information -Driver Version = Versi penggerak +Directories = Direktori +Display Information = Informasi tampilan +Driver Version = Versi driver EGL Extensions = Ekstensi EGL -Frames per buffer = Frames per buffer +Frames per buffer = Bingkai penyangga GPU Information = Informasi GPU -High precision float range = High precision float range -High precision int range = High precision int range -Lang/Region = Bahasa/Regional -Memory Page Size = Memory page size -Native Resolution = Native resolution +High precision float range = Kisaran pengambang presisi tinggi +High precision int range = Rentang integer presisi tinggi +Lang/Region = Bahasa/regional +Memory Page Size = Ukuran halaman memori +Native Resolution = Resolusi asli OGL Extensions = Ekstensi OGL OpenGL ES 2.0 Extensions = Ekstensi OpenGL ES 2.0 OpenGL ES 3.0 Extensions = Ekstensi OpenGL ES 3.0 OpenGL Extensions = Ekstensi OpenGL -Optimal frames per buffer = Optimal frames per buffer -Optimal sample rate = Optimal sample rate +Optimal frames per buffer = Optimalisasi bingkai penyangga +Optimal sample rate = Optimalisasi tingkat analogi OS Information = Informasi OS PPSSPP build = Bentukan PPSSPP -Refresh rate = Refresh rate +Refresh rate = Penyegaran Release = Rilis -RW/RX exclusive = RW/RX exclusive -Sample rate = Sample rate -Shading Language = Shading language -Sustained perf mode = Sustained perf mode +RW/RX exclusive = RW/RX eksklusif +Sample rate = Tingkat penyegaran +Shading Language = Bahasa shading +Storage = Penyimpanan +Sustained perf mode = Mode kinerja berkelanjutan System Information = Informasi sistem -System Name = Nama -System Version = System version -Threads = Threads +System Name = Nama sistem +System Version = Versi sistem +Threads = Inti Vendor = Penyedia Vendor (detected) = Penyedia (terdeteksi) Version Information = Informasi versi @@ -972,77 +1084,85 @@ Vulkan Features = Fitur-fitur Vulkan 12HR = 12 jam 24HR = 24 jam Auto = Otomatis -Auto Load Savestate = Auto load savestate -AVI Dump started. = AVI dump dimulai. -AVI Dump stopped. = AVI dump berhenti. +Auto Load Savestate = Muat otomatis simpanan status +AVI Dump started. = Pembuangan AVI dimulai. +AVI Dump stopped. = Pembuangan AVI berhenti Cache ISO in RAM = Tembolokkan ISO dalam RAM -Change CPU Clock = Change emulated PSP's CPU clock (tidak stabil) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) -Change Nickname = Ganti panggilan -ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? -ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. -ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Kecurangan -Clear Recent = Clear "Recent" -Clear Recent Games List = Bersihkan daftar main terakhir +Change CPU Clock = Ubah pewaktu CPU PSP yang ditiru (tidak stabil) +Error: load undo state is from a different game = Kesalahan: memuat status yang berasal dari permainan yang berbeda +Failed to load state for load undo. Error in the file system. = Gagal memuat status untuk membatalkan pemuatan. Kesalahan dalam sistem berkas. +Floating symbols = Simbol mengambang +Memory Stick folder = Berkas Memory Stick +Memory Stick size = Ukuran Memory Stick +Change Nickname = Ganti nama panggilan +ChangingMemstickPath = Menyimpan permainan, menyimpan status, dan data lainnya tidak akan disalin ke berkas ini.\n\nUbah berkas Memory Stick? +ChangingMemstickPathInvalid = Jalur itu tidak dapat digunakan untuk menyimpan berkas Memory Stick. +ChangingMemstickPathNotExists = Berkas itu belum ada.\n\nSimpan permainan, simpan status, dan data lain tidak akan disalin ke berkas ini.\n\nBuat berkas Memory Stick baru? +Cheats = Pengecoh +Clear Recent = Hapus "Terbaru" +Clear Recent Games List = Bersihkan daftar permainan terakhir Clear UI background = Hapus latar UI Confirmation Button = Tombol konfirmasi Date Format = Format tanggal Day Light Saving = DST DDMMYYYY = HHBBTTTT -Decrease size = Decrease size +Decrease size = Kurangi ukuran Developer Tools = Alat pengembang -Display Extra Info = Display extra info -Display Games on a grid = Display "Games" on a grid -Display Homebrew on a grid = Display "Homebrew && Demos" on a grid -Display Recent on a grid = Display "Recent" on a grid +Display Extra Info = Tampilkan info tambahan +Display Games on a grid = Tampilkan "Permainan" di kisi +Display Homebrew on a grid = Tampilkan "Paket Permainan && Demos" di kisi +Display Recent on a grid = Tampilkan "Terbaru" di kisi Dynarec (JIT) = Dynarec (JIT) Emulation = Emulasi -Enable Cheats = Hidupkan kecurangan +Enable Cheats = Hidupkan pengecoh Enable Compatibility Server Reports = Hidupkan pelaporan ke pelayan kecocokan -Failed to load state. Error in the file system. = Gagal memuat posisi/keadaan. Kesalahan pada sistem berkas. -Failed to save state. Error in the file system. = Gagal menyimpan posisi/keadaan. Kesalahan pada sistem berkas. +Failed to load state. Error in the file system. = Gagal memuat status/keadaan. Kesalahan pada sistem berkas. +Failed to save state. Error in the file system. = Gagal menyimpan status/keadaan. Kesalahan pada sistem berkas. Fast (lag on slow storage) = Cepat (telat di penyimpanan yang lambat) Fast Memory = Memori cepat (tidak stabil) -Force real clock sync (slower, less lag) = Force real clock sync (lambat, namun lebih tepat) -frames, 0:off = frames, 0 = mati -Games list settings = Games list settings +Force real clock sync (slower, less lag) = Paksa sinkronisasi pewaktu nyata (lambat, namun lebih tepat) +frames, 0:off = bingkai, 0 = mati +Games list settings = Daftar pengaturan permainan General = Umum -Grid icon size = Grid icon size +Grid icon size = Ukuran ikon kisi Help the PPSSPP team = Bantu tim PPSSPP Host (bugs, less lag) = Inang (berkutu tapi lebih cepat) -I/O on thread (experimental) = I/O on thread (experimental) -Ignore bad memory accesses = Ignore bad memory accesses -Increase size = Increase size +I/O on thread (experimental) = I/O pada inti (eksperimental) +Ignore bad memory accesses = Abaikan akses memori yang buruk +Increase size = Tambah ukuran Interpreter = Penginterpretasi IO timing method = Metode pewaktu I/O IR Interpreter = Penginterpretasi IR -Memory Stick Folder = Memory Stick folder +Memory Stick Folder = Berkas Memory Stick Memory Stick inserted = Memory Stick dimasukkan MHz, 0:default = MHz, 0 = awal MMDDYYYY = BBHHTTTT -Newest Save = Newest save +Moving background = Latar belakang bergerak +Newest Save = Simpanan terbaru +No animation = Tanpa animasi Not a PSP game = Bukan permainan PSP Off = Mati -Oldest Save = Oldest save +Oldest Save = Simpanan lawas +Path does not exist! = Tidak ada jalur! +PSP Memory Stick = PSP Memory Stick PSP Model = Model PSP PSP Settings = Pengaturan PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 -Record Audio = Rekam Suara -Record Display = Rekam Tampilan -Reset Recording on Save/Load State = Reset recording on Save/Load state -Restore Default Settings = Kembalikan pengaturan PPSSPP ke awal -Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) -Save path in installed.txt = Simpan path dalam installed.txt -Save path in My Documents = Simpan path dalam My Documents -Savestate Slot = Slot simpanan posisi -Savestate slot backups = Savestate slot backups +Recent games = Permainan terbaru +Record Audio = Rekam suara +Record Display = Rekam tampilan +Reset Recording on Save/Load State = Setel ulang rekaman pada status Simpan/Muat +Restore Default Settings = Atur ulang pengaturan PPSSPP ke awal +Rewind Snapshot Frequency = Putar ulang frekuensi foto (mem hog) +Save path in installed.txt = Simpan jalur dalam installed.txt +Save path in My Documents = Simpan jalur dalam dokumen saya +Savestate Slot = Slot simpanan status +Savestate slot backups = Slot simpanan cadangan status Screenshots as PNG = Simpan tangkapan layar dalam format PNG -Set UI background... = Tetapkan UI background... -Show ID = Show ID -Show region flag = Show region flag +Set UI background... = Gunakan latar belakang UI kustom... +Show ID = Tampilkan ID +Show region flag = Tampilkan bendera wilayah Simulate UMD delays = Simulasikan jeda UMD Slot 1 = Slot 1 Slot 2 = Slot 2 @@ -1050,23 +1170,26 @@ Slot 3 = Slot 3 Slot 4 = Slot 4 Slot 5 = Slot 5 Storage full = Penyimpanan penuh -Sustained performance mode = Sustained performance mode +Sustained performance mode = Mode kinerja berkelanjutan Time Format = Format waktu UI = Antarmuka pengguna -UI Sound = UI sound -undo %c = backup %c -Use Lossless Video Codec (FFV1) = Gunakan Lossless Video Codec (FFV1) +UI background animation = Animasi latar belakang UI +UI Sound = Suara UI +undo %c = Cadangan %c +USB = USB +Use Lossless Video Codec (FFV1) = Gunakan kompresi video (FFV1) Use O to confirm = Gunakan O sebagai tombol konfirmasi -Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording -Use system native keyboard = Use system native keyboard +Use output buffer (with overlay) for recording = Gunakan penyangga keluaran (dengan tampilan) untuk merekam +Use system native keyboard = Gunakan papan ketik perangkat Use X to confirm = Gunakan X sebagai tombol konfirmasi VersionCheck = Cek versi baru PPSSPP -WARNING: Android battery save mode is on = PERINGATAN: Modus hemat daya Android aktif -WARNING: Battery save mode is on = PERINGATAN: Modus hemat daya aktif +WARNING: Android battery save mode is on = Peringatan: Mode hemat daya android aktif +WARNING: Battery save mode is on = Peringatan: Mode hemat daya aktif +Waves = Bergelombang YYYYMMDD = TTTT/BB/HH [Upgrade] -Details = Details +Details = Detail Dismiss = Tolak Download = Unduh New version of PPSSPP available = Versi baru PPSSPP tersedia diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 5aa296ed92..ad57191eed 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = Volume velocizzato alternativo Audio backend = Renderer Audio (necessita il riavvio) +Audio Error = Errore Audio AudioBufferingForBluetooth = Buffer per Bluetooth (lento) Auto = Automatico Device = Dispositivo +Disabled = Disabilitato DSound (compatible) = DirectSound (compatibile) Enable Sound = Attiva il Sonoro Global volume = Volume Globale Microphone = Microfono Microphone Device = Periferica Microfono Mute = Muto -Switch on new audio device = Passa la nuovo dispositivo audio +Reverb volume = Riverb. volume +Use new audio devices automatically = Usa il nuovo dispositivo audio automatic. Use global volume = Usa volume globale WASAPI (fast) = WASAPI (veloce) [Controls] -Analog auto-rotation speed = Velocità rotazione automat. analogico +Analog Binding = Mappatura Analogico +Analog Settings = Impostazioni Analogico +Analog Style = Stile Analogico +Auto-rotation speed = Velocità rotazione automat. analogico Analog Axis Sensitivity = Sensibilità Asse Analogico Analog Limiter = Limitatore Analogico Analog Mapper High End = Mappatura Analogico avanzata (sensibilità degli assi) @@ -25,25 +31,41 @@ Analog Stick = Stick Analogico AnalogLimiter Tip = Quando viene premuto il tasto del limitatore analogico Auto = Automatico Auto-centering analog stick = Auto-centramento dello stick analogico -Auto-hide buttons after seconds = Nascondi autom. i pulsanti dopo 2 secondi +Auto-hide buttons after seconds = Nascondi automat. i pulsanti dopo 2 secondi +Auto-switch = Auto-switch +Base tilt position = Posizione inclinazione di base Binds = Assegnazioni +Button Binding = Mappatura Pulsante Button Opacity = Opacità Tasti Button style = Stile dei Tasti +Calibrate Analog Stick = Calibra Stick Analogico Calibrate D-Pad = Calibra il D-Pad +Calibrated = Calibrato Calibration = Calibratura +Circular stick input = Input stick circolare Classic = Classico Combo Key Setting = Impostazioni tasti Combo Combo Key Setup = Settaggi tasti Combo Confine Mouse = Confina il mouse all'interno dell'area della finestra Control Mapping = Mappatura dei Controlli -Custom layout... = Personalizza disposizione dei Controlli... -Customize tilt = Personalizza Inclinazione... +Custom Key Setting = Impostazioni tasto personalizz. +Customize = Personalizza +Customize Touch Controls = Personalizza Controlli Touch +Customize tilt = Personalizza Inclinazione D-PAD = Croce direzionale -Deadzone Radius = Raggio della zona morta +Deadzone radius = Raggio della zona morta DInput Analog Settings = Impostazioni DInput analogico Disable D-Pad diagonals (4-way touch) = Disattiva Diagonali del D-Pad (Tocco a 4-Vie) +Disable diagonal input = Disabilita input diagonale +Double tap = Doppio tocco +Enable gesture control = Abilita controllo gesti +Enable standard shortcut keys = Abilita scorciatoie standard +Gesture = Gesti +Gesture mapping = Mappatura gesti Glowing borders = Bordi luminosi HapticFeedback = Risposta Tattile (vibrazione) +Hide touch analog stick background circle = Nascondi cerchio dello stick analogico +Icon = Icona Ignore gamepads when not focused = Ignora i gamepad se non attivi Ignore Windows Key = Ignora il tasto "Windows" Invert Axes = Inverti gli Assi @@ -55,6 +77,7 @@ L/R Trigger Buttons = Pulsanti grilletto L/R Landscape = Panoramico Landscape Auto = Panoramico automatico Landscape Reversed = Panoramico invertito +Low end radius = Raggio inferiore Mouse = Impostazioni Mouse Mouse sensitivity = Sensibilità Mouse Mouse smoothing = Fluidità Mouse @@ -65,21 +88,32 @@ OnScreen = Controlli Touchscreen Portrait = Ritratto Portrait Reversed = Ritratto invertito PSP Action Buttons = Pulsanti Azione PSP (△◯✕☐) +Raw input = Input grezzo +Reset to defaults = Reset ai predefiniti +Screen aligned to ground = Schermo allineato a terra +Screen at right angle to ground = Schermo perpendicolare a terra Screen Rotation = Rotazione Schermo seconds, 0 : off = secondi, 0 = disattiva +Sensitivity (scale) = Sensibilità (scala) Sensitivity = Sensibilità +Shape = Forma Show right analog = Mostra analogico destro Show Touch Pause Menu Button = Mostra Tasto di Pausa +Swipe = Scorrimento +Swipe sensitivity = Sensibilità Scorrimento +Swipe smoothing = Fluidità Scorrimento Thin borders = Bordi fini Tilt Base Radius = Modifica zona morta con inclinazione analogica Tilt Input Type = Tipo di Input Inclinazione Tilt Sensitivity along X axis = Inverti Sensibilità sull'asse X Tilt Sensitivity along Y axis = Inverti Sensibilità sull'asse Y To Calibrate = Per calibrare, mantenere il dispositivo su una superficie piatta e premere "Calibra". +Toggle mode = Scambia modalità Touch Control Visibility = Visibilità controlli Touch Use custom right analog = Usa analogico destro personalizzato Use Mouse Control = Usa il controllo con il mouse Visibility = Visibilità +Visible = Visibile X = X X + Y = X + Y XInput Analog Settings = Impostazioni XInput analogico @@ -99,6 +133,7 @@ Refresh Rate = Frequenza di Aggiornamento #Font = Trebuchet MS About PPSSPP... = Informazioni su PPSSPP... Auto = Automatico +Auto Max Quality = Qualità massima autom. Backend = Rendering di fondo (riavvia il PPSSPP) Bicubic = Bicubico Break = Interruzione @@ -150,6 +185,7 @@ More Settings... = Altre Impostazioni... Nearest = Pixel perfect Non-Buffered Rendering = Salta effetti di buffer (niente buffer, più velocità) Off = Disattiva +Open Chat = Apri Chat Open Directory... = Apri Cartella... Open from MS:/PSP/GAME... = Apri da MS:/PSP/GAME... Open Memory Stick = Apri Memory Stick @@ -207,7 +243,7 @@ DevMenu = DevMenu Disabled JIT functionality = Disattivata Funzionalità JIT Draw Frametimes Graph = Disegna grafica dei frametimes Dump Decrypted Eboot = Crea EBOOT.BIN decriptato all'avvio del gioco -Dump Frame GPU Commands = Comandi GPU Dump frame +Dump Frame GPU Commands = Comandi GPU Dump frame Enable driver bug workarounds = Abilita espediente per superare i bug dei driver Enable Logging = Attiva Log del Debug Enter address = Inserire indirizzo @@ -229,6 +265,7 @@ No block = Nessun blocco Prev = Indietro Random = Casuale Replace textures = Sostituisci textures +Reset = Reset Reset limited logging = Reset del logging limitato RestoreDefaultSettings = Si desidera davvero ripristinare le impostazioni?\nImpostazioni dei Controlli non sono cambiate.\n\n\nQuest'azione non può essere annullata.\nRiavviare PPSSPP per caricare i cambiamenti. RestoreGameDefaultSettings = Si desidera davvero ripristinare le impostazioni specifiche per il gioco\nai valori predefiniti? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Vuoi veramente cancellare le impostazioni per questo g DeleteFailed = Impossibile cancellare i dati. Deleting = Cancellazione in corso.\nAttendere, prego... Disable All = Disattiva tutto +Dumps = Dumps Edit = Modifica Enable All = Attiva tutto Enter = Invio +Filter = Filtro Finish = Fine +GE Frame Dumps = GE Frame Dumps Grid = Griglia Inactive = Inattiva InternalError = È avvenuto un errore interno. @@ -300,8 +340,10 @@ Save = Salva Save completed = Salvataggio Completato. Saving = Salvataggio in corso.\nAttendere, prego... SavingFailed = Impossibile salvare i dati. +Search = Cerca Select = Seleziona Shift = Maiuscolo +Skip = Salta Snap = Allinea Space = Spazio SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Il file è compresso (ZIP).\nPrima si deve [Game] Asia = Asia +Calculate CRC = Calcola CRC ConfirmDelete = Elimina Create Game Config = Crea game config Create Shortcut = Crea Scorciatoia @@ -398,7 +441,7 @@ SaveData = Dati salvataggio Setting Background = Imposta sfondo Show In Folder = Mostra nella Cartella USA = USA -Use UI background = Usa UI di sfondo +Use UI background = Usa sfondo interfaccia [Graphics] % of the void = % di spazio vuoto @@ -430,6 +473,7 @@ Auto = Automatico Auto (1:1) = Automatico (1:1) Auto (same as Rendering) = Automatico (stessa risoluzione del rendering) Auto FrameSkip = Salto frame automatico +Auto Max Quality = Qualità massima automat. Auto Scaling = Scaling automatico Backend = Renderer Balanced = Bilanciato @@ -555,11 +599,14 @@ Zip file does not contain PSP software = Il file ZIP non contiene software PSP [KeyMapping] Autoconfigure = Configurazione automatica Autoconfigure for device = Configurazione Automatica per il Dispositivo +Bind All = Mappa tutto Clear All = Pulisci Tutto Default All = Ripristina Tutto Map a new key for = Seleziona Tasto di Controllo per: Map Key = Mappatura tasto Map Mouse = Mappatura mouse +Replace = Sostituisci +Show PSP = Mostra PSP Test Analogs = Test analogico You can press ESC to cancel. = Puoi premere Esc per annullare. @@ -568,7 +615,6 @@ Browse = Sfoglia... Buy PPSSPP Gold = Acquista PPSSPP Gold Choose folder = Scegli cartella Credits = Riconoscimenti -DownloadFromStore = Scarica dal PPSSPP Homebrew Store Exit = Esci Game Settings = Impostazioni Games = Giochi @@ -578,6 +624,7 @@ How to get games = Come ottenere giochi? How to get homebrew & demos = Come ottenere homebrew o demo? Load = Carica... Loading... = Caricamento in corso... +PPSSPP Homebrew Store = PPSSPP Homebrew Store PinPath = Pin PPSSPP can't load games or save right now = PPSSPP non può caricare i giochi o salvarli, in questo momento Recent = Recenti @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP sta salvando in una cartella temporanea SavesAreTemporaryGuidance = Estrae PPSSPP da qualche parte per salvarlo permanentemente SavesAreTemporaryIgnore = Ignora l'avviso UnpinPath = Stacca +UseBrowseOrLoad = Usa Sfoglia per scegliere una cartella, oppure Carica per scegliere un file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -596,8 +644,8 @@ System = Sistema Tools = Strumenti [MappableControls] -Alt speed 1 = Velocità altern. 1 -Alt speed 2 = Velocità altern. 2 +Alt speed 1 = Velocità alternat. 1 +Alt speed 2 = Velocità alternat. 2 An.Down = Analogico Giù An.Left = Analogico SX An.Right = Analogico DX @@ -610,13 +658,25 @@ Auto Analog Rotation (CW) = Rotazione analog. automatica (orario) AxisSwap = Scambia Assi Circle = Cerchio Cross = Croce +Custom 1 = A scelta 1 +Custom 10 = A scelta 10 +Custom 2 = A scelta 2 +Custom 3 = A scelta 3 +Custom 4 = A scelta 4 +Custom 5 = A scelta 5 +Custom 6 = A scelta 6 +Custom 7 = A scelta 7 +Custom 8 = A scelta 8 +Custom 9 = A scelta 9 D-pad down = D-pad giù D-pad left = D-pad sinistra D-pad right = D-pad destra D-pad up = D-pad su DevMenu = DevMenu +Double tap button = Pulsante doppio tocco Down = D-Pad Giù Dpad = Dpad +Fast-forward = Avanti veloce Frame Advance = Avanzam. frame Hold = Hold Home = Home @@ -631,10 +691,11 @@ OpenChat = Apri la chat Pause = Pausa R = R RapidFire = Fuoco rapido +Record = Record Remote hold = Blocco da remoto Rewind = Riavvolgi Right = D-Pad Destro -Right Analog Stick (tap to customize) = Analogico destro (tocca per personalizzare) +Right Analog Stick = Stick Analogico destro RightAn.Down = Analogico destro - Giù RightAn.Left = Analogico destro - Sinistra RightAn.Right = Analogico destro - Destra @@ -648,21 +709,25 @@ Select = Select SpeedToggle = Velocità Square = Quadrato Start = Start +Swipe Down = Scorri verso il baso +Swipe Left = Scorri verso sinistra +Swipe Right = Scorri verso destra +Swipe Up = Scorri verso l'alto +tap to customize = tocca per personalizzare Texture Dumping = Dumping delle texture Texture Replacement = Sostituzione delle texture Toggle Fullscreen = Passa a Schermo Intero Toggle mode = Modalità Scambio Triangle = Triangolo -Unthrottle = Non velocizzare Up = D-Pad Su Vol + = Volume + Vol - = Volume - Wlan = WLAN [Networking] -Adhoc Multiplayer forum = Visita il forum Ad Hoc Multigiocatore AdHoc Server = Server Ad hoc AdhocServer Failed to Bind Port = Il server Ad hoc non è riuscito a collegarsi alla porta +AM: Data from Unknown Port = AM: Dati da porta sconosciuta Auto = Auto Bottom Center = In basso al centro Bottom Left = In basso a sinistra @@ -670,10 +735,11 @@ Bottom Right = In basso a destra Center Left = Al centro a sinistra Center Right = Al centro a destra Change Mac Address = Cambia indirizzo MAC -Change proAdhocServer Address = Cambia indirizzo server IP PRO ad hoc (localhost = multiple istanze) +Change proAdhocServer Address = Cambia indirizzo server IP PRO ad hoc (localhost = istanze multiple) Chat = Chat Chat Button Position = Posizione del pulsante chat Chat Here = Scrivi qui +Chat message = Messaggio chat Chat Screen Position = Posizione della chat Disconnected from AdhocServer = Disconnesso dal server ad hoc DNS Error Resolving = Errore risoluzione DNS @@ -693,12 +759,16 @@ Failed to Bind Localhost IP = Impossibile correlare l'IP localhost Failed to Bind Port = Impossibile correlare la porta Failed to connect to Adhoc Server = Impossibile connettersi al sever ad hoc Forced First Connect = Prima connessione forzata (connessione più rapida) +GM: Data from Unknown Port = GM: Dati da porta sconosciuta +Hostname = Nome host Invalid IP or hostname = Indirizzo IP o nome del dominio non valido Minimum Timeout = Timeout minimo (forza in ms, 0 = predefinito) Misc = Varie (predefinito = compatibilità PSP) Network Initialized = Rete inizializzata -Please change your Port Offset = Prego, cambiare l'offset della porta +None = None +Please change your Port Offset = Prego, cambiare l'offset della porta Port offset = Offset Porta (0 = compatibilità PSP) +PPSSPP Ad-Hoc Wiki Page = Pagina Wiki Ad-Hoc PPSSPP proAdhocServer Address: = Indirizzo server ad hoc: Quick Chat 1 = Chat rapida 1 Quick Chat 2 = Chat rapida 2 @@ -732,6 +802,8 @@ Rewind = Riavvolgimento Save State = Salva Stato Settings = Impostazioni Switch UMD = Cambia UMD +Undo last load = Annulla ultimo caricamento +Undo last save = Annulla ultimo salvataggio [PostShaders] (duplicated setting, previous slider will be used) = (parametri duplicati, verrà usata la precedente regolazione) @@ -762,6 +834,7 @@ Scanlines = Linee di scansione (CRT) Sharpen = Maggior nitidezza SSAA(Gauss) = Supercampionamento AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Upscaling Spline36 VideoSmoothingAA = AA nitido del video Vignette = Miniatura @@ -799,13 +872,42 @@ tools = Strumenti Liberi utilizzati: translators1 = MrYadro, mgaver, adrian17, raven02, papel translators2 = sum2012, vnctdj, unknownbrackets, ufdada translators3 = The Dax, wuspring, hrydgard, VIRGINKLM -translators4 = -translators5 = -translators6 = +translators4 = Vecna +translators5 = +translators6 = Twitter @PPSSPP_emu = Twitter website = Visita il sito web: written = Scritto in C++ per velocità e portabilità +[MemStick] +Already contains PSP data = Contiene già dati PSP +Create or Choose a PSP folder = Scegli o crea una cartella PSP +Current = Corrente +DataCanBeShared = I dati possono essere condivisi tra PPSSPP normale/Gold +DataCannotBeShared = I dati NON possono essere condivisi tra PPSSPP normale/Gold! +DataWillBeLostOnUninstall = Attenzione! I dati andranno persi quando disinstalli PPSSPP! +DataWillStay = I dati rimarranno anche se disinstalli PPSSPP. +Done! = Fatto! +EasyUSBAccess = Facile accesso tramite USB +Failed to move some files! = Il trasferimento di alcuni file è fallito! +Failed to save config = Il salvataggio della configurazione è fallito +Free space = Spazio disponibile +Manually specify PSP folder = Seleziona manualmente la cartella PSP +MemoryStickDescription = Scegli dove tenere i dati PSP (Memory Stick) +Move Data = Trasferisci i dati +Selected PSP Data Folder = Seleziona la cartella per i dati PSP +No data will be changed = Nessun dato sarà modificato +PPSSPP will restart after the change = PPSSPP verrà riavviato dopo la modifica +Skip for now = Salta per ora +Starting move... = Inizio trasferimento... +That folder doesn't work as a memstick folder. = Quella cartella non funziona come cartella per la memory stick. +USBAccessThrough = Accesso USB tramite Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = Accesso USB tramite Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Usa la cartella dati privata dell'app +Use PSP folder at root of storage = Usa la cartella PSP alla radice della memoria +Welcome to PPSSPP! = Benvenuto su PPSSPP! +WhatsThis = Cos'è questo? + [RemoteISO] Browse Games = Cerca i giochi Local Server Port = Porta locale del server @@ -828,6 +930,8 @@ Stopping.. = Interruzione in corso... [Reporting] Bad = Pessima +FeedbackCRCCalculating = CRC disco: Calcolo in corso... +FeedbackCRCValue = CRC disco: [VALUE] FeedbackDelayInfo = I dati verranno trasmessi in background. FeedbackDesc = Com'è l'emulazione? Fallo sapere alla comunità! FeedbackDisabled = L'invio del rapporto di compatibilità dev'essere attivato. @@ -853,6 +957,7 @@ Perfect Description = Emulazione perfetta per tutto il gioco - magnifico! Plays = Giocabile Plays Description = Completamente giocabile ma sono presenti dei glitch ReportButton = Rapporto feedback +Show disc CRC = Show disc CRC Speed = Velocità Submit Feedback = Invia feedback SuggestionConfig = Guarda i rapporti sul sito web per le impostazioni migliori. @@ -870,10 +975,12 @@ View Feedback = Mostra i Feedback Date = Data Filename = Nome del file No screenshot = Nessuno screenshot -None yet. Things will appear here after you save. = Ancora niente. Si inizierà a vedere qualcosa dopo il salvataggio. +None yet. Things will appear here after you save. = Ancora niente. Si inizierà a vedere qualcosa dopo il salvataggio. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Salvataggi Save States = Salvataggio stati Savedata Manager = Gestione dei Salvataggi +Showing matches for '%1'. = Showing matches for '%1'. Size = Dimensioni [Screen] @@ -881,12 +988,14 @@ Cardboard VR OFF = Cardboard VR spenta Chainfire3DWarning = AVVISO: rilevato Chainfire3D, potrebbe causare problemi Failed to load state = Impossibile caricare il salvataggio di stato Failed to save state = Impossibile salvare il salvataggio di stato +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata +Loaded. Save in game, restart, and load for less bugs. = Caricato. Salvataggio in gioco, riavvia, e carica per meno bug. fixed = Velocità: alternata GLToolsWarning = AVVISO: rilevato GLTools, potrebbe causare problemi In menu = Nei menu Load savestate failed = Caricamento salvataggio di stato fallito Loaded State = Stato Caricato -Loaded. Save in game, restart, and load for less bugs. = Caricato. Salvataggio in gioco, riavvia, e carica per meno bug. LoadStateDoesntExist = Caricamento stato fallito: lo stato non esiste! LoadStateWrongVersion = Caricamento stato fallito: lo stato è di una versione precedente di PPSSPP! norewind = Nessun riavvolgimento degli stati salvati disponibile. @@ -900,6 +1009,7 @@ saveNewTextures_false = Il salvataggio delle texture è stato disattivato. saveNewTextures_true = Le texture verranno salvate su disco. SpeedCustom2 = Velocità: alternativa 2 standard = Velocità: standard +State load undone = State load undone Untitled PSP game = Gioco PSP senza titolo [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = Versione D3DCompiler Debug = Debug Debugger Present = Debugger presente Device Info = Informazioni dispositivo +Directories = Cartelle Display Information = Informazioni display Driver Version = Versione dei Driver EGL Extensions = Estensioni EGL @@ -956,6 +1067,7 @@ Release = Rilascio RW/RX exclusive = Esclusiva RW/RX Sample rate = Frequenza di campionamento Shading Language = Linguaggio shading +Storage = Storage Sustained perf mode = Modalità prestazioni prolungate System Information = Informazioni Sistema System Name = Nome @@ -977,8 +1089,11 @@ AVI Dump started. = Dump AVI avviato AVI Dump stopped. = Dump AVI interrotto Cache ISO in RAM = Metti l'ISO in cache nella RAM (avvio lento) Change CPU Clock = Cambia la frequenza della CPU (instabile) -Change Memory Stick folder = Cambia cartella della Memory Stick -Change Memory Stick Size = Cambia dimensioni (GB) Memory Stick +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Cartella della Memory Stick +Memory Stick size = Cambia dimensioni Memory Stick Change Nickname = Cambia Nick ChangingMemstickPath = I salvataggi, gli stati e altri dati non verranno copiati in questa cartella.\n\nCambiare la cartella del Memory Stick? ChangingMemstickPathInvalid = Quel percorso non può essere usato per salvare i file Memory Stick. @@ -1006,13 +1121,18 @@ Failed to save state. Error in the file system. = Impossibile effettuare il salv Fast (lag on slow storage) = Veloce (lag nei dischi lenti) Fast Memory = Memoria Rapida (instabile) Force real clock sync (slower, less lag) = Forza sincronizzazione con frequenza reale (lento, meno lag) +Moving background = Moving background +No animation = Nessuna animazione +Path does not exist! = Il percorso non esiste! +PSP Memory Stick = Memory Stick PSP +Recent games = Giochi recenti +UI = UI frames, 0:off = frames, 0 = off Games list settings = Impostazioni Lista giochi General = Generali Grid icon size = Dimensioni delle icone Help the PPSSPP team = Aiuta il gruppo del PPSSPP Host (bugs, less lag) = Host (buggato, poca lag) -I/O on thread (experimental) = I/O su thread (sperimentale) Ignore bad memory accesses = Ignora i cattivi accessi alla memoria Increase size = Aumenta dimensioni Interpreter = Interprete @@ -1052,9 +1172,10 @@ Slot 5 = Slot 5 Storage full = Spazio su disco pieno Sustained performance mode = Modalità prestazioni prolungate Time Format = Formato Data/Ora -UI Language = Lingua dell'Interfaccia +UI background animation = Animazione sfondo interfaccia UI Sound = Suoni dell'Interfaccia undo %c = salva %c +USB = USB Use Lossless Video Codec (FFV1) = Usa Codec Video senza perdite (FFV1) Use O to confirm = Usa ◯ come tasto di conferma Use output buffer (with overlay) for recording = Usa la memoria di buffer per la registrazione (compresi i messaggi) @@ -1063,6 +1184,7 @@ Use X to confirm = Usa ✕ come tasto di conferma VersionCheck = Controlla se ci sono aggiornamenti per PPSSPP WARNING: Android battery save mode is on = ATTENZIONE: La modalità Risparmio Energetico di Android è attivata WARNING: Battery save mode is on = ATTENZIONE: La modalità Risparmio Energetico è attivata +Waves = Waves YYYYMMDD = AAAAMMGG [Upgrade] diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index a7134d7b6f..f598ab696e 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -1,9 +1,11 @@ [Audio] Alternate speed volume = カスタム速度時のボリューム Audio backend = オーディオのバックエンド (再起動が必要) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetoothに適したバッファ (低速) Auto = 自動 Device = デバイス +Disabled = Disabled DSound (compatible) = DSound (互換性重視) Enable Sound = オーディオを有効にする Global volume = グローバルボリューム @@ -11,12 +13,15 @@ Microphone = マイクの設定 Microphone Device = マイク入力機器の選択 Mute = ミュート Reverb volume = リバーブボリューム -Switch on new audio device = 新しいオーディオデバイスをオンにする +Use new audio devices automatically = 新しいオーディオデバイスをオンにする Use global volume = グローバルボリュームを使う WASAPI (fast) = WASAPI (高速) [Controls] -Analog auto-rotation speed = アナログの自動回転速度 +Analog Binding = 右アナログパッドへの対応ボタン割り当て +Analog Settings = アナログパッドの設定 +Analog Style = 右アナログパッドのスタイル +Auto-rotation speed = アナログの自動回転速度 Analog Axis Sensitivity = アナログパッドの感度 Analog Limiter = アナログパッドのリミッタ Analog Mapper High End = アナログマッパーの最大値 (軸の感度) @@ -27,27 +32,40 @@ AnalogLimiter Tip = アナログリミッタボタンが押されたとき Auto = 自動 Auto-centering analog stick = アナログパッドを自動でセンタリングする Auto-hide buttons after seconds = 指定した秒数後に自動でボタンを隠す -Binds = Binds +Auto-switch = Auto-switch +Base tilt position = Base tilt position +Binds = 割り当て +Button Binding = 対応ボタンの割り当て(複数同時設定可能) Button Opacity = ボタンの透明度 Button style = ボタンのスタイル Calibrate Analog Stick = アナログスティックをキャリブレートする -Calibrate D-Pad = 方向キーをキャリブレートする +Calibrate D-Pad = 十字キーをキャリブレートする +Calibrated = キャリブレーション\n(調整)された動作 Calibration = キャリブレーション +Circular stick input = 環状スティック入力 Classic = クラシック Combo Key Setting = コンボキーの設定 Combo Key Setup = コンボキーを設定する Confine Mouse = ウィンドウ/表示領域内でマウスをトラップする Control Mapping = キーを設定する -Custom layout... = カスタムレイアウト... +Custom Key Setting = カスタムキーの設定 +Customize = カスタマイズ Customize tilt = 傾きをカスタマイズする Customize Touch Controls = 画面タッチ用コントローラーをカスタマイズする -D-PAD = 方向キー -Deadzone Radius = デッドゾーンの半径 +D-PAD = 十字キー +Deadzone radius = デッドゾーンの半径 DInput Analog Settings = DInputのアナログパッド設定 -Disable D-Pad diagonals (4-way touch) = 方向キーの斜め入力を無効にする (4方向タッチ) +Disable D-Pad diagonals (4-way touch) = 十字キーの斜め入力を無効にする (4方向タッチ) +Disable diagonal input = 斜め入力を無効にする +Double tap = ダブルタップ +Enable gesture control = ジェスチャー操作を有効にする Enable standard shortcut keys = 標準のショートカットキーを有効にする +Gesture = ジェスチャー +Gesture mapping = ジェスチャー操作の設定をする Glowing borders = 点灯する枠線 HapticFeedback = 触感フィードバック (振動) +Hide touch analog stick background circle = タッチ用アナログスティックの外周円を非表示にする +Icon = アイコン Ignore gamepads when not focused = 非フォーカス時はゲームパッドを無効にする Ignore Windows Key = Windowsキーを無視する Invert Axes = 軸を反転させる @@ -59,6 +77,7 @@ L/R Trigger Buttons = L/R トリガーボタン Landscape = 横 Landscape Auto = 横 (自動) Landscape Reversed = 横 (反転) +Low end radius = 最小動作の半径 Mouse = マウスの設定 Mouse sensitivity = マウスの感度 Mouse smoothing = マウスのスムージング @@ -69,21 +88,32 @@ OnScreen = 画面にタッチ用のコントローラを表示する Portrait = 縦 Portrait Reversed = 縦 (反転) PSP Action Buttons = PSPアクションボタン +Raw input = 現実の入力 +Reset to defaults = デフォルトに戻す +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = 画面の向き seconds, 0 : off = 秒数, 0 = オフ +Sensitivity (scale) = 反応感度 (比率) Sensitivity = 感度 +Shape = ボタンの形 Show right analog = 右アナログを表示する Show Touch Pause Menu Button = 一時停止ボタンを表示する +Swipe = スワイプ +Swipe sensitivity = スワイプの感度 +Swipe smoothing = スワイプの滑らかさ Thin borders = 薄い枠線 Tilt Base Radius = 傾きのベース半径 Tilt Input Type = 傾き入力のタイプ Tilt Sensitivity along X axis = X軸の傾きの感度 Tilt Sensitivity along Y axis = Y軸の傾きの感度 To Calibrate = デバイスを水平に置いて「キャリブレート」を押してください +Toggle mode = トグル(切り替え)ボタンとして使用する Touch Control Visibility = タッチコントロールの表示 Use custom right analog = カスタム右アナログを使用する Use Mouse Control = マウスで操作する Visibility = 表示 +Visible = 画面に表示する X = X X + Y = X + Y XInput Analog Settings = XInputのアナログパッド設定 @@ -103,6 +133,7 @@ Refresh Rate = リフレッシュレート #Font = Trebuchet MS About PPSSPP... = PPSSPPについて(&A)... Auto = 自動(&A) +Auto Max Quality = Auto Max &Quality Backend = バックエンド(&B) Bicubic = Bicubic(&B) Break = ブレーク @@ -154,6 +185,7 @@ More Settings... = 詳細設定(&M)... Nearest = &Nearest Non-Buffered Rendering = ノンバッファレンダリング (高速化)(&S) Off = オフ(&O) +Open Chat = Open Chat Open Directory... = ディレクトリを開く(&D)... Open from MS:/PSP/GAME... = MS:/&PSP/GAMEを開く... Open Memory Stick = メモリースティックを開く(&M) @@ -233,6 +265,7 @@ No block = ブロックなし Prev = 前へ Random = ランダム Replace textures = テクスチャを置き換える +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = 全ての設定 (キーの設定は除く) をデフォルトに戻しますか?\nやり直すことはできません。\n変更を反映させるにはPPSSPPを再起動してください。 RestoreGameDefaultSettings = ゲームの設定をPPSSPPのデフォルトに\n戻しますか? @@ -242,7 +275,7 @@ Save language ini = 言語のiniファイルをセーブする Save new textures = 新しいテクスチャを保存する Shader Viewer = シェーダビューワ Show Developer Menu = 開発者向けメニューを表示する -Show on-screen messages = オンスクリーンメーッセージを表示する +Show on-screen messages = オンスクリーンメッセージを表示する Stats = 状況 System Information = システム情報 Texture Replacement = テクスチャの置き換え @@ -278,10 +311,13 @@ DeleteConfirmGameConfig = 本当にこのゲームの設定を削除しますか DeleteFailed = データを削除できませんでした。 Deleting = 削除中です。\nしばらくお待ちください... Disable All = 全て無効にする +Dumps = Dumps Edit = 編集 Enable All = 全て有効にする Enter = 決定 +Filter = Filter Finish = 終了 +GE Frame Dumps = GE Frame Dumps Grid = グリッド Inactive = 非アクティブ InternalError = 内部エラーが発生しました。 @@ -304,9 +340,11 @@ Save = セーブ Save completed = セーブが完了しました。 Saving = セーブ中です。\nしばらくお待ちください... SavingFailed = データをセーブできませんでした。 +Search = Search Select = Select Shift = Shift -Snap = Snap +Skip = Skip +Snap = グリッド吸着 Space = スペース SSID = SSID Submit = 決定 @@ -380,6 +418,7 @@ ZIP file detected (Require WINRAR) = ファイルが圧縮されています (ZI [Game] Asia = アジア +Calculate CRC = CRCを算出する ConfirmDelete = 削除 Create Game Config = ゲームの設定を作成する Create Shortcut = ショートカットを作成する @@ -434,6 +473,7 @@ Auto = 自動 Auto (1:1) = 自動 (1:1) Auto (same as Rendering) = 自動 (レンダリング解像度と同じ) Auto FrameSkip = オートフレームスキップ +Auto Max Quality = Auto Max Quality Auto Scaling = 自動的に拡大 Backend = バックエンド Balanced = バランス @@ -559,11 +599,14 @@ Zip file does not contain PSP software = ZIPファイルにPSPソフトウェア [KeyMapping] Autoconfigure = 自動設定 Autoconfigure for device = デバイスの自動設定 +Bind All = Bind All Clear All = 全てクリアする Default All = デフォルトに戻す Map a new key for = 新しいキーを入力 Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = PSP画像を表示 Test Analogs = パッドをテスト You can press ESC to cancel. = Escを押すとキャンセルできます。 @@ -589,6 +632,7 @@ SavesAreTemporary = PPSSPPは一時ストレージに保存しています SavesAreTemporaryGuidance = PPSSPPをどこかに展開して永続的に保存する SavesAreTemporaryIgnore = 警告を無視する UnpinPath = ピンを外す +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -602,47 +646,59 @@ Tools = ツール [MappableControls] Alt speed 1 = カスタム速度1 Alt speed 2 = カスタム速度2 -An.Down = パッド 下 -An.Left = パッド 左 -An.Right = パッド 右 -An.Up = パッド 上 +An.Down = アナログパッド 下 +An.Left = アナログパッド 左 +An.Right = アナログパッド 右 +An.Up = アナログパッド 上 Analog limiter = パッドのリミッタ Analog Stick = アナログパッド -Audio/Video Recording = オーディオ/ビデオを記録 +Audio/Video Recording = オーディオ/ビデオの記録 Auto Analog Rotation (CCW) = 自動アナログ回転 (CCW) Auto Analog Rotation (CW) = 自動アナログ回転 (CW) AxisSwap = 軸の入れ替え -Circle = Circle -Cross = Cross -D-pad down = D-pad down -D-pad left = D-pad left -D-pad right = D-pad right -D-pad up = D-pad up +Circle = 〇 +Cross = ✕ +Custom 1 = カスタム 1 +Custom 10 = カスタム 10 +Custom 2 = カスタム 2 +Custom 3 = カスタム 3 +Custom 4 = カスタム 4 +Custom 5 = カスタム 5 +Custom 6 = カスタム 6 +Custom 7 = カスタム 7 +Custom 8 = カスタム 8 +Custom 9 = カスタム 9 +D-pad down = 十字キー 下 +D-pad left = 十字キー 左 +D-pad right = 十字キー 右 +D-pad up = 十字キー 上 DevMenu = 開発者用メニュー -Down = 方向キー 下 -Dpad = 方向キー +Double tap button = ダブルタップ時の設定 +Down = 十字キー 下 +Dpad = 十字キー Frame Advance = コマ送り Hold = ホールド -Home = Home -L = L -Left = 方向キー 左 +Home = Homeボタン +L = L +Left = 十字キー 左 Load State = ステートをロード -Mute toggle = ミュートを切り替える +Mute toggle = ミュートの切り替え Next Slot = 次のスロット None = None -Note = 音符 +Note = ♪ボタン OpenChat = チャットを開く Pause = 一時停止 -R = R +R = R RapidFire = 連射 +Record = Record Remote hold = リモートホールド Rewind = 巻き戻す -Right = 方向キー 右 -Right Analog Stick (tap to customize) = 右アナログスティック (タップしてカスタマイズ) -RightAn.Down = 右パッド 下 -RightAn.Left = 右パッド 左 -RightAn.Right = 右パッド 右 -RightAn.Up = 右パッド 上 +Right = 十字キー 右 +Right Analog Stick = 右アナログパッド +RightAn.Down = 右アナログパッド 下 +RightAn.Left = 右アナログパッド 左 +RightAn.Right = 右アナログパッド 右 +RightAn.Up = 右アナログパッド 上 Rotate Analog (CCW) = アナログ回転 (CCW) Rotate Analog (CW) = アナログ回転 (CW) Save State = ステートをセーブ @@ -650,23 +706,28 @@ Screen = スクリーン Screenshot = スクリーンショット Select = Select SpeedToggle = 速度の切り替え -Square = Square +Square = □ Start = Start +Swipe Down = スワイプ【下】 +Swipe Left = スワイプ【左】 +Swipe Right = スワイプ【右】 +Swipe Up = スワイプ【上】 +tap to customize = タップして設定 Texture Dumping = テクスチャのダンプ Texture Replacement = テクスチャの置換 Toggle Fullscreen = フルスクリーンの切り替え Toggle mode = モードの切り替え -Triangle = Triangle +Triangle = △ Fast-forward = 速度制限を解除 -Up = 方向キー 上 +Up = 十字キー 上 Vol + = 音量を上げる Vol - = 音量を下げる Wlan = WLAN [Networking] -Adhoc Multiplayer forum = アドホックマルチプレイのフォーラムに行く AdHoc Server = アドホックサーバ AdhocServer Failed to Bind Port = アドホックサーバーがポートのバインドに失敗しました +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = 自動 Bottom Center = 下中央 Bottom Left = 左下 @@ -678,6 +739,7 @@ Change proAdhocServer Address = PROアドホックサーバのIPアドレスを Chat = チャット Chat Button Position = チャットボタンの位置 Chat Here = ここにチャットを入力する +Chat message = Chat message Chat Screen Position = チャット画面の位置 Disconnected from AdhocServer = アドホックサーバーから切断する DNS Error Resolving = DNSエラーの解決 @@ -697,10 +759,13 @@ Failed to Bind Localhost IP = ローカルホストIPのバインドに失敗し Failed to Bind Port = ポートのバインドに失敗しました Failed to connect to Adhoc Server = アドホックサーバーに接続できませんでした Forced First Connect = 強制初期接続 (より速い接続) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = 無効なIPまたはホスト名 Minimum Timeout = 最小タイムアウト (低遅延をオーバーライド、単位ms) Misc = その他 (デフォルト = PSP互換) Network Initialized = ネットワークを初期化 +None = None Please change your Port Offset = ポートオフセットを変更してください Port offset = ポートオフセット (0 = PSP互換) PPSSPP Ad-Hoc Wiki Page = PPSSPPのアドホック接続Wikiページを開く (英語) @@ -737,6 +802,8 @@ Rewind = 巻き戻す Save State = ステートをセーブする Settings = 設定 Switch UMD = UMDを交換する +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -767,6 +834,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = Video Smoothing AA Vignette = Vignette @@ -812,17 +880,33 @@ website = ウェブサイトはこちら: written = 速度と移植性を保つためにC++で書かれています [MemStick] +Already contains PSP data = Already contains PSP data +Current = Current DataWillStay = 保存データはPPSSPPをアンインストールしても残る。 DataCanBeShared = 通常版/ゴールド間でのデータの共有が可能。 DataCannotBeShared = 通常版/ゴールド間でのデータの共有が「できない」。 +Done! = Done! EasyUSBAccess = PCとのUSB接続でフォルダにアクセスが簡単にできる。 +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +Move Data = Move Data +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Selected PSP Data Folder = Selected PSP Data Folder +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. USBAccessThrough = USB接続は Android/data/org.ppsspp.ppsspp/files を通して行う。 USBAccessThroughGold = USB接続は Android/data/org.ppsspp.ppssppgold/files を通して行う。 DataWillBeLostOnUninstall = 警告! PPSSPPをアンインストールすると保存データも削除されます! MemoryStickDescription = PSPデータの保存先の選択(メモリースティック) Create or Choose a PSP folder = フォルダの新規作成または既存フォルダの選択 -Use App Private Directory = アプリのプライベートフォルダに保存 +Use App Private Data = アプリのプライベートフォルダに保存 Use PSP folder at root of storage = デバイスの内部ストレージのルートに保存 +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? [RemoteISO] Browse Games = ゲームをブラウズする @@ -846,6 +930,8 @@ Stopping.. = 停止しています... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = あなたのデータはバックグラウンドで送信されます。 FeedbackDesc = エミュレーションの評価をコミュニティに報告する FeedbackDisabled = 「互換性をコミュニティに報告する」を有効にしてください。 @@ -871,6 +957,7 @@ Perfect Description = ゲーム全体に渡って完全なエミュレーショ Plays = Plays Plays Description = 完全に遊べるがグリッチが生じる ReportButton = 報告する +Show disc CRC = Show disc CRC Speed = 速度 Submit Feedback = フィードバックを送信する SuggestionConfig = 適切な設定についてウェブサイトのレポートを参照してください。 @@ -889,9 +976,11 @@ Date = 日付 Filename = ファイル名 No screenshot = スクリーンショットなし None yet. Things will appear here after you save. = まだありません。セーブ後に項目が表示されます。 +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = セーブデータ Save States = セーブステート Savedata Manager = セーブデータを管理する +Showing matches for '%1'. = Showing matches for '%1'. Size = サイズ [Screen] @@ -904,6 +993,8 @@ GLToolsWarning = 警告: GLToolsを検出しました。問題が起きるかも In menu = In menu Load savestate failed = セーブステートのロードに失敗しました Loaded State = ステートをロードしました +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = ロードしました。バグの発生を減らすためにゲーム中でセーブを行い、再起動してロードしてください。 LoadStateDoesntExist = ステートのロードに失敗しました: セーブステートがありません。 LoadStateWrongVersion = ステートのロードに失敗しました: 古いバージョンのセーブステートです。 @@ -918,6 +1009,7 @@ saveNewTextures_false = テクスチャの保存が無効になりました。 saveNewTextures_true = テクスチャがストレージに保存されます。 SpeedCustom2 = 速度: カスタム速度2 standard = 速度: 標準 +State load undone = State load undone Untitled PSP game = 無題のPSPゲーム [Store] @@ -951,6 +1043,7 @@ D3DCompiler Version = D3DCompilerバージョン Debug = デバッグ Debugger Present = デバッガーあり Device Info = デバイス情報 +Directories = Directories Display Information = ディスプレイ情報 Driver Version = ドライバのバージョン EGL Extensions = EGL拡張 @@ -974,6 +1067,7 @@ Release = リリース RW/RX exclusive = RW/RX専用 Sample rate = サンプルレート Shading Language = シェーディング言語 +Storage = Storage Sustained perf mode = 性能維持モード System Information = システム情報 System Name = システム名 @@ -995,8 +1089,11 @@ AVI Dump started. = AVIダンプを開始しました AVI Dump stopped. = AVIダンプを停止しました Cache ISO in RAM = ISO全体をキャッシュする Change CPU Clock = CPUクロックを変更する (不安定) -Change Memory Stick folder = メモリースティックフォルダを変更する -Change Memory Stick Size = メモリースティックの容量の変更 (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = メモリースティックフォルダを変更する +Memory Stick size = メモリースティックの容量の変更 (GB) Change Nickname = ニックネームを変更する ChangingMemstickPath = ゲームのセーブ, セーブステート, その他のデータはこのフォルダにコピーされません。\n\nメモリースティックフォルダを変更しますか? ChangingMemstickPathInvalid = そのパスを使用してメモリースティックファイルを保存することができませんでした。 @@ -1030,7 +1127,6 @@ General = 全般 Grid icon size = グリッド表示時のアイコンサイズ Help the PPSSPP team = PPSSPPチームを支援する Host (bugs, less lag) = ホスト (バグあり, ラグは少ない) -I/O on thread (experimental) = 入出力をスレッド化 (実験的) Ignore bad memory accesses = 不正なメモリアクセスを無視する Increase size = サイズを拡大する Interpreter = インタプリタ @@ -1040,11 +1136,14 @@ Memory Stick Folder = メモリースティックフォルダ Memory Stick inserted = メモリースティックを挿入する MHz, 0:default = MHz, 0 = デフォルト MMDDYYYY = 月/日/年 +Moving background = Moving background Newest Save = 最も新しいセーブ No animation = アニメーションなし Not a PSP game = PSPのゲームではありません Off = オフ Oldest Save = 最も古いセーブ +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSPのモデル PSP Settings = PSPの設定 PSP-1000 = PSP-1000 @@ -1076,6 +1175,7 @@ UI = ユーザーインターフェース UI Sound = UI操作音 UI background animation = UIの背景アニメーション undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = ロスレスビデオコーデックを使う (FFV1) Use O to confirm = ○ボタンで決定する(日本仕様) Use output buffer (with overlay) for recording = 記録時に出力バッファを使用する (オーバーレイ付き) @@ -1084,6 +1184,7 @@ Use X to confirm = ✕ボタンで決定する(海外仕様) VersionCheck = 新バージョンのPPSSPPをチェックする WARNING: Android battery save mode is on = 警告: アンドロイドのバッテリーセーブモードがオンになっています WARNING: Battery save mode is on = 警告: バッテリーセーブモードがオンになっています +Waves = Waves YYYYMMDD = 年/月/日 [Upgrade] diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index a59adaf5a5..cab17cdce9 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Suoro backend (Wiwiti maneh, req) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Otomatis Device = Device +Disabled = Disabled DSound (compatible) = DSound (kompatibel) Enable Sound = Ngatifke Suoro Global volume = Tingkat Volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (cepet) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Mapper Analog dhuwur-mburi (sensitivitas sumbu) Analog Mapper Low End = Mapper Analog sedheng pungkasan (kuwalik deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Otomatis Auto-centering analog stick = Otomatis Analog stick nang tengah Auto-hide buttons after seconds = Otomatis tombol ilang +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Ketebelan warna tombol Button style = Gaya tombol +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibrasi D-Pad +Calibrated = Calibrated Calibration = Kalibrasi +Circular stick input = Circular stick input Classic = Klasik Combo Key Setting = Persiyapan Setelan Kombo Combo Key Setup = Persiyapan Tombol Kombo Confine Mouse = Trap mouse within window/display area Control Mapping = Pemetaan Kontrol -Custom layout... = Edit Sentuh Kontrol layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit Sentuh Kontrol layout... Customize tilt = Ngatur ngiringake ... D-PAD = D-Pad -Deadzone Radius = Radius deadzone +Deadzone radius = Radius deadzone DInput Analog Settings = Setelan analog DInput Disable D-Pad diagonals (4-way touch) = Mateni D-Pad diagonals (4-cara tutul) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Saran tutul (getar) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Nglirwakake gamepads nalika ora fokus Ignore Windows Key = Nglirwakake tombol Windows Invert Axes = Balekna Sumbu @@ -55,6 +77,7 @@ L/R Trigger Buttons = Tombol pemicu L/R Landscape = Lanskap Landscape Auto = Landscape auto Landscape Reversed = Lanskap kebalik +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Tombol Layar-sentuh Portrait = Portret Portrait Reversed = Potret kebalik PSP Action Buttons = PSP Aksi tombol +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotasi layar seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitiv +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Deleng tombol menu ngaso +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Watesan lancip Tilt Base Radius = Tilt base radius Tilt Input Type = Ngiringake Tipe input Tilt Sensitivity along X axis = Ngiringake sensitivitas bebarengan X sumbu Tilt Sensitivity along Y axis = Ngiringake sensitivitas bebarengan Y sumbu To Calibrate = Kanggo kalibrasi, sijine piranti ing warata lan pencet "Kalibrasi". +Toggle mode = Toggle mode Touch Control Visibility = Visibilitas kontrol sentuh Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibilitas +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Setelan analog XInput @@ -99,6 +133,7 @@ Refresh Rate = Restar rate #Font = Trebuchet MS About PPSSPP... = &Tentang PPSSPP... Auto = &Otomatis +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = Setelan sing luwih ... Nearest = &Nearest Non-Buffered Rendering = Skip efek buffer (ora yakuwi,luwih cepet) Off = &Mati +Open Chat = Open Chat Open Directory... = Mbukak &Direktori... Open from MS:/PSP/GAME... = Mbukak soko MS:/PSP/GAME... Open Memory Stick = Mbukak &Memory Stick @@ -229,6 +265,7 @@ No block = Ora pemblokiran Prev = Sadurunge Random = Acak Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Apa panjenengan yakin arep mulihake kabeh setelan bali menyang sing awal?Setelan pemetaan Control ora diganti.Avatar sing Rika unggahna ora bisa batalaken iki.monggo miwiti PPSSPP kanggo owah-owahan kanggo ditrapake. RestoreGameDefaultSettings = Apa panjenengan yakin arep mulihake setelan-game tartamtu back kanggo awal PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Yakin arep mbusek setelan kanggo dolanan iki? DeleteFailed = ora dapat mbusek data. Deleting = Mbusek\nMohon nteni... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Ketik +Filter = Filter Finish = Rampung +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Simpen Save completed = Nyimpen rampung. Saving = Nyimpen\nMohon nteni... SavingFailed = Ora biso Nyimpen data. +Search = Search Select = Peleh Shift = Shift +Skip = Skip Snap = Snap Space = Spasi SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = berkas iki terkompres (ZIP).\nMohon bongkar [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Mbusek Create Game Config = Nggawe Setelan Dolanan Create Shortcut = Nggawe Trobosan @@ -430,6 +473,7 @@ Auto = Otomatis Auto (1:1) = Otomatis (1:1) Auto (same as Rendering) = Otomatis (padha Rendering) Auto FrameSkip = Frameskip Otomatis +Auto Max Quality = Auto Max Quality Auto Scaling = Njongko Otomatis Backend = Backend Balanced = Imbang @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Konfigurasi otomatis Autoconfigure for device = Konfigurasi otomatis kanggo piranti +Bind All = Bind All Clear All = Ilangi kabeh Default All = Gawan kabeh Map a new key for = Petakan tombol anyar Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Tes Analog You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Ngisor Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Ngaso R = R RapidFire = RapidFire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Kanan -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = AnKanan.Ngisor RightAn.Left = AnKanan.Kiri RightAn.Right = AnKanan.Kanan @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Pilian Kacepetan Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Kunjungi forum Ad Hoc Multiplayer AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Ubah alamat pelayan IP PRO ad hoc (localhost = m Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Jaringan diinisiasi +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Simpen Keadaan Settings = Setelan Switch UMD = Ngalih UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Buruk +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = Bagaimana emulasinya? Beritahu komunitas! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Dapat dimainkan Plays Description = Fully playable but might be with glitches ReportButton = Laporkan umpan balik +Show disc CRC = Show disc CRC Speed = Kacepetan Submit Feedback = Kerem umpan balik SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = Ora ana tangkapan layar None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Simpen data Save States = Simpen states Savedata Manager = SimpenData Manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = PERINGATAN: GLTools terdeteksi, mungkin menyebabkan masalah. In menu = In menu Load savestate failed = Load savestate failed Loaded State = Penyimpenan-cepet dimuat +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Gagal memuat: File simpen-cepet ora kasedhiya! LoadStateWrongVersion = Gagal memuat: File simpen-cepet iki kanggi versi lawas PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Kacepetan: standar +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache lengkap ISO ing RAM Change CPU Clock = Ganti CPU Clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Ganti Jeneng ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Umum Grid icon size = Grid icon size Help the PPSSPP team = Bantu tim PPSSPP Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = Gawan MMDDYYYY = BBHHTTTT +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Ora ana dolanan PSP Off = Mati Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = Setelan PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Penyimpenan lengkap Sustained performance mode = Sustained performance mode Time Format = Format wektu UI = Antarmuka Panganggo +UI background animation = UI background animation UI Sound = Swara Antarmuka Panganggo undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Gunakake O kanggo konfirmasi Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Gunakake X kanggo konfirmasi VersionCheck = Cek versi anyar PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = TTTTBBHH [Upgrade] diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index a4d8de699e..bfc6304c82 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = 대체 속도 볼륨 Audio backend = 오디오 처리자 (재시작 필요) +Audio Error = Audio Error AudioBufferingForBluetooth = 블루투스 친화적 버퍼링 (느림) Auto = 자동 Device = 장치 +Disabled = Disabled DSound (compatible) = DSound (호환됨) Enable Sound = 사운드 활성화 Global volume = 전역 볼륨 Microphone = Microphone Microphone Device = Microphone device Mute = 음소거 -Switch on new audio device = 새로운 오디오 장치로 전환 +Reverb volume = Reverb volume +Use new audio devices automatically = 새로운 오디오 장치로 전환 Use global volume = 전역 볼륨 사용 WASAPI (fast) = WASAPI (빠름) [Controls] -Analog auto-rotation speed = 아날로그 자동 회전 속도 +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = 아날로그 자동 회전 속도 Analog Axis Sensitivity = 아날로그 축 민감도 Analog Limiter = 아날로그 제한 Analog Mapper High End = 아날로그 매퍼 high-end (축 감도) @@ -26,24 +32,40 @@ AnalogLimiter Tip = 아날로그 제한 버튼이 눌러졌을 때 아날로그 Auto = 자동 Auto-centering analog stick = 아날로그 스틱 자동으로 중앙 고정 Auto-hide buttons after seconds = 버튼 자동 숨김 +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = 버튼 투명도 Button style = 버튼 스타일 +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = 십자 패드 보정 +Calibrated = Calibrated Calibration = 보정 +Circular stick input = Circular stick input Classic = 클래식 Combo Key Setting = 콤보 키 설정 Combo Key Setup = 콤보 키 설정하기 Confine Mouse = 창/화면 안에 커서를 가두기 Control Mapping = 컨트롤 맵핑 -Custom layout... = 터치 컨트롤 레이아웃 편집... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = 터치 컨트롤 레이아웃 편집... Customize tilt = 기울기 사용자화... D-PAD = 십자 패드 -Deadzone Radius = 데드존 범위 +Deadzone radius = 데드존 범위 DInput Analog Settings = DInput 아날로그 설정 (다이렉트 인풋) Disable D-Pad diagonals (4-way touch) = 십자 패드 대각선 비활성 (4방향 터치) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = 빛나는 테두리 HapticFeedback = 햅틱 피드백 (진동) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = 창이 활성화 되지 않았을 때 게임패드 무시 Ignore Windows Key = 윈도우 키 무시 Invert Axes = 축 반전 @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R 트리거 버튼 Landscape = 가로 Landscape Auto = 가로 자동 Landscape Reversed = 가로 반전 +Low end radius = Low end radius Mouse = 마우스 설정 Mouse sensitivity = 마우스 민감도 Mouse smoothing = 마우스 가속도(Smoothing) @@ -65,21 +88,32 @@ OnScreen = 화면 터치 컨트롤 Portrait = 세로 Portrait Reversed = 세로 반전 PSP Action Buttons = PSP 액션 버튼 +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = 화면 회전 seconds, 0 : off = 초 단위, 0 : 끄기 +Sensitivity (scale) = Sensitivity (scale) Sensitivity = 민감도 +Shape = Shape Show right analog = 오른쪽 아날로그 보기 Show Touch Pause Menu Button = 일시 정지 메뉴 버튼 표시 +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = 얇은 테두리 Tilt Base Radius = Tilt base radius Tilt Input Type = 기울기 입력 방식 Tilt Sensitivity along X axis = X축 기울기 민감도 Tilt Sensitivity along Y axis = Y축 기울기 민감도 To Calibrate = 보정하려면, 기기를 평평한 곳에 놓고 "보정"을 눌러주십시오. +Toggle mode = Toggle mode Touch Control Visibility = 터치 컨트롤 표시 Use custom right analog = 사용자 정의 오른쪽 아날로그 사용 Use Mouse Control = 마우스 사용하기 Visibility = 표시 +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput 아날로그 설정 (Xbox 계열 컨트롤러) @@ -96,6 +130,7 @@ Refresh Rate = 재생률 [DesktopUI] # If your language does not show well with the default font, you can use Font to specify a different one. # Just add it to your language's ini file and uncomment it (remove the # by Font). +Auto Max Quality = Auto Max &Quality Font = NanumGothic About PPSSPP... = PPSSPP 정보(&A)... Auto = 자동(&A) @@ -150,6 +185,7 @@ More Settings... = 기타 설정(&M)... Nearest = 근접 필터링(&N) Non-Buffered Rendering = 버퍼 없는 렌더링(&S) Off = 끄기(&O) +Open Chat = Open Chat Open Directory... = 디렉터리 열기(&D)... Open from MS:/PSP/GAME... = MS:/PSP/GAME에서 열기(&P)... Open Memory Stick = 메모리 스틱 열기(&M) @@ -229,6 +265,7 @@ No block = 블록 없음 Prev = 이전 Random = 랜덤 Replace textures = 텍스처 덮어쓰기 +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = 모든 설정을 다시 기본으로 복원 하시겠습니까?\n컨트롤 맵핑 설정은 변경되지 않습니다.\n\n\n이 작업은 되돌릴 수 없습니다.\n변경 사항을 적용하기 위해 PPSSPP를 재시작해 주십시오. RestoreGameDefaultSettings = 게임 지정 설정을 다시\nPPSSPP 기본 설정으로 복원하시겠습니까? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = 이 게임의 설정을 정말로 삭제하시겠습 DeleteFailed = 삭제할 수 없습니다. Deleting = 삭제 중입니다.\n잠시 기다려 주세요... Disable All = 모두 비활성화 +Dumps = Dumps Edit = Edit Enable All = 모두 활성화 Enter = 결정 +Filter = Filter Finish = 완료 +GE Frame Dumps = GE Frame Dumps Grid = 격자 Inactive = 비활성화 InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = 저장하기 Save completed = 저장을 완료했습니다. Saving = 저장 중입니다.\n잠시 기다려 주세요... SavingFailed = 저장할 수 없습니다. +Search = Search Select = 선택 Shift = 전환 +Skip = Skip Snap = Snap Space = 스페이스 SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = 파일이 ZIP 형식으로 압축되어 있 [Game] Asia = 아시아 +Calculate CRC = Calculate CRC ConfirmDelete = 삭제 Create Game Config = 게임 설정파일 만들기 Create Shortcut = 바로가기 만들기 @@ -430,6 +473,7 @@ Auto = 자동 Auto (1:1) = 자동 (1:1) Auto (same as Rendering) = 자동 (렌더링 해상도와 같음) Auto FrameSkip = 자동 프레임 생략 +Auto Max Quality = Auto Max Quality Auto Scaling = 자동 스케일링 Backend = 처리자 Balanced = 평형 @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP 파일에 PSP 소프트웨어가 [KeyMapping] Autoconfigure = 자동 설정 Autoconfigure for device = 디바이스에 맞게 자동 설정 +Bind All = Bind All Clear All = 모두 지우기 Default All = 기본값 복원 Map a new key for = 새로운 키 입력 Map Key = 키 매핑 Map Mouse = 마우스 매핑 +Replace = Replace +Show PSP = Show PSP Test Analogs = 아날로그 테스트 You can press ESC to cancel. = 취소하려면 ESC를 눌러주십시오. @@ -585,6 +632,7 @@ SavesAreTemporary = 임시 저장장치에 저장하는 중 SavesAreTemporaryGuidance = 영구적으로 사용하기 위해 PPSSPP를 기억장치에 복사해 주십시오. SavesAreTemporaryIgnore = 무시하기 UnpinPath = 고정 해제 +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = 자동 아날로그 회전 (CW) AxisSwap = 축 스왑 Circle = 동그라미 Cross = 십자 +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = 방향 패드.하 D-pad left = 방향 패드.좌 D-pad right = 방향 패드.우 D-pad up = 방향 패드.상 DevMenu = 개발 메뉴 +Double tap button = Double tap button Down = 방향 패드.하 Dpad = 방향 패드 Frame Advance = 프레임 건너뛰기 @@ -631,10 +690,11 @@ OpenChat = 대화 열기 Pause = 일시 정지 R = R RapidFire = 연사 +Record = Record Remote hold = 리모트 잠금 Rewind = 되감기 Right = 방향 패드.우 -Right Analog Stick (tap to customize) = 오른쪽 아날로그 스틱 (탭해서 사용자화) +Right Analog Stick = Right Analog Stick RightAn.Down = 우측An.하 RightAn.Left = 우측An.좌 RightAn.Right = 우측An.우 @@ -648,6 +708,11 @@ Select = 선택 SpeedToggle = 속도 전환 Square = 네모 Start = 시작 +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = 텍스처 덤프 Texture Replacement = 텍스처 교체 Toggle Fullscreen = 전체화면 고정 @@ -659,10 +724,39 @@ Vol + = 볼륨 + Vol - = 볼륨 - Wlan = 무선랜 +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = 애드혹 멀티플레이어 포럼 방문 AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = PRO 애드혹 서버 IP 주소 변경 (localhost Chat = 대화 Chat Button Position = 대화 버튼 위치 Chat Here = 여기에 입력 +Chat message = Chat message Chat Screen Position = 대화 화면 위치 Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = 올바르지 않은 IP 또는 호스트 이름 Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = 네트워크 초기화됨 +None = None Please change your Port Offset = Please change your port offset Port offset = 포트 오프셋(0 = PSP 호환) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = 빠른 대화 1 Quick Chat 2 = 빠른 대화 2 @@ -732,6 +831,8 @@ Rewind = 되감기 Save State = 상태 저장하기 Settings = 설정 Switch UMD = UMD 교체 +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = 스캔라인 (CRT) Sharpen = 선명하게 SSAA(Gauss) = 슈퍼샘플링 AA (가우스) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = 스플라인36 확대 VideoSmoothingAA = VideoSmoothingAA Vignette = 비네트 @@ -830,6 +932,8 @@ Stopping.. = 중지하는 중... [Reporting] Bad = 나쁨 +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = 피드백 데이터를 전송 중입니다. FeedbackDesc = 게임이 어땠나요? 저희에게 알려주십시오! FeedbackDisabled = 서버에 호환성 문제 보고를 체크해 주십시오. @@ -855,6 +959,7 @@ Perfect Description = 게임 전체가 흠 없이 매끄럽게 작동했습니 Plays = 플레이 중 Plays Description = 게임을 즐길 수는 있지만 문제가 있을 수 있습니다 ReportButton = 피드백 남기기 +Show disc CRC = Show disc CRC Speed = 속도 Submit Feedback = 피드백 전송 SuggestionConfig = 적합한 설정을 위해 웹사이트에 올라온 보고서들을 확인해 보십시오. @@ -873,9 +978,11 @@ Date = 날짜 Filename = 파일 이름 No screenshot = 스크린샷 없음 None yet. Things will appear here after you save. = 아직 없음. 저장하면 나타납니다. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = 저장 데이터 Save States = 상태 저장 Savedata Manager = 저장 데이터 관리자 +Showing matches for '%1'. = Showing matches for '%1'. Size = 크기 [Screen] @@ -888,6 +995,8 @@ GLToolsWarning = 경고: GLTools가 감지되었습니다. 문제가 발생할 In menu = 메뉴 Load savestate failed = 상태 불러오기 실패 Loaded State = 상태 불러옴 +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = 불러왔습니다. 게임을 저장한 다음 재시작하면 적은 버그로 로드됩니다. LoadStateDoesntExist = 상태를 불러오지 못했습니다: 상태 저장이 존재하지 않습니다! LoadStateWrongVersion = 상태를 불러오지 못했습니다: 구 버전의 상태 저장입니다! @@ -902,6 +1011,7 @@ saveNewTextures_false = 텍스처 저장이 비활성화되었습니다. saveNewTextures_true = 텍스처가 이제 저장 공간에 저장됩니다. SpeedCustom2 = 속도: 고정 속도 2 standard = 속도: 표준 +State load undone = State load undone Untitled PSP game = 이름 없는 PSP 게임 [Store] @@ -935,6 +1045,7 @@ D3DCompiler Version = D3DCompiler 버전 Debug = 디버그 Debugger Present = 디버거 표시 Device Info = 장치 정보 +Directories = Directories Display Information = 디스플레이 정보 Driver Version = 드라이버 버전 EGL Extensions = EGL 확장 @@ -958,6 +1069,7 @@ Release = 출시 RW/RX exclusive = RW/RX 독점 Sample rate = 샘플 속도 Shading Language = 셰이딩 언어 +Storage = Storage Sustained perf mode = 지속 성능 모드 System Information = 시스템 정보 System Name = 시스템 이름 @@ -979,8 +1091,11 @@ AVI Dump started. = AVI 덤프 시작됨 AVI Dump stopped. = AVI 덤프 정지됨 Cache ISO in RAM = ISO 전체를 램에 캐싱 Change CPU Clock = CPU 클럭 변경 (불안정) -Change Memory Stick folder = 메모리 스틱 폴더 변경 -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = 메모리 스틱 폴더 변경 +Memory Stick size = Memory Stick size Change Nickname = 별명 변경 ChangingMemstickPath = 게임 저장, 상태 저장, 기타 데이터는 이 폴더에 복사되지 않습니다.\n\n메모리 스틱 폴더를 변경하시겠습니까? ChangingMemstickPathInvalid = 이 경로는 메모리 스틱 파일을 저장하는데 사용할 수 없습니다. @@ -1014,7 +1129,6 @@ General = 일반 Grid icon size = 그리드 아이콘 크기 Help the PPSSPP team = PPSSPP 팀 돕기 Host (bugs, less lag) = 호스트 (버그, 약간의 지연) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = 크기 늘리기 Interpreter = 해석기 @@ -1024,14 +1138,19 @@ Memory Stick Folder = 메모리 스틱 폴더 Memory Stick inserted = 메모리 스틱 삽입됨 MHz, 0:default = MHz, 0 = 기본 값 MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = 제일 새로운 저장 +No animation = No animation Not a PSP game = PSP 게임이 아님 Off = 끄기 Oldest Save = 제일 오래된 저장 +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP 기종 PSP Settings = PSP 설정 PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = 소리 녹음하기 Record Display = 영상 녹화하기 Reset Recording on Save/Load State = 저장/불러올 때 기록된 것을 재설정하기 @@ -1055,8 +1174,10 @@ Storage full = 저장 공간 가득참 Sustained performance mode = 지속 성능 모드 Time Format = 시간 표시 방식 UI = 사용자 인터페이스 +UI background animation = UI background animation UI Sound = UI sound undo %c = %c 백업 +USB = USB Use Lossless Video Codec (FFV1) = 무손실 비디오 코덱 사용 (FFV1) Use O to confirm = 확인 버튼으로 O 사용 Use output buffer (with overlay) for recording = 기록에 출력 버퍼(오버레이 포함) 사용 @@ -1065,6 +1186,7 @@ Use X to confirm = 확인 버튼으로 X 사용 VersionCheck = PPSSPP의 새로운 버전을 확인 WARNING: Android battery save mode is on = 주의: 안드로이드 배터리 절약 모드가 켜짐 WARNING: Battery save mode is on = 주의: 배터리 절약 모드가 켜짐 +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index ac932d04e2..c4755e59fa 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = ຮູບແບບສຽງທີ່ຮອງຮັບ (ຕ້ອງຣີສຕາຣ໌ດ) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = ອັດຕະໂນມັດ Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = ເປີດໃຊ້ງານສຽງ Global volume = ລະດັບສຽງຫຼັກ Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = ໂຕຈຳກັດອະນາລ໋ອກ Analog Mapper High End = ປັບປ່ຽນອະນາລ໋ອກ high-end (ການຕອບສະໜອງຂອງແກນ) Analog Mapper Low End = ໂຕປັບອະນາລ໋ອກ low-end (ສະຫຼັບດ້ານ deadzone) Analog Mapper Mode = ໂໝດການປັບອະນາລ໋ອກ +Analog Settings = Analog Settings Analog Stick = ປຸ່ມອະນາລ໋ອກ +Analog Style = Analog Style AnalogLimiter Tip = ເມື່ອກົດທີ່ຂອບປຸ່ມອະນາລ໋ອກ ໂຕຈຳກັດອະນາລ໋ອກຈະເຮັດວຽກ Auto = ອັດຕະໂນມັດ Auto-centering analog stick = ອະນາລ໋ອກກັບຄືນຈຸດສູນກາງອັດຕະໂນມັດ Auto-hide buttons after seconds = ເຊື່ອງປຸ່ມທັນທີຫຼັງຈາກ ວິນາທີ +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = ຄວາມເຂັ້ມຂອງປຸ່ມ Button style = ຮູບແບບປຸ່ມກົດ +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = ປັບຄ່າຄວາມຄາດເຄື່ອນຂອງ D-Pad +Calibrated = Calibrated Calibration = ປັບຄ່າຄວາມຄາດເຄື່ອນ +Circular stick input = Circular stick input Classic = ແບບດັ້ງເດີມ Combo Key Setting = ຕັ້ງຄ່າປຸ່ມຄອມໂບ Combo Key Setup = ຕິດຕັ້ງປຸ່ມຄອມໂບ Confine Mouse = ຈຳກັດເມົ້າໃນໜ້າຕ່າງ/ພື້ນທີ່ສະແດງຜົນ Control Mapping = ປ່ຽນແປງຄ່າຄວບຄຸມ -Custom layout... = ປັບປ່ຽນການຄວບຄຸມແບບສຳຜັດ... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = ປັບປ່ຽນການຄວບຄຸມແບບສຳຜັດ... Customize tilt = ປັບແຕ່ງການອຽງໂດຍໃຊ້ເຊັນເຊີ້ຄວບຄຸມ... D-PAD = D-Pad -Deadzone Radius = ຂອບເຂດ Deadzone +Deadzone radius = ຂອບເຂດ Deadzone DInput Analog Settings = ຕັ້ງຄ່າອະນາລ໋ອກຂອງ DInput Disable D-Pad diagonals (4-way touch) = ປິດການໃຊ້ງານປຸ່ມ D-Pad (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = ຕອບສະໜອງເມື່ອສຳຜັດ (ການສັ່ນ) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = ປະຕິເສດປຸ່ມກົດເມື່ອບໍ່ໄດ້ຫຼິ້ນໃນຕອນນັ້ນ Ignore Windows Key = ປິດການໃຊ້ງານປຸ່ມ Windows Invert Axes = ການສະຫຼັບດ້ານຂອງແກນ @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = ແນວນອນ Landscape Auto = Landscape auto Landscape Reversed = ກັບດ້ານແນວນອນ +Low end radius = Low end radius Mouse = ການຕັ້ງຄ່າເມົ້າ Mouse sensitivity = ຄວາມໄວຕໍ່ການຕອບສະໜອງຂອງເມົ້າ Mouse smoothing = ຄວາມມື່ນໄຫຼຂອງເມົ້າ @@ -65,21 +88,32 @@ OnScreen = ໃຊ້ໜ້າຈໍຄວບຄຸມແບບສຳຜັດ Portrait = ແນວຕັ້ງ Portrait Reversed = ກັບດ້ານແນວຕັ້ງ PSP Action Buttons = ປຸ່ມກົດຂອງ PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = ການໝຸນໜ້າຈໍ seconds, 0 : off = ວິນາທີ, 0 = ປິດ +Sensitivity (scale) = Sensitivity (scale) Sensitivity = ຄວາມໄວຕໍ່ການຕອບສະໜອງ +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = ສະແດງປຸ່ມຢຸດສຳລັບເຂົ້າເມນູ +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = ຂອບແບບບາງ Tilt Base Radius = Tilt base radius Tilt Input Type = ນຳເຂົ້າຮູບແບບການອຽງ Tilt Sensitivity along X axis = ຄວາມໄວການອຽງຕາມແກນ X Tilt Sensitivity along Y axis = ຄວາມໄວການອຽງໄວຕາມແກນ Y To Calibrate = ໃຫ້ວາງອຸປະກອນເທິງພື້ນລຽບ ແລະ ກົດ "ປັບຄ່າຄວາມຄາດເຄື່ອນ". +Toggle mode = Toggle mode Touch Control Visibility = ການສະແດງຜົນປຸ່ມຄວບຄຸມແບບສຳຜັດ Use custom right analog = Use custom right analog Use Mouse Control = ໃຊ້ເມົ້າໃນການຄວບຄຸມ Visibility = ເຊື່ອງປຸ່ມ +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = ການຕັ້ງຄ່າແບບອະນາລ໋ອກ XInput @@ -99,6 +133,7 @@ Refresh Rate = ອັດຕາການຟື້ນຟູ #Font = Trebuchet MS About PPSSPP... = &ກ່ຽວກັບ PPSSPP... Auto = &ອັດຕະໂນມັດ +Auto Max Quality = Auto Max &Quality Backend = &ການສະແດງຜົນທີ່ສະໜັບສະໜຸນ (ຕ້ອງຣີສຕາຣ໌ດ PPSSPP) Bicubic = &ປັບພາບແບບ Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &ການຕັ້ງຄ່າອື່ນໆ... Nearest = &ພາບເປັນຮອຍຍັກໄດ້ Non-Buffered Rendering = &ຂ້າມການໃຊ້ເອັບເຟັກບັບເຟີ້ (ບໍ່ມີບັບເຟີ້, ໄວຂຶ້ນ) Off = &ປິດ +Open Chat = Open Chat Open Directory... = &ເປີດໄດເຣກທໍຣີ... Open from MS:/PSP/GAME... = &ເປີດຈາກ MS:/PSP/GAME... Open Memory Stick = &ເປີດບ່ອນເກັບຂໍ້ມູນ @@ -229,6 +265,7 @@ No block = ບໍ່ຕ້ອງບລັອກ Prev = ກ່ອນໜ້າ Random = ສຸມ Replace textures = ແທນທີ່ພື້ນຜິວ +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການກູ້ການຕັ້ງຄ່າກັບເປັນປົກກະຕິ?\nການຕັ້ງຄ່າແຜງການຄວບຄຸມຈະບໍ່ປ່ຽນ\n\n\nເຈົ້າບໍ່ສາມາດຍົກເລີກ\nກະລຸນາເລີ່ມ PPSSPP ໃໝ່ອີກຄັ້ງ ເພື່ອເຫັນຜົນການປ່ຽນແປງ RestoreGameDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການຄືນຄ່າການຕັ້ງຄ່າເກມໂດຍສະເພາະ\nກັບສູ່ຄ່າເລີ່ມຕົ້ນ PPSSPP ຫຼືບໍ່? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = ເຈົ້າຕ້ອງການທີ່ຈະລ DeleteFailed = ບໍ່ສາມາດລຶບຂໍ້ມູນ. Deleting = ກຳລັງລຶບຂໍ້ມູນ\nກະລຸນາຖ້າ.. Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = ຢືນຢັນ +Filter = Filter Finish = ສິ້ນສຸດ +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = ບັນທຶກ Save completed = ບັນທຶກຂໍ້ມູນສຳເລັດ Saving = ກຳລັງບັນທຶກ\nກະລຸນາຖ້າ... SavingFailed = ບໍ່ສາມາດບັນທຶກຂໍ້ມູນ. +Search = Search Select = ເລືອກ Shift = ປ່ຽນ +Skip = Skip Snap = Snap Space = ຍະວ່າງ SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = ໄຟລ໌ຖືກບີບອັດ (ZI [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = ຢືນຢັນການລຶບ Create Game Config = ສ້າງການຕັ້ງຄ່າເກມ Create Shortcut = ຈາກຫຼ້າສຸດ @@ -430,6 +473,7 @@ Auto = ອັດຕະໂນມັດ Auto (1:1) = ອັດຕະໂນມັດ (1:1) Auto (same as Rendering) = ອັດຕະໂນມັດ (ແບບດຽວກັບຄວາມລະອຽດການສະແດງຜົນ) Auto FrameSkip = ຂ້າມເຟຣມອັດຕະໂນມັດ +Auto Max Quality = Auto Max Quality Auto Scaling = ປັບຂະໜາດສເກລອັດຕະໂນມັດ Backend = ການສະໜັບສະໜູນ Balanced = ສົມດຸນ @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = ກຳນົດຄ່າອັດຕະໂນມັດ Autoconfigure for device = ກຳນົດຄ່າໃຫ້ອັດຕະໂນມັດສຳລັບອຸປະກອນນີ້ +Bind All = Bind All Clear All = ລຶບທັງໝົດ Default All = ຄືນຄ່າເລີ່ມຕົ້ນໃໝ່ໝົດ Map a new key for = ປັບປຸ່ມໃໝ່ເພື່ອ Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = ທົດສອບອະນາລ໋ອກ You can press ESC to cancel. = ເຈົ້າສາມາດກົດ Esc ເພື່ອຍົກເລີກ. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = ຖອດໝຸດ +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = ສະຫຼັບດ້ານແກນ Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = ເມນູຜູ້ພັດທະນາ +Double tap button = Double tap button Down = Dpad ລົງ Dpad = Dpad Frame Advance = Frame Advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = ຢຸດຊົ່ວຄາວ R = R RapidFire = ປຸ່ມລົວຕໍ່ເນື່ອງ +Record = Record Remote hold = Remote hold Rewind = ໝຸນກັບ Right = Dpad ຂວາ -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = ອະນາລ໋ອກຂວາລຸ່ມ RightAn.Left = ອະນາລ໋ອກຂວາຊ້າຍ RightAn.Right = ອະນາລ໋ອກຂວາຂວາ @@ -648,6 +708,11 @@ Select = Select SpeedToggle = ເລັ່ງຄວາມໄວເສີມ Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = ເຂົ້າຊົມຟໍຣຳ Ad Hoc Multiplayer AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = ປ່ຽນໄອພີທີ່ຢູ່ຂອ Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = ເລີ່ມການເຮັດວຽກລະບົບເຄື່ອຂ່າຍແລ້ວ +None = None Please change your Port Offset = Please change your port offset Port offset = ພອຣ໌ດຊົດເຊີຍ (0 = ຄ່າເລີ່ມຕົ້ນຂອງ PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = ໝຸນກັບ Save State = ບັນທຶກເກມ Settings = ການຕັ້ງຄ່າ Switch UMD = ສະຫຼັບແຜ່ນ UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = ບໍ່ດີ +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = ຂໍ້ມູນຂອງເຈົ້າກຳລັງຖືກສົ່ງໃນເບື້ອງຫຼັງ. FeedbackDesc = "ແອັບຈຳລອງນີ້ເປັນແນວໃດ? ບອກໃຫ້ເຮົາ ແລະ ຊຸມຊົນຮູ້ນຳກັນ!" FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = ຫຼິ້ນເກມໄດ້ບໍ່ມີບ່ອ Plays = ໃນຕອນຫຼິ້ນ Plays Description = ຫຼິ້ນໄດ້ຕະຫຼອດເກມ ແຕ່ມີບັນຫາໃນບາງຈຸດ ReportButton = ລາຍງານການຕອບກັບ +Show disc CRC = Show disc CRC Speed = ຄວາມໄວ Submit Feedback = ຢືນຢັນການຕອບກັບ SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = ບໍ່ມີການຈັບພາບໜ້າຈໍ None yet. Things will appear here after you save. = ຍັງບໍ່ມີຂໍ້ມູນເທື່ອ. ຈະມີກໍຕໍ່ເມື່ອເຈົ້າໄດ້ກົດບັນທຶກເອົາໄວ້. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = ຂໍ້ມູນເຊບ Save States = ໄຟລ໌ບັນທຶກ Savedata Manager = ຈັດການຂໍ້ມູນເຊບ +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = ລະວັງ: ກວດພົບ GLTools, ອາດເກີ In menu = In menu Load savestate failed = ໂຫຼດໄຟລ໌ບັນທຶກລົ້ມເຫຼວ Loaded State = ໂຫຼດໄຟລ໌ບັນທຶກແລ້ວ +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = "ລົ້ມເຫຼວໃນການໂຫຼດໄຟລ໌ບັນທຶກ: ໄຟລ໌ບັນທຶກບໍ່ຖືກຕ້ອງ!" LoadStateWrongVersion = ລົ້ມເຫຼວໃນການໂຫຼດໄຟລ໌ບັນທຶກ: ໄຟລ໌ບັນທຶກແມ່ນເວີຊັ່ນເກົ່າຂອງ PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = ຄວາມໄວ: ມາດຕະຖານ +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = ເລີ່ມຖ່າຍໂອນຂໍ້ມູນ AVI AVI Dump stopped. = ຢຸດຖ່າຍໂອນຂໍ້ມູນ AVI ແລ້ວ. Cache ISO in RAM = ເກັບແຄດ ISO ໄວ້ໃນ RAM Change CPU Clock = "ປ່ຽນຄ່າຈຳລອງຄວາມຖີ່ຂອງ CPU (ບໍ່ສະຖຽນ)" -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = ປ່ຽນຊື່ຫຼິ້ນ ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = ທົ່ວໄປ Grid icon size = Grid icon size Help the PPSSPP team = ຊ່ອຍເຫຼືອທີມງານ PPSSPP Host (bugs, less lag) = Host (ອາດມີບັ໊ກ, ແລັກໜ້ອຍລົງ) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = ໃສ່ແນວບັນທຶກຂໍ້ມູນ (Memory Stick) MHz, 0:default = MHz, 0 = ຄ່າເລີ່ມຕົ້ນ MMDDYYYY = ເດືອນ/ວັນ/ປີ +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = ອັນນີ້ບໍ່ແມ່ນເກມ PSP Off = ປິດ Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = ໂມເດລ PSP PSP Settings = ຕັ້ງຄ່າ PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = ບັນທຶກສຽງ Audio Record Display = ບັນທຶກພາບ Display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = ບ່ອນເກັບຂໍ້ມູນເຕັມ Sustained performance mode = Sustained performance mode Time Format = ຮູບແບບເວລາ UI = ການໂຕ້ຕອບຜູ້ໃຊ້ +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use Lossless Video Codec (FFV1) Use O to confirm = ໃຊ້ O ເປັນປຸ່ມຢືນຢັນ Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = ໃຊ້ X ເປັນປຸ່ມຢືນຢັນ VersionCheck = ກວດສອບເວີຊັ່ນໃໝ່ຂອງ PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = ປີ/ເດືອນ/ວັນ [Upgrade] diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 06c4ec327c..e9a5f88da2 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Įjungti garsą Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analoginė svirtelė +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Automatinis Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Mygtukų opacity Button style = Mygtukų stilius +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibruoti krypčių mygtukus +Calibrated = Calibrated Calibration = Kalibravimas +Circular stick input = Circular stick input Classic = Klasikinis Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Valdymo mygtukų nustatymai -Custom layout... = Pakeisti liečiamo valdymo mygtukų pozicijas ir dydį... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Pakeisti liečiamo valdymo mygtukų pozicijas ir dydį... Customize tilt = Pakeisti pakreipimo parametrus... D-PAD = Krypčių mygtukai -Deadzone Radius = "Mirties zonos" spindulys +Deadzone radius = "Mirties zonos" spindulys DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Išjungti krypčių mygtukų įstrižainę (4 paspaudimais vienu metu liečiamam ekranui) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = "Lytėjimo" atsakomoji reakcija (vibracija) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Išjungti Windows klavišą Invert Axes = Perkeisti ašis @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Gulsčias Landscape Auto = Landscape auto Landscape Reversed = Gulsčias (apsuktas) +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Ekrano liečiami kontrolės mygtukai Portrait = Status Portrait Reversed = Status (apsuktas) PSP Action Buttons = PSP konsolės veiksmų mygtukai +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Ekramo pasukimas seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivacija +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Rodyti liečiamą pauzės meniu mygtuką +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Ploni kraštai Tilt Base Radius = Tilt base radius Tilt Input Type = Pakreipimo įvedimo įrenginio tipas Tilt Sensitivity along X axis = Pakreipimo sensitivacija palei X ašį Tilt Sensitivity along Y axis = Pakreipimo sensitivacija palei Y ašį To Calibrate = Jei norite kalibruoti, laikykite įrenginį ant tiesaus paviršiaus ir paspauskite "Kalibruoti". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Matomumas +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Atsinaujinimo dažnis #Font = Trebuchet MS About PPSSPP... = &Apie PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &Daugiau parametrų... Nearest = &Arčiausias Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Išjungti +Open Chat = Open Chat Open Directory... = Atidaryti &vietą... Open from MS:/PSP/GAME... = A&tidaryti iš MS:/PSP/GAME... Open Memory Stick = Atidaryti "&Memory Stick" @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Ar atstatyti "PPSSPP" parametrus į numatytuosius?\nValdymo mygtukų parametrai nebus atstatyti į numatytuosius.\n\n\nJūs negalėsite atstatyti statuso į prieš tai buvusį.\nJūs turite perkrauti "PPSSPP" programą, kad pakeisti parametrai turėtų efektą. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Ar tikrai norite ištrinti šiuos nustatymus iš šito DeleteFailed = Neįmanoma ištrinti duomenų. Deleting = Ištrina\nPrašome palaukti... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Įeitis +Filter = Filter Finish = Baigti +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Išsaugoti Save completed = Išsaugojimas baigtas. Saving = Išsaugoma\nPrašome palaukti... SavingFailed = Neįmanoma išsaugoti duomenų. +Search = Search Select = Pasirinkti Shift = Shift +Skip = Skip Snap = Snap Space = Tarpas SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Failas yra suspaustas (ZIP formato).\nReiki [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Ištrinti Create Game Config = Create game config Create Shortcut = Kurti nuorodą @@ -430,6 +473,7 @@ Auto = Automatinis Auto (1:1) = Automatinė (1:1) Auto (same as Rendering) = Automatinis (kaip Rodymo rezoliucija) Auto FrameSkip = Automatinis kadrų praleidimas +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Automatiškai sukonfiguruoti įrenginiui +Bind All = Bind All Clear All = Ištrinti viską Default All = Akturti numatytus parametrus Map a new key for = Nustatyti naują klavišą Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Krypčių mygtukas žemyn Dpad = Krypčių mygtukai Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pauzė R = R RapidFire = Greita-"ugnis" +Record = Record Remote hold = Remote hold Rewind = "Rewind" Right = Krypčių mygtukas dešinėn -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = "RightAn.Down" RightAn.Left = "RightAn.Left" RightAn.Right = "RightAn.Right" @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Greičio keitimas Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = "Vėjinti" Save State = Išsaugoti statusą Settings = Settings Switch UMD = Pakeisti "UMD" +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = CRT skenavimo linjos Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Išaukštinimas VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Pridėti atsiliepimą SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = ĮSPĖJIMAS: "GLTools" surastas, gali kelti problemų! In menu = In menu Load savestate failed = Load savestate failed Loaded State = Statusas pakrautas +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Nepavyko pakrauti statuso: išsaugojimo statusas neegzistuoja! LoadStateWrongVersion = Nepavyko pakrauti statuso: išsaugojimo statusas skirtas senesniai PPSSPP versijai! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Greitis: standartinis +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Pakeisti emuliuojamo PSP pagrindinio procesoriaus greitį (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Pakeisti slapyvardį ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Pagrindiniai Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDMMMM +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Emuliuojamo PSP modelis PSP Settings = PSP parametrai PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Laiko formatas UI = Vartotojo sąsaja +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Naudoti O kaip patvirtinimo mygtuką Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Naudoti X kaip patvirtinimo mygtuką VersionCheck = Patikrinti, ar yra "PPSSPP" atnaujinimų WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = MMMMMMDD [Upgrade] diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index e3e64c9f5c..f9c004b0be 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Enjin suara (PPSSPP perlu dibuka semula) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Upayakan suara Global volume = Volume keseluruhan Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Sembunyikan butang secara automatik selepas +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Kelegapan butang Button style = Gaya butang +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Klasik Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Pemetaan kawalan -Custom layout... = Edit susunan kawalan... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit susunan kawalan... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Lumpuhkan PadD diagonal (4-jalan sentuh) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Tindak balas haptic (getaran) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Abaikan kekunci Tetingkap (menghalang Menu Permulaan dari muncul) Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landskap Landscape Auto = Landskap Landscape Reversed = Landskap Songsang +Low end radius = Low end radius Mouse = Tetapan Tetikus Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Kawalan sentuh di skrin Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Tepian tipis Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Keterlihatan +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &Mengenai PPSSPP... Auto = &Automatik +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bikubik Break = Break @@ -150,6 +185,7 @@ More Settings... = &Tetapan lanjutan... Nearest = &Terdekat Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Tutup +Open Chat = Open Chat Open Directory... = Buka &Penyimpanan... Open from MS:/PSP/GAME... = B&uka dari MS:/PSP/GAME... Open Memory Stick = Buka &Memori Stik @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Rawak Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Anda pasti menetapkan semua tetapan kecuali pemetaan kawalan kembali ke lalai?\n\nAnda tidak boleh membatalkan tindakan ini.\nSila mulakan semula PPSSPP untuk perubahan berkuat kuasa. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Pemadaman data gagal. Deleting = Memadam\nSila tunggu... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Masuk +Filter = Filter Finish = Tamat +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Simpan Save completed = Menyimpan selesai. Saving = Menyimpan\nSila tunggu... SavingFailed = Unable to save data. +Search = Search Select = Pilih Shift = Shif +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Fail dimampatkan (ZIP).\nSila nyah-mampatka [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Padam Create Game Config = Create game config Create Shortcut = Buat pintasan @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Bersihkan semua Default All = Lalaikan semua Map a new key for = Petakan kekunci baru untuk Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Bawah Dpad = PadD Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Jeda R = R RapidFire = Tembak-Berterusan +Record = Record Remote hold = Remote hold Rewind = Kembali semula Right = Dpad Kanan -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = KananAn.Bawah RightAn.Left = KananAn.Kiri RightAn.Right = KananAn.Kanan @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Kurangkan kelajuan Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Undur semula Save State = Simpan state Settings = Settings Switch UMD = Tukar UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Ketajaman SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Penskalaan spline36 VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = State dimuat +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Gagal memuatkan state: Savestate tiada didapati! LoadStateWrongVersion = Gagal memuatkan state: Savestate adalah untuk versi PPSSPP yang lebih lama! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Kelajuan: standad +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Tukar pemasa CPU (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Tukar nama samaran ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Umum Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = BBHHTTTT +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Model PSP PSP Settings = Tetapan PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Format waktu UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Guna O untuk pengesahan Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Guna X untuk pengesahan VersionCheck = Periksa versi terbaru PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = TTTTBBHH [Upgrade] diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 4560076ce0..5f41ed5470 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audiobackend (vereist herstart) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-vriendelijke buffer (trager) Auto = Automatisch Device = Device +Disabled = Disabled DSound (compatible) = DirectSound (compatibel) Enable Sound = Geluid inschakelen Global volume = Globaal volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (snel) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analoogasgevoeligheid +Analog Binding = Analog Binding Analog Limiter = Analooglimiet Analog Mapper High End = Analoogtoewijzing high-end (gevoeligheid as) Analog Mapper Low End = Analoogtoewijzing low-end (omgekeerde dode zone) Analog Mapper Mode = Analoogtoewijzingsmodus +Analog Settings = Analog Settings Analog Stick = Analoge stick +Analog Style = Analog Style AnalogLimiter Tip = Wanneer de analooglimiettoets is ingedrukt Auto = Automatisch Auto-centering analog stick = Analoge stick automatisch centreren Auto-hide buttons after seconds = Toetsen verbergen na seconden +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Toetsdekking Button style = Toetsstijl +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibreren +Calibrated = Calibrated Calibration = Kalibreren +Circular stick input = Circular stick input Classic = Klassiek Combo Key Setting = Combotoetsinstelling Combo Key Setup = Combotoets instellen Confine Mouse = Muis binnen venster/weergavegebied vastzetten Control Mapping = Besturing toewijzen -Custom layout... = Indeling aanraakbesturing bewerken... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Indeling aanraakbesturing bewerken... Customize tilt = Kantelen personaliseren... D-PAD = Richtingstoetsen -Deadzone Radius = Straal dode zone +Deadzone radius = Straal dode zone DInput Analog Settings = Analooginstellingen voor DInput Disable D-Pad diagonals (4-way touch) = Diagonale pijltoetsen uitzetten (4 richtingen) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Trillen inschakelen +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Gamepads negeren wanneer niet-gefocust Ignore Windows Key = Windows-toets uitschakelen Invert Axes = Assen omkeren @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R-triggertoetsen Landscape = Landschap Landscape Auto = Landscape auto Landscape Reversed = Omgekeerd landschap +Low end radius = Low end radius Mouse = Muisinstellingen Mouse sensitivity = Muisgevoeligheid Mouse smoothing = Muissmoothing @@ -65,21 +88,32 @@ OnScreen = Aanraakbesturing op het scherm Portrait = Portret Portrait Reversed = Omgekeerd portret PSP Action Buttons = PSP-actietoetsen +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Schermrotatie seconds, 0 : off = seconden, 0 = uit +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Gevoeligheid +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Pauzemenutoets weergeven +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Dunne randen Tilt Base Radius = Tilt base radius Tilt Input Type = Invoertype voor kantelen Tilt Sensitivity along X axis = Kantelgevoeligheid op X-as Tilt Sensitivity along Y axis = Kantelgevoeligheid op Y-as To Calibrate = Zet het apparaat op een vlakke ondergrond en druk op "Kalibreren". +Toggle mode = Toggle mode Touch Control Visibility = Zichtbaarheid touchbesturing Use custom right analog = Use custom right analog Use Mouse Control = Muisbesturing gebruiken Visibility = Indeling +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Analooginstellingen voor XInput @@ -99,6 +133,7 @@ Refresh Rate = Vernieuwingsfrequentie #Font = Trebuchet MS About PPSSPP... = &Over PPSSPP... Auto = &Automatisch +Auto Max Quality = Auto Max &Quality Backend = &Renderbackend (herstart PPSSPP) Bicubic = &Bicubisch Break = Break @@ -150,6 +185,7 @@ More Settings... = &Meer instellingen... Nearest = &Naaste buur Non-Buffered Rendering = &Buffereffecten nalaten (niet-gebufferd, sneller) Off = &Uit +Open Chat = Open Chat Open Directory... = &Map openen... Open from MS:/PSP/GAME... = O&pen vanuit MS:/PSP/GAME... Open Memory Stick = M&emory stick openen @@ -229,6 +265,7 @@ No block = Geen blok Prev = Vorige Random = Willekeurig Replace textures = Textures vervangen +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Weet u zeker dat u alle instellingen wilt herstellen\nnaar hun standaardwaarden?\nDe besturingsinstellingen worden niet gewijzigd.\n\nDit kan niet ongedaan gemaakt worden. Start PPSSPP\nopnieuw op om de wijzigingen toe te passen. RestoreGameDefaultSettings = Weet u zeker dat u de game-specifieke instellingen wilt\nherstellen naar de standaardwaarden van PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Weet u zeker dat u de instellingen voor deze game\nwil DeleteFailed = Kan de data niet verwijderen. Deleting = Bezig met verwijderen...\nEen ogenblik geduld. Disable All = Alles uitschakelen +Dumps = Dumps Edit = Edit Enable All = Alles inschakelen Enter = Bevestigen +Filter = Filter Finish = Voltooien +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactief InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Opslaan Save completed = Het opslaan is voltooid. Saving = Bezig met opslaan...\nEen ogenblik geduld. SavingFailed = Kan de data niet opslaan. +Search = Search Select = Selecteren Shift = Shift +Skip = Skip Snap = Snap Space = Spatie SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = het bestand is verkleind (ZIP).\nPak het be [Game] Asia = Azië +Calculate CRC = Calculate CRC ConfirmDelete = Verwijderen Create Game Config = Gameopties aanmaken Create Shortcut = Snelkoppeling maken @@ -430,6 +473,7 @@ Auto = Automatisch Auto (1:1) = Automatisch (1:1) Auto (same as Rendering) = Auto (renderresolutie) Auto FrameSkip = Frames automatisch overslaan +Auto Max Quality = Auto Max Quality Auto Scaling = Automatisch schalen Backend = Backend Balanced = Gebalanceerd @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Autoconfiguratie Autoconfigure for device = Automatisch voor apparaat configureren +Bind All = Bind All Clear All = Alles legen Default All = Herstellen Map a new key for = Stel een nieuwe toets in voor Map Key = Toets indelen Map Mouse = Muis indelen +Replace = Replace +Show PSP = Show PSP Test Analogs = Analoogtest You can press ESC to cancel. = Druk op Esc om te annuleren. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Losmaken +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Assen wisselen Circle = Cirkel Cross = Kruis +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Ontwikkelaarsmenu +Double tap button = Double tap button Down = Beneden Dpad = Richtingstoetsen Frame Advance = Frame doorspoelen @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pauzeren R = R RapidFire = Snelvuur +Record = Record Remote hold = Vasthouden op afstand Rewind = Terugspoelen Right = Rechts -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = StickR beneden RightAn.Left = StickR links RightAn.Right = StickR rechts @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Turboschakelaar Square = Vierkant Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Volledig scherm schakelen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Ad hoc-multiplayerforum bezoeken AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = IP-adres van PRO Ad hoc-server wijzigen (localho Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Netwerk geïnitialiseerd +None = None Please change your Port Offset = Please change your port offset Port offset = Poortoffset (0 = PSP-compatibiliteit) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Terugspoelen Save State = State opslaan Settings = Instellingen Switch UMD = UMD verwisselen +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlijnen (CRT) Sharpen = Verscherpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36-upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignet @@ -828,6 +930,8 @@ Stopping.. = Stoppen... [Reporting] Bad = Slecht +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Uw data wordt op de achtergrond ingediend. FeedbackDesc = Hoe bevalt de emulatie? Laat het ons en de community weten! FeedbackDisabled = Compatibiliteitserverrapporten moet ingeschakeld zijn. @@ -853,6 +957,7 @@ Perfect Description = Het hele spel wordt zonder problemen geëmuleerd - geweldi Plays = Speelt af Plays Description = Volledig speelbaar maar met mogelijke glitches ReportButton = Feedback verzenden +Show disc CRC = Show disc CRC Speed = Snelheid Submit Feedback = Feedback verzenden SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = Geen screenshot None yet. Things will appear here after you save. = Nog niets. Er zullen hier dingen verschijnen zodra u iets opslaat. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Savedata Save States = Savestates Savedata Manager = Beheerder voor savedata +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WAARSCHUWING: GLTools gedetecteerd, kan problemen veroorzaken. In menu = In menu Load savestate failed = Laden van savestate mislukt Loaded State = Savestate geladen +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Laden mislukt: Savestate bestaat niet! LoadStateWrongVersion = Laden mislukt: Savestate is voor een oudere versie van PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Snelheid: standaard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Fouten opsporen Debugger Present = Foutopsporing aanwezig Device Info = Apparaatinformatie +Directories = Directories Display Information = Beeldscherminformatie Driver Version = Driverversie EGL Extensions = EGL-extensies @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX-excusief Sample rate = Samplerate Shading Language = Shadingtaal +Storage = Storage Sustained perf mode = Aanhoudende prestatiemodus System Information = Systeeminformatie System Name = Naam @@ -977,8 +1089,11 @@ AVI Dump started. = AVI-dump gestart AVI Dump stopped. = AVI-dump gestopt Cache ISO in RAM = Hele ISO naar RAM-cache kopiëren Change CPU Clock = CPU-kloksnelheid aanpassen (instabiel) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Gebruikersnaam wijzigen ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Algemeen Grid icon size = Grid icon size Help the PPSSPP team = Help het PPSSPP-team Host (bugs, less lag) = Host (bugs, minder lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreteerder @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick ingevoerd MHz, 0:default = MHz, 0 = standaard MMDDYYYY = MMDDJJJJ +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Geen PSP-game Off = Uit Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP-model PSP Settings = PSP-instellingen PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Audio opnemen Record Display = Scherm opnemen Reset Recording on Save/Load State = Opname opnieuw opstarten bij opslaan/laden van states @@ -1053,8 +1172,10 @@ Storage full = Onvoldoende opslagruimte Sustained performance mode = Aanhoudende prestatiemodus Time Format = Tijdweergave UI = Gebruikersomgeving +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Lossless videocodec gebruiken (FFV1) Use O to confirm = Bevestigen met O Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Bevestigen met X VersionCheck = Controleer op nieuwe versies van PPSSPP WARNING: Android battery save mode is on = WAARSCHUWING: Android batterijbesparingsmodus staat aan WARNING: Battery save mode is on = WAARSCHUWING: Batterijbesparingsmodus staat aan +Waves = Waves YYYYMMDD = JJJJMMDD [Upgrade] diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index fffd49b03d..7db0574291 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (restart req.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatible) Enable Sound = Lyd Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (fast) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Knappgenomsiktighet Button style = Button style +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Control mapping -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = Customize tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignore gamepads when not focused Ignore Windows Key = Disable Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Landscape Landscape Auto = Landscape auto Landscape Reversed = Landscape reversed +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Touch-kontroller på skjermen Portrait = Portrait Portrait Reversed = Portrait reversed PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Screen rotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show pause menu button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visibility +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &Directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Do you really want to delete the settings for this gam DeleteFailed = Unable to delete data. Deleting = Sletter\nVent litt... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Enter +Filter = Filter Finish = Ferdig +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Save Save completed = Ferdig lagret. Saving = Lagrer\nVent litt... SavingFailed = Unable to save data. +Search = Search Select = Velg Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Delete Create Game Config = Create game config Create Shortcut = Create shortcut @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Clear all Default All = Restore defaults Map a new key for = Map a new key for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Lagre status Settings = Instillinger Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = Åpnet status +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Mislyktes å laste: Lagret fil eksisterer ikke! LoadStateWrongVersion = Mislyktes å laste: Lagret fil er for en eldre versjon av PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Hastighet: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Endre Kallenavn ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = General Grid icon size = Grid icon size Help the PPSSPP team = Help the PPSSPP team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = PSP settings PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Time format UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Use O as confirmation button Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Use X as confirmation button VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 5771c811bf..fe8481818a 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Sterownik dźwięku (wymagany restart) +Audio Error = Audio Error AudioBufferingForBluetooth = Bufory dźwięku dost. do Bluetooth (wolniejsze) Auto = Automatyczny Device = Device +Disabled = Disabled DSound (compatible) = DSound (kompatybilny) Enable Sound = Włącz dźwięk Global volume = Głośność globalna Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (szybki) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Czułość osi analoga +Analog Binding = Analog Binding Analog Limiter = Ogranicznik analoga Analog Mapper High End = Mapowanie analoga (czułość osi) Analog Mapper Low End = Mapowanie analoga (odwrócona martwa strefa) Analog Mapper Mode = Tryb mapowania analoga +Analog Settings = Analog Settings Analog Stick = Gałka analogowa +Analog Style = Analog Style AnalogLimiter Tip = Jeśli "ogranicznik analoga" jest aktywny Auto = Automatyczny Auto-centering analog stick = Autocentrowanie gałki analogowej Auto-hide buttons after seconds = Automatyczne ukrywanie przycisków po: +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Przeźroczystość przycisków Button style = Styl przycisków +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Kalibracja krzyżaka +Calibrated = Calibrated Calibration = Kalibracja +Circular stick input = Circular stick input Classic = Klasyczny Combo Key Setting = Ustawienia przycisków kombo Combo Key Setup = Ustawienia przycisków kombo Confine Mouse = Zablokuj myszkę w oknie Control Mapping = Mapowanie przycisków -Custom layout... = Edycja układu przycisków ekranowych... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edycja układu przycisków ekranowych... Customize tilt = Zmodyfikuj przechył... D-PAD = Krzyżak -Deadzone Radius = Promień martwej strefy +Deadzone radius = Promień martwej strefy DInput Analog Settings = Ustawienia analoga DInput Disable D-Pad diagonals (4-way touch) = Wył. przekątne krzyżaka (pozostaw 4 kierunki) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Świecące krawędzie HapticFeedback = Wibracje +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignoruj przyciski pada gdy okno nieaktywne Ignore Windows Key = Ignoruj klawisz Windows Invert Axes = Odwrócone osie @@ -55,6 +77,7 @@ L/R Trigger Buttons = Przyciski L/R Landscape = Poziomo Landscape Auto = Poziomo automatycznie Landscape Reversed = Odwrócone poziomo +Low end radius = Low end radius Mouse = Ustawienia myszy Mouse sensitivity = Czułość myszy Mouse smoothing = Wygładzanie myszy @@ -65,21 +88,32 @@ OnScreen = Przyciski ekranowe Portrait = Pionowo Portrait Reversed = Odwrócone pionowo PSP Action Buttons = Klawisze akcji PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Obrót ekranu seconds, 0 : off = sekundy, 0 = wył. +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Czułość +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Pokaż przycisk Menu Pauzy +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Cienkie krawędzie Tilt Base Radius = Tilt base radius Tilt Input Type = Typ przechyłu Tilt Sensitivity along X axis = Czułość przechyłu wzdłuż osi X Tilt Sensitivity along Y axis = Czułość przechyłu wzdłuż osi Y To Calibrate = Aby skalibrować, połóż urządzenie na płaskiej powierzchni i wciśnij "Kalibracja". +Toggle mode = Toggle mode Touch Control Visibility = Kontroler dotykowy (widoczny) Use custom right analog = Use custom right analog Use Mouse Control = Włącz kontrolę myszką Visibility = Widoczność +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Ustawienia analoga XInput @@ -99,6 +133,7 @@ Refresh Rate = Szybkość odświeżania #Font = Trebuchet MS About PPSSPP... = O PPSSPP... Auto = Automatycznie +Auto Max Quality = Auto Max &Quality Backend = &Sterownik obrazu (Restartuje PPSSPP) Bicubic = Bicubic (Dwusześcienne) Break = Zatrzymaj @@ -150,6 +185,7 @@ More Settings... = Więcej ustawień... Nearest = Najbliższe Non-Buffered Rendering = &Nie renderuj efektów z bufora (niebuforowane, szybsze) Off = Wyłącz +Open Chat = Open Chat Open Directory... = Otwórz katalog... Open from MS:/PSP/GAME... = Otwórz z MS:/PSP/GAME... Open Memory Stick = Otwórz Kartę Pamięci @@ -229,6 +265,7 @@ No block = Brak bloku Prev = Poprzedni Random = Przypadkowy Replace textures = Podmiana tekstur +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Czy na pewno chcesz przywrócić domyślne ustawienia?\nUstawienia sterowania pozostaną niezmienione.\n\n\nNie można tego cofnąć.\nZrestartuj PPSSPP, aby zastosować zmiany. RestoreGameDefaultSettings = Czy na pewno chcesz przywrócić ustawienia specyficzne dla danych gier\npowrót do ustawień domyślnych PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Czy na pewno chcesz usunąć ustawienia dla tej gry? DeleteFailed = Nie można usunąć danych. Deleting = Usuwanie\nProszę czekać... Disable All = Wyłącz wszystko +Dumps = Dumps Edit = Edit Enable All = Włącz wszystko Enter = Dalej +Filter = Filter Finish = Zakończ +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Nieaktywny InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Zapisz Save completed = Zapisywanie zakończone. Saving = Zapisywanie\nProszę czekać... SavingFailed = Nie można zapisać danych. +Search = Search Select = Wybierz Shift = Shift +Skip = Skip Snap = Snap Space = Spacja SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Wykryto plik ZIP.\nRozpakuj go przed użyci [Game] Asia = Azja +Calculate CRC = Calculate CRC ConfirmDelete = Usuń Create Game Config = Utwórz konfigurację gry Create Shortcut = Utwórz skrót @@ -430,6 +473,7 @@ Auto = Automatyczne Auto (1:1) = Automatyczna (1:1) Auto (same as Rendering) = Auto (jak roz. renderowania) Auto FrameSkip = Automatyczne pomijanie klatek +Auto Max Quality = Auto Max Quality Auto Scaling = Automatyczne skalowanie Backend = Sterownik graficzny Balanced = Zbalansowane @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Autokonfiguracja Autoconfigure for device = Skonfiguruj automatycznie +Bind All = Bind All Clear All = Wyczyść Default All = Domyślne Map a new key for = Przypisz nowy klawisz dla Map Key = Mapuj przycisk Map Mouse = Mapuj mysz +Replace = Replace +Show PSP = Show PSP Test Analogs = Testuj analogi You can press ESC to cancel. = Możesz zamknąć to okienko naciskając Esc. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP zapisuje do pamięci tymczasowej SavesAreTemporaryGuidance = Wypakuj PPSSPP, by móc trwale zapisywać SavesAreTemporaryIgnore = Ignoruj UnpinPath = Odepnij +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Zamiana osi Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Menu developerskie +Double tap button = Double tap button Down = Strzałka w dół Dpad = Krzyżak Frame Advance = Nast. klatka @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pauza R = R RapidFire = Auto. strzelanie +Record = Record Remote hold = Remote hold Rewind = Przewiń do tyłu Right = Strzałka w prawo -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = Pr. gałk. w dół RightAn.Left = Pr. gałk. w lewo RightAn.Right = Pr. gałk. w prawo @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Zmień prędkość Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Zrzut tekstur Texture Replacement = Podmiana tekstur Toggle Fullscreen = Wł./wył. pełny ekran @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Odwiedź forum związane z Ad Hoc (tryb wielu graczy) AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Zmień adres IP serwera PRO dla trybu ad hoc (lo Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Sieć została zainicjowana +None = None Please change your Port Offset = Please change your port offset Port offset = Zmień port (0 = zgodne z PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Przewiń do tyłu Save State = Zapisz stan Settings = Ustawienia Switch UMD = Podmień UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Linie skanowania Sharpen = Wyostrzenie SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Skalowanie Spline36 VideoSmoothingAA = Video Smoothing AA Vignette = Winieta @@ -828,6 +930,8 @@ Stopping.. = Zatrzymywanie... [Reporting] Bad = Zła +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Twoje odpowiedzi wysyłane są w tle. FeedbackDesc = Jak działa emulacja? Pozwól nam i społeczności się dowiedzieć! FeedbackDisabled = Raporty kompatybilności muszą być włączone. @@ -853,6 +957,7 @@ Perfect Description = Bezbłędna emulacja w całej grze - super! Plays = Działa Plays Description = Całkowicie grywalna, jednak można napotkać niewielkie błędy ReportButton = Raportuj +Show disc CRC = Show disc CRC Speed = Szybkość Submit Feedback = Wyślij raport SuggestionConfig = Sprawdź dobre konfiguracje w raportach na stronie. @@ -871,9 +976,11 @@ Date = Data Filename = Nazwa No screenshot = Brak obrazka None yet. Things will appear here after you save. = Na razie nic tu nie ma. Wpisy pojawią się, gdy zapiszesz grę. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Zapisy gier Save States = Pliki zapisów stanów Savedata Manager = Zarządzanie zapisami gier +Showing matches for '%1'. = Showing matches for '%1'. Size = Rozmiar [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = UWAGA: Wykryto GLTools, może powodować problemy. In menu = In menu Load savestate failed = Nie można wczytać zapisu stanu Loaded State = Wczytano stan gry +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Wczytano. By zmniejszyć ryzyko potencjalnych problemów, zapisz stan w grze, zrestartuj ją i wczytaj. LoadStateDoesntExist = Nie można wczytać stanu: Zapis stanu nie istnieje! LoadStateWrongVersion = Nie można wczytać stanu: Zapis stanu przeznaczony jest dla starszej wersji PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Zapisywanie tekstur wyłączone. saveNewTextures_true = Tekstury będą zapisywane na nośnik. SpeedCustom2 = Prędkość: alternatywna 2 standard = Prędkość: standardowa +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = Wersja D3DCompiler Debug = Debug Debugger Present = Debugger obecny Device Info = Inf. o urządzeniu +Directories = Directories Display Information = Informacje o Wyświetlaczu Driver Version = Wersja sterownika EGL Extensions = Rozszerzenia EGL @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = Wyłączne RW/RX Sample rate = Częstotliwość próbkowania Shading Language = Język shadingu +Storage = Storage Sustained perf mode = Tryb wysokiej wydajności System Information = Informacje o systemie System Name = Nazwa @@ -977,8 +1089,11 @@ AVI Dump started. = Rozpoczęto zrzut do AVI AVI Dump stopped. = Zatrzymano zrzut do AVI Cache ISO in RAM = Wczytuj całe ISO do RAM'u Change CPU Clock = Zmień częstotliwość zegara CPU (niestabilnie) -Change Memory Stick folder = Zmień folder Karty Pamięci -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Zmień folder Karty Pamięci +Memory Stick size = Memory Stick size Change Nickname = Zmień pseudonim ChangingMemstickPath = Zapisy gier, zapisy stanu i inne dane nie zostaną skopiowane do tego folderu.\n\nZmienić ścieżkę do folderu Karty Pamięci? ChangingMemstickPathInvalid = Ta ścieżka nie może zostać użyta do zapisu plików Karty Pamięci. @@ -1012,7 +1127,6 @@ General = Ogólne Grid icon size = Grid icon size Help the PPSSPP team = Pomóż zespołowi PPSSPP Host (bugs, less lag) = Host (błędy, mniejsze zacinanie) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Folder Karty Pamięci Memory Stick inserted = Karta Pamięci włożona MHz, 0:default = MHz, 0 = domyślne MMDDYYYY = MM/DD/RRRR +Moving background = Moving background Newest Save = Najnowszy zapis +No animation = No animation Not a PSP game = To nie jest gra PSP Off = Wył. Oldest Save = Najstarszy zapis +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Model PSP PSP Settings = Ustawienia PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Nagrywaj dźwięk Record Display = Nagrywaj obraz Reset Recording on Save/Load State = Resetuj nagrywanie przy zapisie/wczytaniu stanu @@ -1053,8 +1172,10 @@ Storage full = Dysk zapełniony Sustained performance mode = Tryb wysokiej wydajności Time Format = Format czasu UI = Interfejs użytkownika +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Używaj stratnego kodeka wideo (FFV1) Use O to confirm = Używaj O jako potwierdzenia Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Używaj X jako potwierdzenia VersionCheck = Sprawdzaj dostępne aktualizacje WARNING: Android battery save mode is on = UWAGA: Oszczędzanie energii zostało włączone WARNING: Battery save mode is on = UWAGA: Oszczędzanie energii jest włączone +Waves = Waves YYYYMMDD = RRRR/MM/DD [Upgrade] diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index fd3443daa6..c3f40f0887 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -25,50 +25,72 @@ [Audio] Alternate speed volume = Alternar velocidade do volume Audio backend = Backed do áudio (requerido reiniciar) +Audio Error = Erro do Áudio AudioBufferingForBluetooth = Buffer amigável do Bluetooth (mais lento) Auto = Automático Device = Dispositivo +Disabled = Desativado DSound (compatible) = DirectSound (compatível) Enable Sound = Ativar áudio Global volume = Volume global Microphone = Microfone Microphone Device = Dispositivo Microfone Mute = Mudo -Switch on new audio device = Trocar pro novo dispositivo de áudio +Reverb volume = Reverberar volume +Use new audio devices automatically = Usar novos dispositivos de áudio automaticamente Use global volume = Usar volume global WASAPI (fast) = WASAPI (rápido) [Controls] -Analog auto-rotation speed = Velocidade de auto-rotação do analógico Analog Axis Sensitivity = Sensibilidade do eixo analógico +Analog Binding = Ligação com o Analógico Analog Limiter = Limitador do analógico Analog Mapper High End = Mapeador analógico high-end (sensibilidade dos eixos) Analog Mapper Low End = Mapeador analógico low-end (zona morta inversa) Analog Mapper Mode = Modo do mapeador analógico +Analog Settings = Configurações do Analógico Analog Stick = Direcional analógico -AnalogLimiter Tip = Quando o botão limitador de análogico é pressionado +Analog Style = Estilo do Analógico +AnalogLimiter Tip = Quando o botão limitador do analógico é pressionado Auto = Automático -Auto-centering analog stick = Auto-centralizar direcional analógico -Auto-hide buttons after seconds = Auto-esconder botões após segundos +Auto-centering analog stick = Auto-centralizar o direcional analógico +Auto-hide buttons after seconds = Auto-esconder os botões após segundos +Auto-rotation speed = Velocidade da auto-rotação +Auto-switch = Auto-trocar +Base tilt position = Posição da inclinação base Binds = Vinculados Button Opacity = Opacidade dos botões Button style = Estilo dos botões +Button style = Estilo do botão +Calibrate Analog Stick = Calibrar Direcional Analógico Calibrate D-Pad = Calibrar +Calibrated = Calibrado Calibration = Calibração +Circular stick input = Entrada circular do direcional Classic = Clássico Combo Key Setting = Configuração das teclas do combo Combo Key Setup = Instalação das teclas do combo -Confine Mouse = Travar mouse dentro da janela/área de exibição +Confine Mouse = Travar o mouse dentro da janela/área de exibição Control Mapping = Mapeamento dos controles -Custom layout... = Editar esquema do controle do toque... -Customize tilt = Personalizar a inclinação... +Custom Key Setting = Configuração Personalizada das Teclas +Customize = Personalizar +Customize Touch Controls = Editar esquema do controle do toque... +Customize tilt = Personalizar inclinação... D-PAD = D-Pad -Deadzone Radius = Raio da zona morta +Deadzone radius = Raio da zona morta DInput Analog Settings = Configurações do DInput analógico Disable D-Pad diagonals (4-way touch) = Desativar diagonais do D-Pad (toque de 4 direções) +Disable diagonal input = Desativar entrada diagonal +Double tap = Toque duplo +Enable gesture control = Ativar controle dos gestos +Enable standard shortcut keys = Ativar teclas padrão dos atalhos +Gesture = Gesto +Gesture mapping = Mapeamento dos gestos Glowing borders = Bordas brilhantes -HapticFeedback = feedback háptico (vibração) -Ignore gamepads when not focused = Ignorar gamepads quando não focado +HapticFeedback = Feedback háptico (vibração) +Hide touch analog stick background circle = Esconder círculo de fundo do direcional do toque analógico +Icon = Ícone +Ignore gamepads when not focused = Ignorar os gamepads quando não focado Ignore Windows Key = Desativar a tecla do Windows Invert Axes = Inverter eixos Invert Tilt along X axis = Inverter a inclinação junto do eixo X @@ -79,31 +101,43 @@ L/R Trigger Buttons = Botões de gatilho L/R Landscape = Paisagem Landscape Auto = Paisagem automática Landscape Reversed = Paisagem invertida +Low end radius = Raio low end Mouse = Configurações do mouse Mouse sensitivity = Sensibilidade do mouse Mouse smoothing = Suavização do mouse MouseControl Tip = Agora você pode mapear o mouse na tela de mapeamento do controle pressionando o ícone 'M'. None (Disabled) = Nenhuma (desativado) -Off = Desativado +Off = Desligado OnScreen = Controles do toque na tela Portrait = Retrato Portrait Reversed = Retrato invertido PSP Action Buttons = Botões de ação do PSP +Raw input = Entrada natural +Reset to defaults = Resetar pros padrões +Screen aligned to ground = Tela alinhada ao solo +Screen at right angle to ground = Tela no ângulo direito ao solo Screen Rotation = Rotação da tela seconds, 0 : off = segundos, 0 = desligado Sensitivity = Sensibilidade +Sensitivity (scale) = Sensibilidade (escala) +Shape = Forma Show right analog = Mostrar analógico direito Show Touch Pause Menu Button = Mostrar o botão do menu de pausa +Swipe = Deslizar +Swipe sensitivity = Sensibilidade do deslizar +Swipe smoothing = Suavidade do deslizar Thin borders = Bordas finas Tilt Base Radius = Raio da base de inclinação Tilt Input Type = Controle da entrada da inclinação Tilt Sensitivity along X axis = Sensibilidade da inclinação junto do eixo X Tilt Sensitivity along Y axis = Sensibilidade da inclinação junto do eixo Y To Calibrate = Pra calibrar mantenha o dispositivo numa superfície plana e pressione "Calibrar". +Toggle mode = Alternar modo Touch Control Visibility = Visibilidade do controle de toque Use custom right analog = Usar analógico direito personalizado Use Mouse Control = Usar o controle do mouse Visibility = Visibilidade +Visible = Visível X = X X + Y = X + Y XInput Analog Settings = Configurações do XInput analógico @@ -113,7 +147,7 @@ Y = Y Cheats = Trapaças Edit Cheat File = Editar arquivo de trapaças Enable/Disable All = Ativar/Desativar todas as trapaças -Import Cheats = Importar de cheat.db +Import Cheats = Importar do cheat.db Options = Opções Refresh Rate = Taxa de atualização @@ -123,22 +157,23 @@ Refresh Rate = Taxa de atualização #Font = Trebuchet MS About PPSSPP... = &Sobre o PPSSPP... Auto = &Auto +Auto Max Quality = Auto-Maximizar a &Qualidade Backend = Backend de &renderização (Reinicia o PPSSPP) Bicubic = &Bi-cúbico Break = Parar Break on Load = Parar ao carregar Buffered Rendering = &Renderização com buffer Buy Gold = Comprar &Gold -Control Mapping... = M&apeamento dos controles +Control Mapping... = M&apeamento dos controles... Debugging = &Debug Deposterize = &Deposterizar Direct3D9 = Direct3D &9 Direct3D11 = Direct3D &11 Disassembly = &Disassembly... Discord = Discord -Display Layout Editor = Exibir editor do esquema... -Display Rotation = Rotação do mostrador -Dump Next Frame to Log = D&mpar o frame seguinte no log +Display Layout Editor = Exibir o editor do esquema... +Display Rotation = Rotação da exibição +Dump Next Frame to Log = D&umpar o frame seguinte no log Emulation = &Emulação Enable Chat = Ativar bate-papo Enable Cheats = Ativar &trapaças @@ -146,12 +181,12 @@ Enable Sound = Ativar s&om Exit = S&air Extract File... = E&xtrair arquivo... File = &Arquivo -Frame Skipping = &Pulo de frames -Frame Skipping Type = Tipo de pulo de frames +Frame Skipping = &Pulo dos frames +Frame Skipping Type = Tipo de pulo dos frames Fullscreen = Te&la cheia Game Settings = &Configurações do jogo -GE Debugger... = Debugger do GE... -GitHub = GitHub +GE Debugger... = Debugger do G&E... +GitHub = Git&Hub Hardware Transform = &Transformação por hardware Help = &Ajuda Hybrid = &Híbrido @@ -161,7 +196,7 @@ Ignore Windows Key = Ignorar a tecla do Windows Keep PPSSPP On Top = &Manter o PPSSPP no topo Landscape = Paisagem Landscape reversed = Paisagem invertida -Language... = Id&ioma +Language... = Id&ioma... Linear = &Linear Load = &Carregar... Load .sym File... = Carregar arquivo .sym @@ -171,12 +206,13 @@ Load State File... = &Carregar arquivo do state... Log Console = &Console dos logs Memory View... = Visualização da &memória... More Settings... = &Mais configurações... -Nearest = &Mais perto +Nearest = &Mais próximo Non-Buffered Rendering = &Ignorar efeitos do buffer (sem buffer, mais rápido) Off = &Desligado +Open Chat = Abrir Bate-Papo Open Directory... = Abrir &diretório... Open from MS:/PSP/GAME... = A&brir do MS:/PSP/GAME... -Open cartão de memória = Abrir &cartão de memória +Open Memory Stick = Abrir &cartão de memória Open New Instance = Abrir nova instância OpenGL = &OpenGL Pause = &Pausar @@ -187,34 +223,34 @@ Postprocessing Shader = Shader de pós-processamento PPSSPP Forums = Fórums do &PPSSPP Record = &Gravar Record Audio = Gravar &áudio -Record Display = Gravar &mostrador +Record Display = Gravar &exibição Rendering Mode = Modo de r&enderização Rendering Resolution = &Resolução da renderização Reset = R&esetar -Reset Symbol Table = Resetar t&abela dos símbolos +Reset Symbol Table = Resetar a t&abela dos símbolos Run = &Executar Save .sym File... = Salva&r arquivo .sym... Save Map File... = &Salvar arquivo do mapa... Save State = Salvar state Save State File... = &Salvar arquivo do state... Savestate Slot = Slo&t do save state -Screen Scaling Filter = F&iltro do dimensionamento da tela +Screen Scaling Filter = Fi<ro do dimensionamento da tela Show Debug Statistics = Mostrar as estatíst&icas do debug -Show FPS Counter = Mostrar contador de &FPS -Skip Number of Frames = Ignorar número de frames +Show FPS Counter = Mostrar o contador dos &FPS +Skip Number of Frames = Ignorar o número dos frames Skip Percent of FPS = Ignorar porcentagem do FPS Stop = &Parar Switch UMD = Trocar UMD Take Screenshot = &Criar screenshot Texture Filtering = Fi<ragem das texturas Texture Scaling = &Dimensionamento das texturas -Use Lossless Video Codec (FFV1) = Usar codec de vídeo sem perda (FFV1) +Use Lossless Video Codec (FFV1) = &Usar codec de vídeo sem perda (FFV1) Use output buffer for video = Usar buffer de saída pro vídeo Vertex Cache = &Cache do vértice VSync = VS&ync Vulkan = Vulkan Window Size = &Tamanho da janela -www.ppsspp.org = Visitar www.&ppsspp.org +www.ppsspp.org = Visite www.&ppsspp.org xBRZ = &xBRZ [Developer] @@ -222,7 +258,7 @@ Allocator Viewer = Visualizador do alocador (Vulkan) Allow remote debugger = Permitir debug remoto Backspace = Backspace Block address = Bloquear endereço -By Address = Por endereço +By Address = Pelo endereço Copy savestates to memstick root = Copiar os save states pra raiz do cartão de memória Create/Open textures.ini file for current game = Criar/abrir o arquivo textures.ini pro jogo atual Current = Atual @@ -232,7 +268,7 @@ Disabled JIT functionality = Funcionalidade do JIT desativada Draw Frametimes Graph = Desenhar gráfico dos tempos dos frames Dump Decrypted Eboot = Dumpar EBOOT.BIN decriptado no boot do jogo Dump Frame GPU Commands = Dumpar comandos dos frames da GPU -Enable driver bug workarounds = Ativar solução alternativa dos bugs dos drivers +Enable driver bug workarounds = Ativar soluções alternativas pros bugs dos drivers Enable Logging = Ativar log do debug Enter address = Inserir endereço FPU = FPU @@ -244,7 +280,7 @@ Jit Compare = Comparar JIT JIT debug tools = Ferramentas de debug do JIT Language = Idioma Load language ini = Carregar ini do idioma -Log Dropped Frame Statistics = Pôr no log as estátisticas da perda dos frames +Log Dropped Frame Statistics = Pôr no log as estátisticas da queda dos frames Log Level = Nível do log Log View = Visualização do log Logging Channels = Canais do log @@ -253,8 +289,9 @@ No block = Nenhum bloco Prev = Anterior Random = Aleatório Replace textures = Substituir texturas +Reset = Resetar Reset limited logging = Resetar o log limitado -RestoreDefaultSettings = Você tem certeza que você quer restaurar todas as configurações de volta pros padrões delas?\nAs configurações do mapeamento dos controles não são mudadas.\nVocê não pode desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças acontecerem. +RestoreDefaultSettings = Você tem certeza que você quer restaurar todas as configurações de volta aos padrões delas?\nAs configurações do mapeamento dos controles não são mudadas.\nVocê não pode desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças terem efeito. RestoreGameDefaultSettings = Você tem certeza que você quer restaurar as configurações específicas do jogo\nde volta para os padrões do PPSSPP? Resume = Resumo Run CPU Tests = Executar testes da CPU @@ -277,10 +314,10 @@ Active = Ativo Back = Voltar Cancel = Cancelar Center = Centro -ChangingGPUBackends = Mudar os backends da GPU requer reiniciar o PPSSPP. Reiniciar agora? +ChangingGPUBackends = Mudar os backends da GPU requer que o PPSSPP reinicie. Reiniciar agora? ChangingInflightFrames = Mudar o buffer do comando dos gráficos requer que o PPSSPP reinicie. Reiniciar agora? Channel: = Canal: -Choose PPSSPP save folder = Escolher diretório dos saves do PPSPP +Choose PPSSPP save folder = Escolha a pasta dos saves do PPSSPP Confirm Overwrite = Você quer sobrescrever os dados? Confirm Save = Você quer salvar estes dados? ConfirmLoad = Carregar estes dados? @@ -291,20 +328,23 @@ Corrupted Data = Dados corrompidos Delete = Apagar Delete all = Apagar tudo Delete completed = Exclusão completada. -DeleteConfirm = Este dado do save será apagado.\nTem certeza que você quer continuar? +DeleteConfirm = Este dado do save será apagado.\nVocê tem certeza que você quer continuar? DeleteConfirmAll = Você realmente quer apagar todos\nos seus dados salvos deste jogo? DeleteConfirmGame = Você realmente quer apagar este jogo\ndo seu dispositivo? Você não pode desfazer isto. DeleteConfirmGameConfig = Você realmente quer apagar as configurações deste jogo? -DeleteFailed = Incapaz de apagar dados. +DeleteFailed = Incapaz de apagar os dados. Deleting = Apagando\nPor favor espere... Disable All = Desativar tudo +Dumps = Dumps Edit = Editar Enable All = Ativar tudo Enter = Inserir +Filter = Filtro Finish = Concluir +GE Frame Dumps = Dumps do Frame do GE Grid = Grade Inactive = Inativo -InternalError = Um erro interno ocorreu. +InternalError = Ocorreu um erro interno. Load = Carregar Load completed = Carregamento completado. Loading = Carregando\nPor favor espere... @@ -315,7 +355,7 @@ NEW DATA = NOVOS DADOS No = Não ObtainingIP = Obtendo endereço de IP.\nPor favor espere... OK = Ok -Old savedata detected = Velhos dados do save detectados +Old savedata detected = Dados antigos do save detectados Options = Opções Reset = Resetar Resize = Redimensionar @@ -324,8 +364,10 @@ Save = Salvar Save completed = Salvamento completado. Saving = Salvando\nPor favor espere... SavingFailed = Incapaz de salvar os dados. +Search = Busca Select = Selecionar Shift = Shift +Skip = Ignorar Snap = Grade Space = Espaço SSID = SSID @@ -344,9 +386,9 @@ Zoom = Zoom 7z file detected (Require 7-Zip) = O arquivo está comprimido (7z).\nPor favor descomprima-o primeiro (tente o 7-zip ou WinRAR). A PSP game couldn't be found on the disc. = Um jogo de PSP não pôde ser achado no disco. Cannot boot ELF located outside mountRoot. = Não pôde dar boot no ELF localizado fora do mountRoot. -Could not save screenshot file = Não pôde salvar o arquivo do screenshot. -D3D9or11 = Direct3D 9? (ou "não" pra Direct3D 11) -D3D11CompilerMissing = O D3DCompiler_47.dll não foi achado. Por favor instale. Ou pressione Sim pra tentar de novo usando o Direct3D 9 ao invés disto. +Could not save screenshot file = Não pôde salvar o arquivo da screenshot. +D3D9or11 = Direct3D 9? (ou "não" pro Direct3D 11) +D3D11CompilerMissing = O D3DCompiler_47.dll não foi achado. Por favor instale-o. Ou pressione Sim pra tentar de novo usando o Direct3D 9 ao invés disto. D3D11InitializationError = Erro de inicialização do Direct3D 11 D3D11Missing = Sua versão do sistema operacional não inclui o D3D11. Por favor execute o Windows Update.\n\nPressione Sim pra tentar de novo usando o Direct3D 9 ao invés disto. D3D11NotSupported = Sua GPU não aparenta suportar o Direct3D 11.\n\nVocê gostaria de tentar de novo usando o Direct3D 9 ao invés disto? @@ -356,17 +398,17 @@ Error loading file = Não pôde carregar o arquivo. Error reading file = Erro ao ler o arquivo. Failed initializing CPU/Memory = Falhou em inicializar a CPU ou memória Failed to identify file = Falhou em identificar o arquivo. -Failed to load executable: = Falhu em carregar o executável: +Failed to load executable: = Falhou em carregar o executável: File corrupt = Arquivo corrompido Game disc read error - ISO corrupt = Erro de leitura do disco do jogo: ISO corrompida. GenericAllStartupError = O PPSSPP falhou em iniciar com qualquer backend dos gráficos. Tente atualizar seus gráficos e outros drivers. GenericBackendSwitchCrash = O PPSSPP teve um crash enquanto iniciava.\n\nIsto geralmente significa um problema do driver dos gráficos. Tente atualizar seus drivers dos gráficos.\n\nO backend dos gráficos foi trocado: -GenericDirect3D9Error = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos e o runtime do DirectX 9.\n\nVocê gostaria de tentar trocar pra OpenGL?\n\nMensagem de erro: +GenericDirect3D9Error = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos e o runtime do DirectX 9.\n\nVocê gostaria de tentar trocar pro OpenGL?\n\nMensagem de erro: GenericGraphicsError = Erro dos Gráficos -GenericOpenGLError = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos.\n\nVocê gostaria de tentar trocar pra DirectX 9?\n\nMensagem de erro: -GenericVulkanError = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos.\n\nVocê gostaria de tentar trocar pra OpenGL?\n\nMensagem de erro: -InsufficientOpenGLDriver = Suporte insuficiente do driver do OpenGL detectado!\n\nSua GPU reporta que não suporta OpenGL 2.0. Você gostaria de tentar usar o DirectX ao invés disto?\n\nO DirectX atualmente é compatível com menos jogos mas na sua GPU pode ser a única escolha.\n\nVisite os fóruns em https://forums.ppsspp.org pra mais informações.\n\n -Just a directory. = Apenas uma diretório. +GenericOpenGLError = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos.\n\nVocê gostaria de tentar trocar pro DirectX 9?\n\nMensagem de erro: +GenericVulkanError = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos.\n\nVocê gostaria de tentar trocar pro OpenGL?\n\nMensagem de erro: +InsufficientOpenGLDriver = Suporte insuficiente do driver do OpenGL detectado!\n\nSua GPU reporta que ela não suporta OpenGL 2.0. Você gostaria de tentar usar o DirectX ao invés disto?\n\nO DirectX atualmente é compatível com menos jogos mas na sua GPU pode ser a única escolha.\n\nVisite os fóruns em https://forums.ppsspp.org pra mais informações.\n\n +Just a directory. = Apenas um diretório. Missing key = Chave ausente MsgErrorCode = Código do erro: MsgErrorSavedataDataBroken = Os dados do save estavam corrompidos. @@ -375,7 +417,7 @@ MsgErrorSavedataNoData = Aviso: não foram achados dados do save. MsgErrorSavedataNoMS = Cartão de memória não inserido. No EBOOT.PBP, misidentified game = Não há EBOOT.PBP, jogo mal identificado. Not a valid disc image. = Não é uma imagem de disco válida. -OpenGLDriverError = Erro no driver do OpenGL +OpenGLDriverError = Erro do driver do OpenGL PPSSPP doesn't support UMD Music. = O PPSSPP não suporta a música do UMD. PPSSPP doesn't support UMD Video. = O PPSSPP não suporta vídeo do UMD. PPSSPP plays PSP games, not PlayStation 1 or 2 games. = O PPSSPP roda jogos de PSP, não jogos de PlayStation 1 ou 2. @@ -393,13 +435,14 @@ This is save data, not a game. = Isto são dados do save, não um jogo. Unable to create cheat file, disk may be full = Incapaz de criar arquivo de trapaça. O disco pode estar cheio. Unable to initialize rendering engine. = Incapaz de inicializar a engine da renderização. Unable to write savedata, disk may be full = Incapaz de gravar os dados do save, o disco pode estar cheio. -Warning: Video memory FULL, reducing ampliação and switching to slow caching mode = AVISO: Memória de vídeo CHEIA, reduzindo a ampliação e trocando pro modo de cache lento. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = AVISO: Memória de vídeo CHEIA, reduzindo a ampliação e trocando pro modo de cache lento. Warning: Video memory FULL, switching to slow caching mode = AVISO: Memória de vídeo CHEIA, trocando pro modo de cache lento. ZIP file detected (Require UnRAR) = O arquivo está comprimido (ZIP).\nPor favor descomprima-o primeiro (tente o UnRAR). ZIP file detected (Require WINRAR) = O arquivo está comprimido (ZIP).\nPor favor descomprima-o primeiro (tente o WinRAR). [Game] Asia = Ásia +Calculate CRC = Calcular CRC ConfirmDelete = Apagar Create Game Config = Criar configuração do jogo Create Shortcut = Criar atalho @@ -419,17 +462,17 @@ One moment please... = Um momento por favor... Play = Jogar Remove From Recent = Remover dos "Recentes" SaveData = Dados do save -Setting Background = Configurando o background +Setting Background = Configurando o cenário de fundo Show In Folder = Mostrar na pasta USA = EUA -Use UI background = Usar background da Interface do Usuário +Use UI background = Usar cenário de fundo da interface do usuário [Graphics] % of the void = % do vazio % of viewport = % do visor %, 0:unlimited = %, 0 = ilimitado (supersampling) = (super amostragem) -(ampliação) = (ampliação) +(upscaling) = (ampliação) 1x PSP = 1× PSP 2x = 2× 2x PSP = 2× PSP @@ -452,39 +495,40 @@ Alternative Speed 2 = Velocidade alternativa 2 (em %, 0 = ilimitada) Anisotropic Filtering = Filtragem anisotrópica Auto = Auto Auto (1:1) = Auto (1:1) -Auto (same as Rendering) = Auto (a mesma que a da resolução da renderização) +Auto (same as Rendering) = Auto (a mesma que a da resolução de renderização) Auto FrameSkip = Auto-pulo dos frames +Auto Max Quality = Auto-Maximizar a Qualidade Auto Scaling = Auto-redimensionamento Backend = Backend Balanced = Balanceado Bicubic = Bi-cúbico BlockTransfer Tip = Alguns jogos requerem que isto esteja Ligado para os gráficos estarem corretos -BlockTransferRequired = Aviso: Esse jogo requer que a "simulação dos efeitos da transferência dos blocos" esteja definido como Ligado. +BlockTransferRequired = Aviso: Esse jogo requer que a "simulação dos efeitos de transferência dos blocos" esteja definida como Ligada. Both = Ambos Buffer graphics commands (faster, input lag) = Buffer dos comandos dos gráficos (mais rápido, atraso na entrada dos dados) Buffered Rendering = Renderização com buffer -BufferedRenderingRequired = Aviso: Este jogo requer que o "modo de renderização" esteja definido em "com buffer". +BufferedRenderingRequired = Aviso: Este jogo requer que o "modo de renderização" esteja definido "com buffer". Camera = Câmera Camera Device = Dispositivo de câmera Cardboard Screen Size = Tamanho da tela (em % do visor) -Cardboard Screen X Shift = Deslocamento no eixo X -Cardboard Screen Y Shift = Deslocamento no eixo Y +Cardboard Screen X Shift = Deslocamento do X (em % do espaço vazio) +Cardboard Screen Y Shift = Deslocamento do Y (em % do espaço vazio) Cardboard VR Settings = Configurações do VR Cardboard Cheats = Trapaças -Clear Speedhack = Limpar buffers dos frames no primeiro uso (hack de velocidade) -ClearSpeedhack Tip = As vezes mais rápido (na maior parte em dispositivos móveis), pode causar erros gráficos +Clear Speedhack = Limpar os buffers dos frames no primeiro uso (hack de velocidade) +ClearSpeedhack Tip = As vezes mais rápido (na maioria das vezes em dispositivos móveis), pode causar erros gráficos CPU Core = Core da CPU -Debugging = Depuração +Debugging = Debugging DefaultCPUClockRequired = Aviso: Este jogo requer que o clock da CPU esteja definido como padrão. Deposterize = Deposterizar -Deposterize Tip = Corrige erros gráficos visuais das bandas em texturas com ampliação +Deposterize Tip = Conserta erros gráficos visuais das faixas nas texturas com ampliação Device = Dispositivo Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 -Disable slower effects (speedup) = Desativa efeitos mais lentos (mais veloz) +Disable slower effects (speedup) = Desativa efeitos mais lentos (mais rápido) Disabled = Desativado Display layout editor = Exibe o editor de esquemas -Display Resolution (HW scaler) = Resolução da tela (Escalador de hardware) +Display Resolution (HW scaler) = Resolução da tela (Dimensionador do hardware) Dump next frame to log = Dumpa o próximo frame no log Enable Cardboard VR = Ativa o VR Cardboard FPS = FPS @@ -502,7 +546,7 @@ Hybrid = Híbrido Hybrid + Bicubic = Híbrido + Bi-cúbico Ignore camera notch when centering = Ignora o nível da câmera quando centralizar Internal Resolution = Resolução interna -Lazy texture caching = Cache preguiçoso da textura (mais veloz) +Lazy texture caching = Cache preguiçoso da textura (mais rápido) Linear = Linear Low = Baixa LowCurves = Qualidade das curvas spline/bezier @@ -513,16 +557,16 @@ Medium = Média Mode = Modo Must Restart = Você deve reiniciar o PPSSPP pra esta mudança ter efeito. Native device resolution = Resolução nativa do dispositivo -Nearest = Mais perto +Nearest = Mais próximo No buffer = Sem buffer -Non-Buffered Rendering = Ignorar efeitos de buffer (sem buffer, mais rápido) +Non-Buffered Rendering = Ignorar efeitos do buffer (sem buffer, mais rápido) None = Nenhum Number of Frames = Número de frames Off = Desligado OpenGL = OpenGL Overlay Information = Informações da sobreposição Partial Stretch = Esticamento parcial -Percent of FPS = Porcentagem do FPS +Percent of FPS = Porcentagem dos FPS Performance = Performance Postprocessing effect = Efeitos de pós-processamento Postprocessing Shader = Shader de pós-processamento @@ -557,10 +601,10 @@ Up to 1 = Até 1 Up to 2 = Até 2 Upscale Level = Nível da ampliação Upscale Type = Tipo de ampliação -UpscaleLevel Tip = Pesado pra CPU - algum dimensionamento pode ser atraso pra evitar travamentos +UpscaleLevel Tip = Pesado pra CPU - algum dimensionamento pode ser atrasado pra evitar travamentos Use all displays = Usar todas as telas Vertex Cache = Cache do vértice -VertexCache Tip = Mais rápido, mas pode causar tremulação da tela +VertexCache Tip = Mais rápido, mas pode causar tremulação temporária VSync = VSync Vulkan = Vulkan Window Size = Tamanho da janela @@ -570,7 +614,7 @@ xBRZ = xBRZ Delete ZIP file = Apagar arquivo ZIP Install = Instalar Install game from ZIP file? = Instalar o jogo do arquivo ZIP? -Install textures from ZIP file? = Instalar texturas do arquivo ZIP? +Install textures from ZIP file? = Instalar as texturas do arquivo ZIP? Installed! = Instalado! Texture pack doesn't support install = O pacote das texturas não suporta a instalação Zip archive corrupt = Arquivo compactado ZIP corrompido @@ -579,17 +623,20 @@ Zip file does not contain PSP software = O arquivo ZIP não contém software do [KeyMapping] Autoconfigure = Auto-configurar Autoconfigure for device = Auto-configurar pro dispositivo +Bind All = Vincular tudo Clear All = Limpar tudo Default All = Restaurar os padrões Map a new key for = Mapear uma nova tecla pra Map Key = Mapear tecla -Map Mouse = Mapear no mouse +Map Mouse = Mapear o mouse +Replace = Substituir +Show PSP = Mostrar PSP Test Analogs = Testar analógicos You can press ESC to cancel. = Você pode pressionar o Esc pra cancelar. [MainMenu] Browse = Procurar... -Buy PPSSPP Gold = Comprar PPSPP Gold +Buy PPSSPP Gold = Comprar o PPSSPP Gold Choose folder = Escolher pasta Credits = Créditos PPSSPP Homebrew Store = Armazém dos Homebrews do PPSSPP @@ -606,9 +653,10 @@ PinPath = Imobilizar PPSSPP can't load games or save right now = O PPSSPP não consegue carregar jogos ou salvar agora Recent = Recentes SavesAreTemporary = O PPSSPP está salvando na armazenagem temporária -SavesAreTemporaryGuidance = Extraia o PPSSPP pra algum lugar pra salvar permanentemente +SavesAreTemporaryGuidance = Extraia o PPSSPP em algum lugar pra salvar permanentemente SavesAreTemporaryIgnore = Ignorar aviso UnpinPath = Remover a imobilização +UseBrowseOrLoad = Usar o Procurar pra escolher uma pasta ou Carregar pra escolher um arquivo. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -623,8 +671,8 @@ Tools = Ferramentas Alt speed 1 = Velocidade alternativa 1 Alt speed 2 = Velocidade alternativa 2 An.Down = Analógico pra Baixo -An.Left = Analógico pra Esquerda -An.Right = Analógico pra Direita +An.Left = Analógico Esquerdo +An.Right = Analógico Direito An.Up = Analógico pra Cima Analog limiter = Limitador do analógico Analog Stick = Analógico @@ -634,17 +682,28 @@ Auto Analog Rotation (CW) = Auto-rotação do analógico (CW) AxisSwap = Trocar eixos Circle = Círculo Cross = Cruz +Custom 1 = Personalizar 1 +Custom 2 = Personalizar 2 +Custom 3 = Personalizar 3 +Custom 4 = Personalizar 4 +Custom 5 = Personalizar 5 +Custom 6 = Personalizar 6 +Custom 7 = Personalizar 7 +Custom 8 = Personalizar 8 +Custom 9 = Personalizar 9 +Custom 10 = Personalizar 10 D-pad down = Direcional pra baixo -D-pad left = Direcional pra esquerda -D-pad right = Direcional pra direita +D-pad left = Direcional esquerdo +D-pad right = Direcional direito D-pad up = Direcional pra cima DevMenu = Menu dos desenvolvedores +Double tap button = Botão do toque duplo Down = Direcional pra Baixo Dpad = Direcional Frame Advance = Avançar frames Hold = Segurar Home = Home -L = E +L = L Left = Esquerda Load State = Carregar state Mute toggle = Alternar pro mudo @@ -653,25 +712,31 @@ None = Nenhum Note = Nota OpenChat = Abrir o bate-papo Pause = Pausar -R = D -RapidFire = Fogo Rápido +R = R +RapidFire = Fogo rápido +Record = Gravar Remote hold = Segurar remoto Rewind = Rebobinar -Right = Direicional pra Direita +Right = Direcional Direito Right Analog Stick (tap to customize) = Análogico direito (pressione pra customizar) RightAn.Down = Analógico Direito pra Baixo -RightAn.Left = Analógico Direito pra Esquerda -RightAn.Right = Analógico Direito pra Direita +RightAn.Left = Analógico Direito a Esquerda +RightAn.Right = Analógico Direito a Direita RightAn.Up = Analógico Direito pra Cima -Rotate Analog (CCW) = Rotacionar analógico (CCW) -Rotate Analog (CW) = Rotacionar analógico (CW) +Rotate Analog (CCW) = Rotação do analógico (Anti-horário) +Rotate Analog (CW) = Rotação do analógico (sentido horário) Save State = Salvar state Screen = Tela Screenshot = Screenshot -Select = Selecionar +Select = Select SpeedToggle = Alternar velocidade Square = Quadrado Start = Start +Swipe Down = Deslizar pra Baixo +Swipe Left = Deslizar pra Esquerda +Swipe Right = Deslizar pra Direita +Swipe Up = Deslizar pra Cima +tap to customize = Toque pra personalizar Texture Dumping = Dumpagem das texturas Texture Replacement = Substituição das texturas Toggle Fullscreen = Alternar pra Tela cheia @@ -684,25 +749,26 @@ Vol - = Vol - Wlan = WLAN [Networking] -Adhoc Multiplayer forum = Visite o fórum do Multiplayer Ad Hoc AdHoc Server = Servidor Ad hoc AdhocServer Failed to Bind Port = O servidor Ad hoc falhou em se conectar a porta +AM: Data from Unknown Port = AM: Dados da Porta Desconhecida Auto = Auto -Bottom Center = Centro da parte de baixo -Bottom Left = Parte de baixo a esquerda -Bottom Right = Parte de baixo a direita -Center Left = Centralizado a esquerda -Center Right = Centralizado a direita +Bottom Center = Centro do rodapé +Bottom Left = A esquerda do rodapé +Bottom Right = A direita do rodapé +Center Left = Centralizar a esquerda +Center Right = Centralizar a direita Change Mac Address = Mudar o endereço do MAC Change proAdhocServer Address = Mudar o endereço de IP do servidor Ad Hoc PRO (localhost = múltiplas instâncias) Chat = Bate-papo Chat Button Position = Posição do botão de bate-papo Chat Here = Bata-papo aqui +Chat message = Mensagem do bate-papo Chat Screen Position = Posição da tela de bate-papo Disconnected from AdhocServer = Desconectado do servidor ad hoc DNS Error Resolving = Resolução dos erros do DNS Enable built-in PRO Adhoc Server = Ativar o servidor ad hoc PRO embutido -Enable network chat = Ativar bate-papo em rede +Enable network chat = Ativar bate-papo na rede Enable networking = Ativar rede/WLAN (beta, pode quebrar os jogos) Enable UPnP = Ativar UPnP (precisa de alguns segundos pra detectar) EnableQuickChat = Ativar bate-papo rápido @@ -717,12 +783,16 @@ Failed to Bind Localhost IP = Falhou em se conectar ao IP do hospedeiro local Failed to Bind Port = Falhou em se conectar a porta Failed to connect to Adhoc Server = Falhou em conectar ao servidor ad hoc Forced First Connect = Primeira conexão forçada (conexão mais rápida) +GM: Data from Unknown Port = GM: Dados da Porta Desconhecida +Hostname = Nome do hospedeiro Invalid IP or hostname = IP ou nome do hospedeiro inválido Minimum Timeout = Tempo mínimo pra esgotar (substituição em ms, 0 = padrão) Misc = Miscelânea (padrão = compatibilidade com o PSP) Network Initialized = Rede inicializada +None = Nenhum Please change your Port Offset = Por favor mude seu deslocamento da porta Port offset = Deslocamento da porta (0 = Compatibilidade com o PSP) +PPSSPP Ad-Hoc Wiki Page = Página do Ad-Hoc no Wiki do PPSSPP proAdhocServer Address: = Endereço do servidor ad hoc: Quick Chat 1 = Bate-papo rápido 1 Quick Chat 2 = Bate-papo rápido 2 @@ -731,7 +801,7 @@ Quick Chat 4 = Bate-papo rápido 4 Quick Chat 5 = Bate-papo rápido 5 QuickChat = Bate-papo rápido Send = Enviar -Send Discord Presence information = Enviar informação da "Presença Rica" pro Discord +Send Discord Presence information = Enviar informação da "Presença Rica" no Discord TCP No Delay = Nenhum atraso pro TCP (TCP mais rápido) Top Center = Centro superior Top Left = Superior esquerdo @@ -742,7 +812,7 @@ UPnP need to be reinitialized = O UPnP precisa ser reinicializado UPnP use original port = O UPnP usa a porta original (ativado = compatibilidade com o PSP) Validating address... = Validando endereço... WLAN Channel = Canal do WLAN -You're in Offline Mode, go to lobby or online hall = Você está no modo offline, vá pro lobby ou sala online +You're in Offline Mode, go to lobby or online hall = Você está no modo offline, vá pro lobby ou salão online [Pause] Cheats = Trapaças @@ -756,6 +826,8 @@ Rewind = Rebobinar Save State = Salvar state Settings = Configurações Switch UMD = Trocar UMD +Undo last load = Desfazer o último carregamento +Undo last save = Desfazer o último salvamento [PostShaders] (duplicated setting, previous slider will be used) = (configuração duplicada, o slider anterior será usado) @@ -770,8 +842,8 @@ Brightness = Brilho Cartoon = Cartoon ColorCorrection = Correção das cores Contrast = Contraste -CRT = Scanlines CRT -FXAA = Antialiasing do FXAA +CRT = Scanlines do CRT +FXAA = Anti-aliasing do FXAA Gamma = Gama Grayscale = Tons de cinza Intensity = Intensidade @@ -784,10 +856,11 @@ PSPColor = Cor do PSP Saturation = Saturação Scanlines = Scanlines (CRT) Sharpen = Aprimorado -SSAA(Gauss) = Super-amostragem AA (Gauss) +SSAA(Gauss) = Super-amostragem do AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Ampliador Spline36 -VideoSmoothingAA = Suavização de vídeo AA +VideoSmoothingAA = Suavização de vídeo do AA Vignette = Vinheta [PSPCredits] @@ -805,15 +878,15 @@ info3 = Você joga possuindo o UMD ou comprando o digital info4 = Baixe da loja PSN no seu PSP real. info5 = O PSP é uma marca registrada da Sony, Inc. iOS builds = Builds do iOS -license = Software livre sob o GPL 2.0+ +license = Software livre sob a GPL 2.0+ list = Listas de compatibilidade, fóruns e informações do desenvolvimento PPSSPP Forums = Fóruns do PPSSPP Privacy Policy = Política de privacidade -Share PPSSPP = Compartilhar o PPSSPP +Share PPSSPP = Compartilhe o PPSSPP specialthanks = Agradecimentos especiais: specialthanksKeithGalocy = da NVIDIA (hardware, conselho) specialthanksMaxim = pelo trabalho incrível dele com o decodificador Atrac3+ -testing = Testando +testing = Testagem this translation by = Traduzido por: title = Um emulador de PSP rápido e portátil tools = Ferramentas grátis usadas: @@ -822,14 +895,43 @@ tools = Ferramentas grátis usadas: # Leave extra lines blank. 4 contributors per line seems to look best. translators1 = Papel, gabrielmop, Efraim Lopes, AkiraJkr translators2 = Felipe -translators3 = -translators4 = -translators5 = -translators6 = +translators3 = +translators4 = +translators5 = +translators6 = Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Verifique o site da web: written = Escrito em C++ pela velocidade e portabilidade +[MemStick] +Already contains PSP data = Já contém dados do PSP +Create or Choose a PSP folder = Criar ou Escolher uma pasta do PSP +Current = Atual +DataCanBeShared = Os dados podem ser compartilhados entre o PPSSPP regular/Gold +DataCannotBeShared = Os dados NÃO PODEM ser compartilhados entre o PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Aviso! Os dados serão perdidos quando você desinstalar o PPSSPP! +DataWillStay = Os dados permanecerão mesmo se você desinstalar o PPSSPP. +Done! = Concluído! +EasyUSBAccess = Acesso fácil ao USB +Failed to move some files! = Falhou em mover alguns arquivos! +Failed to save config = Falhou em salvar a configuração +Free space = Espaço livre +Manually specify PSP folder = Especificar manualmente a pasta do PSP +MemoryStickDescription = Escolher aonde manter os dados do PSP (Cartão de Memóoria) +Move Data = Mover Dados +Selected PSP Data Folder = Pasta Selecionada dos Dados do PSP +Skip for now = Ignorar por enquanto +No data will be changed = Nenhum dado será mudado +PPSSPP will restart after the change = O PPSSPP reiniciará após a mudança +Starting move... = Iniciando a movimentação... +That folder doesn't work as a memstick folder. = Essa pasta não funciona como um cartão de memória. +USBAccessThrough = Acesso ao USB através do Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = Acesso ao USB através do Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use os Dados Privados do App +Use PSP folder at root of storage = Use a pasta do PSP na raiz da armazenagem +Welcome to PPSSPP! = Bem-vindo ao PPSSPP! +WhatsThis = O que é isto? + [RemoteISO] Browse Games = Procurar jogos Local Server Port = Porta do servidor local @@ -838,27 +940,29 @@ Remote disc streaming = Streaming remoto do disco Remote Port = Porta remota Remote Server = Servidor remoto Remote Subdirectory = Sub-diretório remoto -RemoteISODesc = Jogos na sua lista de "Recentes" serão compartilhados -RemoteISOLoading = Conectado, carregando lista de jogos... +RemoteISODesc = Os jogos na sua lista de "Recentes" serão compartilhados +RemoteISOLoading = Conectado, carregando a lista de jogos... RemoteISOScanning = Escaneando... Cliqme em "compartilhar jogos" no seu dispositivo do servidor -RemoteISOScanningTimeout = Escaneando... Verifique sua configuração do firewall no desktop +RemoteISOScanningTimeout = Escaneando... Verifique suas configurações do firewall na área de trabalho RemoteISOWifi = Nota: Conecte os dois dispositivos na mesma rede Wi-Fi RemoteISOWinFirewall = AVISO: O Firewall do Windows está bloqueando o compartilhamento Settings = Configurações Share Games (Server) = Compartilhar jogos (servidor) Share on PPSSPP startup = Compartilhar na inicialização do PPSSPP -Stop Sharing = Parar compartilhamento +Stop Sharing = Parar com o compartilhamento Stopping.. = Parando... [Reporting] Bad = Ruim +FeedbackCRCCalculating = CRC do Disco: Calculando... +FeedbackCRCValue = CRC do Disco: [VALUE] FeedbackDelayInfo = Seus dados estão sendo submetidos em segundo plano. FeedbackDesc = Como está a emulação? Deixe a comunidade e nós sabermos! FeedbackDisabled = Os relatórios da compatibilidade com o servidor devem estar ativados. FeedbackIncludeCRC = Nota: A bateria será usada pra enviar um CRC do disco -FeedbackIncludeScreen = Incluir um screenshot +FeedbackIncludeScreen = Incluir uma screenshot FeedbackSubmitDone = Seus dados foram submetidos. -FeedbackSubmitFail = Não pôde sumeter os dados ao servidor. Tente atualizar o PPSSPP. +FeedbackSubmitFail = Não pôde sumeter os dados pro servidor. Tente atualizar o PPSSPP. FeedbackThanks = Obrigado pelo seu feedback! Gameplay = Jogabilidade Graphics = Gráficos @@ -875,15 +979,16 @@ Overall = Geral Perfect = Perfeito Perfect Description = Emulação sem falhas no jogo inteiro - ótimo! Plays = Jogável -Plays Description = Completamente jogável mas poderia estar com problemas gráficos +Plays Description = Totalmente jogável mas pode estar com problemas gráficos ReportButton = Reportar feedback +Show disc CRC = Mostrar CRC do disco Speed = Velocidade Submit Feedback = Submeter feedback -SuggestionConfig = Veja os relatórios no site da web pra obter configurações boas. +SuggestionConfig = Veja os relatórios no site da web pra obter boas configurações. SuggestionCPUSpeed0 = Desativa a configuração da velocidade do clock travado da CPU. SuggestionDowngrade = Retroceda pra uma versão mais antiga do PPSSPP (por favor reporte este bug). SuggestionsFound = Outros usuários relataram resultados melhores. Pressione "Visualizar Feedback" pra mais detalhes. -SuggestionsNone = Este jogo não está funcionando com outros usuários também. +SuggestionsNone = Este jogo também não está funcionando com outros usuários. SuggestionsWaiting = Submetendo e verificando o feedback dos outros usuários... SuggestionUpgrade = Atualize pra uma versão mais nova do PPSSPP. SuggestionVerifyDisc = Verifique se sua ISO é uma cópia boa do seu disco. @@ -894,14 +999,16 @@ View Feedback = Visualizar todos os feedbacks Date = Data Filename = Nome do arquivo No screenshot = Sem screenshot -None yet. Things will appear here after you save. = Nada ainda. As coisas aparecerão aqui após você salvar. +None yet. Things will appear here after you save. = Nada ainda. As coisas aparecerão aqui após você salvar. +Nothing matching '%1' was found. = Nada combinando com o '%1' foi achado. Save Data = Dados salvos Save States = States salvos Savedata Manager = Gerenciador dos dados dos saves +Showing matches for '%1'. = Mostrando as combinações com o '%1'. Size = Tamanho [Screen] -Cardboard VR OFF = Cardboard VR desligado +Cardboard VR OFF = VR do Cardboard desligado Chainfire3DWarning = AVISO: Chainfire3D detectado, pode causar problemas. Failed to load state = Falhou em carregar o state Failed to save state = Falhou em salvar o state @@ -910,12 +1017,14 @@ GLToolsWarning = AVISO: GLTools detectado, pode causar problemas. In menu = No menu Load savestate failed = Falhou em carregar o state Loaded State = State carregado -Loaded. Save in game, restart, and load for less bugs. = Carregado. Salve no jogo, reinicie e carregue pra menos bugs. +Loaded. Save in game, restart, and load for less bugs. = Carregado. Salve no jogo, reinicie e carregue pra menos bugs. +Loaded. Game may refuse to save over different savedata. = Carregado. O jogo pode recusar a salvar dados diferentes dos salvamentos. +Loaded. Game may refuse to save over newer savedata. = Carregado. O jogo pode recusar a salvar dados mais novos dos salvamentos. LoadStateDoesntExist = Falhou em carregar o state: O state salvo não existe! LoadStateWrongVersion = Falhou em carregar o state: O state salvo é de uma versão mais velha do PPSSPP! norewind = Não há states salvos pra rebobinar disponíveis. Playing = Jogando -PressESC = Pressione ESC pra abrir o menu de pausa. +PressESC = Pressione ESC pra abrir o menu da pausa. replaceTextures_false = As texturas não estão mais sendo substituídas. replaceTextures_true = A substituição das texturas está ativada. Save State Failed = Falhou em salvar o state! @@ -924,6 +1033,7 @@ saveNewTextures_false = O salvamento das texturas foi desativado. saveNewTextures_true = As texturas agora serão salvas no seu armazenamento. SpeedCustom2 = Velocidade: alternativa 2 standard = Velocidade: padrão +State load undone = Carregamento do state desfeito Untitled PSP game = Jogo de PSP sem título [Store] @@ -941,7 +1051,7 @@ Uninstall = Desinstalar %d bytes = %d bytes (none detected) = (nenhum detectado) 3D API = API 3D -ABI = Arquitetura +ABI = ABI API Version = Versão da API Audio Information = Informação do áudio Board = Placa @@ -956,20 +1066,21 @@ CPU Name = Nome D3DCompiler Version = Versão do compilador D3D Debug = Debug Debugger Present = Debugger presente -Device Info = Info do dispositivo +Device Info = Informação do dispositivo +Directories = Diretórios Display Information = Informação da tela Driver Version = Versão do driver EGL Extensions = Extensões do EGL Frames per buffer = Frames por buffer GPU Information = Informações da GPU High precision float range = Alcance da flutuação de alta precisão -High precision int range = Alcance da integral de alta precisão +High precision int range = Alcance do inteiro de alta precisão Lang/Region = Idioma/Região Memory Page Size = Tamanho da página de memória Native Resolution = Resolução nativa OGL Extensions = Extensões do OGL -OpenGL ES 2.0 Extensions = Extensões do OpenGL 2.0 -OpenGL ES 3.0 Extensions = Extensões do OpenGL 3.0 +OpenGL ES 2.0 Extensions = Extensões do OpenGL 2.0 ES +OpenGL ES 3.0 Extensions = Extensões do OpenGL 3.0 ES OpenGL Extensions = Extensões do OpenGL Optimal frames per buffer = Melhores frames por buffer Optimal sample rate = Melhor taxa de amostragem @@ -977,10 +1088,11 @@ OS Information = Informação do sistema operacional PPSSPP build = Build do PPSSPP Refresh rate = Taxa de atualização Release = Lançamento -RW/RX exclusive = Exclusivo RW/RX +RW/RX exclusive = RW/RX exclusivo Sample rate = Taxa de amostragem Shading Language = Idioma do shader -Sustained perf mode = Modo de performace sustentado +Storage = Armazenagem +Sustained perf mode = Modo de performance sustentado System Information = Informação do sistema System Name = Nome System Version = Versão do sistema @@ -996,21 +1108,21 @@ Vulkan Features = Características do Vulkan 12HR = 12 HRs 24HR = 24 HRs Auto = Auto -Auto Load Savestate = Auto-carregar state salvo +Auto Load Savestate = Auto-carregar o state salvo AVI Dump started. = Dump do AVI iniciado AVI Dump stopped. = Dump do AVI parado -Cache ISO in RAM = Pôr no cache a ISO inteira na RAM -Change CPU Clock = Mudar clock da CPU do PSP emulado (instável) -Change Memory Stick folder = Mudar a pasta do cartão de memória -Change Memory Stick Size = Mudar o tamanho do cartão de memória (GBs) +Cache ISO in RAM = Pôr a ISO inteira na RAM +Change CPU Clock = Mudar o clock da CPU do PSP emulado (instável) +Memory Stick folder = Pasta do cartão de memória +Memory Stick size = Tamanho do cartão de memória (GBs) Change Nickname = Mudar apelido ChangingMemstickPath = Jogos salvos, states salvos e outros dados não serão copiados pra esta pasta.\n\nMudar a pasta do cartão de memória? ChangingMemstickPathInvalid = Esse caminho não pôde ser usado pra salvar os arquivos do cartão de memória. ChangingMemstickPathNotExists = Essa pasta não existe ainda.\n\nJogos salvos, states salvos e outros dados não serão copiados pra esta pasta.\n\nCriar uma nova pasta do cartão de memória? Cheats = Trapaças -Clear Recent = Limpar "Recentes" -Clear Recent Games List = Limpar lista dos "Recentes" -Clear UI background = Limpar 2º plano da interface do usuário +Clear Recent = Limpar os "Recentes" +Clear Recent Games List = Limpar a lista dos "Recentes" +Clear UI background = Limpar o cenário de fundo da interface do usuário Confirmation Button = Botão de confirmação Date Format = Formato da data Day Light Saving = Horário de verão @@ -1025,48 +1137,55 @@ Dynarec (JIT) = Dynarec (JIT) Emulation = Emulação Enable Cheats = Ativar trapaças Enable Compatibility Server Reports = Ativar relatórios de compatibilidade com o servidor +Error: load undo state is from a different game = Erro: o estado do carregamento desfeito é de um jogo diferente Failed to load state. Error in the file system. = Falhou em carregar o state. Erro no sistema de arquivos. Failed to save state. Error in the file system. = Falhou em salvar o state. Erro no sistema de arquivos. +Failed to load state for load undo. Error in the file system. = Falhou em carregar o state do carregamento desfeito. Erro no arquivo do sistema. Fast (lag on slow storage) = Rápido (atraso na armazenagem lenta) Fast Memory = Memória rápida (instável) -Force real clock sync (slower, less lag) = Forçar sincronização com relógio real (mais lento, menos atrasos) -frames, 0:off = frames, 0 = desligado +Floating symbols = Símbolos flutuantes +Force real clock sync (slower, less lag) = Forçar sincronização com o relógio real (mais lento, menos atrasos) +frames, 0:off = frames, 0 = Desligado Games list settings = Configurações da lista de jogos General = Geral Grid icon size = Tamanho do ícone da grade Help the PPSSPP team = Ajude o time do PPSSPP Host (bugs, less lag) = Hospedeiro (bugs, menos atrasos) -I/O on thread (experimental) = E/S no thread (experimental) Ignore bad memory accesses = Ignorar acessos ruins da memória Increase size = Aumentar tamanho -Interpreter = Intérprete -IO timing method = Método do tempo de E/S -IR Interpreter = Intérprete do IR +Interpreter = Interpretador +IO timing method = Método de cronometragem da E/S +IR Interpreter = Interpretador do IR Memory Stick Folder = Pasta do cartão de memória Memory Stick inserted = Cartão de memória inserido MHz, 0:default = MHz, 0 = padrão MMDDYYYY = MMDDAAAA +Moving background = Movendo o cenário de fundo Newest Save = Save mais novo +No animation = Sem animação Not a PSP game = Não é um jogo de PSP Off = Desligado Oldest Save = Save mais antigo +Path does not exist! = O caminho não existe! +PSP Memory Stick = Cartão de Memória do PSP PSP Model = Modelo do PSP PSP Settings = Configurações do PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Jogos recentes Record Audio = Gravar áudio Record Display = Gravar tela Reset Recording on Save/Load State = Resetar a gravação ao salvar/carregar o state -Restore Default Settings = Restaurar as configurações do PPSPP para os padrões +Restore Default Settings = Restaurar as configurações do PPSSPP para os padrões Rewind Snapshot Frequency = Rebobinar frequência dos snapshots (consome memória) Save path in installed.txt = Salvar o caminho em installed.txt Save path in My Documents = Salvar o caminho em Meus Documentos Savestate Slot = Slot do state salvo Savestate slot backups = Backups dos slots dos states salvos -Screenshots as PNG = Salvar screenshots no formato PNG -Set UI background... = Definir 2º plano da interface do usuário... +Screenshots as PNG = Salvar as screenshots no formato PNG +Set UI background... = Definir o cenário de fundo da interface do usuário... Show ID = Mostrar ID -Show region flag = Mostrar bandeira da região +Show region flag = Mostrar a bandeira da região Simulate UMD delays = Simular atrasos do UMD Slot 1 = Slot 1 Slot 2 = Slot 2 @@ -1076,17 +1195,20 @@ Slot 5 = Slot 5 Storage full = Armazenamento cheio Sustained performance mode = Modo de performace sustentado Time Format = Formato da hora -UI Language = Idioma da interface do usuário +UI = Interface do usuário UI Sound = Som da interface do usuário -undo %c = backup %c +UI background animation = Animação do cenário de fundo da interface do usuário +undo %c = Backup %c +USB = USB Use Lossless Video Codec (FFV1) = Usar codec de vídeo sem perda (FFV1) Use O to confirm = Usar O como botão de confirmação Use output buffer (with overlay) for recording = Usar buffer de saída (com sobreposição) pra gravação Use system native keyboard = Usar teclado nativo do sistema Use X to confirm = Usar X como botão de confirmação -VersionCheck = Procurar novas versões do PPSPP +VersionCheck = Procurar novas versões do PPSSPP WARNING: Android battery save mode is on = AVISO: O modo de economia da bateria do Android está Ligado WARNING: Battery save mode is on = AVISO: O modo de economia da bateria está Ligado +Waves = Ondas YYYYMMDD = AAAAMMDD [Upgrade] diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index a7ad7cced6..a2acda35d4 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = API de áudio (requer reiniciar) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatível) Enable Sound = Activar som Global volume = Global volume Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (rápido) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Limitador do analógico Analog Mapper High End = Mapeamento max do analógico (sensibilidade dos eixos) Analog Mapper Low End = Mapeamento min do analógico (zona não coberta inversa) Analog Mapper Mode = Modo de mapamento do analógico +Analog Settings = Analog Settings Analog Stick = Analógico +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centralização do analógico Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Opacidade dos botões Button style = Estilo dos botões +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrar D-Pad +Calibrated = Calibrated Calibration = Calibração +Circular stick input = Circular stick input Classic = Clássico Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Mapeamento dos Controlos -Custom layout... = Editar disposição dos controlos de toque... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Editar disposição dos controlos de toque... Customize tilt = Personalizar inclinação... D-PAD = D-Pad -Deadzone Radius = Raio não coberto +Deadzone radius = Raio não coberto DInput Analog Settings = Configurações do analógico DInput Disable D-Pad diagonals (4-way touch) = Desactivar diagonais do D-Pad (4 direcções) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Resposta háptica (vibração) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignorar controladores quando não focado Ignore Windows Key = Ignorar a tecla Windows Invert Axes = Inverter eixos @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Panorâmico Landscape Auto = Landscape auto Landscape Reversed = Panorâmico invertido +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Controlos no ecrã Portrait = Retrato Portrait Reversed = Retrato invertido PSP Action Buttons = Botões de acção da PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotação do ecrã seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensibilidade +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Mostrar botão de menu de pausa +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Bordas finas Tilt Base Radius = Tilt base radius Tilt Input Type = Tipo de input de inclinação Tilt Sensitivity along X axis = Sensibilidade da inclinação no eixo X Tilt Sensitivity along Y axis = Sensibilidade da inclinação no eixo Y To Calibrate = Para calibrar, mantenha o dispositivo numa superfície plana e pressione "Calibrar". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Visib. +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Configurações de analógico XInput @@ -99,6 +133,7 @@ Refresh Rate = Taxa de refrescamento #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &Directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -229,6 +265,7 @@ No block = Nenhum bloco Prev = Anterior Random = Aleatório Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Tem a certeza que deseja restaurar todas as configurações para as suas pre-definições?\nOs mapeamentos de controlos não serão revertidos.\n\nNão poderá reverter esta acção.\nPor favor reinicie o PPSSPP para as modificações terem efeito. RestoreGameDefaultSettings = Tem a certeza que deseja restaurar as configurações\nespecíficas do jogo para as pre-definições do PPSSPP? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Tem a certeza que deseja\napagar as configurações pa DeleteFailed = Erro ao apagar dados. Deleting = A apagar, aguarde... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Aceitar +Filter = Filter Finish = Terminar +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Gravar Save completed = Gravação concluída Saving = A gravar jogo, aguarde... SavingFailed = Erro ao gravar dados. +Search = Search Select = Seleccionar Shift = Shift +Skip = Skip Snap = Snap Space = Espaço SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Eliminar Create Game Config = Criar configuração do jogo Create Shortcut = Criar atalho @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (same as rendering resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanced @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Clear all Default All = Restore defaults Map a new key for = Map a new key for Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Down Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pause R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Right -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Salvar Estado Settings = Configurações Switch UMD = Switch UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Bad +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Report feedback +Show disc CRC = Show disc CRC Speed = Speed Submit Feedback = Submit feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Load savestate failed Loaded State = State loaded +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Speed: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Carregar toda a ISO em RAM Change CPU Clock = Alterar relógio emulado do CPU da PSP (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Alterar alcunha ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Geral Grid icon size = Grid icon size Help the PPSSPP team = Ajude a equipa do PPSSPP Host (bugs, less lag) = Anfitrião (bugs, menos latência) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDAAAA +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Não é um jogo de PSP Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Modelo da PSP PSP Settings = Configurações da PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Armazenamento cheio Sustained performance mode = Sustained performance mode Time Format = Formato da hora UI = Interface de usuário +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Usar O para confirmar Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Usar X para confirmar VersionCheck = Verificar actualizações do PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = AAAAMMDD [Upgrade] diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 76d6dc9d59..a376d5a884 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Format intern audio (necesită restartare) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (mai lent) Auto = Automat Device = Device +Disabled = Disabled DSound (compatible) = DSound (compatibil) Enable Sound = Activează Sunet Global volume = Volum global Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (rapid) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Sensitivitate axa analoagă +Analog Binding = Analog Binding Analog Limiter = Limită pt. control analog Analog Mapper High End = Valoarea maxima analoagă la limita de sus (sensitivitatea axelor) Analog Mapper Low End = Valoarea maxima analoagă la limita de jos (inversarea zonei moarte) Analog Mapper Mode = Modul de plasare analog +Analog Settings = Analog Settings Analog Stick = Butonul analog +Analog Style = Analog Style AnalogLimiter Tip = Când este apasat butonul de limitare control analog Auto = Automat Auto-centering analog stick = Centrare automată a butonului analog Auto-hide buttons after seconds = Ascunde automate butoanele după secunde +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Opacitatea butoanelor Button style = Stilul butonanelor +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrare D-Pad +Calibrated = Calibrated Calibration = Calibrare +Circular stick input = Circular stick input Classic = Clasic Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Trap mouse within window/display area Control Mapping = Editare controale -Custom layout... = Aranjare controale touch... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Aranjare controale touch... Customize tilt = Personificare înclinare... D-PAD = D-Pad -Deadzone Radius = Raza zonei moarte +Deadzone radius = Raza zonei moarte DInput Analog Settings = Setari analoage DInput Disable D-Pad diagonals (4-way touch) = Dezactivare diagonale D-Pad (touch in 4 direcții) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Feedback tactil (vibrație) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignoră gamepadurile cand nu e concentrat Ignore Windows Key = Dezactivează tasta Windows Invert Axes = Inversează axele @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Vedere Landscape Auto = Landscape auto Landscape Reversed = Vedere întoarsă +Low end radius = Low end radius Mouse = Setări Mouse Mouse sensitivity = Sensitivitate Mouse Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Controale Touch pe Ecran Portrait = Portret Portrait Reversed = Portret intors PSP Action Buttons = Butoane acțiune PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotație ecran seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivitate +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Arată buton meniu pauză +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Margini subțiri Tilt Base Radius = Tilt base radius Tilt Input Type = Tip intrare prin înclinare Tilt Sensitivity along X axis = Inversează sensitivitatea pe axa X Tilt Sensitivity along Y axis = Inversează sensitivitatea pe axa Y To Calibrate = Pt. a calibra, ține aparatul pe o suprafață plată și apasă "Calibrate". +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Vizibilitate +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Setări analoage XInput @@ -99,6 +133,7 @@ Refresh Rate = Rată de împrospatare #Font = Trebuchet MS About PPSSPP... = &About PPSSPP... Auto = &Auto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &More Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Open &Directory... Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... Open Memory Stick = Open &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Previous Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Chiar vrei să ștergi setările pt. acest joc? DeleteFailed = Nu s-au putut șterge datele. Deleting = Ştergere în progres\nVă rugăm așteptați... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Confirmare +Filter = Filter Finish = Stop +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Salvează Save completed = Salvare Completă Saving = Se Salvează\nAșteptați... SavingFailed = Nu s-au putut salva datele. +Search = Search Select = Selectează Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Fișierul e compresat(ZIP).\nVă rog decomp [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Ștergere Create Game Config = Creează configurare joc Create Shortcut = Creează scurtătură @@ -430,6 +473,7 @@ Auto = Automat Auto (1:1) = Automat (1:1) Auto (same as Rendering) = Automat (la fel ca rezoluția de afișare) Auto FrameSkip = Sărire cadre automat +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Mod intern Balanced = Balansat @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Configurare automată Autoconfigure for device = Configurare automată pt. dispozitiv +Bind All = Bind All Clear All = Curătă tot Default All = Înapoi la inițial Map a new key for = Configurează o nouă tastă pentru Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Testează analoage You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Schimbare axe Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Jos Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Pauză R = R RapidFire = Foc-rapid +Record = Record Remote hold = Remote hold Rewind = Re-afișare Right = Dpad Dreapta -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Comutare viteză Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visitează forumul Ad Hoc Multiplayer AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Schimbă adresa IP a serverului PRO ad hoc (loca Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Rețea inițializată +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Rewind Save State = Salvează Stare Settings = Setări Switch UMD = Schimbă UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Rău +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = How's the emulation? Let us and the community know! Cum e emularea? Spuneți-ne nouă si comunității! FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Raportează feedback +Show disc CRC = Show disc CRC Speed = Viteză Submit Feedback = Trimite feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = No screenshot None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Save data Save States = Save states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = AVERTIZARE: GLTools detectat, poate cauza probleme. In menu = In menu Load savestate failed = Eroare la încărcare de stare Loaded State = Stare încărcată +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Eroare la încărcare de stare: Starea nu există! LoadStateWrongVersion = Eroare la încărcare de stare: Starea e pt. o versiune PPSSPP mai veche! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Viteză: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Change emulated PSP's CPU clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Schimbă nume ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = General Grid icon size = Grid icon size Help the PPSSPP team = Ajută echipa PPSSPP Host (bugs, less lag) = Host (cu erori, mai puțină latență) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Nu e joc PSP Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Model PSP PSP Settings = Setări PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Stocare plină Sustained performance mode = Sustained performance mode Time Format = Format timp UI = Interfața cu utilizatorul +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = Folosește O ca buton de confirmare Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Folosește X ca buton de confirmare VersionCheck = Verifică pt. versiuni noi de PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 1d1bced666..8b3b129c25 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = Громкость при другой скорости Audio backend = Аудио бэкенд (нужен перезапуск) +Audio Error = Audio Error AudioBufferingForBluetooth = Буфер, подходящий для Bluetooth (медленнее) Auto = Авто Device = Устройство +Disabled = Disabled DSound (compatible) = DSound (совместимый) Enable Sound = Включить звук Global volume = Общая громкость Microphone = Микрофон Microphone Device = Устройство микрофона Mute = Без звука -Switch on new audio device = Переключиться на новое аудиоустройство +Reverb volume = Reverb volume +Use new audio devices automatically = Переключиться на новое аудиоустройство Use global volume = Использовать общую громкость WASAPI (fast) = WASAPI (быстрее) [Controls] -Analog auto-rotation speed = Скорость автовращения аналогового стика +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = Скорость автовращения аналогового стика Analog Axis Sensitivity = Чувствительность аналоговой оси Analog Limiter = Аналоговый ограничитель Analog Mapper High End = Параметры аналогового стика (чувствительность) @@ -26,24 +32,40 @@ AnalogLimiter Tip = Когда нажата кнопка аналогового Auto = Авто Auto-centering analog stick = Автоцентрируемый стик Auto-hide buttons after seconds = Скрывать кнопки через +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Привязки +Button Binding = Button Binding Button Opacity = Прозрачность кнопок Button style = Стиль кнопок +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Калибровать +Calibrated = Calibrated Calibration = Калибровка +Circular stick input = Circular stick input Classic = Классический Combo Key Setting = Изменение комбо-клавиш Combo Key Setup = Настройка комбо-клавиш Confine Mouse = Не давать мыши выходить за пределы окна Control Mapping = Назначение кнопок -Custom layout... = Изменить сенсорное управление... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Изменить сенсорное управление... Customize tilt = Настроить наклон... D-PAD = Крестовина -Deadzone Radius = Радиус мертвой зоны +Deadzone radius = Радиус мертвой зоны DInput Analog Settings = Параметры стиков DInput Disable D-Pad diagonals (4-way touch) = Отключить крестовину по диагонали +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Подсветка краёв HapticFeedback = Виброотдача +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Игнорировать геймпад, когда окно не в фокусе Ignore Windows Key = Игнорировать клавишу Windows Invert Axes = Инверсия осей @@ -55,6 +77,7 @@ L/R Trigger Buttons = Триггеры L/R Landscape = Альбомная Landscape Auto = Альбомная (авто) Landscape Reversed = Альбомная (перевернутая) +Low end radius = Low end radius Mouse = Настройки мыши Mouse sensitivity = Чувствительность мыши Mouse smoothing = Сглаживание мыши @@ -65,21 +88,32 @@ OnScreen = Элементы управления на экране Portrait = Портретная Portrait Reversed = Портретная (перевернутая) PSP Action Buttons = Кнопки действий PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Ориентация экрана seconds, 0 : off = секунд, 0 = выкл. +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Чувствительность +Shape = Shape Show right analog = Показывать правый аналоговый стик Show Touch Pause Menu Button = Показывать кнопку паузы +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Тонкие границы Tilt Base Radius = Радиус наклона основания Tilt Input Type = Замена управления наклоном Tilt Sensitivity along X axis = Чувствительность наклона вдоль X Tilt Sensitivity along Y axis = Чувствительность наклона вдоль Y To Calibrate = Положите устройство на ровную поверхность и нажмите "Калибровать" +Toggle mode = Toggle mode Touch Control Visibility = Видимость элементов управления Use custom right analog = Испот\льзовать настраиваемый правый аналоговый стик Use Mouse Control = Включить управление мышью Visibility = Видимость +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Параметры стиков XInput @@ -99,6 +133,7 @@ Refresh Rate = Частота обновления #Font = Trebuchet MS About PPSSPP... = &О PPSSPP... Auto = &Авто +Auto Max Quality = Auto Max &Quality Backend = Бэкенд &рендеринга (нужен перезапуск) Bicubic = &Бикубическое Break = Останов @@ -150,6 +185,7 @@ More Settings... = &Ещё настройки... Nearest = &Ближайший Non-Buffered Rendering = &Пропускать эффекты (небуферированный, быстрее) Off = В&ыключено +Open Chat = Open Chat Open Directory... = Открыть &папку... Open from MS:/PSP/GAME... = О&ткрыть MS:/PSP/GAME... Open Memory Stick = Открыть карту памяти @@ -229,6 +265,7 @@ No block = Нет блока Prev = Предыдущий Random = Случайный Replace textures = Подменять текстуры +Reset = Reset Reset limited logging = Сбросить ограниченное логирование RestoreDefaultSettings = "Вы уверены, что хотите сбросить настройки\n(кроме управления) на стандартные?\nВы не сможете это отменить.\nПожалуйста, перезапустите PPSSPP после сброса." RestoreGameDefaultSettings = Вы уверены, что хотите вернуть все параметры игры к стандартным? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Вы уверены, что хотите удалит DeleteFailed = Не удалось удалить данные. Deleting = Удаление\nПожалуйста, подождите... Disable All = Отключить все +Dumps = Dumps Edit = Изменить Enable All = Включить все Enter = Ввод +Filter = Filter Finish = Сохранить +GE Frame Dumps = GE Frame Dumps Grid = Сетка Inactive = Неактивно InternalError = Произошла внутренняя ошибка. @@ -300,8 +340,10 @@ Save = Сохранить Save completed = Сохранение завершено. Saving = Сохранение\nПожалуйста, подождите... SavingFailed = Не удалось сохранить. +Search = Search Select = Выбрать Shift = Shift +Skip = Skip Snap = Разметка Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = файл сжат (ZIP).\nПожалуйс [Game] Asia = Азия +Calculate CRC = Calculate CRC ConfirmDelete = Удалить Create Game Config = Создать конфиг Create Shortcut = Создать ярлык @@ -430,6 +473,7 @@ Auto = Авто Auto (1:1) = Авто (1:1) Auto (same as Rendering) = Авто (как разрешение рендеринга) Auto FrameSkip = Автопропуск кадров +Auto Max Quality = Auto Max Quality Auto Scaling = Автомасштаб Backend = Бэкенд Balanced = Сбалансированно @@ -463,7 +507,7 @@ Display layout editor = Редактор расположения экрана Display Resolution (HW scaler) = Разрешение экрана (аппаратное) Dump next frame to log = Сохранить следующий кадр в логе Enable Cardboard VR = Включить Cardboard VR -Features = Возможности +#Features = Возможности FPS = FPS Frame Rate Control = Управление частотой кадров Frame Skipping = Пропуск кадров @@ -556,11 +600,14 @@ Zip file does not contain PSP software = В ZIP-файле отсутсвует [KeyMapping] Autoconfigure = Авто конфиг Autoconfigure for device = Авто конфиг для устройства +Bind All = Bind All Clear All = Очистить все Default All = По умолчанию Map a new key for = Назначить кнопку для Map Key = Назначить кнопку Map Mouse = Назначить мышь +Replace = Replace +Show PSP = Show PSP Test Analogs = Тест стиков You can press ESC to cancel. = Для отмены вы можете нажать Esc. @@ -586,6 +633,7 @@ SavesAreTemporary = PPSSPP сохраняет данные во временно SavesAreTemporaryGuidance = Извлеките PPSSPP в постоянное хранилище SavesAreTemporaryIgnore = Игнорировать предупреждение UnpinPath = Открепить +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -611,11 +659,22 @@ Auto Analog Rotation (CW) = Автовращение аналогового ст AxisSwap = Смена осей Circle = Кружок Cross = Крестик +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad вниз D-pad left = D-pad влево D-pad right = D-pad вправо D-pad up = D-pad вверх DevMenu = Меню разраб. +Double tap button = Double tap button Down = Вниз Dpad = Крестовина Frame Advance = Перемотка кадров @@ -632,10 +691,11 @@ OpenChat = Открыть чат Pause = Пауза R = R RapidFire = Турбо кнопка +Record = Record Remote hold = Удалённый hold Rewind = Возврат Right = Вправо -Right Analog Stick (tap to customize) = Правый аналоговый стик (нажмите для настройки) +Right Analog Stick = Right Analog Stick RightAn.Down = Пр. стик вниз RightAn.Left = Пр. стик влево RightAn.Right = Пр. стик вправо @@ -649,6 +709,11 @@ Select = Select SpeedToggle = Скорость Square = Квадрат Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Дамп текстур Texture Replacement = Подмена текстур Toggle Fullscreen = Полноэкр. режим @@ -660,10 +725,39 @@ Vol + = Громкость + Vol - = Громкость - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Раздел многопользовательских игр на форуме AdHoc Server = Ad-hoc сервер AdhocServer Failed to Bind Port = Не удалось привязать порт ad-hoc сервера +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Авто Bottom Center = Внизу в центре Bottom Left = Внизу слева @@ -675,6 +769,7 @@ Change proAdhocServer Address = Изменить IP-адрес ad-hoc серве Chat = Чат Chat Button Position = Позиция кнопки чата Chat Here = Чат здесь +Chat message = Chat message Chat Screen Position = Позиция чата на экране Disconnected from AdhocServer = Соединение с ad-hoc сервером отключено DNS Error Resolving = Устранение ошибок DNS @@ -694,12 +789,16 @@ Failed to Bind Localhost IP = Не удалось привязать localhost I Failed to Bind Port = Не удалось привязать порт Failed to connect to Adhoc Server = Не удалось подключиться к ad-hoc серверу Forced First Connect = Принудительное первое подключение (быстрое подключение) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Некорректный IP или имя хоста Minimum Timeout = Минимальный таймаут (задержка в мс, 0 = по умолчанию) Misc = Прочее (по умолчанию = совместимость с PSP) Network Initialized = Сеть активирована +None = None Please change your Port Offset = Пожалуйста, измените ваше смещение порта Port offset = Смещение порта (0 = совместимость с PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Адрес ad-hoc сервера: Quick Chat 1 = Быстрый чат 1 Quick Chat 2 = Быстрый чат 2 @@ -733,6 +832,8 @@ Rewind = Возврат Save State = Сохранить Settings = Настройки Switch UMD = Сменить UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (дублированная настройка, используется предыдущий ползунок) @@ -763,6 +864,7 @@ Scanlines = Строки развертки (ЭЛТ) Sharpen = Резкость SSAA(Gauss) = SSAA (Гаусс) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Масштабирование Spline36 VideoSmoothingAA = Сглаживание видео Vignette = Виньетирование @@ -829,6 +931,8 @@ Stopping.. = Остановка... [Reporting] Bad = Плохо +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Ваши данные передаются в фоновом режиме. FeedbackDesc = Как эмуляция? Дайте знать нам и сообществу! FeedbackDisabled = Отчёты на сервер совместимости должны быть включены. @@ -854,6 +958,7 @@ Perfect Description = Безупречная эмуляция игры от на Plays = Нормально Plays Description = Полностью играбельно с незначительными глюками ReportButton = Отправить отзыв +Show disc CRC = Show disc CRC Speed = Скорость Submit Feedback = Отправить отзыв SuggestionConfig = Настройте эмулятор по отзывам на сайте. @@ -872,9 +977,11 @@ Date = Дата Filename = Имя файла No screenshot = Нет скриншота None yet. Things will appear here after you save. = Здесь ничего нет. Появится после сохранения. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Сохранения Save States = Состояния Savedata Manager = Управление сохранениями +Showing matches for '%1'. = Showing matches for '%1'. Size = Размер [Screen] @@ -887,6 +994,8 @@ GLToolsWarning = ВНИМАНИЕ: обнаружен GLTools, это может In menu = В меню Load savestate failed = Загрузка состояния не удалась Loaded State = Состояние загружено +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Загружено. Сохранитесь в игре, перезапустите игру и загрузите для исправления ошибок. LoadStateDoesntExist = Не удалось загрузить состояние: файл не существует! LoadStateWrongVersion = Не удалось загрузить состояние: файл состояния от старой версии PPSSPP! @@ -901,6 +1010,7 @@ saveNewTextures_false = Сохранение текстур отключено. saveNewTextures_true = Текстуры будут сохраняться в вашем хранилище. SpeedCustom2 = Скорость: другая 2 standard = Скорость: стандартная +State load undone = State load undone Untitled PSP game = Безымянная игра для PSP [Store] @@ -934,6 +1044,7 @@ D3DCompiler Version = Версия D3DCompiler Debug = Отладочная Debugger Present = Отладчик присутствует Device Info = Устройство +Directories = Directories Display Information = Информация о дисплее Driver Version = Версия драйвера EGL Extensions = Расширенния EGL @@ -957,6 +1068,7 @@ Release = Релизная RW/RX exclusive = Захват RW/RX Sample rate = Частота дискретизации Shading Language = Язык шейдеров +Storage = Storage Sustained perf mode = Режим длительной работы System Information = Информация о системе System Name = Название @@ -978,8 +1090,11 @@ AVI Dump started. = Дамп AVI запущен AVI Dump stopped. = Дамп AVI остановлен Cache ISO in RAM = Кэшировать ISO в ОЗУ Change CPU Clock = Эмулируемая частота ЦП PSP (нестабильно) -Change Memory Stick folder = Изменить папку с картой памяти -Change Memory Stick Size = Изменить размер карты памяти (Гб) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Изменить папку с картой памяти +Memory Stick size = Изменить размер карты памяти (Гб) Change Nickname = Изменить ник ChangingMemstickPath = Сохранения, состояния и другие данные НЕ будут скопированы в эту папку.\n\nИзменить папку с картой памяти? ChangingMemstickPathInvalid = Этот путь невозможно использовать для файлов карты памяти. @@ -1013,7 +1128,6 @@ General = Основные Grid icon size = Размер ярлыков в режиме сетки Help the PPSSPP team = Помочь команде PPSSPP Host (bugs, less lag) = Хост (ошибки, медленнее) -I/O on thread (experimental) = Ввод/вывод на поток (экспериментально) Ignore bad memory accesses = Игнорировать ошибки доступа к памяти Increase size = Увеличить размер Interpreter = Интерпретатор @@ -1023,14 +1137,19 @@ Memory Stick Folder = Папка с картой памяти Memory Stick inserted = Карта памяти вставлена MHz, 0:default = МГц, 0 = по умолчанию MMDDYYYY = ММДДГГГГ +Moving background = Moving background Newest Save = Самое новое сохранение +No animation = No animation Not a PSP game = Игра не для PSP Off = Отключено Oldest Save = Самое старое сохранение +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Модель PSP PSP Settings = Настройки PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Запись звука Record Display = Запись видео Reset Recording on Save/Load State = Сбрасывать запись при сохранении/загрузке @@ -1054,8 +1173,10 @@ Storage full = Диск заполнен Sustained performance mode = Режим длительной работы Time Format = Формат времени UI = Пользовательский интерфейс +UI background animation = UI background animation UI Sound = Звуки интерфейса undo %c = резервная копия %c +USB = USB Use Lossless Video Codec (FFV1) = Использовать видеокодек без потерь (FFV1) Use O to confirm = O для подтверждения Use output buffer (with overlay) for recording = Использовать выходной буфер (с оверлеем) для записи @@ -1064,6 +1185,7 @@ Use X to confirm = X для подтверждения VersionCheck = Проверять наличие обновлений PPSSPP WARNING: Android battery save mode is on = ВНИМАНИЕ: включен режим энергосбережения Android WARNING: Battery save mode is on = ВНИМАНИЕ: включен режим энергосбережения +Waves = Waves YYYYMMDD = ГГГГММДД [Upgrade] diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index e2dc9a63bd..81321aa913 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Volym vid alternativ hastighet Audio backend = Uppspelningsteknik (ändring kräver omstart!) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Auto -Device = Device +Device = Enhet +Disabled = Disabled DSound (compatible) = DSound (kompatibel) Enable Sound = Ljud Global volume = Global volym Microphone = Microphone -Microphone Device = Microphone device +Microphone Device = Mikrofon-enhet Mute = Tysta -Switch on new audio device = Switch on new audio device +Reverb volume = Volym på reverb-effekt +Use new audio devices automatically = Byt automatiskt till senast inkopplad ljudenhet Use global volume = Använd global volym WASAPI (fast) = WASAPI (snabb) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog känslighet +Analog Binding = Analog Binding Analog Limiter = Analog limiter Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) Analog Mapper Mode = Analog mapper mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Auto-hide buttons after seconds +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Knappgenomskinlighet Button style = Knappstil +Calibrate Analog Stick = Kalibrera analog styrspak Calibrate D-Pad = Kalibrera D-pad +Calibrated = Calibrated Calibration = Kalibrering +Circular stick input = Circular stick input Classic = Klassisk Combo Key Setting = Combo key setting Combo Key Setup = Combo key setup Confine Mouse = Stäng in muspekaren i fönstret Control Mapping = Kontrollmappning -Custom layout... = Anpassad layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Anpassad layout... Customize tilt = Anpassa tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone-radie +Deadzone radius = Deadzone-radie DInput Analog Settings = DInput analoga inställningar Disable D-Pad diagonals (4-way touch) = Slå av D-Pad-diagonaler (4-vägs touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ignorera gamepads i bakgrunden Ignore Windows Key = Ignorera Windows-tangenter Invert Axes = Omvända axlar @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R triggerknappar Landscape = Landskap Landscape Auto = Landskap auto Landscape Reversed = Landskap omvänt +Low end radius = Low end radius Mouse = Musinställningar Mouse sensitivity = Muskänslighet Mouse smoothing = Musutjämning @@ -65,21 +88,32 @@ OnScreen = Touch-kontroller på skärmen Portrait = Porträtt Portrait Reversed = Porträtt omvänt PSP Action Buttons = PSP action-knappar +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Skärmrotation seconds, 0 : off = seconds, 0 = off +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Känslighet +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Show Touch Pause Menu Button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Tunna kanter Tilt Base Radius = Tilt base radius Tilt Input Type = Lutningstyp Tilt Sensitivity along X axis = Lutningskänslighet X Tilt Sensitivity along Y axis = Lutningskänslighet Y To Calibrate = Lägg enheten på en plan yta och tryck "Kalibrera" för kalibrering. +Toggle mode = Toggle mode Touch Control Visibility = Touch control visibility Use custom right analog = Use custom right analog -Use Mouse Control = Use mouse control +Use Mouse Control = Tillåt mus-kontroll Visibility = Synlighet +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Uppdateringsfrekvens #Font = Trebuchet MS About PPSSPP... = Om PPSSPP... Auto = Auto +Auto Max Quality = Auto Max &Quality Backend = Backend Bicubic = Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = Mer inställningar... Nearest = Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = Off +Open Chat = Open Chat Open Directory... = Öppna mapp... Open from MS:/PSP/GAME... = Öppna från MS:/PSP/GAME... Open Memory Stick = Öppna Memory Stick @@ -229,6 +265,7 @@ No block = Inget block Prev = Föregående Random = Slump Replace textures = Ersätt texturer +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Vill du verkligen ta bort inställningarna för det h DeleteFailed = Misslyckades ta bort data. Deleting = Tar bort\nVänta... Disable All = Stäng av allt +Dumps = Dumps Edit = Edit Enable All = Slå på allt Enter = Enter +Filter = Filter Finish = Färdig +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Spara Save completed = Sparat. Saving = Sparar\nVänta... SavingFailed = Kunde inte spara data. +Search = Search Select = Välj Shift = Skift +Skip = Skip Snap = Snap Space = Mellanslag SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Ta bort Create Game Config = Skapa spelconfig Create Shortcut = Skapa genväg @@ -430,6 +473,7 @@ Auto = Auto Auto (1:1) = Auto (1:1) Auto (same as Rendering) = Auto (samma som rendering) Auto FrameSkip = Auto FrameSkip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balancerad @@ -440,25 +484,25 @@ Both = Båda Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) Buffered Rendering = Buffrad rendering BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". -Camera = Camera -Camera Device = Camera device +Camera = Kamera +Camera Device = Kamera-enhet Cardboard Screen Size = Screen size (in % of the viewport) Cardboard Screen X Shift = X shift (in % of the blank space) Cardboard Screen Y Shift = Y shift (in % of the blank space) Cardboard VR Settings = Google Cardboard VR settings -Cheats = Cheats +Cheats = Fusk Clear Speedhack = Clear framebuffers on first use (speed hack) ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches -CPU Core = CPU core +CPU Core = CPU-kärna Debugging = Debuggning DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. Deposterize = Deposterize Deposterize Tip = Fixes visual banding glitches in upscaled textures -Device = Device +Device = Enhet Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 Disable slower effects (speedup) = Stäng av långsamma effects (speedup) -Disabled = Disabled +Disabled = Avstängd Display layout editor = Skärmlayouteditor Display Resolution (HW scaler) = Skärmupplösning (HW scaler) Dump next frame to log = Dumpa nästa frame till log @@ -469,22 +513,22 @@ Frame Skipping = Frameskipping Frame Skipping Type = Frame skipping type FullScreen = Fullskärm Hack Settings = Hack-inställningar (kan orsaka problem) -Hardware Tessellation = Hardware tessellation +Hardware Tessellation = Hårdvarutessellering Hardware Transform = Hårdvarutransform hardware transform error - falling back to software = Hardware transform error, falling back to software -HardwareTessellation Tip = Uses hardware to make curves +HardwareTessellation Tip = Använder hårdvara (vertex shaders) för att rita kurvor High = High Hybrid = Hybrid Hybrid + Bicubic = Hybrid + Bicubic -Ignore camera notch when centering = Ignore camera notch when centering -Internal Resolution = Internal resolution +Ignore camera notch when centering = Ignorera kamerahål vid centrering +Internal Resolution = Intern upplösning Lazy texture caching = Lazy texture caching (speedup) Linear = Linjär Low = Low LowCurves = Spline/Bezier kvalitet LowCurves Tip = Only used by some games, controls smoothness of curves Lower resolution for effects (reduces artifacts) = Lägre upplösning för effekter (bättre kvalitet) -Manual Scaling = Manual scaling +Manual Scaling = Manuell skalning Medium = Medium Mode = Mode Must Restart = Starta om PPSSPP för att ändringen ska få effekt. @@ -493,12 +537,12 @@ Nearest = Närmast No buffer = No buffer Non-Buffered Rendering = Skippa buffereffekter (snabbare, risk för fel) None = Inget -Number of Frames = Number of frames +Number of Frames = Antal frames Off = Off OpenGL = OpenGL Overlay Information = Overlay-information Partial Stretch = Partial stretch -Percent of FPS = Percent of FPS +Percent of FPS = Procent av FPS Performance = Prestanda Postprocessing effect = Postprocessing effects Postprocessing Shader = Postprocessing-Shader @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Autokonfiguration Autoconfigure for device = Autokonfigurera för enhet +Bind All = Bind All Clear All = Rensa Default All = Återställ allt Map a new key for = Mappa ny knapp för Map Key = Mappa tangent Map Mouse = Mappa mus +Replace = Replace +Show PSP = Show PSP Test Analogs = Testa analoger You can press ESC to cancel. = Tryck ESC för att avbryta. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignorera varning UnpinPath = Lossa +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Byt axlar Circle = Cirkel Cross = X +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Dpad Ner Dpad = Dpad Frame Advance = Stega frame @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Paus R = R RapidFire = Rapid-fire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Dpad Höger -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Speed toggle Square = Kvadrat Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Växla fullskärm @@ -660,9 +725,9 @@ Vol - = Vol - Wlan = WLAN [Networking] -Adhoc Multiplayer forum = Adhoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +739,7 @@ Change proAdhocServer Address = Ändra proAdhocServer-adress (localhost = multip Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -683,30 +749,34 @@ Enable networking = Nätverk/wlan (beta) Enable UPnP = Enable UPnP (need a few seconds to detect) EnableQuickChat = Enable quick chat Enter a new PSP nickname = Enter a new PSP nickname -Enter Quick Chat 1 = Enter quick chat 1 -Enter Quick Chat 2 = Enter quick chat 2 -Enter Quick Chat 3 = Enter quick chat 3 -Enter Quick Chat 4 = Enter quick chat 4 -Enter Quick Chat 5 = Enter quick chat 5 +Enter Quick Chat 1 = Snabbchat 1 +Enter Quick Chat 2 = Snabbchat 2 +Enter Quick Chat 3 = Snabbchat 3 +Enter Quick Chat 4 = Snabbchat 4 +Enter Quick Chat 5 = Snabbchat 5 Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Ogiltigt IP eller hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Nätverk initierat +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: -Quick Chat 1 = Quick chat 1 -Quick Chat 2 = Quick chat 2 -Quick Chat 3 = Quick chat 3 -Quick Chat 4 = Quick chat 4 -Quick Chat 5 = Quick chat 5 -QuickChat = Quick chat -Send = Send +Quick Chat 1 = Snabbchat 1 +Quick Chat 2 = Snabbchat 2 +Quick Chat 3 = Snabbchat 3 +Quick Chat 4 = Snabbchat 4 +Quick Chat 5 = Snabbchat 5 +QuickChat = Snabbchat +Send = Skicka Send Discord Presence information = Visa Discord "Rich Presence"-information TCP No Delay = TCP No Delay (faster TCP) Top Center = Top center @@ -732,6 +802,8 @@ Rewind = Spola tillbaka Save State = Spara state Settings = Inställningar Switch UMD = Byt UMD +Undo last load = Ångra senaste ladd +Undo last save = Ångra senaste spar [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +834,7 @@ Scanlines = Scanlines Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = UpscaleSpline36 VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -806,6 +879,35 @@ Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Kolla in webbsidan: written = Skriven i C++ - prestanda och portabilitet +[MemStick] +Already contains PSP data = Innehåller redan PSP-data +Create or Choose a PSP folder = Skapa eller välj en PSP-mapp +Current = Nuvarande +DataCanBeShared = Data kan delas mellan PPSSPP vanlig/Gold +DataCannotBeShared = Data KAN INTE delas mellan PPSSPP vanlig/Gold! +DataWillBeLostOnUninstall = Varning! Data kommer förloras om du avinstallerar PPSSPP! +DataWillStay = Data stannar kvar även om du avinstallerar PPSSPP. +Done! = Klar! +EasyUSBAccess = Lätt åtkomst via USB +Failed to move some files! = Misslyckades att flytta några filer! +Failed to save config = Misslyckades att spara konfiguration +Free space = Ledig plats +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Välj var PSP-data ska lagras (Memory Stick) +Move Data = Flytta data +Selected PSP Data Folder = Vald PSP-data-mapp +No data will be changed = Ingen data kommer ändras +PPSSPP will restart after the change = PPSSPP kommer att starta om efter ändringen +Skip for now = Skippa för tillfället +Starting move... = Startar flytt... +That folder doesn't work as a memstick folder. = Den mappen funkar inte som PSP-data-mapp. +USBAccessThrough = USB-åtkomst genom Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB-åtkomst genom Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Använd "App Private Data" +Use PSP folder at root of storage = Använd PSP-mapp i roten av lagringsutrymmet +Welcome to PPSSPP! = Välkommen till PPSSPP! +WhatsThis = Vad är detta? + [RemoteISO] Browse Games = Bläddra bland spel Local Server Port = Lokal serverport @@ -814,20 +916,22 @@ Remote disc streaming = Remote disc streaming Remote Port = Remote port Remote Server = Remote server Remote Subdirectory = Remote subdirectory -RemoteISODesc = Games in your recent list will be shared -RemoteISOLoading = Connected, loading game list... +RemoteISODesc = Spel i din Senast-lista kommer delas +RemoteISOLoading = Uppkopplad, laddar spel-lista... RemoteISOScanning = Scanning... Click "share games" on your server device RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings -RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network -RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing -Settings = Settings -Share Games (Server) = Share games (server) -Share on PPSSPP startup = Share on PPSSPP startup -Stop Sharing = Stop sharing -Stopping.. = Stopping... +RemoteISOWifi = Notera: Koppla båda enheterna till samma Wi-Fi-nätverk +RemoteISOWinFirewall = VARNING: Windows Firewall blockerar delning +Settings = Inställningar +Share Games (Server) = Dela spel (server) +Share on PPSSPP startup = Börja dela när PPSSPP startar +Stop Sharing = Sluta dela +Stopping.. = Slutar... [Reporting] Bad = Dåligt +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Din data håller på att skickas i bakgrunden. FeedbackDesc = Hur funkar emuleringen? Berätta! FeedbackDisabled = Kompatibilitets-server-rapporter måste vara påslagna.. @@ -853,6 +957,7 @@ Perfect Description = Klockren emulering genom hela spelet - perfekt! Plays = Spelbart Plays Description = Fullt spelbart men det kan finnas små problem ReportButton = Rapportera feedback +Show disc CRC = Show disc CRC Speed = Hastighet Submit Feedback = Skicka in feedback SuggestionConfig = See reports on website for good settings. @@ -861,7 +966,7 @@ SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this b SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. SuggestionsNone = This game isn't working for other users too. SuggestionsWaiting = Submitting and checking other users feedback... -SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionUpgrade = Uppgradera till en nyare version av PPSSPP. SuggestionVerifyDisc = Check your ISO is a good copy of your disc. Unselected Overall Description = Hur bra funkar detta spel att emulera? View Feedback = Visa all feedback @@ -871,13 +976,15 @@ Date = Datum Filename = Filnamn No screenshot = Ingen skärmdump None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Sparad data Save States = Sparade states Savedata Manager = Savedata manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] -Cardboard VR OFF = Cardboard VR off +Cardboard VR OFF = Cardboard VR av Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. Failed to load state = Misslyckades ladda state Failed to save state = Misslyckades spara state @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = I menyn Load savestate failed = Misslyckades ladda state Loaded State = State laddat +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Misslyckades ladda state: Savestate doesn't exist! LoadStateWrongVersion = Misslyckades ladda state: Savestate is for an older version of PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Hastighet: standard +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,14 +1089,17 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cachea hela ISO:n i RAM Change CPU Clock = Ändra CPU-frekvens (kan orsaka instabilitet) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick-mapp +Memory Stick size = Memory Stick-storlek Change Nickname = Ändra nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? Cheats = Fuskkoder -Clear Recent = Clear "Recent" +Clear Recent = Rensa "Senast spelat" Clear Recent Games List = Rensa "Senast spelat" Clear UI background = Ta bort UI-bakgrund Confirmation Button = Bekräftelseknapp @@ -1012,8 +1127,7 @@ General = Blandat Grid icon size = Grid icon size Help the PPSSPP team = Stöd PPSSPP-teamet Host (bugs, less lag) = Host (bugs, mindre lagg) -I/O on thread (experimental) = I/O on thread (experimental) -Ignore bad memory accesses = Ignore bad memory accesses +Ignore bad memory accesses = Ignorera felaktiga minnesåtkomster Increase size = Increase size Interpreter = Interpreter IO timing method = IO-timingsmetod @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick insatt MHz, 0:default = MHz, 0 = standard MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Inte ett PSP-spel Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP-modell PSP Settings = PSP-inställningar PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Spela in audio till fil Record Display = Spela in video till fil Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Lagringsutrymme fullt Sustained performance mode = Sustained performance mode Time Format = Tidsformat UI = Användargränssnitt +UI background animation = UI background animation UI Sound = Ljud i användargränssnittet undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Använd förlust-fri video codec (FFV1) Use O to confirm = Använd O för att bekräfta Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,10 +1184,11 @@ Use X to confirm = Använd X för att bekräfta VersionCheck = Kolla efter nya versioner av PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] -Details = Details +Details = Detaljer Dismiss = Stäng Download = Ladda ner New version of PPSSPP available = Ny version av PPSSPP tillgänglig diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 3cf91bf450..9861a610da 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Audio backend (Kailangan pang i-Restart) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) Auto = Awto Device = Device +Disabled = Disabled DSound (compatible) = DSound (Komportable) Enable Sound = Paganahin ang Tunog Global volume = Kahinaan/Kalakasan ng Tunog Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (Mabilis) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog axis sensitivity +Analog Binding = Analog Binding Analog Limiter = Taga limit ng Analog Analog Mapper High End = Analog Mapper High-End (axis sensitivity) Analog Mapper Low End = Analog Mapper Low-End (Kabaliktaran ng Deadzone) Analog Mapper Mode = Analog Mapper Mode +Analog Settings = Analog Settings Analog Stick = Analog stick +Analog Style = Analog Style AnalogLimiter Tip = When the analog limiter button is pressed Auto = Awto Auto-centering analog stick = Auto-centering analog stick Auto-hide buttons after seconds = Itago ang mga Buton Tapos ng Ilang Segundo +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Kalinawan ng mga Buton Button style = Istylu ng mga Buton +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Calibrate +Calibrated = Calibrated Calibration = Calibration +Circular stick input = Circular stick input Classic = Classic Combo Key Setting = Combo Key Setting Combo Key Setup = Combo Key Setup Confine Mouse = Trap mouse within window/display area Control Mapping = Pagtakda ng Kontrol -Custom layout... = Edit touch control layout... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Edit touch control layout... Customize tilt = I-Customize ang tilt... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Deadzone radius DInput Analog Settings = DInput analog settings Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = Haptic feedback (vibration) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Wag pansinin ang gamepads kapag hindi naka-focus Ignore Windows Key = Wag Paganahin ang Windows key Invert Axes = Invert axes @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R trigger buttons Landscape = Pahiga Landscape Auto = Landscape auto Landscape Reversed = Pabaliktad na Pahiga +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = Mouse sensitivity Mouse smoothing = Mouse smoothing @@ -65,21 +88,32 @@ OnScreen = Pindutan sa Iskrin Portrait = Patayo Portrait Reversed = Pabaliktad na Patayo PSP Action Buttons = PSP action buttons +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Rotation ng Screen seconds, 0 : off = segundo, 0 = patay +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Sensitivity +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Ipakita ang Pause Menu Button +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Thin borders Tilt Base Radius = Tilt base radius Tilt Input Type = Tilt input type Tilt Sensitivity along X axis = Tilt sensitivity along X axis Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis To Calibrate = Para Ma-Calibrate, ilagay ang device sa flat na bagay at i-tap ang "Calibrate" +Toggle mode = Toggle mode Touch Control Visibility = Touch Control Visibility Use custom right analog = Use custom right analog Use Mouse Control = Use mouse control Visibility = Kalinawan +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput analog settings @@ -99,6 +133,7 @@ Refresh Rate = Refresh rate #Font = Trebuchet MS About PPSSPP... = Tungkol sa PPSSPP... Auto = &Awto +Auto Max Quality = Auto Max &Quality Backend = Rendering &Backend (Restarts PPSSPP) Bicubic = &Bicubic Break = Break @@ -150,6 +185,7 @@ More Settings... = &Iba pang Settings... Nearest = &Nearest Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) Off = &Off +Open Chat = Open Chat Open Directory... = Buksan ang &Directory... Open from MS:/PSP/GAME... = I-O&pen mula sa MS:/PSP/GAME... Open Memory Stick = Buksan ang &Memory Stick @@ -229,6 +265,7 @@ No block = No block Prev = Nakalipas Random = Random Replace textures = Replace textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Sigurado ka bang ibalik ang Setting sa dati?\nAng Control Mapping Settings ay di mababago.\n\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. RestoreGameDefaultSettings = Sigurado ka bang ibalik sa dati\nang Setting ng isang spesipikong laro?\n\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Sigurado ka bang burahin ang settings ng larong ito? DeleteFailed = Hindi mabura ang datos. Deleting = Binubura...\nSandali lamang... Disable All = Disable all +Dumps = Dumps Edit = Edit Enable All = Enable all Enter = Pumasok +Filter = Filter Finish = Tapusin +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Inactive InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = I-Save Save completed = Kumpletong nai-Save. Saving = Sandali lamang...\nKasalukuyang nagsesave SavingFailed = Hindi mai-save ang datos. +Search = Search Select = Piliin Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Burahin Create Game Config = Gumawa ng Game Config Create Shortcut = Gumawa ng Shortcut @@ -430,6 +473,7 @@ Auto = Awto Auto (1:1) = Awto (1:1) Auto (same as Rendering) = Auto (Kapareho sa Renderig Resolution) Auto FrameSkip = Auto frameskip +Auto Max Quality = Auto Max Quality Auto Scaling = Auto scaling Backend = Backend Balanced = Balanse @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Auto configure Autoconfigure for device = Autoconfigure for device +Bind All = Bind All Clear All = Burahin Lahat Default All = Ibalik lahat sa dati Map a new key for = Bagong key para sa Map Key = Map key Map Mouse = Map mouse +Replace = Replace +Show PSP = Show PSP Test Analogs = Test analogs You can press ESC to cancel. = You can press Esc to cancel. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP is saving in temporary storage SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently SavesAreTemporaryIgnore = Ignore warning UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Axis swap Circle = Circle Cross = Cross +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = Baba Dpad = Dpad Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Hinto R = R RapidFire = RapidFire +Record = Record Remote hold = Remote hold Rewind = Rewind Right = Kanan -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = KanangAn.Baba RightAn.Left = KanangAn.Kaliwa RightAn.Right = KanangAn.Kanan @@ -648,6 +708,11 @@ Select = Select SpeedToggle = SpeedToggle Square = Square Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Network initialized +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = i-Rewind Save State = i-Save Settings = Settings Switch UMD = Magpalit ng UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = Stopping... [Reporting] Bad = Masama +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Your data is being submitted in the background. FeedbackDesc = Kamusta ang pag-emulate? Paalamin ang Komunidad. FeedbackDisabled = Compatibility server reports must be enabled. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = Plays Plays Description = Fully playable but might be with glitches ReportButton = Mag-Report +Show disc CRC = Show disc CRC Speed = Bilis Submit Feedback = I-Submit ang Feedback SuggestionConfig = See reports on website for good settings. @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = Walang Screenshot None yet. Things will appear here after you save. = Wala pa. Makikita mo dito kapag may na-savestate ka na +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = I-Save ang Datos Save States = Save States Savedata Manager = Savedata Manager +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: GLTools detected, may cause problems. In menu = In menu Load savestate failed = Sablay sa pag load ng savestate Loaded State = Estado ay nai- load +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. LoadStateDoesntExist = Problema sa load state: Walang Savestate! LoadStateWrongVersion = Problema sa load state: Ang Savestate ay para sa lumang bersyon ng PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Speed: alternate 2 standard = Bilis: Karaniwan +State load undone = State load undone Untitled PSP game = Untitled PSP game [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Baguhin ang PSP CPU Clock (unstable) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Baguhin ang Palayaw ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Pangkalahatan Grid icon size = Grid icon size Help the PPSSPP team = Tulongan ang PPSSPP Team Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Interpreter @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Memory Stick inserted MHz, 0:default = MHz, 0 = default MMDDYYYY = BBPPTTTT +Moving background = Moving background Newest Save = Newest save +No animation = No animation Not a PSP game = Not a PSP game Off = Off Oldest Save = Oldest save +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = Ayos ng PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Record audio Record Display = Record display Reset Recording on Save/Load State = Reset recording on Save/Load state @@ -1053,8 +1172,10 @@ Storage full = Storage full Sustained performance mode = Sustained performance mode Time Format = Pormat ng Oras UI = UI +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) Use O to confirm = O para pumili Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = X para pumili VersionCheck = Check for new versions of PPSSPP WARNING: Android battery save mode is on = WARNING: Android battery save mode is On WARNING: Battery save mode is on = WARNING: Battery save mode is on +Waves = Waves YYYYMMDD = TTTTBBPP [Upgrade] diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 6fc59dc420..6691092d67 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -1,6 +1,7 @@ [Audio] Alternate speed volume = ระดับเสียงในโหมดเร่งความเร็ว Audio backend = รูปแบบเสียงที่สนับสนุน (จำเป็นต้องรีสตาร์ท) +Audio Error = ระบบเสียงเกิดข้อผิดพลาด AudioBufferingForBluetooth = บลูทูธ-เฟรนด์ลี่ บัฟเฟอร์ (ช้ากว่า) Auto = อัตโนมัติ Device = อุปกรณ์ @@ -17,7 +18,6 @@ Use new audio devices automatically = สลับไปใช้อุปกร WASAPI (fast) = WASAPI (เร็ว) [Controls] -Analog auto-rotation speed = ความเร็วที่ใช้หมุนปุ่มอนาล็อก Analog Axis Sensitivity = ความไวต่อการตอบสนองแกนอนาล็อก Analog Binding = เซ็ตปุ่มควบคุมอนาล็อก Analog Limiter = ตัวจำกัดปุ่มอนาล็อก @@ -38,31 +38,33 @@ Binds = เซ็ตปุ่ม Button Binding = เซ็ตปุ่มควบคุม Button Opacity = ความชัดของปุ่มกด Button style = รูปแบบของปุ่มกด -Button Style = รูปแบบของปุ่มกด Calibrate Analog Stick = ปรับค่าความคลาดเคลื่อนปุ่มอนาล็อก -Calibrate D-Pad = ปรับค่าความคลาดเคลื่อน +Calibrate D-Pad = ปรับค่าความคลาดเคลื่อนปุ่มลูกศร Calibrated = ค่าความคลาดเคลื่อนที่ปรับ Calibration = ปรับค่าความคลาดเคลื่อน -Circular stick input = ค่านำเข้าของปุ่มหมุน +Circular stick input = ค่านำเข้าหมุนปุ่ม Classic = แบบดั้งเดิม Combo Key Setting = ตั้งค่าปุ่มคอมโบ Combo Key Setup = ติดตั้งปุ่มคอมโบ Confine Mouse = จำกัดเมาส์ภายในหน้าต่าง/พื้นที่แสดงผล Control Mapping = เปลี่ยนแปลงค่าควบคุม Custom Key Setting = ติดตั้งปุ่มคอมโบปรับแต่ง -Custom layout... = ปรับเปลี่ยนการควบคุมแบบสัมผัส... Customize = ปรับแต่ง Customize tilt = ปรับแต่งการเอียงโดยใช้เซ็นเซอร์ควบคุม... Customize Touch Controls = ปรับแต่งปุ่มควบคุมสัมผัสหน้าจอ D-PAD = ปุ่มลูกศร Deadzone radius = รัศมีของ Deadzone -Deadzone Radius = รัศมีของ Deadzone DInput Analog Settings = ตั้งค่าอนาล็อกของจอย DInput Disable D-Pad diagonals (4-way touch) = ปิดการใช้งานปุ่มลูกศรในแนวทแยง (สัมผัส 4 ทิศทาง) Disable diagonal input = ปิดการใช้งานอนาล็อกในแนวทแยง +Double tap = แตะสองครั้ง +Enable gesture control = เปิดการควบคุมปัดหน้าจอสัมผัส Enable standard shortcut keys = เปิดการใช้งานปุ่มคีย์ลัดแบบพื้นฐาน +Gesture = ปัดจอ +Gesture mapping = เซ็ตปุ่มควบคุมปัดหน้าจอสัมผัส Glowing borders = แบบขอบทึบแสง HapticFeedback = ตอบสนองเมื่อสัมผัส (การสั่น) +Hide touch analog stick background circle = ซ่อนพื้นหลังวงกลมของปุ่มอนาล็อก Icon = รูปปุ่ม Ignore gamepads when not focused = ละเว้นต่อปุ่มกดเมื่อไม่ได้ใช้หน้าจอนั้น Ignore Windows Key = ละเว้นการใช้งานปุ่มวินโดวส์ @@ -97,9 +99,12 @@ Sensitivity (scale) = ความไวการตอบสนอง Shape = กรอบปุ่ม Show right analog = โชว์ปุ่มอนาล็อกขวา Show Touch Pause Menu Button = แสดงปุ่มหยุดสำหรับเข้าหน้าเมนู +Swipe = ปัดหน้าจอ +Swipe sensitivity = ความแรงที่ใช้ปัดหน้าจอ +Swipe smoothing = ความลื่นไหลในการปัดหน้าจอ Thin borders = แบบขอบบาง Tilt Base Radius = รัศมีของการเอียง -Tilt Input Type = นำเข้ารูปแบบการเอียง +Tilt Input Type = รูปแบบนำเข้าการเอียง Tilt Sensitivity along X axis = ความไวต่อการตอบสนองเอียงตามแกน X Tilt Sensitivity along Y axis = ความไวต่อการตอบสนองเอียงตามแกน Y To Calibrate = ให้วางอุปกรณ์ลงบนพื้นราบ และกด "ปรับค่าความคลาดเคลื่อน" @@ -128,6 +133,7 @@ Refresh Rate = อัตรารีเฟรช #Font = Trebuchet MS About PPSSPP... = เกี่ยวกับ PPSSPP... Auto = อัตโนมัติ +Auto Max Quality = แบบคุณภาพสูงสุด Backend = การแสดงผลที่สนับสนุน (ต้องรีสตาร์ท PPSSPP) Bicubic = ไบคิวบิค Break = หยุด @@ -309,6 +315,7 @@ Dumps = ไฟล์ดั๊มพ์ Edit = แก้ไข Enable All = เปิดใช้งานทั้งหมด Enter = ยืนยัน +Filter = ตัวกรอง Finish = สิ้นสุด GE Frame Dumps = ไฟล์กราฟิกเอนจิ้นเฟรมดั๊มพ์ Grid = กริด @@ -336,6 +343,7 @@ SavingFailed = ไม่สามารถบันทึกข้อมูล Search = ค้นหา Select = เลือก Shift = เปลี่ยน +Skip = ข้าม Snap = ขยับ Space = เว้นวรรค SSID = SSID @@ -465,6 +473,7 @@ Auto = อัตโนมัติ Auto (1:1) = อัตโนมัติ (1:1) Auto (same as Rendering) = อัตโนมัติ (ค่าเดียวกับที่ใช้แสดงผลภาพ) Auto FrameSkip = ข้ามเฟรมอัตโนมัติ +Auto Max Quality = แบบคุณภาพสูงสุด Auto Scaling = สเกลอัตโนมัติ Backend = การสนับสนุนกราฟิก Balanced = สมดุล @@ -590,11 +599,14 @@ Zip file does not contain PSP software = ไฟล์ ZIP นี้ ไม่ม [KeyMapping] Autoconfigure = ค่าอัตโนมัติ Autoconfigure for device = กำหนดค่าให้อัตโนมัติสำหรับอุปกรณ์นี้ +Bind All = เซ็ตปุ่มทั้งหมด Clear All = ล้างทั้งหมด Default All = คืนค่าเดิมทั้งหมด Map a new key for = ปรับปุ่มใหม่สำหรับ Map Key = ตั้งค่าปุ่ม Map Mouse = ตั้งค่าปุ่มเมาส์ +Replace = แทนที่ +Show PSP = แสดง PSP Test Analogs = ทดสอบอนาล็อก You can press ESC to cancel. = คุณสามารถกด ESC เพื่อยกเลิกได้ @@ -603,7 +615,6 @@ Browse = เรียกใช้... Buy PPSSPP Gold = ซื้อ PPSSPP Gold Choose folder = เลือกโฟลเดอร์ Credits = เครดิต -PPSSPP Homebrew Store = ดาวน์โหลดจาก PPSSPP โฮมบริวสโตร์ Exit = ออก Game Settings = ตั้งค่าเกม Games = เกมอื่นๆ @@ -615,6 +626,7 @@ Load = โหลดเกม... Loading... = กำลังโหลด... PinPath = ปักหมุด PPSSPP can't load games or save right now = --- ไม่สามารถโหลดเข้าเกมหรือข้อมูลเซฟได้ในขณะนี้ --- +PPSSPP Homebrew Store = ดาวน์โหลดจาก PPSSPP โฮมบริวสโตร์ Recent = เกมที่พึ่งเล่นล่าสุด SavesAreTemporary = PPSSPP จะเซฟข้อมูลในโฟลเดอร์ชั่วคราว SavesAreTemporaryGuidance = แนะนำให้แตกไฟล์ PPSSPP ก่อนที่จะใช้งานนะจ้ะ เซฟจะได้ไม่บิน @@ -640,10 +652,6 @@ An.Right = อนาล็อกขวา An.Up = อนาล็อกขึ้น Analog limiter = ตัวจำกัดปุ่มอนาล็อก Analog Stick = ปุ่มอนาล็อก -Arrow down = ลูกศรลง -Arrow left = ลูกศรซ้าย -Arrow right = ลูกศรขวา -Arrow up = ลูกศรขึ้น Audio/Video Recording = อัดบันทึกวีดีโอ/เสียง Auto Analog Rotation (CCW) = หมุนอนาล็อกอัตโนมัติ (ทวนเข็ม) Auto Analog Rotation (CW) = หมุนอนาล็อกอัตโนมัติ (ตามเข็ม) @@ -665,16 +673,14 @@ D-pad left = ปุ่มลูกศรซ้าย D-pad right = ปุ่มลูกศรขวา D-pad up = ปุ่มลูกศรขึ้น DevMenu = เมนูผู้พัฒนา +Double tap button = กดเบิ้ลสองทีที่ปุ่ม Down = ลูกศรลง -Down Triangle = สามเหลี่ยมกลับหัว Dpad = ลูกศร Fast-forward = เร่งความเร็ว Frame Advance = เฟรมขั้นสูง -Gear = ฟันเฟือง Hold = ระงับ Home = หน้าหลัก L = แอล -L button = ปุ่มแอล Left = ลูกศรซ้าย Load State = โหลดสเตทเกม Mute toggle = ปิดเสียง @@ -683,15 +689,11 @@ None = ไม่มี Note = หมายเหตุ OpenChat = เปิดแชท Pause = หยุดชั่วคราว -Plus = บวก R = อาร์ -R button = ปุ่มอาร์ RapidFire = กดรัวต่อเนื่อง Record = บันทึกหน้าจอ -Rectangle = สี่เหลี่ยมพื้นผ้า Remote hold = หยุดการใช้รีโมท Rewind = โหลดสเตทพื้นหลัง -Rhombus = สี่เหลี่ยมเปียกปูน Right = ลูกศรขวา Right Analog Stick = ปุ่มอนาล็อกขวา RightAn.Down = อนาล็อก(ขวา)ลง @@ -707,6 +709,10 @@ Select = ซีเล็คท์ SpeedToggle = สับเปลี่ยนความเร็ว Square = สี่เหลี่ยม Start = สตาร์ท +Swipe Down = ปัดลง +Swipe Left = ปัดซ้าย +Swipe Right = ปัดขวา +Swipe Up = ปัดขึ้น tap to customize = กดตั้งค่าเพิ่มเติม Texture Dumping = บันทึกพื้นผิว Texture Replacement = แทนที่พื้นผิว @@ -714,14 +720,43 @@ Toggle Fullscreen = ปรับเต็มหน้าจอ Toggle mode = โหมดสับเปลี่ยน Triangle = สามเหลี่ยม Up = ลูกศรขึ้น -Vertical Rectangle = สี่เหลี่ยมพื้นผ้าแนวตั้ง Vol + = เพิ่มเสียง Vol - = ลดเสียง Wlan = เครือข่าย +[MemStick] +Already contains PSP data = มีข้อมูลอยู่ข้างในนั้น +Create or Choose a PSP folder = สร้างหรือเลือกโฟลเดอร์เก็บข้อมูล PSP +Current = ที่ใช้อยู่ +DataCanBeShared = ข้อมูลสามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง +DataCannotBeShared = ข้อมูลไม่สามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง! +DataWillBeLostOnUninstall = คำเตือน! ข้อมูลอาจจะสูญหาย เมื่อคุณถอนการติดตั้ง PPSSPP! +DataWillStay = ข้อมูลจะยังคงอยู่ ถึงแม้ว่าจะถอนการติดตั้ง PPSSPP ออกไปแล้ว +Done! = เรียบร้อย! +EasyUSBAccess = การเข้าถึงข้อมูลทำได้ง่าย +Failed to move some files! = ล้มเหลวในการย้ายบางไฟล์! +Failed to save config = ล้มเหลวในการบันทึกตั้งค่า +Free space = พื้นที่ว่าง +Manually specify PSP folder = ใช้โฟลเดอร์ PSP แบบกำหนดเส้นทางเอง +MemoryStickDescription = เลือกแหล่งที่เก็บข้อมูล PSP (เม็มโมรี่ สติ๊ก) +Move Data = ย้ายข้อมูล +No data will be changed = ไม่มีข้อมูลอะไรถูกเปลี่ยนแปลง +PPSSPP will restart after the change = PPSSPP จะรีสตาร์ทใหม่หลังจากปรับเปลี่ยนตั้งค่า +Selected PSP Data Folder = โฟลเดอร์ข้อมูล PSP ที่เลือกไว้ +Skip for now = ข้ามไปก่อน +Starting move... = กำลังเริ่มการย้าย... +That folder doesn't work as a memstick folder. = โฟลเดอร์นั้นไม่สามารถนำมาใช้เป็นโฟลเดอร์แหล่งที่เก็บข้อมูลได้ +USBAccessThrough = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = ใช้แหล่งเก็บข้อมูลแอพแบบส่วนบุคคล +Use PSP folder at root of storage = ใช้โฟลเดอร์ PSP ที่ต้นทางของแหล่งเก็บข้อมูลเครื่อง +Welcome to PPSSPP! = ยินดีต้อนรับสู่ PPSSPP! +WhatsThis = นี่คืออะไร? + [Networking] AdHoc Server = เซิร์ฟเวอร์ Adhoc AdhocServer Failed to Bind Port = เซิร์ฟเวอร์ Adhoc ล้มเหลวในการเชื่อมโยงพอร์ต +AM: Data from Unknown Port = AM: ข้อมูลมาจากพอร์ตที่ไม่รู้จัก Auto = อัตโนมัติ Bottom Center = มุมล่างกลางจอ Bottom Left = มุมล่างซ้ายจอ @@ -733,6 +768,7 @@ Change proAdhocServer Address = เปลี่ยนไอพีที่อย Chat = แชท Chat Button Position = ปุ่มตำแหน่งแชท Chat Here = แชทที่นี่ +Chat message = ข้อความแชท Chat Screen Position = ตำแหน่งหน้าต่างแชท Disconnected from AdhocServer = เซิร์ฟเวอร์ Adhoc ถูกตัดขาดการเชื่อมต่อ DNS Error Resolving = กำลังแก้ไขข้อผิดพลาดของ DNS @@ -747,11 +783,13 @@ Enter Quick Chat 2 = ข้อความแชทด่วน 2 Enter Quick Chat 3 = ข้อความแชทด่วน 3 Enter Quick Chat 4 = ข้อความแชทด่วน 4 Enter Quick Chat 5 = ข้อความแชทด่วน 5 -Error = เออเร่อร์ +Error = มีข้อผิดพลาด Failed to Bind Localhost IP = เชื่อมโยง Localhost IP ไม่สำเร็จ Failed to Bind Port = ล้มเหลวในการเชื่อมโยงพอร์ต Failed to connect to Adhoc Server = ล้มเหลวในการเชื่อมต่อกับเซิร์ฟเวอร์ Adhoc Forced First Connect = บังคับการเชื่อมต่อในครั้งแรกสุด +GM: Data from Unknown Port = GM: ข้อมูลมาจากพอร์ตที่ไม่รู้จัก +Hostname = ชื่อหัวห้อง Invalid IP or hostname = ไอพี หรือ ชื่อโฮสต์ ไม่ถูกต้อง Minimum Timeout = เวลาขั้นต่ำที่ใช้เชื่อมต่อ (แทนที่ค่าความหน่วงในมิลลิวินาที) Misc = อื่นๆ (ค่าดั้งเดิม = ดีสุดแล้ว) @@ -870,34 +908,6 @@ Twitter @PPSSPP_emu = ไปที่ Twitter website = เพิ่มเติมข้อมูลได้ที่เว็บไซต์: written = เขียนโดยใช้ภาษา C++ เพื่อความรวดเร็ว และความเสถียร -[MemStick] -Already contains data. = มีข้อมูลอยู่ข้างในนั้น -Create or Choose a PSP folder = สร้างหรือเลือกโฟลเดอร์เก็บข้อมูล PSP -DataCanBeShared = ข้อมูลสามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง -DataCannotBeShared = ข้อมูลไม่สามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง! -DataWillBeLostOnUninstall = คำเตือน! ข้อมูลอาจจะสูญหาย เมื่อคุณถอนการติดตั้ง PPSSPP! -DataWillStay = ข้อมูลจะยังคงอยู่ ถึงแม้ว่าจะถอนการติดตั้ง PPSSPP ออกไปแล้ว -Done! = เรียบร้อย! -EasyUSBAccess = การเข้าถึงข้อมูลทำได้ง่าย -Failed to move some files! = ล้มเหลวในย้ายบางไฟล์! -Failed to save config = ล้มเหลวในการบันทึกตั้งค่า -Free space = พื้นที่ว่าง -MemoryStickDescription = เลือกแหล่งที่เก็บข้อมูล PSP (เม็มโมรี่ สติ๊ก) -Move Data = ย้ายข้อมูล -New PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันใหม่ -No data will be changed. = ไม่มีข้อมูลอะไรถูกเปลี่ยนแปลง -Old PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันเก่า -PPSSPP will restart after the change. = PPSSPP จะรีสตาร์ทใหม่หลังจากปรับเปลี่ยนตั้งค่า -ScopedStorageWarning = คำเตือน: การรองรับแอนดรอยด์ที่ใช้ Scoped Storage ยังอยู่ในขั้นทดสอบ\nเพราะฉะนั้นอาจจะเขมือบข้อมูลของคุณ -Starting move... = กำลังเริ่มการย้าย... -That folder doesn't work as a memstick folder. = โฟลเดอร์นั้นไม่สามารถนำมาใช้เป็นโฟลเดอร์แหล่งที่เก็บข้อมูลได้ -That's the folder being used! = อันนั้นคือโฟลเดอร์ที่ปรับใช้งานอยู่แล้ว! -USBAccessThrough = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppsspp/files -USBAccessThroughGold = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppssppgold/files -Use App Private Directory = ใช้แหล่งเก็บข้อมูลแอพแบบส่วนบุคคล -Use PSP folder at root of storage = ใช้โฟลเดอร์ PSP ที่อยู่ต้นทางของแหล่งเก็บข้อมูลในเครื่อง -Welcome to PPSSPP! = ยินดีต้อนรับสู่ PPSSPP! - [RemoteISO] Browse Games = ค้นหาไปยังเกม Local Server Port = พอร์ตเซิร์ฟเวอร์แหล่งภายใน @@ -966,9 +976,11 @@ Date = ตามวันที่ Filename = ตามชื่อ No screenshot = ไม่มีภาพประกอบ None yet. Things will appear here after you save. = ยังไม่มีข้อมูล จะมีก็ต่อเมื่อหลังจากที่คุณได้กดบันทึกเอาไว้ +Nothing matching '%1' was found. = ไม่พบข้อมูล '%1' ที่ตรงกัน Save Data = เซฟดาต้า Save States = เซฟสเตท Savedata Manager = การจัดการข้อมูลเซฟ +Showing matches for '%1'. = กำลังแสดงข้อมูลของ '%1' Size = ตามขนาด [Screen] @@ -997,6 +1009,7 @@ saveNewTextures_false = ยกเลิกการบันทึกพื้ saveNewTextures_true = เปิดใช้งานการบันทึกพื้นผิวลงในแหล่งที่เก็บข้อมูล SpeedCustom2 = ความเร็ว: มาตรฐาน 2 standard = ความเร็ว: มาตรฐาน +State load undone = ยกเลิกโหลดสเตท Untitled PSP game = ไม่มีชื่อของเกม PSP นี้ [Store] @@ -1076,8 +1089,6 @@ AVI Dump started. = เริ่มการอัดบันทึกวีด AVI Dump stopped. = หยุดการอัดบันทึกวีดีโอ Cache ISO in RAM = เก็บแคช ISO ทั้งหมดเอาไว้ในแรม Change CPU Clock = เปลี่ยนค่าจำลองความถี่ของซีพียู (ไม่เสถียร) -Change Memory Stick folder = เปลี่ยนแหล่งที่เก็บข้อมูล (เม็มโมรี่ สติ๊ก) -Change Memory Stick Size = เปลี่ยนขนาดของแหล่งที่เก็บข้อมูล (กิ๊กกะไบต์) Change Nickname = เปลี่ยนชื่อเล่น ChangingMemstickPath = เซฟดาต้า เซฟสเตท และข้อมูลอื่นๆ อาจจะไม่สามารถคัดลอกไปยังโฟลเดอร์นี้ได้\n\nต้องการปรับเปลี่ยนไปใช้แหล่งที่เก็บข้อมูลนี้เลยหรือไม่? ChangingMemstickPathInvalid = เส้นทางนี้ไม่สามารถใช้งานสำหรับการเปลี่ยนแหล่งที่เก็บข้อมูลได้ @@ -1100,6 +1111,8 @@ Dynarec (JIT) = ไดนาเร็ค (JIT) Emulation = การจำลองเสมือน Enable Cheats = เปิดใช้งานสูตรโกง Enable Compatibility Server Reports = เปิดใช้การส่ง-แนบรายงานข้อมูลเกมไปยังเซิร์ฟเวอร์ +Error: load undo state is from a different game = ข้อผิดพลาด: โหลดข้อมูลสเตทที่สำรองไว้ มาจากคนละเกมกัน +Failed to load state for load undo. Error in the file system. = ล้มเหลวในการโหลดสเตทเกมที่สำรองไว้ เนื่องจากไฟล์ระบบเสียหาย Failed to load state. Error in the file system. = ล้มเหลวในการโหลดสเตทเกม เนื่องจากไฟล์ระบบเสียหาย Failed to save state. Error in the file system. = ล้มเหลวในการเซฟสเตทเกม เนื่องจากไฟล์ระบบเสียหาย Fast (lag on slow storage) = เร็ว (อาจแล็ก หากที่เก็บข้อมูลอ่านช้า) @@ -1112,21 +1125,24 @@ General = ทั่วไป Grid icon size = ขนาดของไอคอนเกม Help the PPSSPP team = ช่วยเหลือทีมงาน PPSSPP Host (bugs, less lag) = โฮสต์ (อาจเกิดบั๊ก, แล็กน้อยลง) -I/O on thread (experimental) = การรับ/ส่ง ข้อมูล บนเธรด (ขั้นทดสอบ) Ignore bad memory accesses = ละเว้นการเข้าถึงหน่วยความจำที่ผิดพลาด Increase size = เพิ่มขนาดไอคอน Interpreter = อินเตอร์พรีเตอร์ IO timing method = ทางเลือกคำนวณเวลา รับ/ส่ง ข้อมูล IR Interpreter = ไออาร์ อินเตอร์พรีเตอร์ +Memory Stick size = เปลี่ยนขนาดของแหล่งที่เก็บข้อมูล (กิ๊กกะไบต์) +Memory Stick folder = เปลี่ยนแหล่งที่เก็บข้อมูล (เม็มโมรี่ สติ๊ก) Memory Stick Folder = โฟลเดอร์แหล่งที่เก็บข้อมูล (เม็มโมรี่ สติ๊ก) Memory Stick inserted = ใส่ที่บันทึกข้อมูล (เม็มโมรี่ สติ๊ก) MHz, 0:default = MHz, 0 = ค่าเริ่มต้น MMDDYYYY = เดือน/วัน/ปี +Moving background = พื้นหลังเคลื่อนไหว Newest Save = เซฟอันใหม่สุด No animation = ไม่แสดงอนิเมชั่น Not a PSP game = นี่ไม่ใช่เกม PSP นะจ้ะ Off = ปิด Oldest Save = เซฟอันเก่าสุด +Path does not exist! = ไม่มีเส้นทางนี้อยู่! PSP Memory Stick = แหล่งเก็บข้อมูล PSP PSP Model = โมเดลของ PSP PSP Settings = การตั้งค่า PSP @@ -1159,6 +1175,7 @@ UI = หน้าจอผู้ใช้ UI background animation = อนิเมชั่นพื้นหลังของอินเตอร์เฟซ UI Sound = เสียงของอินเตอร์เฟซ undo %c = สำรอง %c +USB = USB Use Lossless Video Codec (FFV1) = ใช้โค้ด FFV1 บันทึกวีดีโอ เพื่อรักษาความคมชัด Use O to confirm = ใช้ O เป็นปุ่มยืนยัน Use output buffer (with overlay) for recording = ใช้การส่งออกบัฟเฟอร์ (พร้อมด้วยการซ้อนทับ) ในการบันทึกวีดีโอ @@ -1167,8 +1184,21 @@ Use X to confirm = ใช้ X เป็นปุ่มยืนยัน VersionCheck = ตรวจสอบ PPSSPP เวอร์ชั่นใหม่ WARNING: Android battery save mode is on = คำเตือน: โหมดประหยัดแบตเตอรี่แอนดรอยด์เริ่มทำงาน WARNING: Battery save mode is on = คำเตือน: โหมดประหยัดแบตเตอรี่เริ่มทำงาน +Waves = คลื่น YYYYMMDD = ปี/เดือน/วัน +[UI Elements] +%1 button = %1 ปุ่ม +%1 checkbox = %1 ช่องติ๊ก +%1 choice = %1 ตัวเลือก +%1 heading = %1 หัวข้อ +%1 radio button = %1 ปุ่มตัวเลือก +%1 text field = %1 ช่องข้อความ +Choices: ตัวเลือก: +List: = รายการ: +Progress: %1% = ความคืบหน้า: %1% +Screen representation = การแสดงหน้าจอ + [Upgrade] Details = รายละเอียด Dismiss = ยกเลิก diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index c5cec029cb..d3de5f6585 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -1,85 +1,118 @@ [Audio] -Alternate speed volume = Alternate speed volume -Audio backend = Ses alttabanı (Yeniden başlatma lazım) -AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) -Auto = Otomatik -Device = Device +Alternate speed volume = Alternatif hız sesi +Audio backend = Ses alttabanı (Yeniden başlatma gerekir) +Audio Error = Ses Hatası +AudioBufferingForBluetooth = Bluetooth-uyumlu arabellek (daha yavaş) +Device = Cihaz +Disabled = Devre dışı DSound (compatible) = DSound (Uyumlu) Enable Sound = Sesi etkinleştir Global volume = Genel ses -Microphone = Microphone -Microphone Device = Microphone device -Mute = Mute -Switch on new audio device = Switch on new audio device -Use global volume = Use global volume +Microphone = Mikrofon +Microphone Device = Mikrofon cihazı +Mute = Sessiz +Reverb volume = Yankı sesi +Use new audio devices automatically = Otomatik olarak yeni ses cihazlarını kullan +Use global volume = Genel ses seviyesini kullan WASAPI (fast) = WASAPI (Hızlı) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Analog eksen uyarlılığı +Analog Binding = Analog Binding Analog Limiter = Analog sınırlayıcı Analog Mapper High End = Analog mapper high-end (axis sensitivity) Analog Mapper Low End = Analog mapper low-end (inverse deadzone) -Analog Mapper Mode = Analog mapper mode +Analog Mapper Mode = Analog mapper modu +Analog Settings = Analog Ayarları Analog Stick = Analog çubuk +Analog Style = Analog Biçimi AnalogLimiter Tip = Analog sınırlayıcı tuşuna basınca Auto = Otomatik Auto-centering analog stick = Analog çubuğu otomatik ortala Auto-hide buttons after seconds = Belirli bir süre sonra tuşları otomatik sakla +Auto-rotation speed = Otomatik rotasyon hızı +Auto-switch = Oto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Tuş görünürlüğü Button style = Tuş biçimi +Calibrate Analog Stick = Analog Çubuğu Kalibre Et Calibrate D-Pad = D-Pad'i kalibre et -Calibration = Ayarlama +Calibrated = Kalibre edildi +Calibration = Kalibrasyon +Circular stick input = Dairesel çubuk girişi Classic = Klasik -Combo Key Setting = Combo key setting -Combo Key Setup = Combo key setup +Combo Key Setting = Kombo tuş ayarı +Combo Key Setup = Kombo tuş kurulumu Confine Mouse = Fareyi belirli bir pencere/görüntü alanı içinde sınırla -Control Mapping = Kontrolleri ayarla -Custom layout... = Dokunmatik kontrol düzenini düzenle... -Customize tilt = Customize tilt... +Control Mapping = Kontrolleri Ayarla +Custom Key Setting = Özel Tuş Ayarı +Customize = Düzenle +Customize Touch Controls = Dokunmatik kontrol düzenini düzenle... +Customize tilt = Eğimi düzenle... D-PAD = D-Pad -Deadzone Radius = Deadzone radius +Deadzone radius = Ölü bölge yarıçapı DInput Analog Settings = DInput analog ayarları Disable D-Pad diagonals (4-way touch) = D-Pad'i devre dışı bırak (4'lü Yön Tuşları) -Glowing borders = Glowing borders -HapticFeedback = Dokunsal geribildirim (Titreşim) +Disable diagonal input = Diyagonal girişi devre dışı bırak +Double tap = Çift dokunma +Enable gesture control = Hareket kontrolünü etkinleştir +Enable standard shortcut keys = Standart kısayol tuşlarını etkinleştir +Gesture = Hareket +Gesture mapping = Hareket kontrollerini düzenle +Glowing borders = Parlayan kenarlar +HapticFeedback = Haptik geribildirim (Titreşim) +Hide touch analog stick background circle = Dokunmatik analog çubuk arka plan dairesini gizle +Icon = Simge Ignore gamepads when not focused = Başka programa geçildiğinde oyun kolunu yoksay -Ignore Windows Key = Windows tuşunu devre dışı bırak +Ignore Windows Key = Windows tuşunu yoksay Invert Axes = Eksenleri ters çevir -Invert Tilt along X axis = Invert tilt along X axis -Invert Tilt along Y axis = Invert tilt along Y axis -Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Invert Tilt along X axis = Eğimin X eksenini ters çevir +Invert Tilt along Y axis = Eğimin Y eksenini ters çevir +Keep this button pressed when right analog is pressed = Sağ analoğa basıldığında bu düğmeyi basılı tutun Keyboard = Klavye kontrol ayarları L/R Trigger Buttons = L/R Tetik düğmeleri Landscape = Yatay -Landscape Auto = Landscape auto +Landscape Auto = Otomatik yatay Landscape Reversed = Ters yatay +Low end radius = Low end radius Mouse = Fare ayarları Mouse sensitivity = Fare hassasiyeti Mouse smoothing = Fare yumuşatma MouseControl Tip = Fareye 'Kontrolleri Ayarlama' bölümünden 'M' simgesine basarak kontrol atayabilirsiniz. -None (Disabled) = Hiçbiri (Devredışı) +None (Disabled) = Hiçbiri (Devre Dışı) Off = Kapalı OnScreen = Dokunmatik ekran kontrolleri Portrait = Dikey Portrait Reversed = Ters dikey PSP Action Buttons = PSP eylem tuşları +Raw input = Ham girdi +Reset to defaults = Varsayılanlara sıfırla +Screen aligned to ground = Ekran yere hizalansın +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Ekran rotasyonu seconds, 0 : off = saniyeler, 0 = kapalı +Sensitivity (scale) = Hassasiyet (ölçek) Sensitivity = Hassasiyet -Show right analog = Show right analog +Shape = Şekil +Show right analog = Sağ analoğu göster Show Touch Pause Menu Button = Duraklama menüsü tuşunu göster -Thin borders = İnce sınırlar -Tilt Base Radius = Tilt base radius -Tilt Input Type = Tilt input type -Tilt Sensitivity along X axis = Tilt sensitivity along X axis -Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis -To Calibrate = Ayarlamak için cihazı düz bir zemin üzerinde tutun ve "Ayarla" tuşuna basın. +Swipe = Kaydır +Swipe sensitivity = Kaydırma hassasiyeti +Swipe smoothing = Pürüzsüz kaydırma +Thin borders = İnce kenarlar +Tilt Base Radius = Eğim Taban Yarıçapı +Tilt Input Type = Eğim giriş türü +Tilt Sensitivity along X axis = X ekseni boyunca eğim hassasiyeti +Tilt Sensitivity along Y axis = Y ekseni boyunca eğim hassasiyeti +To Calibrate = Kalibre etmek için cihazı düz bir zemine yerleştirin ve "Kalibre et" tuşuna basın. +Toggle mode = Toggle mode Touch Control Visibility = Dokunmatik kontrol görünürlüğü -Use custom right analog = Use custom right analog +Use custom right analog = Özel sağ analog kullan Use Mouse Control = Fareyle kontrolü etkinleştir Visibility = Görünürlük +Visible = Görünür X = X X + Y = X + Y XInput Analog Settings = XInput analog ayarları @@ -94,16 +127,19 @@ Options = Ayarlar Refresh Rate = Yenileme hızı [DesktopUI] -# If your language does not show well with the default font, you can use Font to specify a different one. +# EN: If your language does not show well with the default font, you can use Font to specify a different one. # Just add it to your language's ini file and uncomment it (remove the # by Font). -#Font = Trebuchet MS +# TR: Eğer diliniz varsayılan yazı tipi ile güzel görünmüyor ise, Font kısmından başka bir yazı tipi seçebilirsiniz. +# Sadece dilinizin ini dosyasına ekleyin ve yorumunu kaldırın (Font'tan önceki #'yi kaldırın). +#Font = Segoe UI About PPSSPP... = &PPSSPP Hakkında... Auto = &Otomatik -Backend = Rendering &Backend (Restarts PPSSPP) -Bicubic = &Bicubic +Auto Max Quality = Otomatik en yüksek &kalite +Backend = Oluşturma &Arkaucu (PPSSPP'yi yeniden başlatır) +Bicubic = &Bikübik Break = Break Break on Load = Break on load -Buffered Rendering = &Buffered Rendering +Buffered Rendering = &Tampon bellek ile oluştur Buy Gold = Altın Sürümünü Satın Al Control Mapping... = Kontrol Ayarlama... Debugging = &Hata Ayıklama @@ -112,27 +148,27 @@ Direct3D9 = &Direct3D9 Direct3D11 = Direct3D &11 Disassembly = &Disassembly... Discord = Discord -Display Layout Editor = Görüntü düzeni düzenleyici... +Display Layout Editor = Ekran düzeni düzenleyici... Display Rotation = Ekran rotasyonu Dump Next Frame to Log = D&ump Next Frame to Log Emulation = &Emülasyon -Enable Chat = Enable chat +Enable Chat = Chat'i Etkinleştir Enable Cheats = &Hileleri Aç Enable Sound = Sesi Aç Exit = Çıkış Extract File... = Dosya Çıkart... File = Dosya Frame Skipping = &Kare Atlama -Frame Skipping Type = Frame skipping type +Frame Skipping Type = Kare atlama türü Fullscreen = Tam Ekran Game Settings = &Oyun Ayarları GE Debugger... = GE Debugge&r... GitHub = Git&Hub Hardware Transform = &Donanım Dönüştürme Help = Yardım -Hybrid = &Hybrid -Hybrid + Bicubic = H&ybrid + Bicubic -Ignore Illegal Reads/Writes = &İllegal Yazıları Yoksay +Hybrid = &Hibrit +Hybrid + Bicubic = H&ibrit + Bikübik +Ignore Illegal Reads/Writes = &İllegal Okuma/Yazmaları Yoksay Ignore Windows Key = Windows Tuşunu Yoksay Keep PPSSPP On Top = &PPSSPP'yi En Üstte Tut Landscape = Yatay @@ -144,12 +180,13 @@ Load .sym File... = &.sym Dosyası Yükle... Load Map File... = &Harita Dosyası Yükle... Load State = &Durum Yükle Load State File... = &Durum Dosyası Yükle... -Log Console = &Log Console -Memory View... = Memory &View... +Log Console = &Günlük Konsolu +Memory View... = Bellek &Görünümü... More Settings... = &Daha Fazla Ayar... Nearest = &En Yakın -Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Non-Buffered Rendering = &Arabellek efektlerini atla (arabelleğe alınmaz, daha hızlıdır) Off = &Kapalı +Open Chat = Open Chat Open Directory... = Dizin Aç... Open from MS:/PSP/GAME... = Şurdan Aç MS:/PSP/GAME... Open Memory Stick = Hafıza Kartını Aç @@ -177,93 +214,94 @@ Savestate Slot = Durum Kaydı Yeri Screen Scaling Filter = Scr&een Scaling Filter Show Debug Statistics = Hata Ayıklama İstatistiklerini Göster Show FPS Counter = FPS Sayacını Göster -Skip Number of Frames = Skip number of frames -Skip Percent of FPS = Skip percent of FPS +Skip Number of Frames = Şu kadar kare sayısını atla +Skip Percent of FPS = Şu kadar FPS yüzdesini atla Stop = &Dur Switch UMD = UMD Değiştir Take Screenshot = &Ekran Görüntüsü Al Texture Filtering = Doku Filtreleme Texture Scaling = &Doku Ölçekleme -Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) -Use output buffer for video = Use output buffer for video -Vertex Cache = &Vertex Cache +Use Lossless Video Codec (FFV1) = &Kayıpsız video kodek'i kullan (FFV1) +Use output buffer for video = Video için çıkış arabelleğini kullan +Vertex Cache = &Vertex Önbellek VSync = Dikey Eşleme (VSync) Vulkan = Vulkan -Window Size = &Pencere Büyüklüğü +Window Size = &Pencere Boyutu www.ppsspp.org = www.&ppsspp.org Ziyaret Et xBRZ = &xBRZ [Developer] Allocator Viewer = Allocator viewer (Vulkan) -Allow remote debugger = Allow remote debugger -Backspace = Geri Tuşu -Block address = Block address -By Address = By address -Copy savestates to memstick root = Copy save states to Memory Stick root +Allow remote debugger = Uzaktan hata ayıklamaya izin ver +Backspace = Silme Tuşu +Block address = Adresi engelle +By Address = Adrese Göre +Copy savestates to memstick root = Durum kayıtlarını hafıza kartına kopyalayın Create/Open textures.ini file for current game = Şu anki oyun için textures.ini dosyası Oluştur/Aç Current = Current Dev Tools = Geliştirme araçları DevMenu = DevMenu -Disabled JIT functionality = Disabled JIT functionality -Draw Frametimes Graph = Draw frametimes graph -Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot -Dump Frame GPU Commands = Dump frame GPU commands -Enable driver bug workarounds = Enable driver bug workarounds -Enable Logging = Enable debug logging +Disabled JIT functionality = JIT işlevselliğini devre dışı bırakın +Draw Frametimes Graph = Kare süreleri grafiğini çizin +Dump Decrypted Eboot = Şifresi çözülmüş EBOOT.BIN'i oyun açılışında temizleyin +Dump Frame GPU Commands = Kare GPU komutlarını temizleyin +Enable driver bug workarounds = Sürücü hatası geçici çözümlerini etkinleştirin +Enable Logging = Hata ayıklama günlüğünü etkinleştirin Enter address = Adres Gir FPU = FPU -Framedump tests = Framedump tests +Framedump tests = Framedump testleri Frame Profiler = Frame profiler -GPU Driver Test = GPU driver test -GPU Profile = GPU profile -Jit Compare = Jit compare -JIT debug tools = JIT debug tools +GPU Driver Test = GPU sürücü testi +GPU Profile = GPU profili +Jit Compare = Jit karşılaştırma +JIT debug tools = JIT hata ayıklama araçları Language = Dil Load language ini = Dil Dosyası Yükle(.ini) -Log Dropped Frame Statistics = Log dropped frame statistics -Log Level = Log level -Log View = Log view -Logging Channels = Logging channels +Log Dropped Frame Statistics = Düşen kare istatistiklerini günlüğe kaydet +Log Level = Günlük seviyesi +Log View = Günlük görünümü +Logging Channels = Günlük kanalları Next = Sonraki No block = No block Prev = Önceki Random = Rastgele Replace textures = Dokuları değiştir -Reset limited logging = Reset limited logging +Reset = Sıfırla +Reset limited logging = Sınırlı günlük kaydını sıfırlayın RestoreDefaultSettings = Bütün ayarları varsayılanlarına döndürmek istediğine emin misin?\nKontrol ayarları değiştirilmedi.\n\nBunu geri alamazsın.\nDeğişikliklerin uygulanması için lütfen PPSSPP'yi yeniden başlatın. RestoreGameDefaultSettings = Oyun için ayarlanmış olan özel ayarları PPSSPP varsayılanlarına döndürmek istediğinden emin misin? -Resume = Resume +Resume = Devam ettir Run CPU Tests = İşlemci testlerini başlat Save language ini = Dil Dosyası Kaydet (.ini) Save new textures = Yeni dokuları kaydet -Shader Viewer = Shader viewer +Shader Viewer = Shader Görüntüleyici Show Developer Menu = Geliştirici Menüsünü Göster -Show on-screen messages = Show on-screen messages -Stats = Stats +Show on-screen messages = Ekran üzerinde mesajları göster +Stats = İstatistikler System Information = Sistem bilgisi Texture Replacement = Doku değiştirme Toggle Audio Debug = Ses hata ayıklamasını Aç/Kapat Toggle Freeze = Donmayı Aç/Kapa -Touchscreen Test = Touchscreen test +Touchscreen Test = Dokunmatik ekran testi VFPU = VFPU [Dialog] * PSP res = * PSP Çözünürlüğü -Active = Active +Active = Etkin Back = Geri Cancel = İptal Center = Merkez ChangingGPUBackends = GPU arkaucunu değiştirmek için PPSSPP'nin yeniden başlatılması gerek. Şimdi yeniden başlatılsın mı? -ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? -Channel: = Channel: +ChangingInflightFrames = Grafik komut arabelleğini değiştirmek, PPSSPP'nin yeniden başlatılmasını gerektirir. Şimdi yeniden başlat? +Channel: = Kanal: Choose PPSSPP save folder = PPSSPP kayıt dosyası seç Confirm Overwrite = Veriyi üstüne yazmak istiyor musun? Confirm Save = Bu veriyi kaydetmek istiyor musun? ConfirmLoad = Veriyi yüklemek istiyor musun? -ConnectingAP = Connecting to the access point.\nPlease wait... -ConnectingPleaseWait = Connecting.\nPlease wait... -ConnectionName = Connection name -Corrupted Data = Corrupted data +ConnectingAP = Erişim noktasına bağlanılıyor.\nLütfen bekleyin.... +ConnectingPleaseWait = Bağlanılıyor.\nLütfen bekleyin... +ConnectionName = Bağlantı adı +Corrupted Data = Bozuk veri Delete = Sil Delete all = Hepsini sil Delete completed = Silme işlemi tamamlandı. @@ -274,13 +312,16 @@ DeleteConfirmGameConfig = Bu oyun için ayarları silmek istediğine emin misin? DeleteFailed = Veri silinemedi. Deleting = Siliniyor\nLütfen Bekleyin... Disable All = Hepsini devre dışı bırak -Edit = Edit +Dumps = Dökümler +Edit = Düzenle Enable All = Hepsini etkinleştir Enter = Gir +Filter = Filtre Finish = Bitir -Grid = Grid -Inactive = Inactive -InternalError = An internal error has occurred. +GE Frame Dumps = GE Kare Dökümleri +Grid = Izgara +Inactive = Ektin değil +InternalError = Dahili bir hata oluştu. Load = Yükle Load completed = Yükleme tamamlandı. Loading = Yükleniyor\nLütfen Bekleyin... @@ -289,7 +330,7 @@ Move = Taşı Network Connection = Ağ Bağlantısı NEW DATA = YENİ VERİ No = Hayır -ObtainingIP = Obtaining IP address.\nPlease wait... +ObtainingIP = IP adresi alınıyor.\nLütfen bekleyin... OK = Tamam Old savedata detected = Eski kayıt bulundu. Options = Ayarlar @@ -298,63 +339,65 @@ Resize = Yeniden Boyutlandır Retry = Yeniden Dene Save = Kaydet Save completed = Kaydedildi. -Saving = Kayıt ediliyor\nLütfen Bekleyin... -SavingFailed = Veriyi kaydedemiyor. +Saving = Kaydediliyor\nLütfen Bekleyin... +SavingFailed = Veri kaydedilemiyor. +Search = Ara Select = Seç Shift = Shift -Snap = Snap +Skip = Geç +Snap = Hizala Space = Boşluk SSID = SSID Submit = Gönder -Supported = Supported -There is no data = Veri yok +Supported = Destekleniyor +There is no data = Veri yok. Toggle All = Hepsini değiştir -Toggle List = Toggle list -Unsupported = Unsupported +Toggle List = Listeyi değiştir +Unsupported = Desteklenmiyor When you save, it will load on a PSP, but not an older PPSSPP = Kayıt aldığında almış olduğunuz kayıt PSP'de yüklenebilecek ama eski bir PPSSPP sürümünde yüklenemeyecek. -When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +When you save, it will not work on outdated PSP Firmware anymore = Kaydettiğinde artık eski PSP yazılımı üzerinde çalışmayacaktır. Yes = Evet Zoom = Yakınlaştır [Error] 7z file detected (Require 7-Zip) = dosya sıkıştırılmış (7z).\nLütfen ilk olarak dosyayı çıkartın (7-zip ya da WinRAR kullanın). -A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. -Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +A PSP game couldn't be found on the disc. = Diskte bir PSP oyunu bulunamadı. +Cannot boot ELF located outside mountRoot. = mountRoot dışında bulunan ELF önyüklenemiyor. Could not save screenshot file = Ekran görüntüsü kaydedilemedi. D3D9or11 = Direct3D 9? (Direct3D 11 için hayır'a basın) -D3D11CompilerMissing = D3DCompiler_47.dll bulunamadı. Lütfen yükleyin. Ya da yerine Direct3D 9 kullanarak yeniden denemek için Evete basın. +D3D11CompilerMissing = D3DCompiler_47.dll bulunamadı. Lütfen yükleyin. Ya da yerine Direct3D 9 kullanarak yeniden denemek için Evet'e basın. D3D11InitializationError = Direct3D 11 başlatma hatası -D3D11Missing = İşletim sisteminiz D3D11'i içermiyor. Lütfen Windows Update'i çalıştırınız.\n\nYerine Direct3D 9 kullanarak tekrar denemek için Evete basın. -D3D11NotSupported = Grafik işlemciniz Direct3D 11'i destekliyor gibi görünmüyor.\n\nYerine Direct3D 9 kullanarak yeniden denemek ister misiniz? +D3D11Missing = İşletim sisteminiz D3D11'i içermiyor. Lütfen Windows Update'i çalıştırınız.\n\nYerine Direct3D 9 kullanarak tekrar denemek için Evet'e basın. +D3D11NotSupported = Ekran kartınız Direct3D 11'i desteklemiyor.\n\nDirect3D 9 kullanarak yeniden denemek ister misiniz? Disk full while writing data = Veri yazılırken disk dolu. -ELF file truncated - can't load = ELF file truncated - can't load +ELF file truncated - can't load = ELF dosyası kesildi - yüklenemiyor Error loading file = Oyun yüklenemedi. Error reading file = Dosya okumada hata. -Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed initializing CPU/Memory = CPU veya bellek başlatılamadı Failed to identify file = Dosya tanımlanamadı. -Failed to load executable: = Failed to load executable: -File corrupt = File corrupt -Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. -GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. -GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +Failed to load executable: = Yürütülebilir dosya yüklenemedi: +File corrupt = Bozuk dosya +Game disc read error - ISO corrupt = Oyun diskini okurken hata oluştu: ISO bozuk. +GenericAllStartupError = PPSSPP, herhangi bir grafik arkaucuyla başlatılamadı. Ekran kartınızı ve diğer sürücüleri yükseltmeyi deneyin. +GenericBackendSwitchCrash = PPSSPP başlatılırken çöktü.\n\n Bu genellikle bir ekran kartı sürücüsü sorunu anlamına gelir. Sürücüyü güncellemeyi deneyin.\n\nGrafik arka ucu değiştirildi: GenericDirect3D9Error = Grafikler başlatılamadı. Ekran kartınızın sürücülerini ve DirectX'i güncellemeyi deneyin.\n\nOpenGL'ye geçmek ister misiniz?\n\nHata Mesajı: GenericGraphicsError = Grafik Hatası GenericOpenGLError = Grafikler başlatılamadı. Ekran kartınızın sürücülerini güncellemeyi deneyin.\n\nDirectX 9'a geçmek ister misiniz?\n\nHata Mesajı: GenericVulkanError = Grafikler başlatılamadı. Ekran kartınızın sürücülerini güncellemeyi deneyin.\n\nOpenGL'ye geçmek ister misiniz?\n\nHata Mesajı: -InsufficientOpenGLDriver = Yetersiz OpenGL desteği tespit edildi!\n\nEkran işlemciniz OpenGL 2.0'ı desteklemiyor. Onun yerine DirectX'u kullanmayı denemek ister misiniz?\n\nDirectX şimdilik az sayıda oyunla uyumlu ama belkide ekran kartınız için tek seçenek bu.\n\nDaha fazla bilgi için https://forums.ppsspp.org sitesindeki forumları ziyaret edin\n\n +InsufficientOpenGLDriver = Yetersiz OpenGL desteği tespit edildi!\n\nEkran kartı işlemciniz OpenGL 2.0'ı desteklemiyor. Onun yerine DirectX'i kullanmak ister misiniz?\n\nDirectX şimdilik az sayıda oyunla uyumlu ama belkide ekran kartınız için tek seçenek bu.\n\nDaha fazla bilgi için https://forums.ppsspp.org sitesini ziyaret edin\n\n Just a directory. = Sadece bir klasör. -Missing key = Missing key -MsgErrorCode = Error code: -MsgErrorSavedataDataBroken = Save data was corrupt. -MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. -MsgErrorSavedataNoData = Warning: no save data was found. -MsgErrorSavedataNoMS = Memory Stick not inserted. -No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. -Not a valid disc image. = Not a valid disc image. +Missing key = Eksik anahtar +MsgErrorCode = Hata kodu: +MsgErrorSavedataDataBroken = Oyun kayıt verileri bozuk. +MsgErrorSavedataMSFull = Hafıza Kartı dolu. Depolama alanınızı kontrol edin. +MsgErrorSavedataNoData = Uyarı: Hiçbir kayıt verisi bulunamadı! +MsgErrorSavedataNoMS = Hafıza Kartı takılı değil. +No EBOOT.PBP, misidentified game = EBOOT.PBP yok, yanlış tanımlanmış oyun. +Not a valid disc image. = Geçerli bir disk kalıbı değil. OpenGLDriverError = OpenGL Sürücü Hatası -PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. -PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. -PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPP doesn't support UMD Music. = PPSSPP UMD Müziklerini desteklemez. +PPSSPP doesn't support UMD Video. = PPSSPP UMD Videolarını desteklemez. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP PSP oyunlarını açar, PS1 veya PS2 oyunlarını değil. PPSSPPDoesNotSupportInternet = PPSSPP şuan DLC, PSN ya da oyun güncellemeleri için internete bağlanmayı desteklemiyor. PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT'ları PPSSPP tarafından desteklenmiyor. PSX game image detected. = Dosya bir MODE2 imajı. PPSSPP PS1 oyunlarını desteklemiyor. @@ -363,19 +406,20 @@ RAR file detected (Require WINRAR) = Dosya sıkıştırılmış (RAR).\nLütfen Running slow: try frameskip, sound is choppy when slow = Yavaş çalışıyor : Kare atlamayı deneyin, yavaş çalışırken ses kesikli olur Running slow: Try turning off Software Rendering = Yavaş çalışıyor: Yazılımsal işlemeyi kapamayı deneyin. Save encryption failed. This save won't work on real PSP = Kayıt şifrelemesi başarısız oldu. Bu kayıt PSP'de çalışmayacak -textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +textures.ini filenames may not be cross-platform = "textures.ini" dosya adları çapraz platform olmayabilir. This is a saved state, not a game. = Bu bir durum kaydı, bir oyun değil This is save data, not a game. = Bu bir kayıt dosyası, bir oyun değil. Unable to create cheat file, disk may be full = Hile dosyası oluşturulamadı, belkide disk doludur. -Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to initialize rendering engine. = Render motoru başlatılamıyor. Unable to write savedata, disk may be full = Kayıt verisi yazılamadı, belkide disk doludur. -Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = UYARI: Video hafızası DOLU, video ölçekleme azaltılıyor ve yavaş önbellekleme moduna geçiliyor. -Warning: Video memory FULL, switching to slow caching mode = UYARI: Video hafızası DOLU, yavaş önbellekleme moduna geçiliyor. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = UYARI: Video belleği (VRAM) DOLU, video ölçekleme azaltılıyor ve yavaş önbellekleme moduna geçiliyor. +Warning: Video memory FULL, switching to slow caching mode = UYARI: Video belleği (VRAM) DOLU, yavaş önbellekleme moduna geçiliyor. ZIP file detected (Require UnRAR) = Dosya sıkıştırılmış (ZIP).\nLütfen ilk olarak dosyayı çıkartın (UnRAR'ı deneyin). ZIP file detected (Require WINRAR) = Dosya sıkıştırlmış (ZIP).\nLütfen ilk olarak dosyayı çıkartın (WinRAR'ı deneyin). [Game] Asia = Asya +Calculate CRC = CRC'yi Hesapla ConfirmDelete = Sil Create Game Config = Oyun için yapılandırma dosyası oluştur Create Shortcut = Kısayol oluştur @@ -389,15 +433,15 @@ Homebrew = Homebrew Hong Kong = Hong Kong InstallData = Veri yükle Japan = Japonya -Korea = Korea +Korea = Kore MB = MB One moment please... = Bir dakika lütfen... Play = Oyna Remove From Recent = Geçmişten sil SaveData = Kayıt -Setting Background = Setting background +Setting Background = Arkaplan ayarlanıyor Show In Folder = Dosyada göster -USA = USA +USA = ABD Use UI background = Arayüz arkaplanı olarak kullan [Graphics] @@ -423,152 +467,156 @@ Use UI background = Arayüz arkaplanı olarak kullan 10x PSP = 10× PSP 16x = 16× Aggressive = Agresif -Alternative Speed = Alternatif Hız (in %, 0 = sınırsız) -Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) -Anisotropic Filtering = Anisotropic filtreleme +Alternative Speed = Alternatif Hız (% 0 = sınırsız) +Alternative Speed 2 = Alternatif Hız 2 (% 0 = sınırsız) +Anisotropic Filtering = Anizotropik filtreleme Auto = Otomatik Auto (1:1) = Otomatik (1:1) Auto (same as Rendering) = Otomatik (İşleme Çözünürlüğüyle Aynı) Auto FrameSkip = Otomatik kare atlama +Auto Max Quality = Otomatik En Yüksek Kalite Auto Scaling = Otomatik ölçekleme Backend = Arkauç Balanced = Dengeli Bicubic = Çift Kübik BlockTransfer Tip = Bazı oyunlarda doğru grafikler için bu ayarın açık olması gerekir -BlockTransferRequired = Warning: This game requires Simulate Block Transfer Mode to be set to On. -Both = İkisi -Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) -Buffered Rendering = Yükleyerek çöz -BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". -Camera = Camera -Camera Device = Camera device -Cardboard Screen Size = Ekran Boyutu (in % of the viewport) -Cardboard Screen X Shift = X shift (in % of the blank space) -Cardboard Screen Y Shift = Y shift (in % of the blank space) +BlockTransferRequired = Uyarı: Bu oyun Blok Aktarım Simülasyon Modunun Açık olmasını gerektirir. +Both = İkisi de +Buffer graphics commands (faster, input lag) = Grafik komutlarını arabellekle (daha hızlı, input lag'e sebep olabilir) +Buffered Rendering = Yükleyerek işleme +BufferedRenderingRequired = Uyarı: Bu oyun "işleme modunun" "yükleyerek işleme"ye alınmasını gerektirir. +Camera = Kamera +Camera Device = Kamera cihazı +Cardboard Screen Size = Ekran Boyutu (görüntü alanının %si olarak) +Cardboard Screen X Shift = X shift (boş alanın %si olarak) +Cardboard Screen Y Shift = Y shift (boş alanın %si olarak) Cardboard VR Settings = Google Cardboard VR Ayarları -Cheats = Cheats -Clear Speedhack = Clear framebuffers on first use (speed hack) -ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +Cheats = Hileler +Clear Speedhack = İlk kullanımda kare arabelleklerini temizleyin (speed hack) +ClearSpeedhack Tip = Bazen daha hızlıdır (çoğunlukla mobil cihazlarda), hatalara neden olabilir CPU Core = İşlemci Çekirdeği Debugging = Hata Ayıklama -DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +DefaultCPUClockRequired = Uyarı: Bu oyun CPU saatinin varsayılana ayarlanmasını gerektirir. Deposterize = Deposterize -Deposterize Tip = Fixes visual banding glitches in upscaled textures -Device = Device +Deposterize Tip = Yeniden ölçeklenen dokulardaki görsel şerit hatalarını düzeltir +Device = Cihaz Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 -Disable slower effects (speedup) = Disable slower effects (speedup) -Disabled = Disabled -Display layout editor = Ekran Düzeni Düzenleyicisi +Disable slower effects (speedup) = Daha yavaş efektleri kapatın (daha hızlı) +Disabled = Devre dışı +Display layout editor = Görüntü Düzeni Düzenleyicisi Display Resolution (HW scaler) = Görüntü Çözünürlüğü (HW scaler) -Dump next frame to log = Dump next frame to log -Enable Cardboard VR = Enable Cardboard VR +Dump next frame to log = Sonraki kareyi günlüğe dökümle +Enable Cardboard VR = Cardboard VR'ı Etkinleştirin FPS = FPS Frame Rate Control = Kare hızı denetimi Frame Skipping = Kare atla -Frame Skipping Type = Frame skipping type +Frame Skipping Type = Kare atlama türü FullScreen = Tam ekran Hack Settings = Hack ayarları (Küçük teknik problemlere neden olabilir.) -Hardware Tessellation = Hardware tessellation +Hardware Tessellation = Donanım Mozaikleme Hardware Transform = Donanım dönüştürme hardware transform error - falling back to software = Donanım dönüştürme hatası, yazılıma geri dönülüyor -HardwareTessellation Tip = Uses hardware to make curves +HardwareTessellation Tip = Eğrileri oluşturmak için donanımı kullanır High = Yüksek -Hybrid = Hybrid -Hybrid + Bicubic = Hybrid + Bicubic -Ignore camera notch when centering = Ignore camera notch when centering +Hybrid = Hibrit +Hybrid + Bicubic = Hibrit + Bikübik +Ignore camera notch when centering = Merkezleme sırasında kamera çentiğini yoksay Internal Resolution = İç çözünürlük -Lazy texture caching = Lazy texture caching (speedup) -Linear = Linear +Lazy texture caching = Yavaş doku önbellekleme (hızlandırır) +Linear = Doğrusal Low = Düşük -LowCurves = Spline/Bezier curves quality +LowCurves = Spline/Bezier eğri kalitesi LowCurves Tip = Sadece bazı oyunlar tarafından kullanılır, eğrilerin pürüzsüzlüğünü kontrol eder -Lower resolution for effects (reduces artifacts) = Efektler için daha az çözünürlük ( sorunları azaltır ) +Lower resolution for effects (reduces artifacts) = Efektler için daha az çözünürlük (sorunları azaltır) Manual Scaling = El ile ölçekleme Medium = Orta Mode = Mod Must Restart = Bu değişikliğin uygulanması için PPSSPP'yi yeniden başlatmalısın. Native device resolution = Yerel aygıt çözünürlüğü Nearest = En yakın -No buffer = No buffer -Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +No buffer = Arabellek/tampon bellek yok +Non-Buffered Rendering = Arabellek efektlerini atla (arabelleğe alınmaz, daha hızlıdır) None = Hiçbiri -Number of Frames = Number of frames +Number of Frames = Kare sayısı Off = Kapalı OpenGL = OpenGL Overlay Information = Ek Bilgi -Partial Stretch = Partial stretch -Percent of FPS = Percent of FPS +Partial Stretch = Tam ekran (kısmi sünme) +Percent of FPS = FPS yüzdesi Performance = Performans -Postprocessing effect = Postprocessing effects -Postprocessing Shader = Postprocessing shader +Postprocessing effect = Postprocessing efektleri +Postprocessing Shader = Postprocessing gölgelendiricisi Recreate Activity = Recreate activity -Render duplicate frames to 60hz = Render duplicate frames to 60 Hz -RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Render duplicate frames to 60hz = Yinelenen kareleri 60Hz'de işleyin +RenderDuplicateFrames Tip = Daha düşük kare hızlarında çalışan oyunlarda kare hızını düzeltebilir Rendering Mode = İşleme modu Rendering Resolution = İşleme çözünürlüğü -RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games -Retain changed textures = Retain changed textures (sometimes slower) +RenderingMode NonBuffered Tip = Daha hızlıdır, ancak bazı oyunlarda hiçbir şey çizilmeyebilir +Retain changed textures = Değişen dokuları koruyun (bazen daha yavaştır) RetainChangedTextures Tip = Çoğu oyunu yavaşlatır ama bazı oyunları çok hızlandırır. Rotation = Rotasyon Safe = Güvenli -Screen layout = Screen layout +Screen layout = Ekran düzeni Screen Scaling Filter = Ekran ölçekleme filtresi Show Debug Statistics = Hata ayıklama istatistiklerini göster Show FPS Counter = FPS sayacını göster -Simulate Block Transfer = Simulate block transfer effects -SoftGPU Tip = Şuan çok yavaş +Simulate Block Transfer = Blok aktarım efektlerini simüle edin +SoftGPU Tip = Şu an çok yavaş Software Rendering = Yazılımsal işleme (Deneysel) Software Skinning = Software skinning SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games Speed = Hız -Stretching = Stretching +Stretching = Serbest tam ekran (sünme) Texture Filter = Doku filtreleme Texture Filtering = Doku filtreleme Texture Scaling = Doku ölçekleme -Texture Shader = Texture shader -Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Texture Shader = Doku gölgelendiricisi +Turn off Hardware Tessellation - unsupported = "Donanım mozaikleme"yi kapatın: desteklenmiyor Unlimited = Sınırsız -Up to 1 = Up to 1 -Up to 2 = Up to 2 -Upscale Level = Upscale level -Upscale Type = Upscale type -UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter -Use all displays = Use all displays +Up to 1 = 1'e kadar +Up to 2 = 2'ye kadar +Upscale Level = Ölçeklendirme seviyesi +Upscale Type = Ölçeklendirme türü +UpscaleLevel Tip = CPU ağır - takılmayı önlemek için bazı yeniden ölçeklendirmeler gecikebilir +Use all displays = Tüm ekranları kullan Vertex Cache = Vertex önbellek -VertexCache Tip = Faster, but may cause temporary flicker +VertexCache Tip = Daha hızlıdır, ancak geçici ekran titremesine neden olabilir VSync = Dikey eşleme (Vsync) Vulkan = Vulkan -Window Size = Pencere büyüklüğü +Window Size = Pencere boyutu xBRZ = xBRZ [InstallZip] Delete ZIP file = Zip dosyasını sil Install = Yükle -Install game from ZIP file? = Zip dosyasından oyun yüklesin mi? -Install textures from ZIP file? = Install textures from ZIP file? +Install game from ZIP file? = Zip dosyasından oyun yüklensin mi? +Install textures from ZIP file? = Zip dosyasından dokular yüklensin mi? Installed! = Yüklendi! -Texture pack doesn't support install = Texture pack doesn't support install -Zip archive corrupt = ZIP archive corrupt -Zip file does not contain PSP software = ZIP file does not contain PSP software +Texture pack doesn't support install = Doku paketi yüklemeyi desteklemiyor +Zip archive corrupt = ZIP arşivi bozuk +Zip file does not contain PSP software = ZIP dosyası PSP yazılımı içermiyor [KeyMapping] Autoconfigure = Otomatik ayarla Autoconfigure for device = Cihaz için otomatik ayarla +Bind All = Hepsini Bağla Clear All = Hepsini Temizle Default All = Varsayılana Döndür Map a new key for = Yeni bir tuş girin -Map Key = Map key -Map Mouse = Map mouse +Map Key = Tuş girin +Map Mouse = Mouse eşleştir +Replace = Değiştir +Show PSP = PSP'yi Göster Test Analogs = Analogları test et You can press ESC to cancel. = İptal etmek için Esc'ye basabilirsiniz. [MainMenu] Browse = Aç... Buy PPSSPP Gold = Buy PPSSPP Gold -Choose folder = Choose folder +Choose folder = Klasör seç Credits = Emeği Geçenler -PPSSPP Homebrew Store = PPSSPP Homebrew Store'dan indir +PPSSPP Homebrew Store = PPSSPP Bağımsız Yapım Mağazası Exit = Çıkış Game Settings = Ayarlar Games = Oyunlar @@ -577,14 +625,15 @@ Homebrew & Demos = Demolar ve Bağımsız Yapımlar How to get games = Nasıl oyun alırım? How to get homebrew & demos = Demo veya bağımsız yapım nasıl bulurum? Load = Yükle... -Loading... = Loading... +Loading... = Yükleniyor... PinPath = İşaretle PPSSPP can't load games or save right now = PPSSPP şuan kayıt ya da oyun yükleyemiyor. Recent = Geçmiş -SavesAreTemporary = PPSSPP is saving in temporary storage -SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently -SavesAreTemporaryIgnore = Ignore warning +SavesAreTemporary = PPSSPP geçici depolamaya kaydediyor +SavesAreTemporaryGuidance = Kalıcı olarak kaydetmek için PPSSPP'yi bir yere çıkartın +SavesAreTemporaryIgnore = Uyarıyı yoksay UnpinPath = İşaretlemeyi Kaldır +UseBrowseOrLoad = Aç ile bir klasör seçin veya Yükle ile bir dosya seçin. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -596,61 +645,78 @@ System = Sistem Tools = Araçlar [MappableControls] -Alt speed 1 = Alt hız 1 -Alt speed 2 = Alt hız 2 +Alt speed 1 = Alt. hız 1 +Alt speed 2 = Alt. hız 2 An.Down = Analog Aşağı -An.Left = Analog Sola -An.Right = Analog Sağa +An.Left = Analog Sol +An.Right = Analog Sağ An.Up = Analog Yukarı Analog limiter = Analog sınırlayıcı Analog Stick = Analog çubuk -Audio/Video Recording = Audio/Video recording -Auto Analog Rotation (CCW) = Auto analog rotation (CCW) -Auto Analog Rotation (CW) = Auto analog rotation (CW) -AxisSwap = Axis swap -Circle = Çember -Cross = Çapraz -D-pad down = D-pad down -D-pad left = D-pad left -D-pad right = D-pad right -D-pad up = D-pad up +Audio/Video Recording = Ses/Video kaydı +Auto Analog Rotation (CCW) = Otomatik analog rotayonu (CCW) +Auto Analog Rotation (CW) = Otomatik analog rotayonu (CW) +AxisSwap = Eksenleri değiştir +Circle = Çember (O) +Cross = Çapraz (X) +Custom 1 = Özel 1 +Custom 10 = Özel 10 +Custom 2 = Özel 2 +Custom 3 = Özel 3 +Custom 4 = Özel 4 +Custom 5 = Özel 5 +Custom 6 = Özel 6 +Custom 7 = Özel 7 +Custom 8 = Özel 8 +Custom 9 = Özel 9 +D-pad down = D-pad aşağı +D-pad left = D-pad sol +D-pad right = D-pad sağ +D-pad up = D-pad yukarı DevMenu = Geliştirici Menüsü +Double tap button = Düğmeye çift basın Down = Dpad Aşağı Dpad = Dpad Frame Advance = Frame advance -Hold = Hold -Home = Home +Hold = Basılı tut +Home = Ev L = L Left = Dpad Sol Load State = Durum Yükle -Mute toggle = Mute toggle +Mute toggle = Sessize al Next Slot = Sonraki Yer -None = None +None = Hiçbiri Note = Not -OpenChat = Open chat +OpenChat = Chat'i Aç Pause = PPSSPP Menüsü R = R RapidFire = Seri Ateş +Record = Record Remote hold = Remote hold -Rewind = Geri Sarma +Rewind = Geri Sar Right = Dpad Sağ -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Sağ Analog çubuk RightAn.Down = SağAn.Aşağı RightAn.Left = SağAn.Sol RightAn.Right = SağAn.Sağ RightAn.Up = SağAn.Yukarı -Rotate Analog (CCW) = Rotate analog (CCW) -Rotate Analog (CW) = Rotate analog (CW) +Rotate Analog (CCW) = Analoğu döndür (CCW) +Rotate Analog (CW) = Analoğu döndür (CW) Save State = Durum Kaydet Screen = Ekran -Screenshot = Screenshot +Screenshot = Ekran görüntüsü Select = Select -SpeedToggle = Speed toggle +SpeedToggle = Hızı ayarla Square = Kare -Start = Start -Texture Dumping = Texture dumping -Texture Replacement = Texture replacement -Toggle Fullscreen = Toggle fullscreen +Start = Başlat +Swipe Down = Aşağı Kaydır +Swipe Left = Sola Kaydır +Swipe Right = Sağa Kaydır +Swipe Up = Yukarı Kaydır +tap to customize = özelleştirmek için dokun +Texture Dumping = Doku Dökümü +Texture Replacement = Doku değiştirme +Toggle Fullscreen = Tam ekran Toggle mode = Toggle mode Triangle = Üçgen Fast-forward = Fast-forward @@ -659,66 +725,100 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Zaten PSP verisi içeriyor +Create or Choose a PSP folder = Bir PSP klasörü oluştur veya seç +Current = Current +DataCanBeShared = Veri PPSSPP normal/Gold arasında paylaşılabilir +DataCannotBeShared = Veri PPSSPP normal/Gold arasında PAYLAŞILAMAZ! +DataWillBeLostOnUninstall = Uyarı! PPSSPP'yi kaldırdığınızda veriler kaybolacak! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Tamamlandı! +EasyUSBAccess = Kolay USB erişimi +Failed to move some files! = Bazı dosyalar taşınamadı! +Failed to save config = Yapılandırma kaydedilemedi +Free space = Boş alan +Manually specify PSP folder = PSP klasörünü manuel olarak belirtin +MemoryStickDescription = PSP verisinin nerede tutulacağını seçin (Hafıza Kartı) +Move Data = Veriyi Taşı +Selected PSP Data Folder = Seçilen PSP Veri Klasörü +No data will be changed = Hiçbir veri değişmeyecektir +PPSSPP will restart after the change = PPSSPP değişiklikten sonra yeniden başlayacak +Skip for now = Şimdilik atla +Starting move... = Taşıma başlıyor... +That folder doesn't work as a memstick folder. = Bu klasör bir hafıza kartı klasörü olarak çalışmaz. +USBAccessThrough = Android/data/org.ppsspp.ppsspp/files üzerinden USB erişimi +USBAccessThroughGold = Android/data/org.ppsspp.ppssppgold/files üzerinden USB erişimi +Use App Private Data = Uygulama Gizli Verisini Kullan +Use PSP folder at root of storage = Depolamanın kökündeki PSP klasörünü kullan +Welcome to PPSSPP! = PPSSPP'ye hoş geldiniz! +WhatsThis = Bu nedir? + [Networking] -Adhoc Multiplayer forum = Ad Hoc Multiplayer Forumunu ziyaret et -AdHoc Server = Ad hoc server -AdhocServer Failed to Bind Port = Ad hoc server failed to bind port -Auto = Auto -Bottom Center = Bottom center -Bottom Left = Bottom left -Bottom Right = Bottom right -Center Left = Center left -Center Right = Center right +AdHoc Server = Ad hoc sunucusu +AdhocServer Failed to Bind Port = Ad hoc sunucusu portu bağlayamadı +AM: Data from Unknown Port = AM: Bilinmeyen Porttan Veri +Auto = Otomatik +Bottom Center = Orta alt +Bottom Left = Sol alt +Bottom Right = Sağ alt +Center Left = Sol orta +Center Right = Sağ orta Change Mac Address = MAC adresini değiştir -Change proAdhocServer Address = PRO Ad Hoc Server IP adresini değiştir (localhost = multiple instances) +Change proAdhocServer Address = PRO Ad Hoc Server IP adresini değiştir (localhost = çoklu örnek) Chat = Chat -Chat Button Position = Chat button position -Chat Here = Chat here -Chat Screen Position = Chat screen position -Disconnected from AdhocServer = Disconnected from ad hoc server -DNS Error Resolving = DNS error resolving -Enable built-in PRO Adhoc Server = Yerleşik PRO Ad Hoc Server'ı etkinleştir -Enable network chat = Enable network chat -Enable networking = Ağ Oluşturma/WLAN'ı aç (Beta, oyun çalışmayı durdurabilir.) -Enable UPnP = Enable UPnP (need a few seconds to detect) -EnableQuickChat = Enable quick chat -Enter a new PSP nickname = Enter a new PSP nickname -Enter Quick Chat 1 = Enter quick chat 1 -Enter Quick Chat 2 = Enter quick chat 2 -Enter Quick Chat 3 = Enter quick chat 3 -Enter Quick Chat 4 = Enter quick chat 4 -Enter Quick Chat 5 = Enter quick chat 5 -Error = Error +Chat Button Position = Chat düğmesinin konumu +Chat Here = Buraya yazın +Chat message = Chat mesajı +Chat Screen Position = Chat ekranının konumu +Disconnected from AdhocServer = Ad hoc sunucu bağlantısı kesildi +DNS Error Resolving = DNS hatası teşhis ediliyor +Enable built-in PRO Adhoc Server = Yerleşik PRO Ad Hoc Sunucusunu etkinleştir +Enable network chat = Ağ sohbetini etkinleştir +Enable networking = Ağ Oluşturma/WLAN'ı aç (Henüz Beta, oyun çökebilir.) +Enable UPnP = UPnP'yi etkinleştirin (algılamak için birkaç saniye gerekir) +EnableQuickChat = Hızlı chat'i etkinleştirin +Enter a new PSP nickname = Yeni bir PSP kullanıcı adı girin +Enter Quick Chat 1 = Hızlı chat 1'e girin +Enter Quick Chat 2 = Hızlı chat 2'ye girin +Enter Quick Chat 3 = Hızlı chat 3'e girin +Enter Quick Chat 4 = Hızlı chat 4'e girin +Enter Quick Chat 5 = Hızlı chat 5'e girin +Error = Hata Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port -Failed to connect to Adhoc Server = Failed to connect to ad hoc server -Forced First Connect = Forced first connect (faster connect) -Invalid IP or hostname = Invalid IP or hostname -Minimum Timeout = Minimum timeout (override in ms, 0 = default) -Misc = Miscellaneous (default = PSP compatibility) +Failed to connect to Adhoc Server = Ad hoc sunucusuna bağlanılamadı +Forced First Connect = Zorunlu ilk bağlantı (daha hızlı bağlantı) +GM: Data from Unknown Port = GM: Bilinmeyen Porttan Veri +Hostname = Hostname +Invalid IP or hostname = Geçersiz IP veya host adı +Minimum Timeout = En düşük zaman aşımı (ms cinsinden geçersiz kılma, 0 = varsayılan) +Misc = Çeşitli (varsayılan = PSP uyumluluğu) Network Initialized = Network Switch -Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) -proAdhocServer Address: = Ad hoc server address: -Quick Chat 1 = Quick chat 1 -Quick Chat 2 = Quick chat 2 -Quick Chat 3 = Quick chat 3 -Quick Chat 4 = Quick chat 4 -Quick Chat 5 = Quick chat 5 -QuickChat = Quick chat -Send = Send -Send Discord Presence information = Send Discord "Rich Presence" information -TCP No Delay = TCP No Delay (faster TCP) -Top Center = Top center -Top Left = Top left -Top Right = Top right -Unable to find UPnP device = Unable to find UPnP device -UPnP (port-forwarding) = UPnP (port forwarding) -UPnP need to be reinitialized = UPnP need to be reinitialized -UPnP use original port = UPnP use original port (enabled = PSP compatibility) -Validating address... = Validating address... -WLAN Channel = WLAN channel -You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall +None = Hiçbiri +Please change your Port Offset = Lütfen Port Offset'i değiştirin +Port offset = Port offset(0 = PSP uyumluluğu) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Sayfası +proAdhocServer Address: = Ad hoc sunucu adresi: +Quick Chat 1 = Hızlı chat 1 +Quick Chat 2 = Hızlı chat 2 +Quick Chat 3 = Hızlı chat 3 +Quick Chat 4 = Hızlı chat 4 +Quick Chat 5 = Hızlı chat 5 +QuickChat = Hızlı sohbet +Send = Gönder +Send Discord Presence information = Discord "Rich Presence" bilgisi gönder +TCP No Delay = Gecikmesiz TCP (daha hızlı TCP) +Top Center = Orta üst +Top Left = Sol üst +Top Right = Sağ üst +Unable to find UPnP device = UPnP cihazı bulunamıyor +UPnP (port-forwarding) = UPnP (port yönlendirme) +UPnP need to be reinitialized = UPnP'nin yeniden başlatılması gerekiyor +UPnP use original port = UPnP orijinal portu kullan (etkin = PSP uyumluluğu) +Validating address... = Adres doğrulanıyor... +WLAN Channel = WLAN Kanalı +You're in Offline Mode, go to lobby or online hall = Çevrimdışı moddasınız, lobiye veya çevrimiçi salona gidin [Pause] Cheats = Hileler @@ -732,39 +832,41 @@ Rewind = Geri Sar Save State = Kaydet Settings = Ayarlar Switch UMD = UMD değiştir - +Undo last load = Son yüklemeyi geri al +Undo last save = Son kaydetmeyi geri al [PostShaders] -(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +(duplicated setting, previous slider will be used) = (yinelenen ayar, önceki kaydırıcı kullanılacaktır) 4xHqGLSL = 4×HQ GLSL 5xBR = 5xBR 5xBR-lv2 = 5xBR-lv2 AAColor = AA-Color -Amount = Amount -Black border = Black border +Amount = Miktar +Black border = Siyah çerçeve Bloom = Bloom -Brightness = Brightness -Cartoon = Cartoon +Brightness = Parlaklık +Cartoon = Çizgi film ColorCorrection = Color correction -Contrast = Contrast -CRT = CRT scanlines -FXAA = FXAA Antialiasing +Contrast = Karşıtlık +CRT = CRT tarama çizgileri +FXAA = FXAA Kenar Yumuşatma Gamma = Gamma -Grayscale = Grayscale -Intensity = Intensity -InverseColors = Inverse Colors +Grayscale = Gri tonlama +Intensity = Yoğunluk +InverseColors = Ters Renkler Natural = Doğal Renkler -NaturalA = Natural Colors (no blur) +NaturalA = Doğal Renkler (bulanıklık yok) Off = Kapalı -Power = Power -PSPColor = PSP color -Saturation = Saturation +Power = Güç +PSPColor = PSP rengi +Saturation = Doygunluk Scanlines = Tarama Çizgileri (CRT) -Sharpen = Sharpen -SSAA(Gauss) = Supersampling AA (Gauss) +Sharpen = Keskinleştir +SSAA(Gauss) = Süper örneklemeli Kenar Yumuşatma (Gauss) Tex4xBRZ = 4xBRZ -UpscaleSpline36 = Spline36 Upscaler +TexMMPX = MMPX +UpscaleSpline36 = Spline36 Yeniden Ölçeklendirici VideoSmoothingAA = VideoSmoothingAA -Vignette = Vignette +Vignette = Vinyet [PSPCredits] all the forum mods = Bütün forum modlarına @@ -781,7 +883,7 @@ info3 = oyunun UMD'sini veya PSP'niz üzerinden info4 = PSN Store'dan dijital sürümünü satın alarak emin olunuz. info5 = PSP SONY'nin tescilli markasıdır. iOS builds = iOS builds -license = GPL 2.0+ altında özgür yazılım +license = GPL 2.0+ altında bir "özgür yazılım" list = Uyumluluk Listeleri, Forumlar ve Geliştirme Bilgisi PPSSPP Forums = PPSSPP Forumları Privacy Policy = Privacy policy @@ -798,28 +900,28 @@ tools = Kullanılan Ücretsiz Araçlar: # Leave extra lines blank. 4 contributors per line seems to look best. translators1 = Gravityy translators2 = mygizli04 -translators3 = +translators3 = kishiradarken1867 translators4 = translators5 = translators6 = Twitter @PPSSPP_emu = Twitter @PPSSPP_emu -website = Web Sitesini Ziyaret Et: PPSSPP.org -written = Hız ve Taşınabilirlik İçin C++ İle Yazıldı +website = PPSSPP.org'u Ziyaret Et +written = Hız ve Taşınabilirlik için C++ ile Yazıldı [RemoteISO] Browse Games = Oyunlara bak... -Local Server Port = Local server port -Manual Mode Client = Manual mode client +Local Server Port = Yerel sunucu portu +Manual Mode Client = Manuel mod istemcisi Remote disc streaming = Uzaktan disk akışı Remote Port = Uzaktan port Remote Server = Uzaktan sunucu -Remote Subdirectory = Uzaktan alt dizi +Remote Subdirectory = Uzaktan alt dizin RemoteISODesc = Geçmiş listendeki oyunlar paylaştırılacak RemoteISOLoading = Bağlandı, oyun listesi yükleniyor... RemoteISOScanning = Taranıyor... Sunucu cihazınızdan "Oyunları paylaş" kısmına tıklayın -RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOScanningTimeout = Taranıyor... güvenlik duvarı ayarlarını kontrol edin RemoteISOWifi = Not: İki cihazı da aynı Wi-Fi ağına bağlayın. -RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +RemoteISOWinFirewall = UYARI: Windows Güvenlik Duvarı paylaşımı engelliyor Settings = Ayarlar Share Games (Server) = Oyunları paylaş (sunucu) Share on PPSSPP startup = PPSSPP açılışında paylaşın @@ -828,6 +930,8 @@ Stopping.. = Durduruluyor... [Reporting] Bad = Kötü +FeedbackCRCCalculating = Disk CRC: Hesaplanıyor... +FeedbackCRCValue = Disk CRC: [VALUE] FeedbackDelayInfo = Veriniz arkaplanda gönderiliyor. FeedbackDesc = Program nasıldı? Bizi ve topluluğu haberdar et! FeedbackDisabled = Uyumluluk sunucusu raporları etkinleştirilmelidir. @@ -840,7 +944,7 @@ Gameplay = Oynanış Graphics = Grafikler Great = İyi In-game = Oyun içi -In-game Description = Oyuna giriyor, ama tamamlamak için çok buglu +In-game Description = Tamamen oynanabilir ancak hatalar olabilir Menu/Intro = Menü/Giriş Menu/Intro Description = Asıl oyuna girilmiyor Nothing = Hiçbir şey @@ -851,8 +955,9 @@ Overall = Genel Perfect = Harika Perfect Description = Bütün oyun boyunca kusursuz emülasyon - harika! Plays = Plays -Plays Description = Fully playable but might be with glitches +Plays Description = Tamamen oynanabilir ancak hatalar olabilir ReportButton = Geribildirimde bulun +Show disc CRC = Disk CRC'sini göster Speed = Hız Submit Feedback = Geribildirimi yolla SuggestionConfig = İyi ayarlar için sitedeki ayarlara bakın. @@ -871,13 +976,15 @@ Date = Date Filename = Dosya adı No screenshot = Ekran görüntüsü yok None yet. Things will appear here after you save. = Henüz birşey yok.Kayıt aldığında kayıtların burada gözükecek. +Nothing matching '%1' was found. = '%1' ile eşleşen hiçbir şey bulunamadı. Save Data = Normal Kayıtlar Save States = Durum Kayıtları Savedata Manager = Kayıt yöneticisi +Showing matches for '%1'. = '%1' ile eşleşen sonuçlar gösteriliyor. Size = Boyut [Screen] -Cardboard VR OFF = Cardboard VR off +Cardboard VR OFF = Cardboard VR kapalı Chainfire3DWarning = UYARI: Chainfire3D algılandı, problemlere sebep olabilir. Failed to load state = Durum yüklenemedi. Failed to save state = Durum kaydedilemedi. @@ -886,20 +993,23 @@ GLToolsWarning = UYARI: GLTools algılandı, problemlere sebep olabilir. In menu = In menu Load savestate failed = Durum kaydı yüklenemedi. Loaded State = Durum yüklendi. +Loaded. Game may refuse to save over different savedata. = Yüklendi. Oyun belki farklı verilerin üzerine kaydetmeyi reddedebilir. +Loaded. Game may refuse to save over newer savedata. = Yüklendi. Oyun belki yeni verilerin üzerine kaydetmeyi reddedebilir. Loaded. Save in game, restart, and load for less bugs. = Yüklendi. Daha az bug için oyunda kaydedin, yeniden başlatın ve yükleyin. LoadStateDoesntExist = Durum yüklenemedi: Durum kaydı yerinde yok! LoadStateWrongVersion = Durum yüklenemedi: Durum kaydı eski bir PPSSPP versiyonu için uygun! norewind = Geriye sarma durumu bulunamadı. Playing = Oynatılıyor... PressESC = PPSSPP menüsünü açmak için ESC'ye bas. -replaceTextures_false = Textures no longer are being replaced. -replaceTextures_true = Texture replacement is enabled. +replaceTextures_false = Dokular artık değiştirilmiyor. +replaceTextures_true = Doku değiştirme etkinleştirildi. Save State Failed = Durum kaydı yapılamadı! Saved State = Durum kaydedildi. -saveNewTextures_false = Texture saving was disabled. -saveNewTextures_true = Textures will now be saved to your storage. +saveNewTextures_false = Doku kaydetme devre dışı bırakıldı. +saveNewTextures_true = Dokular şimdi cihazınıza kaydedilecek. SpeedCustom2 = Hız: Alternatif 2 standard = Hız: Standart +State load undone = Durum yüklemesi tamamlanmadı Untitled PSP game = Başlıksız PSP oyunu [Store] @@ -914,7 +1024,7 @@ Uninstall = Sil [SysInfo] %d (%d per core, %d cores) = %d (çekirdek başına %d , %d çekirdek ) -%d bytes = %d bytes +%d bytes = %d bayt (none detected) = (hiç bulunamadı) 3D API = 3D API ABI = ABI @@ -923,46 +1033,48 @@ Audio Information = Ses bilgisi Board = Board Build Config = Yapı konfigürasyonu Build Configuration = Yapı konfigürasyonu -Built by = Tarafından yapılsı +Built by = Tarafından yapıldı Core Context = Core context Cores = Çekirdekler CPU Extensions = CPU uzantıları CPU Information = CPU bilgisi CPU Name = Ad -D3DCompiler Version = D3DCompiler version +D3DCompiler Version = D3DCompiler sürümü Debug = Hata Ayıklama Debugger Present = Hata ayıklayıcı var Device Info = Cihaz bilgisi +Directories = Dizinler Display Information = Ekran bilgisi Driver Version = Sürücü sürümü EGL Extensions = EGL eklentileri -Frames per buffer = Frames per buffer +Frames per buffer = Tampon başına çerçeveler GPU Information = GPU bilgisi High precision float range = High precision float range High precision int range = High precision int range Lang/Region = Dil/Bölge -Memory Page Size = Memory page size +Memory Page Size = Bellek sayfa boyutu Native Resolution = Doğal çözünürlük OGL Extensions = OGL eklentileri OpenGL ES 2.0 Extensions = OpenGL ES 2.0 eklentileri OpenGL ES 3.0 Extensions = OpenGL ES 3.0 eklentileri OpenGL Extensions = OpenGL eklentileri -Optimal frames per buffer = Optimal frames per buffer -Optimal sample rate = Optimal sample rate +Optimal frames per buffer = Optimum tampon başına çerçeveler +Optimal sample rate = Optimum örnekleme hızı OS Information = İS bilgisi -PPSSPP build = PPSSPP yapımı -Refresh rate = Refresh rate +PPSSPP build = PPSSPP derlemesi +Refresh rate = Yenileme hızı Release = Release RW/RX exclusive = RW/RX 'e özel -Sample rate = Sample rate -Shading Language = Shading language -Sustained perf mode = Sustained perf mode +Sample rate = Örnekleme hızı +Shading Language = Gölgelendirme dili +Storage = Depolama +Sustained perf mode = Sürekli performans modu System Information = Sistem bilgisi System Name = Ad -System Version = System version -Threads = Threads -Vendor = Vendor -Vendor (detected) = Vendor (detected) +System Version = Sistem sürümü +Threads = İzlekler +Vendor = Satıcı +Vendor (detected) = Satıcı (tespit edildi) Version Information = Sürüm bilgisi Vulkan Extensions = Vulkan eklentileri Vulkan Features = Vulkan özellikleri @@ -972,77 +1084,84 @@ Vulkan Features = Vulkan özellikleri 12HR = 12 saat 24HR = 24 saat Auto = Otomatik -Auto Load Savestate = Auto load savestate +Auto Load Savestate = Otomatik durum kaydı yükle AVI Dump started. = AVI kaydı başladı AVI Dump stopped. = AVI kaydı bitti Cache ISO in RAM = Bütün ISO'yu RAM'e önbellekle -Change CPU Clock = Taklit edilen PSP'nin CPU sayacını değiştir ( kararlı değil ) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Change CPU Clock = Taklit edilen PSP'nin CPU sayacını değiştir (kararsız) +Error: load undo state is from a different game = Hata: yükleme geri alma durumu farklı bir oyundan +Failed to load state for load undo. Error in the file system. = Yüklemeyi geri alma durumu yüklenemedi. Dosya sisteminde hata. +Floating symbols = kayan simgeler +Memory Stick folder = Hafıza Kartı klasörü +Memory Stick size = Hafıza Kartı boyutu Change Nickname = Kullanıcı adını değiştir -ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? -ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. -ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +ChangingMemstickPath = Oyun kayıtları, durum kayıtları ve diğer veriler bu klasöre kopyalanmayacak.\n\nHafıza Kartı klasörü değiştirilsin mi? +ChangingMemstickPathInvalid = Bu yol, Hafıza Kartı dosyalarını kaydetmek için kullanılamaz. +ChangingMemstickPathNotExists = Bu klasör henüz yok.\n\nOyun kayıtları, durum kayıtları ve diğer veriler bu klasöre kopyalanmayacak.\n\nYeni bir Hafıza Kartı klasörü oluşturulsun mu? Cheats = Hileler -Clear Recent = Clear "Recent" +Clear Recent = Geçmişi Temizle Clear Recent Games List = Geçmiş listesini temizle -Clear UI background = Arayüz arkaplanını varsayılana döndür +Clear UI background = Arayüz arkaplanını temizle Confirmation Button = Onaylama tuşu Date Format = Tarih biçimi Day Light Saving = Yaz saati uygulaması DDMMYYYY = GGAAYYYY -Decrease size = Decrease size +Decrease size = Boyutu küçült Developer Tools = Geliştirici araçları -Display Extra Info = Display extra info -Display Games on a grid = Display "Games" on a grid -Display Homebrew on a grid = Display "Homebrew && Demos" on a grid -Display Recent on a grid = Display "Recent" on a grid +Display Extra Info = Fazladan bilgileri göster +Display Games on a grid = "Oyunlar"ı bir ızgarada göster +Display Homebrew on a grid = "Bağımsız Yapımlar && Demolar"ı bir ızgarada göster +Display Recent on a grid = "Geçmiş"i bir ızgarada göster Dynarec (JIT) = Dynarec (JIT) Emulation = Emülasyon Enable Cheats = Hileleri aç Enable Compatibility Server Reports = Uyumluluk sunucusu raporlarını etkinleştir Failed to load state. Error in the file system. = Durum yüklenemedi. Dosya sistemi hatası. Failed to save state. Error in the file system. = Durum kaydedilemedi. Dosya sistemi hatası. -Fast (lag on slow storage) = Hızlı (Yavaş depolamada gecikmeye(lag) neden olur) +Fast (lag on slow storage) = Hızlı (Yavaş depolamada gecikme yapabilir) Fast Memory = Hızlı Bellek (Kararsız) Force real clock sync (slower, less lag) = Gerçek sayaç senkronizasyonuna zorla (daha yavaş, daha az kasma) frames, 0:off = frames, 0 = off -Games list settings = Games list settings +Games list settings = Oyun listesi ayarları General = Genel -Grid icon size = Grid icon size +Grid icon size = Izgara simge boyutu Help the PPSSPP team = PPSSPP takımına yardım et -Host (bugs, less lag) = Host (bugs, less lag) -I/O on thread (experimental) = I/O on thread (experimental) -Ignore bad memory accesses = Ignore bad memory accesses -Increase size = Increase size -Interpreter = Interpreter -IO timing method = I/O timing method -IR Interpreter = IR interpreter -Memory Stick Folder = Memory Stick folder +Host (bugs, less lag) = Host (buglu, daha az kasma) +Ignore bad memory accesses = Kötü bellek erişimlerini yoksay +Increase size = Boyutu arttır +Interpreter = Tercüman +IO timing method = G / Ç zamanlama yöntemi +IR Interpreter = IR tercümanı +Memory Stick Folder = Hafıza Kartı klasörü Memory Stick inserted = Hafıza kartı takıldı MHz, 0:default = MHz, 0 = varsayılan MMDDYYYY = AAGGYYYY +Moving background = hareketli arka plan Newest Save = En yeni kayıt +No animation = animasyon yok Not a PSP game = Bir PSP oyunu değil Off = Kapalı Oldest Save = En eski kayıt +Path does not exist! = Yol mevcut değil! +PSP Memory Stick = PSP Hafıza Kartı PSP Model = PSP modeli PSP Settings = PSP ayarları PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = En son oyunlar Record Audio = Sesi kaydet Record Display = Görüntüyü kaydet -Reset Recording on Save/Load State = Reset recording on Save/Load state +Reset Recording on Save/Load State = Kaydet/Yükle durumunda kaydı sıfırla Restore Default Settings = Varsayılan ayarları yükle Rewind Snapshot Frequency = Geri sarma görüntüsü sıklılığı (mem hog) -Save path in installed.txt = Save path in installed.txt +Save path in installed.txt = Yolu installed.txt'ye kaydet Save path in My Documents = Dosyaları "Belgeler"'e kaydet Savestate Slot = Durum kaydı yeri -Savestate slot backups = Savestate slot backups +Savestate slot backups = Durum kaydı slot yedekleri Screenshots as PNG = Ekran görüntülerini PNG formatında kaydet Set UI background... = Arayüz arkaplanı ayarla... -Show ID = Show ID -Show region flag = Show region flag +Show ID = ID'yi göster +Show region flag = Bölge bayrağını göster Simulate UMD delays = UMD gecikmelerini simule et Slot 1 = Slot 1 Slot 2 = Slot 2 @@ -1053,20 +1172,23 @@ Storage full = Depolama dolu Sustained performance mode = Sürekli performans modu Time Format = Zaman biçimi UI = Kullanıcı arayüzü -UI Sound = UI sound +UI background animation = UI arka plan animasyonu +UI Sound = UI sesi undo %c = %c 'yi yedekle +USB = USB Use Lossless Video Codec (FFV1) = Kayıpsız video kodek'i kullan (FFV1) -Use O to confirm = O Onaylama Tuşu Olarak Kullan -Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording -Use system native keyboard = Use system native keyboard -Use X to confirm = X Onaylama Tuşu Olarak Kullan +Use O to confirm = O (Japonya) +Use output buffer (with overlay) for recording = Kayıt için çıktı arabelleğini kullanın (bindirmeli) +Use system native keyboard = Sistem yerel klavyesini kullan +Use X to confirm = X (Küresel) VersionCheck = Güncellemeleri denetle WARNING: Android battery save mode is on = UYARI: Android güç tasaruufu açık WARNING: Battery save mode is on = UYARI: Güç tasarrufu açık +Waves = Dalgalar YYYYMMDD = YYYYAAGG [Upgrade] -Details = Details +Details = Detaylar Dismiss = Reddet Download = İndir -New version of PPSSPP available = PPSSPP'nin yeni versiyonu var +New version of PPSSPP available = PPSSPP'nin yeni versiyonu mevcut diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index ee20612102..738dcbd459 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = Гучність при альтернативній швидкості Audio backend = Бекенд аудіо (потрібне перезавантаження) +Audio Error = Audio Error AudioBufferingForBluetooth = Буфер, який підходить для Bluetooth (повільніше) Auto = Авто Device = Пристрій +Disabled = Disabled DSound (compatible) = DSound (сумісний) Enable Sound = Ввімкнути звук Global volume = Глобальна гучність Microphone = Microphone Microphone Device = Microphone device Mute = Вимкнути звук -Switch on new audio device = Увімкніть новий аудіопристрій +Reverb volume = Reverb volume +Use new audio devices automatically = Увімкніть новий аудіопристрій Use global volume = Використовувати загальну гучність WASAPI (fast) = WASAPI (швидко) [Controls] -Analog auto-rotation speed = Швидкість автоматичного обертання аналогу +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = Швидкість автоматичного обертання аналогу Analog Axis Sensitivity = Чутливість аналогової вісі Analog Limiter = Аналоговий обмежувач Analog Mapper High End = Параметри аналогового стіку (вісь чутливості) @@ -26,24 +32,40 @@ AnalogLimiter Tip = Коли натиснена кнопка аналогово Auto = Авто Auto-centering analog stick = Автоматичне центрування аналогового стіку Auto-hide buttons after seconds = Приховувати кнопки через +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Прив'язка +Button Binding = Button Binding Button Opacity = Прозорість кнопок Button style = Стиль кнопок +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Калібрувати хрестовину +Calibrated = Calibrated Calibration = Калібрування +Circular stick input = Circular stick input Classic = Класичний Combo Key Setting = Зміна комбо-кнопок Combo Key Setup = Налаштуванн комбо-кнопок... Confine Mouse = Не давати миші виходити за межі екрану Control Mapping = Призначення кнопок -Custom layout... = Розташування кнопок... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Розташування кнопок... Customize tilt = Налаштування нахилу... D-PAD = Хрестовина -Deadzone Radius = Радіус мертвої зони +Deadzone radius = Радіус мертвої зони DInput Analog Settings = Налаштування стіків DInput Disable D-Pad diagonals (4-way touch) = Вимкнути хрестовину по діагоналі +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Тонкі границі (підсвічування) HapticFeedback = Вібровіддача +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Ігнорувати геймпади, коли немає сфокусованості Ignore Windows Key = Ігнорувати клавішу Windows Invert Axes = Інверсія вісі @@ -55,6 +77,7 @@ L/R Trigger Buttons = Триггери L/R Landscape = Альбомна Landscape Auto = Альбомна (авто) Landscape Reversed = Альбомна (перевернута) +Low end radius = Low end radius Mouse = Налаштування миші Mouse sensitivity = Чутливість миші Mouse smoothing = Згладжування миші @@ -65,21 +88,32 @@ OnScreen = Елементи управління на екрані Portrait = Портретна Portrait Reversed = Портретна (перевернута) PSP Action Buttons = Кнопки дій PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Орієнтація екрану seconds, 0 : off = сек., 0 = вимкнено +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Чутливість +Shape = Shape Show right analog = Показати правий аналог Show Touch Pause Menu Button = Показувати кнопку меню +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Тонкі границі (збільшення) Tilt Base Radius = Радіус нахилу основи Tilt Input Type = Тип управління нахилом Tilt Sensitivity along X axis = Чутливість нахилу по осі X Tilt Sensitivity along Y axis = Чутливість нахилу по осі Y To Calibrate = Для калібрування поставте пристрій на рівну поверхню і натисніть "Калібрувати". +Toggle mode = Toggle mode Touch Control Visibility = Видимість елементів управління Use custom right analog = Використовуйте кастомний правий аналог Use Mouse Control = Використовувати керування мишою Visibility = Видимість +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Параметри стіків XInput @@ -99,6 +133,7 @@ Refresh Rate = Частота оновлення #Font = Trebuchet MS About PPSSPP... = &Про PPSSPP... Auto = Авто +Auto Max Quality = Auto Max &Quality Backend = Бекенд &рендерингу (потрібне перезавантаження) Bicubic = &Бікубічний Break = Перервати @@ -150,6 +185,7 @@ More Settings... = &Ще налаштування... Nearest = &Найближчий Non-Buffered Rendering = &Пропустити ефекти (небуферований, швидше) Off = В&имкнено +Open Chat = Open Chat Open Directory... = Відкрити &папку... Open from MS:/PSP/GAME... = Ві&дкрити MS:/PSP/GAME... Open Memory Stick = Відкрити карту пам'яті @@ -229,6 +265,7 @@ No block = Немає блоку Prev = Попередній Random = Випадковий Replace textures = Заміна текстур +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = "Ви впевненні,що хочете скинути налаштування \n(окрім керування) на стандартні?\nВи не зможите це відмінити.\nБудь ласка, презавантажте PPSSPP після скидання." RestoreGameDefaultSettings = Ви впевнені, що хочете повернути всі параметри гри до стардартних\nповернути PPSSPP за замовчуванням ? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Параметри налаштування для ц DeleteFailed = Неможливо видалити дані. Deleting = Видалення\nБудь ласка, зачекайте... Disable All = Вимкнути все +Dumps = Dumps Edit = Edit Enable All = Ввімкнути все Enter = Введення +Filter = Filter Finish = Зберегти +GE Frame Dumps = GE Frame Dumps Grid = Сітка Inactive = Неактивно InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Зберегти Save completed = Збереження завершено. Saving = Збереження\nБудь ласка, зачекайте... SavingFailed = Неможливо зберегти дані. +Search = Search Select = Вибрати Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = Файл стиснуто (ZIP).\nБудь [Game] Asia = Азія +Calculate CRC = Calculate CRC ConfirmDelete = Видалити Create Game Config = Створити конфіг Create Shortcut = Створити ярлик @@ -430,6 +473,7 @@ Auto = Авто Auto (1:1) = Авто (1:1) Auto (same as Rendering) = Авто (таке ж як розширення рендерингу) Auto FrameSkip = Автопропуск кадрів +Auto Max Quality = Auto Max Quality Auto Scaling = Автоматичне масштабування Backend = Бекенд Balanced = Збалансовано @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP-файл не містить про [KeyMapping] Autoconfigure = Авто конфіг Autoconfigure for device = Авто конфіг для пристрою +Bind All = Bind All Clear All = Очистити все Default All = Скинути все Map a new key for = Призначити кнопку для Map Key = Карта кнопки Map Mouse = Карта миші +Replace = Replace +Show PSP = Show PSP Test Analogs = Тест аналогів You can press ESC to cancel. = Ви можете натиснути Esc, щоб скасувати. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP зберігає на тимчасовому збер SavesAreTemporaryGuidance = Витягніть кудись PPSSPP, щоб назавжди зберегти SavesAreTemporaryIgnore = Ігноруйте попередження UnpinPath = Відкріпити +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Авто обертання аналогу (CW) AxisSwap = Обмін осей Circle = Коло Cross = Хрестик +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Меню розробника +Double tap button = Double tap button Down = Вниз Dpad = Хрестовина Frame Advance = Завантаження кадру заздалегідь @@ -631,10 +690,11 @@ OpenChat = Відкритий чат Pause = Пауза R = R RapidFire = Турбо кнопка +Record = Record Remote hold = Віддалене утримання Rewind = Повернення Right = Вправо -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = П. стік вниз RightAn.Left = П. стік вліво RightAn.Right = П. стік вправо @@ -648,6 +708,11 @@ Select = Select SpeedToggle = Швидкість Square = Квадрат Start = Start +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Демпінг текстури Texture Replacement = Заміна текстури Toggle Fullscreen = Повноекранний режим @@ -659,10 +724,39 @@ Vol + = Гучність + Vol - = Гучність - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Відвідайте спеціальний форум мультиплеєру AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Знизу центрально Bottom Left = Знизу ліворуч @@ -674,6 +768,7 @@ Change proAdhocServer Address = Спеціальна адреса серверу Chat = Чат Chat Button Position = Положення кнопки чату Chat Here = Тут чат +Chat message = Chat message Chat Screen Position = Положення екрана чату Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Недійсне IP або ім'я хоста Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Мережа ініціалізована +None = None Please change your Port Offset = Please change your port offset Port offset = Зсув порту (0 = сумісність з PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Швидкий чат 1 Quick Chat 2 = Швидкий чат 2 @@ -732,6 +831,8 @@ Rewind = Повернення Save State = Зберегти Settings = Налаштування Switch UMD = Перемикач UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Кінескоп 2 Sharpen = Різкість SSAA(Gauss) = SSAA (Гаусс) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Високоякісний Spline36 VideoSmoothingAA = Згладжування відео (VSAA) Vignette = Віньєтка @@ -828,6 +930,8 @@ Stopping.. = Зупинка... [Reporting] Bad = Погано +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Ваші дані надсилаються у фоновому режимі. FeedbackDesc = Як емулюється? Дайте знати нам і нашій спільноті! FeedbackDisabled = Звіти на сервер сумісності повинні бути включені. @@ -853,6 +957,7 @@ Perfect Description = Бездоганна емуляція гри від поч Plays = Нормально Plays Description = Повністю іграбельно з незначними глюками ReportButton = Відправити відгук +Show disc CRC = Show disc CRC Speed = Швидкість Submit Feedback = Надіслати відгук SuggestionConfig = Дивіться відгуки на веб-сайті, щоб отримати гарні налаштування @@ -871,9 +976,11 @@ Date = Дата Filename = Ім'я файлу No screenshot = Немає скріншоту None yet. Things will appear here after you save. = Тут поки що нічого немає. З'явиться після вашого збереження. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Збереження Save States = Стан збереження Savedata Manager = Управління збереженими даними +Showing matches for '%1'. = Showing matches for '%1'. Size = Розмір [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = ПОПЕРЕДЖЕННЯ: виявлено GLTools, можут In menu = В меню Load savestate failed = Не вдалося завантажити збереження Loaded State = Стан завантажено +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = Завантажено. Збережіться в грі, перезапустіть гру і завантажте для виправлення помилок. LoadStateDoesntExist = Не вдається завантажити стан: файла не існує! LoadStateWrongVersion = Не вдається завантажити стан: файл стану від старої версії PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Збереження текстур вимкнено. saveNewTextures_true = Текстури будуть зберігатися у вашому сховищі. SpeedCustom2 = Швидкість: альтернативна 2 standard = Швидкість: стандартна +State load undone = State load undone Untitled PSP game = Безіменна гра для PSP [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = Версія D3DCompiler Debug = Налагодження Debugger Present = Присутній налагоджувач Device Info = Інформація про пристрій +Directories = Directories Display Information = Інформація про дисплей Driver Version = Версія драйвера EGL Extensions = Розширення EGL @@ -956,6 +1067,7 @@ Release = Реліз RW/RX exclusive = Ексклюзивний RW/RX Sample rate = Норма вибірки Shading Language = Мова шейдерів +Storage = Storage Sustained perf mode = Режим тривалої роботи System Information = Інформація про систему System Name = Назва @@ -977,8 +1089,11 @@ AVI Dump started. = Дамп AVI запущено AVI Dump stopped. = Дамп AVI зупинено Cache ISO in RAM = Кешувати ISO в оперативну пам'ять Change CPU Clock = Змінити частоту CPU (нестабільно) -Change Memory Stick folder = Змінити папку для карти пам'яті -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Змінити папку для карти пам'яті +Memory Stick size = Memory Stick size Change Nickname = Змінити ім'я ChangingMemstickPath = Збереження, стан і інші дані НЕ будуть скопійовані в цю папку..\n\nЗмінити папку для карти пам'яті? ChangingMemstickPathInvalid = Цей шлях неможливо використовувати для файлів карти пам'яті. @@ -1012,7 +1127,6 @@ General = Загальні Grid icon size = Розмір піктограми сітки Help the PPSSPP team = Допомога Команді PPSSPP Host (bugs, less lag) = Хост (повільніше, можливі лаги) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Збільшити розмір Interpreter = Інтерпретатор @@ -1022,14 +1136,19 @@ Memory Stick Folder = Папка карти пам'яті Memory Stick inserted = Вставлена карта пам'яті MHz, 0:default = МГц, 0 = за замовч. MMDDYYYY = ММДДРРРР +Moving background = Moving background Newest Save = Найновіші збереження +No animation = No animation Not a PSP game = Не є грою для PSP Off = Вимкнено Oldest Save = Найстаріші збереження +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = Модель PSP PSP Settings = Налаштування PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Запис аудіо Record Display = Запис відео Reset Recording on Save/Load State = Скидати запис при збереженні / завантаженні @@ -1053,8 +1172,10 @@ Storage full = Пам'ять заповнено Sustained performance mode = Режим тривалої роботи Time Format = Формат часу UI = Користувацький інтерфейс +UI background animation = UI background animation UI Sound = UI sound undo %c = резервна копія %c +USB = USB Use Lossless Video Codec (FFV1) = Використовувати відеокодек без втрат (FFV1) Use O to confirm = O для підтвердження Use output buffer (with overlay) for recording = Використовувати вихідний буфер (з оверлеєм) для запису @@ -1063,6 +1184,7 @@ Use X to confirm = X для підтвердження VersionCheck = Перевіряти наявність оновлень WARNING: Android battery save mode is on = УВАГА: ввімкнено режим енергозбереження Android WARNING: Battery save mode is on = УВАГА: включений режим енергозбереження +Waves = Waves YYYYMMDD = РРРРММДД [Upgrade] diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 46f1918b2f..8acd20bc1c 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -1,49 +1,71 @@ [Audio] Alternate speed volume = Alternate speed volume Audio backend = Âm thanh backend (hãy khởi động lại.) +Audio Error = Audio Error AudioBufferingForBluetooth = Bluetooth-friendly buffer (chậm) Auto = Tự động Device = Device +Disabled = Disabled DSound (compatible) = Âm thanh (tương thích) Enable Sound = Mở âm thanh Global volume = Âm lượng Microphone = Microphone Microphone Device = Microphone device Mute = Mute -Switch on new audio device = Switch on new audio device +Reverb volume = Reverb volume +Use new audio devices automatically = Use new audio devices automatically Use global volume = Use global volume WASAPI (fast) = WASAPI (nhanh) [Controls] -Analog auto-rotation speed = Analog auto-rotation speed Analog Axis Sensitivity = Độ nhạy của Analog +Analog Binding = Analog Binding Analog Limiter = Phạm vi của Analog Analog Mapper High End = Analog high-end (rất nhạy) Analog Mapper Low End = Analog low-end (ít nhạy) Analog Mapper Mode = Chế độ sắp đặt Analog +Analog Settings = Analog Settings Analog Stick = Cần Analog +Analog Style = Analog Style AnalogLimiter Tip = Khi phạm vi của analog được chọn Auto = Tự động Auto-centering analog stick = Cần Analog auto định tâm Auto-hide buttons after seconds = Thời gian Auto ẩn nút (giây) +Auto-rotation speed = Auto-rotation speed +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = Độ trong suốt Button style = Kiểu nút +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = Chỉnh cân bằng D-Pad +Calibrated = Calibrated Calibration = Đã chỉnh xong +Circular stick input = Circular stick input Classic = Cổ điển Combo Key Setting = Thiết lập phím combo Combo Key Setup = Cài đặt phím combo Confine Mouse = hiển thị chuột Control Mapping = Chỉnh nút -Custom layout... = Chỉnh vị trí nút... +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = Chỉnh vị trí nút... Customize tilt = Chỉnh độ nghiêng... D-PAD = D-Pad -Deadzone Radius = Bán kính vùng chết +Deadzone radius = Bán kính vùng chết DInput Analog Settings = Cài đặt đầu vào analog Disable D-Pad diagonals (4-way touch) = Tắt D-Pad chéo (chạm 4 hướng) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Ánh sáng đường viền HapticFeedback = Chế độ rung +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = Bỏ qua gamepads khi "ko tập trung" Ignore Windows Key = Bỏ qua phím Windows (ngăn menu Start hiện ra) Invert Axes = Đảo ngược cần analog @@ -55,6 +77,7 @@ L/R Trigger Buttons = Kích hoạt nút L/R Landscape = Chiều ngang Landscape Auto = Auto chiều ngang Landscape Reversed = Chiều ngang đảo ngược +Low end radius = Low end radius Mouse = Cài đặt chuột Mouse sensitivity = Độ nhạy của chuột Mouse smoothing = Chuột smoothing (mịn màng) @@ -65,21 +88,32 @@ OnScreen = Hiện điều khiển cảm ứng trên màn hình Portrait = Chiều dọc Portrait Reversed = Chiều dọc đảo ngược PSP Action Buttons = Nút hành động của PSP +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = Xoay màn hình seconds, 0 : off = giây, 0 : tắt +Sensitivity (scale) = Sensitivity (scale) Sensitivity = Độ nhạy +Shape = Shape Show right analog = Show right analog Show Touch Pause Menu Button = Hiện phím dừng +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = Viền mỏng Tilt Base Radius = Tilt base radius Tilt Input Type = Đầu vào kiểu nghiêng Tilt Sensitivity along X axis = Độ nhạy nghiêng theo chiều x Tilt Sensitivity along Y axis = Độ nhạy nghiêng theo chiều y To Calibrate = Để chỉnh cân bằng, giữ thiết bị cân bằng và bấm "chỉnh cân bằng D-Pad". +Toggle mode = Toggle mode Touch Control Visibility = Hiển thị điều khiển cảm ứng Use custom right analog = Use custom right analog Use Mouse Control = Sử dụng chuột điều khiển Visibility = Hiển thị +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = Đặt đầu vào X của analog @@ -99,6 +133,7 @@ Refresh Rate = Tần số làm mới #Font = Trebuchet MS About PPSSPP... = Thông tin về PPSSPP... Auto = Tự động +Auto Max Quality = Auto Max &Quality Backend = Kết xuất từ thư viện đồ họa (Khởi động lại PPSSPP) Bicubic = Bicubic (mịn) Break = Break @@ -150,6 +185,7 @@ More Settings... = Các thiết lập khác... Nearest = Gần nhất Non-Buffered Rendering = Bỏ qua hiệu ứng đệm (Không bộ nhớ đệm, nhanh hơn) Off = Tắt +Open Chat = Open Chat Open Directory... = Mở thư mục... Open from MS:/PSP/GAME... = Mở từ MS:/PSP/GAME... Open Memory Stick = Mở Memory Stick @@ -229,6 +265,7 @@ No block = không chặn Prev = Trở lại Random = Ngẫu nhiên Replace textures = Thay thế textures +Reset = Reset Reset limited logging = Reset limited logging RestoreDefaultSettings = Bạn có muốn khôi phục các thiết lập về mặc định không?\nThiết lập tay cầm (bên ngoài) sẽ không bị thay đổi.\n\n\n\nHãy thoát PPSSPP rồi mở lại. RestoreGameDefaultSettings = Bạn có muốn khôi phục cài đặt trò chơi\nPPSSPP sẽ trở về mặc định? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = Bạn có muốn xóa thiết lập\nđối với game DeleteFailed = Không thể xóa dữ liệu này. Deleting = Đang xóa\nXin đợi... Disable All = Vô hiệu hóa tất cả +Dumps = Dumps Edit = Edit Enable All = Cho phép tất cả Enter = Enter +Filter = Filter Finish = Hoàn thành +GE Frame Dumps = GE Frame Dumps Grid = Grid Inactive = Không hoạt động InternalError = An internal error has occurred. @@ -300,8 +340,10 @@ Save = Lưu Save completed = Đã lưu xong. Saving = Đang lưu\nXin đợi một lúc... SavingFailed = Không thể lưu dữ liệu này. +Search = Search Select = Lựa chọn Shift = Shift +Skip = Skip Snap = Snap Space = Space SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = đây là file nén (ZIP).\nXin hãy giải [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = Xóa Create Game Config = Tạo thiết lập cho game Create Shortcut = Tạo lối tắt @@ -430,6 +473,7 @@ Auto = Tự động Auto (1:1) = Tự động (1:1) Auto (same as Rendering) = Tự động (cùng với kết xuất) Auto FrameSkip = Tự động nhảy khung hình +Auto Max Quality = Auto Max Quality Auto Scaling = Tự động nhân rộng Backend = Thư viện đồ họa Balanced = Cân bằng @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP file does not contain PSP software [KeyMapping] Autoconfigure = Tự động thiết lập Autoconfigure for device = Tự động thiết lập với thiết bị này +Bind All = Bind All Clear All = Xóa tất cả Default All = Trả lại thiết lập gốc Map a new key for = Nhập nút mới cho Map Key = bản đồ nút Map Mouse = bản đồ chuột +Replace = Replace +Show PSP = Show PSP Test Analogs = Kiểm tra Analog You can press ESC to cancel. = bạn có thể nhấp Esc để hủy. @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP đang tiết kiệm trong bộ lưu trữ SavesAreTemporaryGuidance = Giải nén PPSSPP ở thư mục nào đó để lưu vĩnh viễn SavesAreTemporaryIgnore = Bỏ qua cảnh báo UnpinPath = Unpin +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = Auto analog rotation (CW) AxisSwap = Hoán đổi trục Circle = Tròn Cross = Cross (chéo) +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = Menu NPH +Double tap button = Double tap button Down = Xuống Dpad = Dpad Frame Advance = Khung trước @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = Tạm dừng R = R RapidFire = Rapid-fire +Record = Record Remote hold = Giữ điều khiển Rewind = Tua nhanh Right = Phải -Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +Right Analog Stick = Right Analog Stick RightAn.Down = RightAn.Down RightAn.Left = RightAn.Left RightAn.Right = RightAn.Right @@ -648,6 +708,11 @@ Select = lựa chọn SpeedToggle = Chuyển đổi tốc độ Square = Vuông Start = Bắt đầu +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = Texture dumping Texture Replacement = Texture replacement Toggle Fullscreen = Chuyển toàn màn hình @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = Thăm diễn đàn AdHoc AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = Bottom center Bottom Left = Bottom left @@ -674,6 +768,7 @@ Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here +Chat message = Chat message Chat Screen Position = Chat screen position Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server Forced First Connect = Forced first connect (faster connect) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = Invalid IP or hostname Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network Initialized = Mạng đã được khởi tạo +None = None Please change your Port Offset = Please change your port offset Port offset = Port offset(0 = PSP compatibility) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc server address: Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 @@ -732,6 +831,8 @@ Rewind = Tua lại Save State = Lưu trò chơi Settings = Cấu hình trò chơi Switch UMD = Đổi UMD +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Đường nét (CRT) Sharpen = Sắc nét SSAA(Gauss) = Siêu mẫu AA (cốt) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Cao cấp VideoSmoothingAA = Video mịn AA Vignette = Đen góc @@ -828,6 +930,8 @@ Stopping.. = Đang dừng... [Reporting] Bad = Tệ +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = Dữ liệu của bạn đang được gửi trong nền. FeedbackDesc = Đánh giá thế nào về giả lập này? Hãy để chúng tôi và cộng đồng biết! FeedbackDisabled = Báo cáo sever tương thích phải được kích hoạt. @@ -853,6 +957,7 @@ Perfect Description = Ứng dụng hoàn hảo cho toàn bộ trò chơi - tuy Plays = Chơi Plays Description = Hoàn toàn có thể chơi nhưng có thể bị trục trặc ReportButton = Báo cáo phản hồi +Show disc CRC = Show disc CRC Speed = Tốc độ Submit Feedback = Báo cáo phản hồi SuggestionConfig = Xem thông báo trên trang web để cài đặt tốt hơn. @@ -871,9 +976,11 @@ Date = Date Filename = Tên file No screenshot = Không có screenshot None yet. Things will appear here after you save. = Không có gì ở đây. Mọi thứ sẽ xuất hiện ở đây sau khi bạn lưu. +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = Lưu dữ liệu Save States = Lưu game Savedata Manager = Quản lý lưu dữ liệu +Showing matches for '%1'. = Showing matches for '%1'. Size = Kích cỡ [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = WARNING: Phát hiện GLTools, có thể gây ra vấn đề. In menu = In menu Load savestate failed = Lưu trò chơi thất bại Loaded State = Đã load xong +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = loaded. lưu trong game, khởi động lại và tải để ít lỗi hơn. LoadStateDoesntExist = Không load được: không có file save! LoadStateWrongVersion = Không load được: file save là của một phiên bản cũ của PPSSPP! @@ -900,6 +1009,7 @@ saveNewTextures_false = Texture saving was disabled. saveNewTextures_true = Textures will now be saved to your storage. SpeedCustom2 = Tốc độ: Luân phiên 2 standard = Tốc độ: bình thường +State load undone = State load undone Untitled PSP game = Trò chơi PSP không tên [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Thông tin thiết bị +Directories = Directories Display Information = Hiện thông tin Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Giải phóng RW/RX exclusive = Độc quyền RW/RX Sample rate = Tỷ lệ mẫu Shading Language = Ngôn ngữ tô bóng +Storage = Storage Sustained perf mode = Chế độ hoàn thiện bền vững System Information = Thông tin hệ thống System Name = Tên @@ -977,8 +1089,11 @@ AVI Dump started. = Đưa AVI vào bắt đầu AVI Dump stopped. = Đưa AVI vào dừng lại Cache ISO in RAM = Cache full ISO in RAM Change CPU Clock = Chỉnh đồng hồ CPU (không ổn định) -Change Memory Stick folder = Change Memory Stick folder -Change Memory Stick Size = Change Memory Stick size (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = Memory Stick folder +Memory Stick size = Memory Stick size Change Nickname = Đổi nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = Linh tinh Grid icon size = Grid icon size Help the PPSSPP team = Giúp nhóm PPSSPP Host (bugs, less lag) = Host (lỗi, ít lag) -I/O on thread (experimental) = I/O on thread (experimental) Ignore bad memory accesses = Ignore bad memory accesses Increase size = Increase size Interpreter = Thông dịch viên @@ -1022,14 +1136,19 @@ Memory Stick Folder = Memory Stick folder Memory Stick inserted = Thẻ nhớ được chèn MHz, 0:default = MHz, 0 = mặc định MMDDYYYY = ThangNgayNam +Moving background = Moving background Newest Save = Save mới nhất +No animation = No animation Not a PSP game = Đây Không phải là game PSP Off = Tắt Oldest Save = Save cũ nhất +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP model PSP Settings = Thiết lập PSP PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = Ghi audio Record Display = Hiển thị ghi Reset Recording on Save/Load State = Đặt lại ghi trên trạng thái Save/Load. @@ -1053,8 +1172,10 @@ Storage full = Bộ nhớ đầy Sustained performance mode = Chế độ hiệu suất duy trì Time Format = Chỉnh định dạng thời gian (12/24) UI = Giao diện người dùng +UI background animation = UI background animation UI Sound = UI sound undo %c = backup %c +USB = USB Use Lossless Video Codec (FFV1) = Sử dụng codec video lossless (FFV1) Use O to confirm = Dùng O để chọn Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording @@ -1063,6 +1184,7 @@ Use X to confirm = Dùng X để chọn VersionCheck = Kiểm tra phiên bản PPSSPP mới WARNING: Android battery save mode is on = CẢNH BÁO: Chế độ tiết kiệm pin của Android được Bật WARNING: Battery save mode is on = CẢNH BÁO: Chế độ tiết kiệm pin được bật +Waves = Waves YYYYMMDD = NamThangNgay [Upgrade] diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 075d237c62..d487393546 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = 自定义速度下的音量 Audio backend = 音频引擎 (需要重启) +Audio Error = 音频错误 AudioBufferingForBluetooth = 蓝牙友好缓冲区 (更慢) Auto = 自动 Device = 设备 +Disabled = 禁用 DSound (compatible) = DirectSound (兼容) Enable Sound = 开启声音 Global volume = 全局音量 Microphone = 麦克风 Microphone Device = 麦克风设备 Mute = 静音 -Switch on new audio device = 启动新的音频设备 +Reverb volume = 混响音量 +Use new audio devices automatically = 自动使用新的音频设备 Use global volume = 使用全局音量 WASAPI (fast) = WASAPI (快) [Controls] -Analog auto-rotation speed = 模拟自动转速 +Analog Binding = 摇杆绑定 +Analog Settings = 摇杆设置 +Analog Style = 摇杆样式 +Auto-rotation speed = 自动旋转速度 Analog Axis Sensitivity = 摇杆灵敏度 Analog Limiter = 摇杆限制器 Analog Mapper High End = 模拟映射器的高端 (轴灵敏度) @@ -26,24 +32,40 @@ AnalogLimiter Tip = 当按下摇杆限制器键时 Auto = 自动 Auto-centering analog stick = 摇杆自动跟手 Auto-hide buttons after seconds = 自动隐藏按键时间 +Auto-switch = 自动切换 +Base tilt position = 标准体感位置 Binds = 绑定 +Button Binding = 按键绑定 Button Opacity = 按键透明度 Button style = 按键样式 +Calibrate Analog Stick = 校准摇杆 Calibrate D-Pad = 校准方向键 +Calibrated = 校准后 Calibration = 校准 +Circular stick input = 环形摇杆输入 Classic = 传统 Combo Key Setting = 组合键设置 Combo Key Setup = 组合键设置 Confine Mouse = 在窗口/显示区域内捕获鼠标 Control Mapping = 按键映射 -Custom layout... = 编辑按键布局... +Custom Key Setting = 自定义键位设置 +Customize = 自定义 +Customize Touch Controls = 编辑触屏布局... Customize tilt = 自定义重力感应... D-PAD = 方向键 -Deadzone Radius = 死区半径 +Deadzone radius = 死区半径 DInput Analog Settings = DInput 模拟设置 Disable D-Pad diagonals (4-way touch) = 禁用方向键对角线 (四方向触控) +Disable diagonal input = 禁用对角线方向输入 +Double tap = 双击 +Enable gesture control = 启用体感操作 +Enable standard shortcut keys = 启用标准快捷键 +Gesture = 体感 +Gesture mapping = 体感映射 Glowing borders = 细边框 (发光) HapticFeedback = 按键反馈 (震动) +Hide touch analog stick background circle = 隐藏触屏摇杆的背景圈 +Icon = 图标 Ignore gamepads when not focused = 后台运行时忽略游戏手柄 Ignore Windows Key = 忽略 Windows 键 Invert Axes = 轴反转 @@ -55,31 +77,43 @@ L/R Trigger Buttons = L/R 触发按钮 Landscape = 横向 Landscape Auto = 自动横向 Landscape Reversed = 横向反转 +Low end radius = 末端半径 Mouse = 鼠标设置 Mouse sensitivity = 鼠标灵敏度 -Mouse smoothing = 鼠标平滑 -MouseControl Tip = 您现在可以在按键映射界面按下 "M" 图标来映射鼠标按键。 +Mouse smoothing = 鼠标平滑度 +MouseControl Tip = 您可以在按键映射界面按下 "M" 图标来映射鼠标按键。 None (Disabled) = 无 (禁用) Off = 关闭 OnScreen = 屏幕虚拟按键 Portrait = 纵向 Portrait Reversed = 纵向反转 PSP Action Buttons = PSP 功能键 +Raw input = 原始输入 +Reset to defaults = 重置为默认 +Screen aligned to ground = 屏幕平行地面时 +Screen at right angle to ground = 屏幕与地面垂直时 Screen Rotation = 屏幕旋转 seconds, 0 : off = 秒, 0 = 不隐藏 +Sensitivity (scale) = 灵敏度 (倍率) Sensitivity = 灵敏度 +Shape = 形状 Show right analog = 显示右摇杆 Show Touch Pause Menu Button = 显示暂停菜单按键 +Swipe = 挥动 +Swipe sensitivity = 挥动灵敏度 +Swipe smoothing = 挥动平滑度 Thin borders = 细边框 Tilt Base Radius = 最小摇杆半径 Tilt Input Type = 重力感应替代按键类型 Tilt Sensitivity along X axis = 沿 X 轴倾斜灵敏度 Tilt Sensitivity along Y axis = 沿 Y 轴倾斜灵敏度 To Calibrate = 如需校准, 请保证设备在一个平面上,然后按"校准" +Toggle mode = 切换模式 Touch Control Visibility = 触摸按键可见性 Use custom right analog = 自定义右摇杆用途 Use Mouse Control = 使用鼠标控制 Visibility = 可见设定 +Visible = 可见 X = X X + Y = X + Y XInput Analog Settings = XInput 模拟设置 @@ -96,6 +130,7 @@ Refresh Rate = 刷新率 [DesktopUI] # If your language does not show well with the default font, you can use Font to specify a different one. # Just add it to your language's ini file and uncomment it (remove the # by Font). +Auto Max Quality = 自动最佳质量 Font = 微软雅黑 About PPSSPP... = 关于 PPSSPP (&A)... Auto = 自动 (&A) @@ -150,6 +185,7 @@ More Settings... = 更多设置 (&M)... Nearest = 邻近取样 (&N) Non-Buffered Rendering = 跳过缓冲效果 (非缓冲, 更快) Off = 关闭 (&O) +Open Chat = 打开聊天 Open Directory... = 打开目录 (&D)... Open from MS:/PSP/GAME... = 打开 MS:/PSP/GAME (P)... Open Memory Stick = 打开记忆棒 (&M) @@ -199,7 +235,7 @@ Allow remote debugger = 允许远程调试器 Backspace = 退格键 Block address = 内存块地址 By Address = 通过地址定位 -Copy savestates to memstick root = 副本保存状态,以记忆棒根 +Copy savestates to memstick root = 拷贝即时存档至记忆棒根路径 Create/Open textures.ini file for current game = 创建/打开当前游戏的 textures.ini 文件 Current = 当前 Dev Tools = 开发者工具 @@ -229,6 +265,7 @@ No block = 没有内存块 Prev = 之前 Random = 随机 Replace textures = 纹理替换 +Reset = 重置 Reset limited logging = 重置受限日志 RestoreDefaultSettings = 您确定要将所有设置恢复到默认? (按键映射除外)\n该操作无法撤销。\n\n操作将在 PPSSPP 重新启动后生效。 RestoreGameDefaultSettings = 您确定要将此游戏设置\n恢复为 PPSSPP 默认吗? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = 您确定要删除此游戏的设置吗? DeleteFailed = 无法删除存档。 Deleting = 删除中\n请稍候... Disable All = 全部禁用 +Dumps = 转储 Edit = 编辑 Enable All = 全部启用 Enter = 确定 +Filter = 筛选 Finish = 完成 +GE Frame Dumps = GE 帧转储 Grid = 网格尺寸 Inactive = 未激活 InternalError = 发生内部错误. @@ -300,8 +340,10 @@ Save = 保存 Save completed = 保存完成。 Saving = 保存中\n请稍候... SavingFailed = 无法保存存档。 +Search = 搜索 Select = 选择 Shift = 翻页 +Skip = 跳过 Snap = 网格对齐 Space = 空格键 SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = 这是 ZIP 压缩文件。\n请尝试使用 [Game] Asia = 亚洲 +Calculate CRC = 计算 CRC ConfirmDelete = 确认删除 Create Game Config = 建立游戏配置 Create Shortcut = 创建快捷方式 @@ -401,8 +444,8 @@ USA = 美国 Use UI background = 使用界面背景 [Graphics] -% of the void = % of the void -% of viewport = % of viewport +% of the void = %的边框 +% of viewport = %的视区 %, 0:unlimited = %, 0 = 无限制 (supersampling) = (超级采样) (upscaling) = (放大) @@ -430,6 +473,7 @@ Auto = 自动 Auto (1:1) = 自动 (1:1) Auto (same as Rendering) = 自动 (同渲染分辨率) Auto FrameSkip = 自动跳帧 +Auto Max Quality = 自动最佳质量 Auto Scaling = 自动缩放 Backend = 渲染引擎 Balanced = 均衡 @@ -457,7 +501,7 @@ Deposterize Tip = 修复纹理被放大时可见的带状错误 Device = 设备 Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 -Disable slower effects (speedup) = 停用较慢的渲染效果 (提升速度) +Disable slower effects (speedup) = 停用较慢的渲染效果 (提速) Disabled = 禁用 Display layout editor = 显示布局编辑器 Display Resolution (HW scaler) = 显示分辨率 (硬件缩放) @@ -478,7 +522,7 @@ Hybrid = 混合 Hybrid + Bicubic = 混合 + 双三次 Ignore camera notch when centering = 居中时忽略摄像头缺口 Internal Resolution = 内部分辨率 -Lazy texture caching = 减少缓存存取 (提升速度) +Lazy texture caching = 减少缓存存取 (更快, 但可能引起字体渲染错误) Linear = 线性过滤 Low = 低 LowCurves = 低品质样条函数/贝塞尔曲线 (提升速度) @@ -491,7 +535,7 @@ Must Restart = 重启 PPSSPP 才能使这项设置生效。 Native device resolution = 本机原生的分辨率 Nearest = 邻近取样 No buffer = 不缓冲 -Non-Buffered Rendering = 跳过缓冲效果 (非缓冲, 更快) +Non-Buffered Rendering = 跳过缓冲效果 (不缓冲, 更快) None = 不显示 Number of Frames = 帧的数量 Off = 关闭 @@ -502,14 +546,14 @@ Percent of FPS = 帧率的百分比 Performance = 性能 Postprocessing effect = 后处理效果 Postprocessing Shader = 后处理着色器 -Recreate Activity = Recreate activity +Recreate Activity = 重建进程 Render duplicate frames to 60hz = 渲染重复帧至60 Hz -RenderDuplicateFrames Tip = 在以较低帧速率运行的游戏中可以使帧速率更平滑 +RenderDuplicateFrames Tip = 在较低帧率的游戏中可以使帧速率更平滑 Rendering Mode = 渲染模式 Rendering Resolution = 渲染分辨率 RenderingMode NonBuffered Tip = 更快, 但可能在某些游戏中没有图像渲染 Retain changed textures = 保留已更改的纹理 (有时更慢) -RetainChangedTextures Tip = 使较多游戏速度变慢, 但有些游戏变得快了很多 +RetainChangedTextures Tip = 使较多游戏减速, 但有些游戏可能变快很多 Rotation = 旋转 Safe = 安全 Screen layout = 屏幕布局 @@ -520,7 +564,7 @@ Simulate Block Transfer = 模拟数据块传输效果 SoftGPU Tip = 目前非常慢 Software Rendering = 软件渲染 (慢) Software Skinning = 软件蒙皮 -SoftwareSkinning Tip = 合并 CPU 中已经蒙皮的模型绘制, 在较多游戏中更快 +SoftwareSkinning Tip = 合并 CPU 中已经蒙皮的模型绘制, 在部分游戏中更快 Speed = 运行速度 Stretching = 拉伸 Texture Filter = 纹理过滤方式 @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP 文件不包含 PSP 软件 [KeyMapping] Autoconfigure = 自动配置 Autoconfigure for device = 自动根据设备配置 +Bind All = 全部绑定 Clear All = 全部清除 Default All = 恢复默认 Map a new key for = 映射该键的新按键 Map Key = 按键映射 Map Mouse = 鼠标映射 +Replace = 替换现有 +Show PSP = 显示 PSP Test Analogs = 测试摇杆 You can press ESC to cancel. = 您可以按下 ESC 键取消 @@ -572,7 +619,7 @@ PPSSPP Homebrew Store = 从 PPSSPP 自制软件商店下载 Exit = 退出程序 Game Settings = 游戏设置 Games = 载入新游戏 -Give PPSSPP permission to access storage = 给予 PPSSPP 访问存储器的权限 +Give PPSSPP permission to access storage = 给予 PPSSPP 访问存储空间的权限 Homebrew & Demos = 自制游戏与试玩 How to get games = 如何获得游戏? How to get homebrew & demos = 如何获得自制游戏与试玩? @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP 正在临时空间内存档 SavesAreTemporaryGuidance = 请将 PPSSPP 解压出来以使存档永久保留 SavesAreTemporaryIgnore = 忽略警告 UnpinPath = 取消固定 +UseBrowseOrLoad = 浏览以选择文件夹,或者加载以读取游戏文件 www.ppsspp.org = 访问官网 [MainSettings] @@ -598,71 +646,117 @@ Tools = 工具 [MappableControls] Alt speed 1 = 自定义速度 Alt speed 2 = 自定义速度 2 -An.Down = 左摇杆:下 -An.Left = 左摇杆:左 -An.Right = 左摇杆:右 -An.Up = 左摇杆:上 +An.Down = 左摇杆:下 +An.Left = 左摇杆:左 +An.Right = 左摇杆:右 +An.Up = 左摇杆:上 Analog limiter = 摇杆限制器 Analog Stick = 左摇杆 Audio/Video Recording = 音频/视频录制 Auto Analog Rotation (CCW) = 自动旋转摇杆(逆时针) Auto Analog Rotation (CW) = 自动旋转摇杆(顺时针) AxisSwap = 摇杆互换 -Circle = 圈 +Circle = 圆 Cross = 叉 -D-pad down = 方向键:下 -D-pad left = 方向键:左 -D-pad right = 方向键:右 -D-pad up = 方向键:上 +Custom 1 = 预设 1 +Custom 10 = 预设 10 +Custom 2 = 预设 2 +Custom 3 = 预设 3 +Custom 4 = 预设 4 +Custom 5 = 预设 5 +Custom 6 = 预设 6 +Custom 7 = 预设 7 +Custom 8 = 预设 8 +Custom 9 = 预设 9 +D-pad down = 方向键:下 +D-pad left = 方向键:左 +D-pad right = 方向键:右 +D-pad up = 方向键:上 DevMenu = 开发者菜单 -Down = 方向键:下 +Double tap button = 双击键 +Down = 方向键:下 Dpad = 方向键 Frame Advance = 逐帧播放 -Hold = Hold -Home = Home +Hold = 短按电源键 +Home = Home键 L = L -Left = 方向键:左 +Left = 方向键:左 Load State = 载入即时存档 -Mute toggle = 静音按钮 +Mute toggle = 静音 Next Slot = 下个即时存档插槽 -None = 没有 -Note = Note +None = 无 +Note = ♪ 键 OpenChat = 打开聊天 -Pause = 暂停按钮 +Pause = 暂停 R = R RapidFire = 连射按钮 -Remote hold = Remote hold +Record = 录制 +Remote hold = 长按电源键 Rewind = 倒带 -Right = 方向键:右 -Right Analog Stick (tap to customize) = 右模拟摇杆(点按以自定义) -RightAn.Down = 右摇杆:下 -RightAn.Left = 右摇杆:左 -RightAn.Right = 右摇杆:右 -RightAn.Up = 右摇杆:上 +Right = 方向键:右 +Right Analog Stick = 右摇杆 +RightAn.Down = 右摇杆:下 +RightAn.Left = 右摇杆:左 +RightAn.Right = 右摇杆:右 +RightAn.Up = 右摇杆:上 Rotate Analog (CCW) = 旋转摇杆 (逆时针) -Rotate Analog (CW) = 旋转摇杆 (顺时针) +Rotate Analog (CW) = 旋转摇杆 (顺时针) Save State = 保存即时存档 -Screen = Screen -Screenshot = 屏幕截图 +Screen = 屏幕亮度键 +Screenshot = 截图 Select = Select -SpeedToggle = 加速按钮 +SpeedToggle = 加速(按一次) Square = 方形 Start = Start +Swipe Down = 向下挥动 +Swipe Left = 向左挥动 +Swipe Right = 向右挥动 +Swipe Up = 向上挥动 +tap to customize = 点击以自定义 Texture Dumping = 纹理转储 Texture Replacement = 纹理替换 Toggle Fullscreen = 切换全屏 -Toggle mode = Toggle mode +Toggle mode = 切换模式 Triangle = 三角 -Fast-forward = 解除限速 -Up = 方向键:上 +Fast-forward = 加速 (长按) +Up = 方向键:上 Vol + = 音量 + Vol - = 音量 - Wlan = 无线网络 +[MemStick] +Already contains PSP data = 已含有PSP数据 +Create or Choose a PSP folder = 创建或者选择PSP文件夹 +Current = 目前 +DataCanBeShared = 数据可以在普通版/黄金版之间共用 +DataCannotBeShared = 数据无法在普通版/黄金版之间共用! +DataWillBeLostOnUninstall = 警告!卸载PPSSPP将丢失全部数据! +DataWillStay = 卸载PPSSPP时会保留数据。 +Done! = 完成! +EasyUSBAccess = 用USB读取数据更简单 +Failed to move some files! = 无法移动部分文件! +Failed to save config = 无法保存配置! +Free space = 可用空间 +Manually specify PSP folder = 手动指定PSP文件夹 +MemoryStickDescription = 选择PSP文件的存放位置 (记忆棒) +Move Data = 移动PSP数据 +Selected PSP Data Folder = 选择PSP数据文件夹 +No data will be changed = 您数据不会更改 +PPSSPP will restart after the change = 完成设置后会重启PPSSPP +Skip for now = 暂时跳过 +Starting move... = 开始移动... +That folder doesn't work as a memstick folder. = 您选择的文件夹无法作为记忆棒目录。 +USBAccessThrough = USB连接时请打开Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB连接时请打开Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = 在APP内置的目录中保存 +Use PSP folder at root of storage = 在手机目录中保存PSP文件 +Welcome to PPSSPP! = 欢迎使用PPSSPP! +WhatsThis = 这个设置有什么用? + [Networking] -Adhoc Multiplayer forum = 访问官方 Ad Hoc 联机论坛 (英文) AdHoc Server = Ad Hoc 服务器 AdhocServer Failed to Bind Port = 无法绑定Adhoc服务器端口 +AM: Data from Unknown Port = AM: 来自未知端口的数据 Auto = 自动 Bottom Center = 正下方 Bottom Left = 左下方 @@ -670,10 +764,11 @@ Bottom Right = 右下方 Center Left = 左中间 Center Right = 右中间 Change Mac Address = 更改 MAC 地址 -Change proAdhocServer Address = 更改 PRO Ad Hoc 服务器 IP 地址 (localhost = 多个实例) +Change proAdhocServer Address = 更改 PRO Ad Hoc 服务器 IP 地址 (localhost = 模拟器双开) Chat = 聊天 Chat Button Position = 聊天按钮位置 Chat Here = 在这里聊天 +Chat message = 聊天消息 Chat Screen Position = 聊天屏幕位置 Disconnected from AdhocServer = 与Adhoc服务器断开连接 DNS Error Resolving = DNS错误解析 @@ -693,12 +788,17 @@ Failed to Bind Localhost IP = 无法绑定本地主机IP Failed to Bind Port = 无法绑定端口 Failed to connect to Adhoc Server = 无法连接Adhoc服务器 Forced First Connect = 强制首次连接(更快的连接) +GM: Data from Unknown Port = GM: 来自未知端口的数据 +Hostname = 主机名 Invalid IP or hostname = IP 或主机名是无效的 -Minimum Timeout = 最小超时(以毫秒为单位,0 =默认值) -Misc = 其他(默认= PSP兼容性) +Minimum Timeout = 最小超时(以毫秒为单位,0 = 默认值) +Misc = 其他(默认 = PSP兼容性) +MultiplayerHowToURL = https://github.com/hrydgard/ppsspp/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8PPSSPP%E5%A4%9A%E4%BA%BA%E8%81%94%E6%9C%BA%E6%B8%B8%E6%88%8F Network Initialized = 网络已初始化 +None = 无 Please change your Port Offset = 请更改您的端口偏移 -Port offset = 端口偏移 (0 = PSP 实机兼容) +Port offset = 端口偏移 (0 = 兼容PSP) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc 百科页面 proAdhocServer Address: = Ad hoc 服务器地址: Quick Chat 1 = 快速聊天1 Quick Chat 2 = 快速聊天2 @@ -707,15 +807,15 @@ Quick Chat 4 = 快速聊天4 Quick Chat 5 = 快速聊天5 QuickChat = 快速聊天 Send = 发送 -Send Discord Presence information = 发送 Discord "Rich Presence" 信息 -TCP No Delay = TCP无延迟(更快的TCP) +Send Discord Presence information = 发送 Discord "在线状态" 信息 +TCP No Delay = TCP 无延迟(更快的TCP) Top Center = 正上方 Top Left = 左上方 Top Right = 右上方 Unable to find UPnP device = 找不到UPnP设备 UPnP (port-forwarding) = UPnP(端口转发) UPnP need to be reinitialized = UPnP需要重新初始化 -UPnP use original port = UPnP使用原始端口(已启用= PSP兼容性) +UPnP use original port = UPnP 使用原始端口(启用 = 兼容PSP) Validating address... = 正在验证地址... WLAN Channel = WLAN 频道 You're in Offline Mode, go to lobby or online hall = 您现在是离线模式, 请进入房间或着在线大厅 @@ -732,6 +832,8 @@ Rewind = 倒带 Save State = 保存即时存档 Settings = 设置 Switch UMD = 切换 UMD 光盘 +Undo last load = 撤销加载 +Undo last save = 撤销保存 [PostShaders] (duplicated setting, previous slider will be used) = (设置重复, 将使用上面滑块的值) @@ -739,29 +841,30 @@ Switch UMD = 切换 UMD 光盘 5xBR = 5xBR 5xBR-lv2 = 5xBR-lv2 AAColor = AA-Color -Amount = Amount -Black border = Black border +Amount = 数量 +Black border = 黑色描边 Bloom = Bloom -Brightness = Brightness +Brightness = 亮度 Cartoon = Cartoon ColorCorrection = Color correction -Contrast = Contrast +Contrast = 对比度 CRT = CRT 扫描线 FXAA = FXAA (快速近似抗锯齿) -Gamma = Gamma +Gamma = 伽马值 Grayscale = Grayscale (灰度图) -Intensity = Intensity +Intensity = 强度 InverseColors = 反色 Natural = 自然色 NaturalA = 自然色 (无模糊) Off = 关闭 -Power = Power -PSPColor = PSP color -Saturation = Saturation +Power = 效果强度 +PSPColor = PSP 色彩 +Saturation = 色彩 Scanlines = 扫描线 (CRT) Sharpen = 锐化 SSAA(Gauss) = SuperSamplingAA (超级采样抗锯齿:高斯) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA (视频平滑抗锯齿) Vignette = Vignette (暗角) @@ -828,6 +931,8 @@ Stopping.. = 正在停止... [Reporting] Bad = 很差 +FeedbackCRCCalculating = 光盘 CRC: 计算中... +FeedbackCRCValue = 光盘 CRC: [VALUE] FeedbackDelayInfo = 您的数据正在后台提交。 FeedbackDesc = 模拟兼容性怎样?请告诉我们和社区! FeedbackDisabled = 必须启用"向服务器报告兼容性问题"选项 @@ -853,6 +958,7 @@ Perfect Description = 完美模拟整个游戏 - 太棒了! Plays = 可玩 Plays Description = 完全可玩, 但有时会出现故障 ReportButton = 报告反馈 +Show disc CRC = 显示光盘 CRC Speed = 速度 Submit Feedback = 提交反馈 SuggestionConfig = 请参阅网站上的报告以了解最佳设置。 @@ -871,9 +977,11 @@ Date = 日期 Filename = 文件名 No screenshot = 没有截图 None yet. Things will appear here after you save. = 暂无。在你保存后将会在此出现存档。 +Nothing matching '%1' was found. = 没有找到符合'%1'的结果 Save Data = 保存的存档 Save States = 保存的即时存档 Savedata Manager = 存档数据管理器 +Showing matches for '%1'. = 找到符合'%1'的搜索结果。 Size = 大小 [Screen] @@ -886,6 +994,8 @@ GLToolsWarning = 警告:检测到 GLTools, 可能会导致问题。 In menu = 在菜单中 Load savestate failed = 无法载入即时存档 Loaded State = 已载入即时存档 +Loaded. Game may refuse to save over different savedata. = 已载入。游戏可能会无法在别的存档中保存。 +Loaded. Game may refuse to save over newer savedata. = 已载入。游戏可能会无法在进度提前的存档中保存。 Loaded. Save in game, restart, and load for less bugs. = 已载入。请在游戏中存档, 重开, 再次读档以减少 bug。 LoadStateDoesntExist = 即时存档载入失败:存档不存在 LoadStateWrongVersion = 即时存档载入失败:存档是旧版本 PPSSPP 的 @@ -900,6 +1010,7 @@ saveNewTextures_false = 纹理转储已停止。 saveNewTextures_true = 开始转储新纹理。 SpeedCustom2 = 速度:自定义 2 standard = 速度:标准 +State load undone = 即时存档载入已撤消 Untitled PSP game = 无标题的 PSP 游戏 [Store] @@ -933,6 +1044,7 @@ D3DCompiler Version = D3DCompiler 版本 Debug = 调试 Debugger Present = 调试器已连接 Device Info = 设备信息 +Directories = 目录 Display Information = 显示信息 Driver Version = 驱动程序版本 EGL Extensions = EGL 扩展 @@ -956,6 +1068,7 @@ Release = 发布 RW/RX exclusive = RW/RX 独占 Sample rate = 采样率 Shading Language = 着色语言 +Storage = 存储 Sustained perf mode = 持久性能模式 System Information = 系统信息 System Name = 名称 @@ -977,8 +1090,11 @@ AVI Dump started. = AVI 转储开始 AVI Dump stopped. = AVI 转储停止 Cache ISO in RAM = 在内存中缓存完整 ISO Change CPU Clock = 修改模拟的 PSP 的 CPU 频率 (不稳定) -Change Memory Stick folder = 修改记忆棒文件夹 -Change Memory Stick Size = 更改记忆棒的大小(GB) +Error: load undo state is from a different game = 错误: 撤回的即时存档是来自不同游戏的 +Failed to load state for load undo. Error in the file system. = 无法撤回加载即时存档。文件系统有错误。 +Floating symbols = 飘浮的按键 +Memory Stick folder = 记忆棒文件夹 +Memory Stick size = 记忆棒大小(GB) Change Nickname = 修改昵称 ChangingMemstickPath = 游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要修改记忆棒文件夹吗? ChangingMemstickPathInvalid = 目标路径不能用于保存记忆棒数据。 @@ -1003,16 +1119,15 @@ Enable Cheats = 开启金手指 Enable Compatibility Server Reports = 向服务器报告兼容性问题 Failed to load state. Error in the file system. = 无法载入即时存档。文件系统出错。 Failed to save state. Error in the file system. = 无法保存即时存档。文件系统出错。 -Fast (lag on slow storage) = 快速 (在慢速存储上会延迟) +Fast (lag on slow storage) = 快速 (在低速存储会有延迟) Fast Memory = 快速内存 (不稳定) -Force real clock sync (slower, less lag) = 强制同步实际时钟频率 (更慢,但是更少延迟) +Force real clock sync (slower, less lag) = 强制同步实际时钟频率 (慢,但是更少延迟) frames, 0:off = 每几帧, 0 = 关 Games list settings = 游戏列表设置 General = 常规设置 -Grid icon size = 方格图标的尺寸 +Grid icon size = 按倍率的图标尺寸 Help the PPSSPP team = 帮助 PPSSPP 团队 -Host (bugs, less lag) = 主机 (有错误, 更少滞后) -I/O on thread (experimental) = 线程上的 I/O (实验性) +Host (bugs, less lag) = 主机 (较少延迟, 有错误) Ignore bad memory accesses = 忽略错误的内存访问 Increase size = 增大尺寸 Interpreter = 解释器 @@ -1022,19 +1137,24 @@ Memory Stick Folder = 记忆棒文件夹 Memory Stick inserted = 记忆棒已插入 MHz, 0:default = MHz, 默认为 0 MMDDYYYY = 月/日/年 +Moving background = 动态壁纸 Newest Save = 最新的即时存档 +No animation = 静态壁纸 Not a PSP game = 这不是一个 PSP 游戏 Off = 关闭 Oldest Save = 最旧的即时存档 +Path does not exist! = 路径不存在! +PSP Memory Stick = PSP 记忆棒 PSP Model = PSP 机型 PSP Settings = PSP 设置 PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = 最近的游戏 Record Audio = 录制音频 Record Display = 录制视频 Reset Recording on Save/Load State = 保存/载入存档时重置录制 Restore Default Settings = 恢复默认 PPSSPP 设置 -Rewind Snapshot Frequency = 倒带自动即时存档频率 (mem hog) +Rewind Snapshot Frequency = 倒带自动即时存档频率 Save path in installed.txt = 存档路径在 installed.txt Save path in My Documents = 存档路径在我的文档 Savestate Slot = 即时存档插槽 @@ -1053,8 +1173,10 @@ Storage full = 存储空间已满 Sustained performance mode = 持久性能模式 (使长时间运行的应用运行更流畅) Time Format = 时间格式 UI = 用户界面 +UI background animation = UI 背景效果 UI Sound = 界面声音 undo %c = 备份 %c +USB = USB Use Lossless Video Codec (FFV1) = 使用无损视频编解码器 (FFV1) Use O to confirm = 使用按钮 O 确认 Use output buffer (with overlay) for recording = 录制时使用输出缓冲 (包括叠加信息) @@ -1063,6 +1185,7 @@ Use X to confirm = 使用按钮 X 确认 VersionCheck = 检查 PPSSPP 新版本 WARNING: Android battery save mode is on = 警告:安卓省电模式已开启 WARNING: Battery save mode is on = 警告:省电模式已开启 +Waves = 波浪动画 YYYYMMDD = 年/月/日 [Upgrade] diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 4e693aad0e..a8a8a32624 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -1,21 +1,27 @@ [Audio] Alternate speed volume = 自定義速度下的音量 Audio backend = 音訊引擎 (需要重新啟動) +Audio Error = Audio Error AudioBufferingForBluetooth = 藍牙友好緩衝區(較慢) Auto = 自動 Device = Device +Disabled = Disabled DSound (compatible) = DirectSound (兼容) Enable Sound = 啟用音效 Global volume = 全局音量 Microphone = Microphone Microphone Device = 麥克風裝置 Mute = Mute -Switch on new audio device = 開啟新的音頻設備 +Reverb volume = Reverb volume +Use new audio devices automatically = 開啟新的音頻設備 Use global volume = 使用全局量 WASAPI (fast) = WASAPI (快) [Controls] -Analog auto-rotation speed = 模擬自動轉速 +Analog Binding = Analog Binding +Analog Settings = Analog Settings +Analog Style = Analog Style +Auto-rotation speed = 模擬自動轉速 Analog Axis Sensitivity = 搖桿靈敏度 Analog Limiter = 搖桿限制器 Analog Mapper High End = 模擬映射器的高端 (軸靈敏度) @@ -26,24 +32,40 @@ AnalogLimiter Tip = 按下模擬限制器按鈕時 Auto = 自動 Auto-centering analog stick = 自動定心搖桿 Auto-hide buttons after seconds = 數秒後自動隱藏按鈕 +Auto-switch = Auto-switch +Base tilt position = Base tilt position Binds = Binds +Button Binding = Button Binding Button Opacity = 按鈕透明度 Button style = 按鍵樣式 +Calibrate Analog Stick = Calibrate Analog Stick Calibrate D-Pad = 校正方向鍵 +Calibrated = Calibrated Calibration = 校正 +Circular stick input = Circular stick input Classic = 傳統 Combo Key Setting = 組合鍵設置 Combo Key Setup = 組合鍵設置 Confine Mouse = 在窗口/顯示區域內捕獲鼠標 Control Mapping = 按鍵對應 -Custom layout... = 自訂佈局 +Custom Key Setting = Custom Key Setting +Customize = Customize +Customize Touch Controls = 自訂佈局 Customize tilt = 自訂傾斜 D-PAD = 方向鍵 -Deadzone Radius = 死區半徑 +Deadzone radius = 死區半徑 DInput Analog Settings = DInput 模擬設置 Disable D-Pad diagonals (4-way touch) = 停用方向鍵對角線 (四方向觸控) +Disable diagonal input = Disable diagonal input +Double tap = Double tap +Enable gesture control = Enable gesture control +Enable standard shortcut keys = Enable standard shortcut keys +Gesture = Gesture +Gesture mapping = Gesture mapping Glowing borders = Glowing borders HapticFeedback = 按鍵反饋 (震動) +Hide touch analog stick background circle = Hide touch analog stick background circle +Icon = Icon Ignore gamepads when not focused = 非作用時忽略遊戲手把 Ignore Windows Key = 忽略 Windows 鍵 Invert Axes = 軸反轉 @@ -55,6 +77,7 @@ L/R Trigger Buttons = L/R 觸發按鈕 Landscape = 橫向 Landscape Auto = 自動橫向 Landscape Reversed = 橫向反轉 +Low end radius = Low end radius Mouse = Mouse settings Mouse sensitivity = 鼠標靈敏度 Mouse smoothing = 鼠標平滑 @@ -65,21 +88,32 @@ OnScreen = 顯示虛擬控制器 Portrait = 縱向 Portrait Reversed = 縱向反轉 PSP Action Buttons = PSP 的功能鍵 +Raw input = Raw input +Reset to defaults = Reset to defaults +Screen aligned to ground = Screen aligned to ground +Screen at right angle to ground = Screen at right angle to ground Screen Rotation = 螢幕旋轉 seconds, 0 : off = 秒,0 = 關閉 +Sensitivity (scale) = Sensitivity (scale) Sensitivity = 靈敏度 +Shape = Shape Show right analog = 顯示右模擬 Show Touch Pause Menu Button = 顯示觸控暫停選單鍵 +Swipe = Swipe +Swipe sensitivity = Swipe sensitivity +Swipe smoothing = Swipe smoothing Thin borders = 薄邊框 Tilt Base Radius = Tilt base radius Tilt Input Type = 傾斜輸入類型 Tilt Sensitivity along X axis = 沿 X 軸傾斜靈敏度 Tilt Sensitivity along Y axis = 沿 Y 軸傾斜靈敏度 To Calibrate = 請將裝置放在平面上,然後按「校正」。 +Toggle mode = Toggle mode Touch Control Visibility = 觸控可視性 Use custom right analog = 使用自定義右模擬 Use Mouse Control = 使用鼠標控制 Visibility = 可視設定 +Visible = Visible X = X X + Y = X + Y XInput Analog Settings = XInput 模擬設置 @@ -96,6 +130,7 @@ Refresh Rate = 刷新率 [DesktopUI] # If your language does not show well with the default font, you can use Font to specify a different one. # Just add it to your language's ini file and uncomment it (remove the # by Font). +Auto Max Quality = Auto Max &Quality Font = Microsoft JhengHei About PPSSPP... = 關於 PPSSPP... Auto = 自動 @@ -150,6 +185,7 @@ More Settings... = 更多設定 Nearest = &Nearest Non-Buffered Rendering = 跳過緩衝效果 (不緩衝,速度更快) Off = 關閉 +Open Chat = Open Chat Open Directory... = 打開目錄... Open from MS:/PSP/GAME... = 打開 MS:/PSP/GAME... Open Memory Stick = 打開記憶卡 @@ -229,6 +265,7 @@ No block = 沒有記憶體區塊 Prev = 上一個 Random = 隨機 Replace textures = 紋理更換 +Reset = Reset Reset limited logging = 重置受限日誌 RestoreDefaultSettings = 你確定要所有設定還原到預設值 (除了按鍵配置)?\n此動作無法恢復。\n需要重新啟動 PPSSPP,變更才會生效。 RestoreGameDefaultSettings = 你確定要恢復特定遊戲的設置,\n回到 PPSSPP 的預設值? @@ -274,10 +311,13 @@ DeleteConfirmGameConfig = 你確定要刪除這個遊戲的設置? DeleteFailed = 無法刪除資料。 Deleting = 刪除中\n請稍候... Disable All = 禁用所有 +Dumps = Dumps Edit = Edit Enable All = 全部啟用 Enter = 決定 +Filter = Filter Finish = 完成 +GE Frame Dumps = GE Frame Dumps Grid = 格 Inactive = 不活躍 InternalError = 發生了一個內部錯誤. @@ -300,8 +340,10 @@ Save = 儲存 Save completed = 檔案已儲存。 Saving = 儲存中\n請稍候... SavingFailed = 無法儲存資料。 +Search = Search Select = 選擇 Shift = 翻頁 +Skip = Skip Snap = Snap Space = 空格鍵 SSID = SSID @@ -376,6 +418,7 @@ ZIP file detected (Require WINRAR) = 檔案是 ZIP 壓縮檔。\ n請先解壓 [Game] Asia = Asia +Calculate CRC = Calculate CRC ConfirmDelete = 確定 Create Game Config = 建立遊戲配置 Create Shortcut = 建立捷徑 @@ -430,6 +473,7 @@ Auto = 自動 Auto (1:1) = 自動 (1:1) Auto (same as Rendering) = 自動 (同渲染) Auto FrameSkip = 自動跳幀 +Auto Max Quality = Auto Max Quality Auto Scaling = 自動縮放 Backend = 後端 Balanced = 均衡 @@ -555,11 +599,14 @@ Zip file does not contain PSP software = ZIP文件不包含PSP軟件 [KeyMapping] Autoconfigure = 自動配置 Autoconfigure for device = 設備自動配置 +Bind All = Bind All Clear All = 全部清除 Default All = 全部恢復預設 Map a new key for = 你按下的按鈕將會對應到此功能: Map Key = 按鍵映射 Map Mouse = 鼠標映射 +Replace = Replace +Show PSP = Show PSP Test Analogs = 測試搖桿 You can press ESC to cancel. = 您可以按Esc取消。 @@ -585,6 +632,7 @@ SavesAreTemporary = PPSSPP正在保存在臨時存儲中 SavesAreTemporaryGuidance = 將PPSSPP提取到某個地方以永久保存 SavesAreTemporaryIgnore = 忽略警告 UnpinPath = 取消標記 +UseBrowseOrLoad = Use Browse to choose a folder, or Load to choose a file. www.ppsspp.org = www.ppsspp.org [MainSettings] @@ -610,11 +658,22 @@ Auto Analog Rotation (CW) = 自動模擬旋轉(CW) AxisSwap = 軸交換 Circle = 圈 Cross = 叉 +Custom 1 = Custom 1 +Custom 10 = Custom 10 +Custom 2 = Custom 2 +Custom 3 = Custom 3 +Custom 4 = Custom 4 +Custom 5 = Custom 5 +Custom 6 = Custom 6 +Custom 7 = Custom 7 +Custom 8 = Custom 8 +Custom 9 = Custom 9 D-pad down = D-pad down D-pad left = D-pad left D-pad right = D-pad right D-pad up = D-pad up DevMenu = DevMenu +Double tap button = Double tap button Down = 方向鍵:下 Dpad = 方向鍵 Frame Advance = Frame advance @@ -631,10 +690,11 @@ OpenChat = Open chat Pause = 暫停 R = R RapidFire = 連射 +Record = Record Remote hold = Remote hold Rewind = 倒回 Right = 方向鍵:右 -Right Analog Stick (tap to customize) = 右搖桿(輕按即可定制) +Right Analog Stick = Right Analog Stick RightAn.Down = 右搖桿:下 RightAn.Left = 右搖桿:左 RightAn.Right = 右搖桿:右 @@ -648,6 +708,11 @@ Select = 選擇 SpeedToggle = 速度切換 Square = 正方 Start = 開始 +Swipe Down = Swipe Down +Swipe Left = Swipe Left +Swipe Right = Swipe Right +Swipe Up = Swipe Up +tap to customize = tap to customize Texture Dumping = 紋理轉儲 Texture Replacement = 紋理替換 Toggle Fullscreen = 切換全屏 @@ -659,10 +724,39 @@ Vol + = Vol + Vol - = Vol - Wlan = WLAN +[MemStick] +Already contains PSP data = Already contains PSP data +Create or Choose a PSP folder = Create or Choose a PSP folder +Current = Current +DataCanBeShared = Data can be shared between PPSSPP regular/Gold +DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! +DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! +DataWillStay = Data will stay even if you uninstall PPSSPP. +Done! = Done! +EasyUSBAccess = Easy USB access +Failed to move some files! = Failed to move some files! +Failed to save config = Failed to save config +Free space = Free space +Manually specify PSP folder = Manually specify PSP folder +MemoryStickDescription = Choose where to keep PSP data (Memory Stick) +Move Data = Move Data +Selected PSP Data Folder = Selected PSP Data Folder +No data will be changed = No data will be changed +PPSSPP will restart after the change = PPSSPP will restart after the change +Skip for now = Skip for now +Starting move... = Starting move... +That folder doesn't work as a memstick folder. = That folder doesn't work as a memstick folder. +USBAccessThrough = USB access through Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = USB access through Android/data/org.ppsspp.ppssppgold/files +Use App Private Data = Use App Private Data +Use PSP folder at root of storage = Use PSP folder at root of storage +Welcome to PPSSPP! = Welcome to PPSSPP! +WhatsThis = What's this? + [Networking] -Adhoc Multiplayer forum = 連線的問題請至官方論壇 (英文) AdHoc Server = Ad hoc server AdhocServer Failed to Bind Port = 無法綁定Adhoc服務器端口 +AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Bottom Center = 中間下面 Bottom Left = 下左面 @@ -674,6 +768,7 @@ Change proAdhocServer Address = 改變 PRO Adhoc 網路位址 (localhost = 多 Chat = 聊天 Chat Button Position = 聊天按鈕位置 Chat Here = 在這裡聊天 +Chat message = Chat message Chat Screen Position = 聊天畫面位置 Disconnected from AdhocServer = 與Adhoc服務器斷開連接 DNS Error Resolving = DNS錯誤解決 @@ -693,12 +788,16 @@ Failed to Bind Localhost IP = 無法綁定本地主機IP Failed to Bind Port = 無法綁定端口 Failed to connect to Adhoc Server = 無法連接Adhoc服務器 Forced First Connect = 強制首次連接(更快的連接) +GM: Data from Unknown Port = GM: Data from Unknown Port +Hostname = Hostname Invalid IP or hostname = 無效的IP或主機名 Minimum Timeout = 最小超時(以毫秒為單位,0 =默認) Misc = 其他(默認= PSP兼容性) Network Initialized = 網路已初始化 +None = None Please change your Port Offset = 請更改您的端口偏移 Port offset = 端口偏移 (0 = PSP 實機兼容) +PPSSPP Ad-Hoc Wiki Page = PPSSPP Ad-Hoc Wiki Page proAdhocServer Address: = Ad hoc 服務器地址: Quick Chat 1 = 快速聊天1 Quick Chat 2 = 快速聊天2 @@ -732,6 +831,8 @@ Rewind = 倒回 Save State = 即時存檔 Settings = 設定 Switch UMD = 切換光碟 +Undo last load = Undo last load +Undo last save = Undo last save [PostShaders] (duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) @@ -762,6 +863,7 @@ Scanlines = Scanlines (CRT) Sharpen = Sharpen SSAA(Gauss) = Supersampling AA (Gauss) Tex4xBRZ = 4xBRZ +TexMMPX = MMPX UpscaleSpline36 = Spline36 Upscaler VideoSmoothingAA = VideoSmoothingAA Vignette = Vignette @@ -828,6 +930,8 @@ Stopping.. = 正在停止... [Reporting] Bad = 壞 +FeedbackCRCCalculating = Disc CRC: Calculating... +FeedbackCRCValue = Disc CRC: [VALUE] FeedbackDelayInfo = 您的數據正在後台提交. FeedbackDesc = 模擬的效果怎麼樣?說給我們聽聽! FeedbackDisabled = 兼容性服務器報告必須啟用. @@ -853,6 +957,7 @@ Perfect Description = Flawless emulation for the entire game - great! Plays = 可玩 Plays Description = Fully playable but might be with glitches ReportButton = 報告反饋 +Show disc CRC = Show disc CRC Speed = 速度 Submit Feedback = 提交反饋 SuggestionConfig = 請參閱網站上的報告以了解正確的設置。 @@ -871,9 +976,11 @@ Date = Date Filename = Filename No screenshot = 沒有截圖 None yet. Things will appear here after you save. = 暫無。在你存檔之後這裡才會出現數據。 +Nothing matching '%1' was found. = Nothing matching '%1' was found. Save Data = 存檔資料 Save States = 即時存檔資料 Savedata Manager = 管理存檔資料 +Showing matches for '%1'. = Showing matches for '%1'. Size = Size [Screen] @@ -886,6 +993,8 @@ GLToolsWarning = 警告:偵測到 GLTools,可能造成問題 In menu = In menu Load savestate failed = 無法載入快速存檔 Loaded State = 已載入即時存檔 +Loaded. Game may refuse to save over different savedata. = Loaded. Game may refuse to save over different savedata. +Loaded. Game may refuse to save over newer savedata. = Loaded. Game may refuse to save over newer savedata. Loaded. Save in game, restart, and load for less bugs. = 已加載。 保存在遊戲中,重新啟動並加載,以減少錯誤。 LoadStateDoesntExist = 無法載入:存檔不存在! LoadStateWrongVersion = 無法載入:存檔為舊版的 PPSSPP 的! @@ -900,6 +1009,7 @@ saveNewTextures_false = 紋理保存已禁用. saveNewTextures_true = 紋理現在將保存到您的存儲中. SpeedCustom2 = 速度:備用2 standard = 速度:標準 +State load undone = State load undone Untitled PSP game = 無標題的PSP遊戲 [Store] @@ -933,6 +1043,7 @@ D3DCompiler Version = D3DCompiler version Debug = Debug Debugger Present = Debugger present Device Info = Device info +Directories = Directories Display Information = Display information Driver Version = Driver version EGL Extensions = EGL extensions @@ -956,6 +1067,7 @@ Release = Release RW/RX exclusive = RW/RX exclusive Sample rate = Sample rate Shading Language = Shading language +Storage = Storage Sustained perf mode = Sustained perf mode System Information = System information System Name = Name @@ -977,8 +1089,11 @@ AVI Dump started. = AVI dump started AVI Dump stopped. = AVI dump stopped Cache ISO in RAM = 將整個 ISO 檔暫存於記憶體中 Change CPU Clock = 調整 CPU 時鐘 (不穩定) -Change Memory Stick folder = 更改記憶棒文件夾 -Change Memory Stick Size = 更改記憶棒大小 (GB) +Error: load undo state is from a different game = Error: load undo state is from a different game +Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system. +Floating symbols = Floating symbols +Memory Stick folder = 更改記憶棒文件夾 +Memory Stick size = 更改記憶棒大小 (GB) Change Nickname = 更改別名 ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. @@ -1012,7 +1127,6 @@ General = 一般 Grid icon size = Grid icon size Help the PPSSPP team = 幫助 PPSSPP 團隊 Host (bugs, less lag) = 主機 (較少延遲,但可能造成問題;有助於魔法少女小圓) -I/O on thread (experimental) = 線程上的I / O(實驗性) Ignore bad memory accesses = 忽略錯誤的內存訪問 Increase size = 增加大小 Interpreter = 解釋器 @@ -1022,14 +1136,19 @@ Memory Stick Folder = 記憶棒文件夾 Memory Stick inserted = 插入記憶棒 MHz, 0:default = MHz,預設為 0 MMDDYYYY = MMDDYYYY +Moving background = Moving background Newest Save = 最新存礑 +No animation = No animation Not a PSP game = 不是 PSP 遊戲 Off = Off Oldest Save = 最早存礑 +Path does not exist! = Path does not exist! +PSP Memory Stick = PSP Memory Stick PSP Model = PSP 機型 PSP Settings = PSP 設定 PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = Recent games Record Audio = 錄音 Record Display = 錄製畫面 Reset Recording on Save/Load State = 在保存/加載狀態下重置記錄 @@ -1053,8 +1172,10 @@ Storage full = 存儲容量已滿 Sustained performance mode = 持續性能模式 Time Format = 時間格式 UI = 用戶界面 +UI background animation = UI background animation UI Sound = 介面聲音 undo %c = 備用 %c +USB = USB Use Lossless Video Codec (FFV1) = 使用無損視訊轉碼器 (FFV1) Use O to confirm = 使用 O 確認 Use output buffer (with overlay) for recording =使用輸出緩衝區(帶有覆蓋)進行記錄 @@ -1063,6 +1184,7 @@ Use X to confirm = 使用 X 確認 VersionCheck = 檢查 PPSSPP 新版本 WARNING: Android battery save mode is on = 警告:Android省電模式已開啟 WARNING: Battery save mode is on = 警告:省電模式已開啟 +Waves = Waves YYYYMMDD = YYYYMMDD [Upgrade] diff --git a/assets/ppge_atlas_luna.meta b/assets/ppge_atlas_luna.meta index aae0915cb3..1119284691 100644 Binary files a/assets/ppge_atlas_luna.meta and b/assets/ppge_atlas_luna.meta differ diff --git a/assets/ppge_atlas_luna.zim b/assets/ppge_atlas_luna.zim index 3009762b6e..cf413d407c 100644 Binary files a/assets/ppge_atlas_luna.zim and b/assets/ppge_atlas_luna.zim differ diff --git a/assets/shaders/defaultshaders.ini b/assets/shaders/defaultshaders.ini index 48cba6fc99..3f471a25a5 100644 --- a/assets/shaders/defaultshaders.ini +++ b/assets/shaders/defaultshaders.ini @@ -187,12 +187,13 @@ Fragment=psp_color.fsh Vertex=fxaa.vsh [Tex4xBRZ] Type=Texture -Name=4xBRZ +Name=4xBRZ (4x) Author=Hyllian Compute=tex_4xbrz.csh +Scale=4 [TexMMPX] Type=Texture -Name=MMPX +Name=MMPX (2x) Author=Morgan McGuire and Mara Gagiu Compute=tex_mmpx.csh -MaxScale=2 +Scale=2 diff --git a/assets/shaders/tex_4xbrz.csh b/assets/shaders/tex_4xbrz.csh index 2a72a7f3b5..a3a1ff84bf 100644 --- a/assets/shaders/tex_4xbrz.csh +++ b/assets/shaders/tex_4xbrz.csh @@ -1,5 +1,5 @@ // 4xBRZ shader - Copyright (C) 2014-2016 DeSmuME team (GPL2+) -// Hyllian's xBR-vertex code and texel mapping +// Hyllians xBR-vertex code and texel mapping // Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com #define BLEND_ALPHA 1 #define BLEND_NONE 0 @@ -17,7 +17,7 @@ float reduce(vec4 color) { float DistYCbCr(vec4 pixA, vec4 pixB) { // https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.2020_conversion const vec3 K = vec3(0.2627, 0.6780, 0.0593); - const mat3 MATRIX = mat3(K, + const mat3 MATRIX = mat3(K, -.5 * K.r / (1.0 - K.b), -.5 * K.g / (1.0 - K.b), .5, .5, -.5 * K.g / (1.0 - K.r), -.5 * K.b / (1.0 - K.r)); vec4 diff = pixA - pixB; @@ -36,10 +36,11 @@ bool IsBlendingNeeded(const ivec4 blend) { return diff.x != 0 || diff.y != 0 || diff.z != 0 || diff.w != 0; } -vec4 applyScalingf(uvec2 origxy, uvec2 xy) { - float dx = 1.0 / params.width; - float dy = 1.0 / params.height; +vec4 readInput(uvec2 coord) { + return readColorf(uvec2(clamp(coord.x, 0, params.width - 1), clamp(coord.y, 0, params.height - 1))); +} +void applyScaling(uvec2 origxy) { // A1 B1 C1 // A0 A B C C4 // D0 D E F F4 @@ -54,8 +55,6 @@ vec4 applyScalingf(uvec2 origxy, uvec2 xy) { uvec4 t6 = uvec4(origxy.x - 2, origxy.y - 1, origxy.y, origxy.y + 1); // A0 D0 G0 uvec4 t7 = uvec4(origxy.x + 2, origxy.y - 1, origxy.y, origxy.y + 1); // C4 F4 I4 - vec2 f = fract(vec2(float(xy.x) / float(params.scale), float(xy.y) / float(params.scale))); - //--------------------------------------- // Input Pixel Mapping: |21|22|23| // 19|06|07|08|09 @@ -65,27 +64,27 @@ vec4 applyScalingf(uvec2 origxy, uvec2 xy) { vec4 src[25]; - src[21] = readColorf(t1.xw); - src[22] = readColorf(t1.yw); - src[23] = readColorf(t1.zw); - src[ 6] = readColorf(t2.xw); - src[ 7] = readColorf(t2.yw); - src[ 8] = readColorf(t2.zw); - src[ 5] = readColorf(t3.xw); - src[ 0] = readColorf(t3.yw); - src[ 1] = readColorf(t3.zw); - src[ 4] = readColorf(t4.xw); - src[ 3] = readColorf(t4.yw); - src[ 2] = readColorf(t4.zw); - src[15] = readColorf(t5.xw); - src[14] = readColorf(t5.yw); - src[13] = readColorf(t5.zw); - src[19] = readColorf(t6.xy); - src[18] = readColorf(t6.xz); - src[17] = readColorf(t6.xw); - src[ 9] = readColorf(t7.xy); - src[10] = readColorf(t7.xz); - src[11] = readColorf(t7.xw); + src[21] = readInput(t1.xw); + src[22] = readInput(t1.yw); + src[23] = readInput(t1.zw); + src[ 6] = readInput(t2.xw); + src[ 7] = readInput(t2.yw); + src[ 8] = readInput(t2.zw); + src[ 5] = readInput(t3.xw); + src[ 0] = readInput(t3.yw); + src[ 1] = readInput(t3.zw); + src[ 4] = readInput(t4.xw); + src[ 3] = readInput(t4.yw); + src[ 2] = readInput(t4.zw); + src[15] = readInput(t5.xw); + src[14] = readInput(t5.yw); + src[13] = readInput(t5.zw); + src[19] = readInput(t6.xy); + src[18] = readInput(t6.xz); + src[17] = readInput(t6.xw); + src[ 9] = readInput(t7.xy); + src[10] = readInput(t7.xz); + src[11] = readInput(t7.xw); float v[9]; v[0] = reduce(src[0]); @@ -254,26 +253,17 @@ vec4 applyScalingf(uvec2 origxy, uvec2 xy) { dst[ 6] = mix(dst[ 6], blendPix, (needBlend && doLineBlend && haveShallowLine) ? 0.25 : 0.00); } - // select output pixel - vec4 res = mix(mix(mix(mix(dst[ 6], dst[ 7], step(0.25, f.x)), - mix(dst[ 8], dst[ 9], step(0.75, f.x)), - step(0.50, f.x)), - mix(mix(dst[ 5], dst[ 0], step(0.25, f.x)), - mix(dst[ 1], dst[10], step(0.75, f.x)), - step(0.50, f.x)), - step(0.25, f.y)), - mix(mix(mix(dst[ 4], dst[ 3], step(0.25, f.x)), - mix(dst[ 2], dst[11], step(0.75, f.x)), - step(0.50, f.x)), - mix(mix(dst[15], dst[14], step(0.25, f.x)), - mix(dst[13], dst[12], step(0.75, f.x)), - step(0.50, f.x)), - step(0.75, f.y)), - step(0.50, f.y)); - - return res; -} - -uint applyScalingu(uvec2 origxy, uvec2 xy) { - return packUnorm4x8(applyScalingf(origxy, xy)); + // Output Pixel Mapping: + // 06|07|08|09 + // 05|00|01|10 + // 04|03|02|11 + // 15|14|13|12 + const int order[16] = int[16](6, 7, 8, 9, 5, 0, 1, 10, 4, 3, 2, 11, 15, 14, 13, 12); + // Write all 16 output pixels. + ivec2 destXY = ivec2(origxy) * 4; + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 4; x++) { + writeColorf(destXY + ivec2(x, y), dst[order[y * 4 + x]]); + } + } } diff --git a/assets/shaders/tex_mmpx.csh b/assets/shaders/tex_mmpx.csh index 1ba45d1ffe..72851f6564 100644 --- a/assets/shaders/tex_mmpx.csh +++ b/assets/shaders/tex_mmpx.csh @@ -1,5 +1,5 @@ /* MMPX.glc - Copyright 2020 Morgan McGuire & Mara Gagiu. + Copyright 2020 Morgan McGuire & Mara Gagiu. Provided under the Open Source MIT license https://opensource.org/licenses/MIT See js-demo.html for the commented source code. @@ -9,6 +9,8 @@ #define ABGR8 uint +// If we took an image as input, we could use a sampler to do the clamping. But we decode +// low-bpp texture data directly, so... ABGR8 src(int x, int y) { return readColoru(uvec2(clamp(x, 0, params.width - 1), clamp(y, 0, params.height - 1))); } @@ -42,9 +44,9 @@ bool none_eq4(ABGR8 B, ABGR8 A0, ABGR8 A1, ABGR8 A2, ABGR8 A3) { return B != A0 && B != A1 && B != A2 && B != A3; } -uint applyScalingu(uvec2 origxy, uvec2 xy) { - int srcX = int(origxy.x); - int srcY = int(origxy.y); +void applyScaling(uvec2 xy) { + int srcX = int(xy.x); + int srcY = int(xy.y); ABGR8 A = src(srcX - 1, srcY - 1), B = src(srcX, srcY - 1), C = src(srcX + 1, srcY - 1); ABGR8 D = src(srcX - 1, srcY + 0), E = src(srcX, srcY + 0), F = src(srcX + 1, srcY + 0); @@ -74,44 +76,35 @@ uint applyScalingu(uvec2 origxy, uvec2 xy) { if (Dl < El && all_eq4(E, C, F, I, R) && none_eq4(E, B, A, G, H)) J = L = D; // 2:1 slope rules - if (H != B) { + if (H != B) { if (H != A && H != E && H != C) { if (all_eq3(H, G, F, R) && none_eq2(H, D, src(srcX + 2, srcY - 1))) L = M; if (all_eq3(H, I, D, Q) && none_eq2(H, F, src(srcX - 2, srcY - 1))) M = L; } - + if (B != I && B != G && B != E) { if (all_eq3(B, A, F, R) && none_eq2(B, D, src(srcX + 2, srcY + 1))) J = K; if (all_eq3(B, C, D, Q) && none_eq2(B, F, src(srcX - 2, srcY + 1))) K = J; } } // H !== B - - if (F != D) { + + if (F != D) { if (D != I && D != E && D != C) { if (all_eq3(D, A, H, S) && none_eq2(D, B, src(srcX + 1, srcY + 2))) J = L; if (all_eq3(D, G, B, P) && none_eq2(D, H, src(srcX + 1, srcY - 2))) L = J; } - - if (F != E && F != A && F != G) { + + if (F != E && F != A && F != G) { if (all_eq3(F, C, H, S) && none_eq2(F, B, src(srcX - 1, srcY + 2))) K = M; if (all_eq3(F, I, B, P) && none_eq2(F, H, src(srcX - 1, srcY - 2))) M = K; } } // F !== D } // not constant - // TODO: Write four pixels at once. For now, 1/4x speed. - if ((xy.y & 1u) == 0u) { - if ((xy.x & 1u) == 0u) { - return J; - } - return K; - } - if ((xy.x & 1u) == 0u) { - return L; - } - return M; -} - -vec4 applyScalingf(uvec2 origxy, uvec2 xy) { - return unpackUnorm4x8(applyScalingu(origxy, xy)); + // Write four pixels at once. + ivec2 destXY = ivec2(xy) * 2; + writeColorf(destXY, unpackUnorm4x8(J)); + writeColorf(destXY + ivec2(1, 0), unpackUnorm4x8(K)); + writeColorf(destXY + ivec2(0, 1), unpackUnorm4x8(L)); + writeColorf(destXY + ivec2(1, 1), unpackUnorm4x8(M)); } diff --git a/assets/ui_atlas_luna.meta b/assets/ui_atlas_luna.meta index 9574df7b60..572acf3052 100644 Binary files a/assets/ui_atlas_luna.meta and b/assets/ui_atlas_luna.meta differ diff --git a/assets/ui_atlas_luna.zim b/assets/ui_atlas_luna.zim index 24f9f66b73..935cb32639 100644 Binary files a/assets/ui_atlas_luna.zim and b/assets/ui_atlas_luna.zim differ diff --git a/atlasfontscript.txt b/atlasfontscript.txt new file mode 100644 index 0000000000..d5b303f461 --- /dev/null +++ b/atlasfontscript.txt @@ -0,0 +1,3 @@ +2048 +font UBUNTU24 assets/Roboto-Condensed.ttf UWER 34 -2 +font UBUNTU24 C:/Windows/Fonts/ARIALUNI.ttf UWEhkcRGHKVTe 30 0 \ No newline at end of file diff --git a/atlasscript.txt b/atlasscript.txt index 495a046f51..61774ad192 100644 --- a/atlasscript.txt +++ b/atlasscript.txt @@ -1,6 +1,4 @@ 2048 -font UBUNTU24 assets/Roboto-Condensed.ttf UWER 34 -2 -font UBUNTU24 C:/Windows/Fonts/ARIALUNI.ttf UWEhkcRGHKVTe 30 0 image I_SOLIDWHITE white.png copy image I_CROSS source_assets/image/cross.png copy image I_CIRCLE source_assets/image/circle.png copy @@ -56,3 +54,7 @@ image I_C source_assets/image/c.png copy image I_D source_assets/image/d.png copy image I_E source_assets/image/e.png copy image I_F source_assets/image/f.png copy +image I_SQUARE_SHAPE source_assets/image/square_shape.png copy +image I_SQUARE_SHAPE_LINE source_assets/image/square_shape_line.png copy +image I_FOLDER_OPEN source_assets/image/folder_open_line.png copy +image I_WARNING source_assets/image/warning.png copy \ No newline at end of file diff --git a/b.sh b/b.sh index 83aad6ba02..779c78adee 100755 --- a/b.sh +++ b/b.sh @@ -19,15 +19,21 @@ do --ios-xcode) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/ios.cmake -DIOS_PLATFORM=OS -GXcode ${CMAKE_ARGS}" TARGET_OS=iOS-xcode ;; + --fat) CMAKE_ARGS="-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64 ${CMAKE_ARGS}" + ;; + --no-png) CMAKE_ARGS="-DUSE_SYSTEM_LIBPNG=OFF ${CMAKE_ARGS}" + ;; + --no-sdl2) CMAKE_ARGS="-DUSE_SYSTEM_LIBSDL2=OFF ${CMAKE_ARGS}" + ;; --rpi-armv6) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv6.cmake ${CMAKE_ARGS}" ;; --rpi) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv7.cmake ${CMAKE_ARGS}" ;; - --rpi64) - CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv8.cmake ${CMAKE_ARGS}" - ;; + --rpi64) + CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv8.cmake ${CMAKE_ARGS}" + ;; --android) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=android/android.toolchain.cmake ${CMAKE_ARGS}" TARGET_OS=Android PACKAGE=1 diff --git a/build.gradle b/build.gradle index a2dd2770f6..0d6d69b0e0 100644 --- a/build.gradle +++ b/build.gradle @@ -2,16 +2,16 @@ buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.android.tools.build:gradle:7.0.3' } } allprojects { repositories { google() - jcenter() + mavenCentral() } } diff --git a/buildatlas.sh b/buildatlas.sh index e296ba77da..8f9cf95731 100755 --- a/buildatlas.sh +++ b/buildatlas.sh @@ -1,3 +1,2 @@ -./ext/native/tools/build/atlastool atlasscript.txt ui 8888 && cp ui_atlas_luna.zim ui_atlas_luna.meta assets && cp ui_atlas_luna.zim ui_atlas_luna.meta android/assets && rm ui_atlas_luna.cpp ui_atlas_luna.h -rm ui_atlas_luna.zim ui_atlas_luna.meta +./ext/native/tools/build/atlastool atlasscript.txt ui 8888 && cp ui_atlas_luna.zim ui_atlas_luna.meta android/assets && cp ui_atlas_luna.zim ui_atlas_luna.meta assets && mv ui_atlas_luna.zim.png ui_preview.png && rm ui_atlas_luna.* $SHELL diff --git a/buildfontatlas.sh b/buildfontatlas.sh new file mode 100644 index 0000000000..afcbef7fba --- /dev/null +++ b/buildfontatlas.sh @@ -0,0 +1,2 @@ +./ext/native/tools/build/atlastool atlasfontscript.txt ui 8888 && for f in ui_atlas_luna.*;do ext="${f##*.}"; mv "$f" "font_atlas_luna.$ext"; done && cp font_atlas_luna.zim font_atlas_luna.meta android/assets && cp font_atlas_luna.zim font_atlas_luna.meta assets && mv font_atlas_luna.png font_preview.png && rm font_atlas_luna.* +$SHELL diff --git a/cmake/Modules/FindZSTD.cmake b/cmake/Modules/FindZSTD.cmake new file mode 100644 index 0000000000..cdbe013d9e --- /dev/null +++ b/cmake/Modules/FindZSTD.cmake @@ -0,0 +1,93 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying file COPYING-CMAKE-SCRIPTS or +# https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindZSTD +-------- + +Find the ZSTD library + +Zstandard C/C++ library is built with CMake. So this find module +should be removed when ZStandard library export cmake config files +as distribution. Unfortunately ZStandard does not export it, +we need to prepare find module. + +IMPORTED targets +^^^^^^^^^^^^^^^^ + +This module defines the following :prop_tgt:`IMPORTED` target: ``ZSTD::zstd`` + +Result variables +^^^^^^^^^^^^^^^^ + +This module will set the following variables if found: + +``ZSTD_INCLUDE_DIRS`` - where to find zstd.h, etc. +``ZSTD_LIBRARIES`` - the libraries to link against to use ZSTD. +``ZSTD_VERSION`` - version of the ZSTD library found +``ZSTD_FOUND`` - TRUE if found + +:: + + ``ZSTD_VERSION_MAJOR`` - The major version of zstd + ``ZSTD_VERSION_MINOR`` - The minor version of zstd + ``ZSTD_VERSION_RELEASE`` - The release version of zstd + +#]=======================================================================] + +find_package(PkgConfig) +pkg_check_modules(PC_ZSTD QUIET libzstd) + +find_path( + ZSTD_INCLUDE_DIR + NAMES zstd.h + PATHS ${PC_ZSTD_INCLUDE_DIRS} +) +find_library( + ZSTD_LIBRARY + NAMES zstd + PATHS ${PC_ZSTD_LIBRARY_DIRS} +) + +# Extract version information from the header file +if(EXISTS "${ZSTD_INCLUDE_DIR}/zstd.h") + file(STRINGS "${ZSTD_INCLUDE_DIR}/zstd.h" + _ZSTD_VERSION_MAJOR REGEX "^#define ZSTD_VERSION_MAJOR") + string(REGEX MATCH "[0-9]+" ZSTD_VERSION_MAJOR ${_ZSTD_VERSION_MAJOR}) + file(STRINGS "${ZSTD_INCLUDE_DIR}/zstd.h" + _ZSTD_VERSION_MINOR REGEX "^#define ZSTD_VERSION_MINOR") + string(REGEX MATCH "[0-9]+" ZSTD_VERSION_MINOR ${_ZSTD_VERSION_MINOR} ) + file(STRINGS "${ZSTD_INCLUDE_DIR}/zstd.h" + _ZSTD_VERSION_RELEASE REGEX "^#define ZSTD_VERSION_RELEASE") + string(REGEX MATCH "[0-9]+" ZSTD_VERSION_RELEASE ${_ZSTD_VERSION_RELEASE} ) + set(ZSTD_VERSION ${ZSTD_VERSION_MAJOR}.${ZSTD_VERSION_MINOR}.${ZSTD_VERSION_RELEASE}) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + ZSTD + FOUND_VAR ZSTD_FOUND + REQUIRED_VARS ZSTD_LIBRARY ZSTD_INCLUDE_DIR + VERSION_VAR ZSTD_VERSION + HANDLE_COMPONENTS) +mark_as_advanced(ZSTD_INCLUDE_DIR ZSTD_LIBRARY) + +include(FeatureSummary) +set_package_properties( + ZSTD PROPERTIES + DESCRIPTION "Zstandard - Fast real-time compression algorithm" + URL "https://github.com/facebook/zstd") + +if(ZSTD_FOUND) + set(ZSTD_INCLUDE_DIRS ${ZSTD_INCLUDE_DIR}) + set(ZSTD_LIBRARIES ${ZSTD_LIBRARY}) + set(ZSTD_DEFINITIONS ${PC_ZSTD_CFLAGS_OTHER}) + if(NOT TARGET ZSTD::zstd) + add_library(ZSTD::zstd UNKNOWN IMPORTED) + set_target_properties(ZSTD::zstd PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIR}) + if(EXISTS "${ZSTD_LIBRARY}") + set_target_properties(ZSTD::zstd PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${ZSTD_LIBRARY}") + endif() + endif() +endif() diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index 3597ca190e..440f3c362c 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -8,7 +8,6 @@ endif() set(ENABLE_GLSLANG_BINARIES OFF CACHE BOOL "let's not build binaries we don't need" FORCE) set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS ON CACHE BOOL "let's not use exceptions" FORCE) set(ENABLE_SPVREMAPPER OFF CACHE BOOL "we don't need spvremapper" FORCE) -set(ZSTD_BUILD_PROGRAMS OFF CACHE BOOL "we don't need zstd programs" FORCE) # This is really a workaround for an NDK 20 compiler issue (PPSSPP issue #12105), but shouldn't hurt. if(ANDROID) @@ -22,4 +21,3 @@ add_subdirectory(SPIRV-Cross-build) if(USE_DISCORD AND NOT IOS AND NOT LIBRETRO) add_subdirectory(discord-rpc-build) endif() -add_subdirectory(zstd/build/cmake EXCLUDE_FROM_ALL) diff --git a/ext/native/tools/.gitignore b/ext/native/tools/.gitignore index 07bde6bc05..455a1127f3 100644 --- a/ext/native/tools/.gitignore +++ b/ext/native/tools/.gitignore @@ -2,3 +2,8 @@ Release Debug build *.VC* +Makefile +CMakeFiles +CMakeCache.txt +cmake_install.cmake +png17/ \ No newline at end of file diff --git a/ext/native/tools/CMakeLists.txt b/ext/native/tools/CMakeLists.txt index 1e06925717..0547a25af7 100644 --- a/ext/native/tools/CMakeLists.txt +++ b/ext/native/tools/CMakeLists.txt @@ -10,24 +10,21 @@ add_definitions(-fno-strict-aliasing) #add_definitions(-fopenmp) if(IOS) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++ -DMAX_LOGLEVEL=-1") elseif(APPLE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -mmacosx-version-min=10.7") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -mmacosx-version-min=10.7 -DMAX_LOGLEVEL=-1") endif() if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7.0) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -DMAX_LOGLEVEL=-1") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -DMAX_LOGLEVEL=-1") endif() # add_definitions(-fstrict-aliasing) include_directories(..) -include_directories(../ext) -include_directories(../math/lin) -include_directories(../image) -include_directories(/usr/local/include) +include_directories(../..) include_directories(../../..) link_directories(/opt/local/lib) @@ -38,17 +35,10 @@ include_directories(/usr/local/include/freetype2) include_directories(/opt/local/include/freetype2) include_directories(/opt/local/include) -add_subdirectory(../base base) -add_subdirectory(../gfx gfx) -add_subdirectory(../file file) -add_subdirectory(../image image) -add_subdirectory(../math math) -add_subdirectory(../util util) -add_subdirectory(../ext/libpng17 png17) +add_subdirectory(../../libpng17 png17) +add_executable(build/atlastool atlastool.cpp ../../../Common/Data/Format/PNGLoad.cpp ../../../Common/Data/Encoding/Utf8.cpp ../../../Common/Data/Format/ZIMSave.cpp) +target_link_libraries(build/atlastool freetype util png17 z zstd) -add_executable(atlastool atlastool.cpp) -target_link_libraries(atlastool freetype util image png17 z file base) - -add_executable(zimtool zimtool.cpp) -target_link_libraries(zimtool freetype image png17 z file base) +add_executable(build/zimtool zimtool.cpp ../../../Common/Data/Format/PNGLoad.cpp ../../../Common/Data/Format/ZIMSave.cpp) +target_link_libraries(build/zimtool freetype util png17 z zstd) diff --git a/ext/native/tools/b.sh b/ext/native/tools/b.sh index 015dc7e52e..44ac6c13b2 100755 --- a/ext/native/tools/b.sh +++ b/ext/native/tools/b.sh @@ -1,3 +1,3 @@ mkdir -p build -(cd build; cmake .. && make -j5; cd ..) +(cmake CMakeLists.txt && make -j5) #cp build/atlastool /home/henrik/bin diff --git a/MoltenVK/iOS/Frameworks/libMoltenVK.dylib b/ext/vulkan/iOS/Frameworks/libMoltenVK.dylib similarity index 68% rename from MoltenVK/iOS/Frameworks/libMoltenVK.dylib rename to ext/vulkan/iOS/Frameworks/libMoltenVK.dylib index 59a25a1099..7814e1c845 100755 Binary files a/MoltenVK/iOS/Frameworks/libMoltenVK.dylib and b/ext/vulkan/iOS/Frameworks/libMoltenVK.dylib differ diff --git a/ext/vulkan/macOS/Frameworks/libMoltenVK.dylib b/ext/vulkan/macOS/Frameworks/libMoltenVK.dylib new file mode 100755 index 0000000000..23c8f49222 Binary files /dev/null and b/ext/vulkan/macOS/Frameworks/libMoltenVK.dylib differ diff --git a/MoltenVK/vulkan-1.2.154.0-macos-license-summary.txt b/ext/vulkan/vulkan-1.2.162.0-macos-license-summary.txt similarity index 96% rename from MoltenVK/vulkan-1.2.154.0-macos-license-summary.txt rename to ext/vulkan/vulkan-1.2.162.0-macos-license-summary.txt index 399460e4b1..53fe48f091 100644 --- a/MoltenVK/vulkan-1.2.154.0-macos-license-summary.txt +++ b/ext/vulkan/vulkan-1.2.162.0-macos-license-summary.txt @@ -1,4 +1,4 @@ -VULKAN RELEASE 1.2.154.0 MACOS LICENSE SUMMARY +VULKAN RELEASE 1.2.162.0 MACOS LICENSE SUMMARY ================================================================================ List of Open Source Licenses in use by SDK components: @@ -10,6 +10,7 @@ List of Open Source Licenses in use by SDK components: LGPL-3.0 LLVM MIT + Qt Qt2 Unlicensed glslangPreprocesssor @@ -23,6 +24,7 @@ List of copyrights in use by SDK components: << Copyright 2016-2020 LunarG Inc. Copyright (c) 2018 The Khronos Group Inc. LunarG Inc. All rights reserved. Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, Copyright (C) 2002-2005 3Dlabs Inc. Ltd. Copyright (C) 2011 Thiago Macieira Copyright (C) 2012 Giuseppe D'Angelo . @@ -81,7 +83,6 @@ List of copyrights in use by SDK components: Copyright (c) 2013 The Khronos Group Inc. Copyright (c) 2014-2016 The Khronos Group Inc. Copyright (c) 2014-2017 The Khronos Group Inc. - Copyright (c) 2014-2018 The Khronos Group Inc. Copyright (c) 2014-2019 LunarG, Inc. Copyright (c) 2014-2019 The Khronos Group Inc. Copyright (c) 2014-2019 Valve Corporation @@ -112,7 +113,6 @@ List of copyrights in use by SDK components: Copyright (c) 2015-2017 Valve Corporation Copyright (c) 2015-2017, 2019 Google Inc. Copyright (c) 2015-2017, 2019 LunarG, Inc. - Copyright (c) 2015-2017, 2019 The Khronos Group Inc. Copyright (c) 2015-2017, 2019 Valve Corporation Copyright (c) 2015-2017, 2019-2020 LunarG, Inc. Copyright (c) 2015-2017, 2019-2020 The Khronos Group Inc. @@ -204,7 +204,7 @@ List of copyrights in use by SDK components: Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. copyright (c) 2014 joseph werle - label->setText(QApplication::translate("dlgAbout", "Copyright 2020 LunarG, Inc.", nullptr)); + label->setText(QApplication::translate("dialog_about", "Copyright 2020 LunarG, Inc.", nullptr)); The full text of each license is listed below. @@ -429,6 +429,24 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +================================================================================ +Qt +-------------------------------------------------------------------------------- + +LunarG’s SDK incorporates the following Qt 5.13 modules and add-ons: Qt Core, Qt GUI, Qt Widgets and Qt WebEngine. + +Information on the general Qt 5.13 license is available at this link: https://doc.qt.io/qt-5/licensing.html + +Information on the overall Qt Core license and third party modules contained in Qt Core are available at this link: https://doc.qt.io/qt-5/qtcore-index.html + +Information on the overall Qt GUI license and third party modules contained in Qt GUI are available at this link: https://doc.qt.io/qt-5/qtgui-index.html + +Information on the overall Qt Widgets license is available at this link: https://doc.qt.io/qt-5/qtwidgets-index.html + +Information on the overall Qt WebEngine license and third party modules contained in Qt WebEngine are available at this link: https://doc.qt.io/qt-5/qtwebengine-licensing.html + + + ================================================================================ Qt2 -------------------------------------------------------------------------------- diff --git a/ffmpeg b/ffmpeg index a5baf97df4..70bfd4a774 160000 --- a/ffmpeg +++ b/ffmpeg @@ -1 +1 @@ -Subproject commit a5baf97df4579b4614cd5e643241c7acfc36b0c4 +Subproject commit 70bfd4a77487e56ef60b4adfc47f714cfea59794 diff --git a/headless/Compare.cpp b/headless/Compare.cpp index 1b81867a67..be8dad3738 100644 --- a/headless/Compare.cpp +++ b/headless/Compare.cpp @@ -19,9 +19,10 @@ #include #include #include +#include #include -#include "headless/Compare.h" +#include "headless/Compare.h" #include "Common/Data/Convert/ColorConv.h" #include "Common/Data/Format/PNGLoad.h" #include "Common/File/FileUtil.h" @@ -209,7 +210,7 @@ std::string GetTestName(const Path &bootFilename) } bool CompareOutput(const Path &bootFilename, const std::string &output, bool verbose) { - Path expect_filename = bootFilename.WithReplacedExtension(".prx", ".expected"); + Path expect_filename = bootFilename.GetFileExtension() == ".prx" ? bootFilename.WithReplacedExtension(".prx", ".expected") : bootFilename.WithExtraExtension(".expected"); std::unique_ptr expect_loader(ConstructFileLoader(expect_filename)); if (expect_loader->Exists()) { @@ -365,32 +366,35 @@ std::vector TranslateDebugBufferToCompare(const GPUDebugBuffer *buffer, u32 return data; } -double CompareScreenshot(const std::vector &pixels, u32 stride, u32 w, u32 h, const Path& screenshotFilename, std::string &error) -{ - if (pixels.size() < stride * h) - { - error = "Buffer format conversion error"; + +ScreenshotComparer::~ScreenshotComparer() { + if (reference_) + free(reference_); +} + +double ScreenshotComparer::Compare(const Path &screenshotFilename) { + if (pixels_.size() < stride_ * h_) { + error_ = "Buffer format conversion error"; return -1.0f; } // We assume the bitmap is the specified size, not including whatever stride. - u32 *reference = nullptr; - bool asBitmap = false; - std::unique_ptr loader(ConstructFileLoader(screenshotFilename)); if (loader->Exists()) { uint8_t header[2]; if (loader->ReadAt(0, 2, header) != 2) { - error = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); + error_ = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); return -1.0f; } if (header[0] == 'B' && header[1] == 'M') { - reference = (u32 *)calloc(stride * h, sizeof(u32)); - asBitmap = true; + reference_ = (u32 *)calloc(stride_ * h_, sizeof(u32)); + asBitmap_ = true; // The bitmap header is 14 + 40 bytes. We could validate it but the test would fail either way. - if (reference && loader->ReadAt(14 + 40, sizeof(u32), stride * h, reference) != stride * h) { - error = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); + if (reference_ && loader->ReadAt(14 + 40, sizeof(u32), stride_ * h_, reference_) != stride_ * h_) { + error_ = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); + free(reference_); + reference_ = nullptr; return -1.0f; } } else { @@ -398,45 +402,151 @@ double CompareScreenshot(const std::vector &pixels, u32 stride, u32 w, u32 std::vector compressed; compressed.resize(loader->FileSize()); if (loader->ReadAt(0, compressed.size(), &compressed[0]) != compressed.size()) { - error = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); + error_ = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); return -1.0f; } int width, height; - if (!pngLoadPtr(&compressed[0], compressed.size(), &width, &height, (unsigned char **)&reference)) { - error = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); + if (!pngLoadPtr(&compressed[0], compressed.size(), &width, &height, (unsigned char **)&reference_)) { + error_ = "Unable to read screenshot data: " + screenshotFilename.ToVisualString(); + if (reference_) + free(reference_); + reference_ = nullptr; return -1.0f; } } } else { - error = "Unable to read screenshot: " + screenshotFilename.ToVisualString(); + error_ = "Unable to read screenshot: " + screenshotFilename.ToVisualString(); return -1.0f; } - if (!reference) { - error = "Unable to allocate screenshot data: " + screenshotFilename.ToVisualString(); + if (!reference_) { + error_ = "Unable to allocate screenshot data: " + screenshotFilename.ToVisualString(); return -1.0f; } u32 errors = 0; - if (asBitmap) { + if (asBitmap_) { // The reference is flipped and BGRA by default for the common BMP compare case. - for (u32 y = 0; y < h; ++y) { - u32 yoff = y * stride; - for (u32 x = 0; x < w; ++x) - errors += ComparePixel(pixels[y * stride + x], reference[yoff + x]); + for (u32 y = 0; y < h_; ++y) { + u32 yoff = y * stride_; + for (u32 x = 0; x < w_; ++x) + errors += ComparePixel(pixels_[y * stride_ + x], reference_[yoff + x]); } } else { // Just convert to BGRA for simplicity. - ConvertRGBA8888ToBGRA8888(reference, reference, h * stride); - for (u32 y = 0; y < h; ++y) { - u32 yoff = (h - y - 1) * stride; - for (u32 x = 0; x < w; ++x) - errors += ComparePixel(pixels[y * stride + x], reference[yoff + x]); + ConvertRGBA8888ToBGRA8888(reference_, reference_, h_ * stride_); + for (u32 y = 0; y < h_; ++y) { + u32 yoff = (h_ - y - 1) * stride_; + for (u32 x = 0; x < w_; ++x) + errors += ComparePixel(pixels_[y * stride_ + x], reference_[yoff + x]); } } - free(reference); + return (double) errors / (double) (w_ * h_); +} - return (double) errors / (double) (w * h); +bool ScreenshotComparer::SaveActualBitmap(const Path &resultFilename) { + static const u8 header[14 + 40] = { + 0x42, 0x4D, 0x38, 0x80, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x80, 0x08, 0x00, 0x12, 0x0B, + 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + FILE *saved = File::OpenCFile(resultFilename, "wb"); + if (saved) { + fwrite(&header, sizeof(header), 1, saved); + fwrite(pixels_.data(), sizeof(u32), stride_ * h_, saved); + fclose(saved); + + return true; + } + + return false; +} + +bool ScreenshotComparer::SaveVisualComparisonPNG(const Path &resultFilename) { + std::unique_ptr comparison(new u32[w_ * 2 * h_ * 2]); + + if (asBitmap_) { + // The reference is flipped and BGRA by default for the common BMP compare case. + for (u32 y = 0; y < h_; ++y) { + u32 yoff = y * stride_; + u32 comparisonRow = (h_ - y - 1) * 2 * w_ * 2; + for (u32 x = 0; x < w_; ++x) { + PlotVisualComparison(comparison.get(), comparisonRow + x * 2, pixels_[y * stride_ + x], reference_[yoff + x]); + } + } + } else { + // Reference is already in BGRA either way. + for (u32 y = 0; y < h_; ++y) { + u32 yoff = (h_ - y - 1) * stride_; + u32 comparisonRow = (h_ - y - 1) * 2 * w_ * 2; + for (u32 x = 0; x < w_; ++x) { + PlotVisualComparison(comparison.get(), comparisonRow + x * 2, pixels_[y * stride_ + x], reference_[yoff + x]); + } + } + } + + FILE *fp = File::OpenCFile(resultFilename, "wb"); + if (!fp) + return false; + + png_image png; + memset(&png, 0, sizeof(png)); + png.version = PNG_IMAGE_VERSION; + png.format = PNG_FORMAT_BGRA; + png.width = w_ * 2; + png.height = h_ * 2; + + bool success = png_image_write_to_stdio(&png, fp, 0, comparison.get(), w_ * 2 * 4, nullptr) != 0; + fclose(fp); + png_image_free(&png); + + return success && png.warning_or_error < 2; +} + +int ChannelDifference(u8 actual, u8 reference) { + int diff = actual > reference ? actual - reference : reference - actual; + if (diff == 0) + return 0; + if (diff < 4) + return 1; + if (diff < 8) + return 2; + if (diff < 16) + return 3; + if (diff < 32) + return 4; + return 5; +} + +int PixelDifference(u32 actual, u32 reference) { + int b = ChannelDifference((actual >> 0) & 0xFF, (reference >> 0) & 0xFF); + int g = ChannelDifference((actual >> 8) & 0xFF, (reference >> 8) & 0xFF); + int r = ChannelDifference((actual >> 16) & 0xFF, (reference >> 16) & 0xFF); + return std::max(b, std::max(g, r)); +} + +void ScreenshotComparer::PlotVisualComparison(u32 *dst, u32 offset, u32 actual, u32 reference) { + int diff = PixelDifference(actual, reference); + dst[offset + 0] = actual | 0xFF000000; + dst[offset + 1] = actual | 0xFF000000; + dst[offset + w_ * 2 + 0] = reference | 0xFF000000; + + int alpha = 0x00000000; + switch (diff) { + case 0: alpha = 0xFF000000; break; + case 1: alpha = 0xEF000000; break; + case 2: alpha = 0xCF000000; break; + case 3: alpha = 0xAF000000; break; + case 4: alpha = 0x7F000000; break; + default: break; + } + + dst[offset + w_ * 2 + 1] = (reference & 0x00FFFFFF) | alpha; } diff --git a/headless/Compare.h b/headless/Compare.h index f1f30f5375..0ddd702af8 100644 --- a/headless/Compare.h +++ b/headless/Compare.h @@ -34,4 +34,31 @@ std::string GetTestName(const Path &bootFilename); bool CompareOutput(const Path &bootFilename, const std::string &output, bool verbose); std::vector TranslateDebugBufferToCompare(const GPUDebugBuffer *buffer, u32 stride, u32 h); -double CompareScreenshot(const std::vector &pixels, u32 stride, u32 w, u32 h, const Path &screenshotFilename, std::string &error); + +class ScreenshotComparer { +public: + ScreenshotComparer(const std::vector &pixels, u32 stride, u32 w, u32 h) + : pixels_(pixels), stride_(stride), w_(w), h_(h) { + } + ~ScreenshotComparer(); + + double Compare(const Path &screenshotFilename); + + std::string GetError() { + return error_; + } + + bool SaveActualBitmap(const Path &filename); + bool SaveVisualComparisonPNG(const Path &filename); + +protected: + void PlotVisualComparison(u32 *dst, u32 offset, u32 actual, u32 reference); + + const std::vector &pixels_; + u32 *reference_ = nullptr; + bool asBitmap_ = false; + std::string error_; + u32 stride_; + u32 w_; + u32 h_; +}; diff --git a/headless/Headless.vcxproj b/headless/Headless.vcxproj index 8bca7efb04..6ef86ce3ee 100644 --- a/headless/Headless.vcxproj +++ b/headless/Headless.vcxproj @@ -176,7 +176,7 @@ NotUsing Level3 _CRTDBG_MAP_ALLOC;USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_ARCH_32=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/x86/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/x86/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 EnableFastChecks StreamingSIMDExtensions2 Precise @@ -209,7 +209,7 @@ NotUsing Level3 _CRTDBG_MAP_ALLOC;USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_ARCH_64=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/x86_64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/x86_64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 NotSet Precise false @@ -242,7 +242,7 @@ NotUsing Level3 _CRTDBG_MAP_ALLOC;USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_ARCH_64=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/aarch64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/aarch64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 Precise false true @@ -271,7 +271,7 @@ NotUsing Level3 _CRTDBG_MAP_ALLOC;USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_ARCH_32=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/arm/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/arm/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 Precise false true @@ -303,7 +303,7 @@ true true USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_ARCH_32=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/x86/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/x86/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 false StreamingSIMDExtensions2 Precise @@ -339,7 +339,7 @@ true true USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_ARCH_64=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/x86_64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/x86_64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 false NotSet Precise @@ -377,7 +377,7 @@ true true USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_ARCH_64=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/aarch64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/aarch64/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 false Precise Speed @@ -411,7 +411,7 @@ true true USING_WIN_UI;GLEW_STATIC;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_ARCH_32=1;_CONSOLE;_UNICODE;UNICODE;%(PreprocessorDefinitions) - ../ffmpeg/Windows/arm/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew + ../ffmpeg/Windows/arm/include;../dx9sdk/Include/DX11;../Common;..;../Core;../ext/glew;../ext/libpng17 false Precise Speed diff --git a/headless/StubHost.cpp b/headless/StubHost.cpp index e2331d1e48..e7fbd03f9a 100644 --- a/headless/StubHost.cpp +++ b/headless/StubHost.cpp @@ -17,6 +17,7 @@ #include "Common/File/FileUtil.h" #include "Common/Log.h" +#include "Common/StringUtils.h" #include "Core/CoreParameter.h" #include "Core/System.h" #include "GPU/Common/GPUDebugInterface.h" @@ -48,36 +49,17 @@ void HeadlessHost::SendDebugScreenshot(const u8 *pixbuf, u32 w, u32 h) { gpuDebug->GetCurrentFramebuffer(buffer, GPU_DBG_FRAMEBUF_RENDER); const std::vector pixels = TranslateDebugBufferToCompare(&buffer, 512, 272); - std::string error; - double errors = CompareScreenshot(pixels, FRAME_STRIDE, FRAME_WIDTH, FRAME_HEIGHT, comparisonScreenshot_, error); + ScreenshotComparer comparer(pixels, FRAME_STRIDE, FRAME_WIDTH, FRAME_HEIGHT); + double errors = comparer.Compare(comparisonScreenshot_); if (errors < 0) - SendOrCollectDebugOutput(error + "\n"); + SendOrCollectDebugOutput(comparer.GetError() + "\n"); if (errors > 0) - { - char temp[256]; - snprintf(temp, sizeof(temp), "Screenshot error: %f%%\n", errors * 100.0f); - SendOrCollectDebugOutput(temp); - } + SendOrCollectDebugOutput(StringFromFormat("Screenshot error: %f%%\n", errors * 100.0f)); if (errors > 0 && !teamCityMode && !getenv("GITHUB_ACTIONS")) { - static const u8 header[14 + 40] = { - 0x42, 0x4D, 0x38, 0x80, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x80, 0x08, 0x00, 0x12, 0x0B, - 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - FILE *saved = File::OpenCFile(Path("__testfailure.bmp"), "wb"); - if (saved) { - fwrite(&header, sizeof(header), 1, saved); - fwrite(pixels.data(), sizeof(u32), FRAME_STRIDE * FRAME_HEIGHT, saved); - fclose(saved); - + if (comparer.SaveActualBitmap(Path("__testfailure.bmp"))) SendOrCollectDebugOutput("Actual output written to: __testfailure.bmp\n"); - } + comparer.SaveVisualComparisonPNG(Path("__testcompare.png")); } } diff --git a/history.md b/history.md index 29256df154..b40eaba158 100644 --- a/history.md +++ b/history.md @@ -1,5 +1,97 @@ This is history moved out from README.md, which was getting a bit long. +What's new in 1.9.0/1.9.3 +------------------------- +* Sizing/touch fixes on Android +* Fixes for some crashes + +What's new in 1.9.0/1.9.2 +------------------------- +* Flicker fixed in God of War that appeared with newer drivers for Mali GPUs ([#12224]) +* Improve performance of God of War on Vulkan ([#12242]), implement built-in GPU profiler ([#12262], [#12266]) +* Vertex range culling fixed on ARM Mali ([#12227]) +* Started to improve VFPU precision, resulting so far in a fix for the long standing Tekken 6 leg shaking problem ([#12217]) +* Fixed a VFPU precision snafu on ARM64, fixing disappearing officers in Warriors Orochi ([#11299]) and some problems in Tomb Raider ([#11179]). +* Vulkan is the default again on Android versions newer than Pie +* Fix various homebrew store issues +* GPU pause signal handling fixed, fixing some hangs in Bleach and Armored Core games ([#12160]) +* Audio sample rate conversion handling fixes ([#12147]) +* Some Vulkan optimizations (pre-rotation ([#12216]), perf fix in Metal Gear Acid, etc) +* Multiple fixes for the UWP build ([#12036], others) +* MP3 playback fixes ([#12005]) +* Audio in Motorstorm: Arctic Edge fixed by returning errors correctly ([#12121]) +* Audio glitches in Final Fantasy Tactics fixed ([#9956]) +* Camera display in Invizimals fixed ([#12278], [#8521]) +* Added hotkeys for texture dump and replace ([#11938]) +* Added Visual Studio 2019 support. Windows XP is no longer supported ([#11995], others) +* Fixes for video capture ([#12069]) +* Added a separate sound volume for alternative speed ([#12124]) +* Improved mouse control (Windows only) ([#12173], [#12176]) +* Support for installing texture packs and ISOs from zips ([#12175]) +* Right analog support for touch controls (only used by patched games and some HD remasters) ([#12182]) +* Android: Fix OpenSL initialization, possibly helps audio crackle a little. ([#12333]). +* Fix graphics on Amazon Fire TV Stick 4K +* Fixed strange vehicle behavior in MGS:PW (somehow) ([#12342]) + +What's new in 1.8.0 +------------------- +* Avoid crash when starting PPSSPP due to bad AMD Vulkan drivers ([#11802]) +* PowerVR Vulkan display corruption fixed ([#11744], [#11747]) +* Naruto Shippuden 3 hang fixed ([#11780]) +* Fixes to various lighting bugs ([#11567], [#11574], [#11577]) +* Fix control issue in Sonic Rivals and Rock Band ([#11878], [#11798], [#11879]) +* Significant performance improvement in Earth Defense Force 2 ([#11172]) +* Fix "real clock sync" setting (helps with latency for music games - [#11813]) +* More speed in FF4 effects and other generated curves ([#11425]) +* Support for resizing Vulkan on Linux ([#11451]) +* Improved support for GLES on Linux/IoT ([#11507], [#11537], [#11541], [#11632], [#11746], [#11806], [#11845]) +* Percentage based frameskipping ([#11523]) +* DXT accuracy improved, fixing thick white line in Gran Turismo sky ([#11530]) +* Fix Motorstorm freeze on non-Windows ([#11618]) +* Faster block transfer in some games like Digimon Adventures ([#11531], [#11553], [#11776]) +* Blending optimizations and improvements ([#11543], [#11620]) +* Improve D3D11 rendering issues ([#11584]) +* Change default graphics backend to D3D11 or OpenGL ([#11621], [#11658]) +* Remove some outdated settings ([#11665], [#11666], [#11667]) +* Fix remote disc streaming with ipv6 ([#11689], [#11700]) +* Vulkan: Workarounds for some driver bugs for 5xx series Qualcomm GPUs ([#11691], [#11694]) +* Fix some Qt port issues with recent performance improvements ([#11720], [#11807], [#11808]) +* UWP Xbox One: fix X/Back button confusion ([#11740]) +* Fix Formula 1 2006 timing issue ([#11767]) +* Fixes and workarounds for some vertex range culling bugs that broke a few games ([#11785], [#11859]), and disable it on older GPUs ([#11712], [#11773], [#11787]) +* Android: Allow putting PSP storage on custom paths like SD cards ([#11812]) +* Corrected vocp instruction, fixing models in Artdink games ([#11822], [#11835]) +* Bundle SDL in binary for macOS builds ([#11831]) +* Prevent keeping games open on Windows ([#11842]) + +What's new in 1.7.3/1.7.4/1.7.5 +------------------- +* Fixes for a couple of common crashes +* Reverted immersive mode change temporarily to see if it helps misaligned buttons +* Change default adhoc server address + +What's new in 1.7.2 +------------------- +* Update text of "Buy PPSSPP Gold" button + +What's new in 1.7.1 +------------------- +* Minor crashfixes, lang updates +* Save bug fixed ([#11508]) + +What's new in 1.7.0 +------------------- +* Fix for insta-crash on Galaxy Note 9, some Xiaomi devices, and the new nVidia Shield ([#11441]) +* Vertex range culling on most platforms, fixes DTM: Race Driver and similar ([#11393]) +* Major speed boost in some Gundam and Earth Defense Force games ([#10973]) +* Fix for issues with post processing shaders in GL 3+ ([#11182]) +* Fixes to sound output switching on Windows (WASAPI) ([#11438]) +* Detects DirectInput devices when running ([#11461]) +* Simple Discord integration ([#11307]) +* New debugging APIs ([#10909]) +* Task switching made a lot more robust (fixes GPD XD problems) ([#11447]) +* Texture decoding optimizations ([#11350]) +* Tons and tons of miscellaneous bugfixes and compatibility fixes What's new in 1.6.3 ------------------- @@ -382,3 +474,95 @@ go to see there http://forums.ppsspp.org/showthread.php?tid=3595&pid=59241#pid59 [#8882]: https://github.com/hrydgard/ppsspp/issues/8882 "Add custom log expressions to the debugger" [#8762]: https://github.com/hrydgard/ppsspp/issues/8762 "Add more GE debugger features" [#8968]: https://github.com/hrydgard/ppsspp/issues/8968 "Android: Add both a lost and restore phase" +[#12224]: https://github.com/hrydgard/ppsspp/issues/12224 "Vulkan: Add missing barrier between multiple passes to the same target." +[#12242]: https://github.com/hrydgard/ppsspp/issues/12242 "Vulkan: Automatically merge render passes to the same target when possible" +[#12262]: https://github.com/hrydgard/ppsspp/issues/12262 "Vulkan: Implement basic integrated GPU profiling." +[#12266]: https://github.com/hrydgard/ppsspp/issues/12266 "Vulkan: Further improvements to GPU profiling" +[#12227]: https://github.com/hrydgard/ppsspp/issues/12227 "Vulkan/GL: Set all four coordinates to NaN instead of just W." +[#12217]: https://github.com/hrydgard/ppsspp/issues/12217 "Merge vfpu-dot changes and add compat flag for Tekken" +[#11299]: https://github.com/hrydgard/ppsspp/issues/11299 "Warrior Orochi Enemy Missing" +[#11179]: https://github.com/hrydgard/ppsspp/issues/11179 "Tomb Raider Anniversary jump to horizontal bar issue" +[#12160]: https://github.com/hrydgard/ppsspp/issues/12160 "GPU: Forget pause signal on new list" +[#12147]: https://github.com/hrydgard/ppsspp/issues/12147 "Handle audio SRC mixing more correctly" +[#12216]: https://github.com/hrydgard/ppsspp/issues/12216 "Cant get Invizimals to work on PPSSPP (Video source not rendered)" +[#12036]: https://github.com/hrydgard/ppsspp/issues/12036 "Several UWP fixes" +[#12005]: https://github.com/hrydgard/ppsspp/issues/12005 "Correct mp3 looping, frame num, and sum decoded" +[#12121]: https://github.com/hrydgard/ppsspp/issues/12121 "Return errors on Audio2 release when channel busy" +[#9956]: https://github.com/hrydgard/ppsspp/issues/9956 "Audio crackle/distortion in Final Fantasy Tactics" +[#12278]: https://github.com/hrydgard/ppsspp/issues/12278 "UsbCam/jpeg: Cleanups, notify framebuffer manager" +[#8521]: https://github.com/hrydgard/ppsspp/issues/8521 "PSP Camera Support (Android)" +[#11938]: https://github.com/hrydgard/ppsspp/issues/11938 "Add texture dump/replace hotkeys." +[#11995]: https://github.com/hrydgard/ppsspp/issues/11995 "Fix VS2019 builds and remove _xp dependency" +[#12069]: https://github.com/hrydgard/ppsspp/issues/12069 "Fix avi dump feature" +[#12124]: https://github.com/hrydgard/ppsspp/issues/12124 "Audio: Add volume for alternate speed" +[#12173]: https://github.com/hrydgard/ppsspp/issues/12173 "Ignore mapped mouse input for UI" +[#12176]: https://github.com/hrydgard/ppsspp/issues/12176 "Mouse improvements" +[#12175]: https://github.com/hrydgard/ppsspp/issues/12175 "UI: Allow installing texture packs from zips" +[#12182]: https://github.com/hrydgard/ppsspp/issues/12182 "Add right analog for touch controls." +[#12333]: https://github.com/hrydgard/ppsspp/issues/12333 "Android OpenSL initial queue fix" +[#12342]: https://github.com/hrydgard/ppsspp/issues/12342 "Serious MGS Peace Walker bug fixed post-1.8.0" +[#11802]: https://github.com/hrydgard/ppsspp/issues/11802 "Windows: Detect Vulkan in separate process" +[#11744]: https://github.com/hrydgard/ppsspp/issues/11744 "VulkanDeviceAlloc: Memorytype per slab" +[#11747]: https://github.com/hrydgard/ppsspp/issues/11747 "Vk validation fixes, plus PowerVR swapchain hack" +[#11780]: https://github.com/hrydgard/ppsspp/issues/11780 "Naruto Shippuden Ultimate Ninja 3: Probably a better fix for the video hang issue." +[#11567]: https://github.com/hrydgard/ppsspp/issues/11567 "Correct shade mapping when light pos is all zeros" +[#11574]: https://github.com/hrydgard/ppsspp/issues/11574 "Correct various light param issues based on tests" +[#11577]: https://github.com/hrydgard/ppsspp/issues/11577 "Correct provoking vertex for lighting when flat shading" +[#11878]: https://github.com/hrydgard/ppsspp/issues/11878 "Sonic Rivals controls semi-broken" +[#11798]: https://github.com/hrydgard/ppsspp/issues/11798 "User report: Long notes in Rock Band Unplugged are not registered correctly" +[#11879]: https://github.com/hrydgard/ppsspp/issues/11879 "Fix apparent bug in #11094, fixes #11878 and likely #11798" +[#11172]: https://github.com/hrydgard/ppsspp/issues/11172 "handle cullface, help to #10597" +[#11813]: https://github.com/hrydgard/ppsspp/issues/11813 "Core: Fix lag sync on game start / after pause" +[#11425]: https://github.com/hrydgard/ppsspp/issues/11425 "[Refactoring] Improve spline/bezier." +[#11451]: https://github.com/hrydgard/ppsspp/issues/11451 "SDL/Vulkan window resize improvements" +[#11507]: https://github.com/hrydgard/ppsspp/issues/11507 "Improve support of Qt + USING_GLES2" +[#11537]: https://github.com/hrydgard/ppsspp/issues/11537 "CMake: Allow disabling Wayland support with USE_WAYLAND_WSI" +[#11541]: https://github.com/hrydgard/ppsspp/issues/11541 "CMake: Fix linking X11 when using EGL and not fbdev" +[#11632]: https://github.com/hrydgard/ppsspp/issues/11632 "SDL: Allow toggling fullscreen for GLES2 on desktops." +[#11746]: https://github.com/hrydgard/ppsspp/issues/11746 "CMakeLists: fix EGL detection for ARM devices" +[#11806]: https://github.com/hrydgard/ppsspp/issues/11806 "SDL: Force fullscreen desktop for USING_FBDEV" +[#11845]: https://github.com/hrydgard/ppsspp/issues/11845 "EGL: Avoid HDR mode. Uses unknownbrackets' changes from #11839." +[#11523]: https://github.com/hrydgard/ppsspp/issues/11523 "Add frameskip setting" +[#11530]: https://github.com/hrydgard/ppsspp/issues/11530 "Make DXT alpha and color calculation more accurate" +[#11618]: https://github.com/hrydgard/ppsspp/issues/11618 "Io: Ensure sign extension for error codes" +[#11531]: https://github.com/hrydgard/ppsspp/issues/11531 "WIP: Virtual readbacks" +[#11553]: https://github.com/hrydgard/ppsspp/issues/11553 "Remove constraint that virtual framebuffers have to represent VRAM." +[#11776]: https://github.com/hrydgard/ppsspp/issues/11776 "Only gate really expensive block transfers behind the setting." +[#11543]: https://github.com/hrydgard/ppsspp/issues/11543 "GPU: Dirty frag shader on depth write" +[#11620]: https://github.com/hrydgard/ppsspp/issues/11620 "Optimize out some stencil emulation, try to avoid depth write" +[#11584]: https://github.com/hrydgard/ppsspp/issues/11584 "D3D11: Allow shader blend to self" +[#11621]: https://github.com/hrydgard/ppsspp/issues/11621 "Vulkan: Avoid using Vulkan" +[#11658]: https://github.com/hrydgard/ppsspp/issues/11658 "Windows: Hide Vulkan/D3D11 if not available" +[#11665]: https://github.com/hrydgard/ppsspp/issues/11665 "Remove the \"Disable stencil test\" hack setting" +[#11666]: https://github.com/hrydgard/ppsspp/issues/11666 "Remove \"Timer Hack\" setting." +[#11667]: https://github.com/hrydgard/ppsspp/issues/11667 "Remove outdated TrueColor setting." +[#11689]: https://github.com/hrydgard/ppsspp/issues/11689 "Correct remote disc streaming with ipv6" +[#11700]: https://github.com/hrydgard/ppsspp/issues/11700 "http: Report errors reading discs" +[#11691]: https://github.com/hrydgard/ppsspp/issues/11691 "WIP: Vulkan/adreno: Apply workaround for Harvest Moon issue #10421" +[#11694]: https://github.com/hrydgard/ppsspp/issues/11694 "Vulkan: Limit stencil workaround to Adreno 5xx" +[#11720]: https://github.com/hrydgard/ppsspp/issues/11720 "Try to support Qt keyboard input directly. Fixes #11653" +[#11807]: https://github.com/hrydgard/ppsspp/issues/11807 "Qt: Re-enable Load button to browse for file" +[#11808]: https://github.com/hrydgard/ppsspp/issues/11808 "Qt: Correct text bind on first draw of string" +[#11740]: https://github.com/hrydgard/ppsspp/issues/11740 "Fix for weird Xbox B button behavior, see #10948." +[#11767]: https://github.com/hrydgard/ppsspp/issues/11767 "Compat: Force realistic UMD timing for F1 2006." +[#11785]: https://github.com/hrydgard/ppsspp/issues/11785 "GPU: Correct depth clamp range in range cull" +[#11859]: https://github.com/hrydgard/ppsspp/issues/11859 "GPU: Handle cull range properly drawing at offset" +[#11712]: https://github.com/hrydgard/ppsspp/issues/11712 "GLES: Detect Vivante GPU, disable vertex range culling" +[#11773]: https://github.com/hrydgard/ppsspp/issues/11773 "D3D9: Disable range culling on really old NVIDIA cards" +[#11787]: https://github.com/hrydgard/ppsspp/issues/11787 "GLES: Disable range culling on VideoCore/Vivante" +[#11812]: https://github.com/hrydgard/ppsspp/issues/11812 "Android: Allow using a custom Memory Stick storage path" +[#11822]: https://github.com/hrydgard/ppsspp/issues/11822 "interp: Correct vocp prefix handling" +[#11835]: https://github.com/hrydgard/ppsspp/issues/11835 "Correct vocp / vsocp prefix handling" +[#11831]: https://github.com/hrydgard/ppsspp/issues/11831 "Bundle libSDL inside app on macOS, fixes #11830" +[#11842]: https://github.com/hrydgard/ppsspp/issues/11842 "Win32 handle leak fix" +[#11508]: https://github.com/hrydgard/ppsspp/issues/11508 "Savedata: Write only one secure entry" +[#11441]: https://github.com/hrydgard/ppsspp/issues/11441 "Vulkan: Apply Themaister's patch, removing illegal pre-transitions of swapchain images. Fixes #11417 (crash on Note 9)" +[#11393]: https://github.com/hrydgard/ppsspp/issues/11393 "Implement vertex range culling" +[#10973]: https://github.com/hrydgard/ppsspp/issues/10973 "handle cull mode" +[#11182]: https://github.com/hrydgard/ppsspp/issues/11182 "GLES: Use accurate GLSL ver in postshader convert" +[#11438]: https://github.com/hrydgard/ppsspp/issues/11438 "Allow WASAPI device switching" +[#11461]: https://github.com/hrydgard/ppsspp/issues/11461 "Windows: Detect DirectInput devices after launch" +[#11307]: https://github.com/hrydgard/ppsspp/issues/11307 "Enable Discord integration for Mac and Linux." +[#10909]: https://github.com/hrydgard/ppsspp/issues/10909 "WebSocket based debugger interface" +[#11447]: https://github.com/hrydgard/ppsspp/issues/11447 "Avoid calling any GL calls during shutdown on Android. Should help #11063" +[#11350]: https://github.com/hrydgard/ppsspp/issues/11350 "TexCache: Optimize DXT3/DXT5 decode to single pass" \ No newline at end of file diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 7eb2285d0b..223379479b 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -210,7 +210,7 @@ static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Co static RetroOption ppsspp_fast_memory("ppsspp_fast_memory", "Fast Memory (Speedhack)", true); static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", "Block Transfer GPU", true); static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { { "Up to 2", 2 }, { "Up to 1", 1 }, { "No buffer", 0 }, }); -static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "Auto", 0 } }); +static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); static RetroOption ppsspp_texture_shader("ppsspp_texture_shader", "Texture Shader (Vulkan only, overrides Texture Scaling Type)", { {"Off", "Off"}, {"4xBRZ", "Tex4xBRZ"}, {"MMPX", "TexMMPX"} }); static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 }, {"Auto max quality", 4}}); @@ -221,7 +221,6 @@ static RetroOption ppsspp_texture_replacement("ppsspp_texture_replacement" static RetroOption ppsspp_gpu_hardware_transform("ppsspp_gpu_hardware_transform", "GPU Hardware T&L", true); static RetroOption ppsspp_vertex_cache("ppsspp_vertex_cache", "Vertex Cache (Speedhack)", false); static RetroOption ppsspp_cheats("ppsspp_cheats", "Internal Cheats Support", false); -static RetroOption ppsspp_io_threading("ppsspp_io_threading", "I/O on thread (Experimental)", true); static RetroOption ppsspp_io_timing_method("ppsspp_io_timing_method", "IO Timing Method", { { "Fast", IOTimingMethods::IOTIMING_FAST }, { "Host", IOTimingMethods::IOTIMING_HOST }, { "Simulate UMD delays", IOTimingMethods::IOTIMING_REALISTIC } }); static RetroOption ppsspp_frame_duplication("ppsspp_frame_duplication", "Duplicate frames in 30hz games", false); static RetroOption ppsspp_software_skinning("ppsspp_software_skinning", "Software Skinning", true); @@ -264,7 +263,6 @@ void retro_set_environment(retro_environment_t cb) vars.push_back(ppsspp_texture_filtering.GetOptions()); vars.push_back(ppsspp_texture_deposterize.GetOptions()); vars.push_back(ppsspp_texture_replacement.GetOptions()); - vars.push_back(ppsspp_io_threading.GetOptions()); vars.push_back(ppsspp_io_timing_method.GetOptions()); vars.push_back(ppsspp_ignore_bad_memory_access.GetOptions()); vars.push_back(ppsspp_cheats.GetOptions()); @@ -368,7 +366,6 @@ static void check_variables(CoreParameter &coreParam) ppsspp_locked_cpu_speed.Update(&g_Config.iLockedCPUSpeed); ppsspp_rendering_mode.Update(&g_Config.iRenderingMode); ppsspp_cpu_core.Update((CPUCore *)&g_Config.iCpuCore); - ppsspp_io_threading.Update(&g_Config.bSeparateIOThread); ppsspp_io_timing_method.Update((IOTimingMethods *)&g_Config.iIOTimingMethod); ppsspp_lower_resolution_for_effects.Update(&g_Config.iBloomHack); ppsspp_frame_duplication.Update(&g_Config.bRenderDuplicateFrames); @@ -930,6 +927,17 @@ float System_GetPropertyFloat(SystemProperty prop) return -1; } +bool System_GetPropertyBool(SystemProperty prop) +{ + switch (prop) + { + case SYSPROP_CAN_JIT: + return true; + default: + return false; + } +} + std::string System_GetProperty(SystemProperty prop) { return ""; } std::vector System_GetPropertyStringVec(SystemProperty prop) { return std::vector(); } diff --git a/link_readme.py b/link_readme.py index 58abf16d07..25cd951b4f 100755 --- a/link_readme.py +++ b/link_readme.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- import re from time import sleep @@ -8,10 +9,21 @@ from lxml.html import parse footer_delimiter = "\n\n[comment]: # (LINK_LIST_BEGIN_HERE)\n" footer = "" -def replace_foo(match): +linked_id = [] +present_id = [] + +def add_bracket(match): first_char = match.group(1) id = match.group(2) replace = first_char + "[#"+id+"]" + return replace + +def add_link(match): + id = match.group(1) + present_id.append(id) + replace = "#" + id + if id in linked_id: + return replace url = "https://github.com/hrydgard/ppsspp/issues/"+id title = None @@ -27,22 +39,65 @@ def replace_foo(match): global footer addition = "[#"+id+"]: https://github.com/hrydgard/ppsspp/issues/"+id+" \""+title+"\"" footer += addition+"\n" - print("Done: " + addition) + linked_id.append(id) + print("Linked: " + addition) return replace -f = open("README.md", "r+") -cont = f.read() +def already_added_id(match): + linked_id.append(match.group(1)) + return "[#" + match.group(1) + "]:" -# We don't want to match issues id in title so stop before the link list -d = cont.find(footer_delimiter) -if (d != -1): - footer = cont[d + len(footer_delimiter):] - cont = cont[0 : d] +def remove_old_link(line): + # Ignore extra new lines at the end + if line.find("#") == -1: + return "" + + id = line[line.find("[#")+2 : line.find("]:")] + if id in present_id: + return line + "\n" + else: + print("Removed: #" + id) + return "" -updated = re.sub(r"([^[])#(\d+)", replace_foo, cont) -f.seek(0) -f.write(updated) -f.write(footer_delimiter) -f.write(footer) -f.truncate() -f.close() +def update(file_name): + global footer + footer = "" + global linked_id + linked_id = [] + global present_id + present_id = [] + + f = open(file_name, "r+") + cont = f.read() + + # We don't want to match issues id in title so stop before the link list + d = cont.find(footer_delimiter) + if (d != -1): + footer = cont[d + len(footer_delimiter):] + cont = cont[0 : d] + re.sub(r"\[#(\d+)\]:", already_added_id, footer) + + # Add brackets if missing + added_bracket = re.sub(r"([^[])#(\d+)", add_bracket, cont) + + # Add links if missing + updated = re.sub(r"#(\d+)", add_link, added_bracket) + + # Remove old unused link + updated_footer = "" + for line in footer.split("\n"): + updated_footer += remove_old_link(line) + + # Remove extra new lines at the end + while updated_footer[-1] == "\n": + updated_footer = updated_footer[0:-1] + + f.seek(0) + f.write(updated) + f.write(footer_delimiter) + f.write(updated_footer) + f.truncate() + f.close() + +update("README.md") +update("history.md") diff --git a/ppsspp.iss b/ppsspp.iss index 9d37d59206..9aa613f4bc 100644 --- a/ppsspp.iss +++ b/ppsspp.iss @@ -74,6 +74,7 @@ Source: "README.md"; DestName: "README.txt"; DestDir: "{app}"; Flags: isreadme Source: "notinstalled.txt"; DestName: "installed.txt"; DestDir: "{app}"; Source: "assets\*.*"; DestDir: "{app}\assets" Source: "assets\shaders\*.*"; DestDir: "{app}\assets\shaders" +Source: "assets\debugger\*"; DestDir: "{app}\assets\debugger"; Flags: recursesubdirs Source: "assets\lang\*.ini"; DestDir: "{app}\assets\lang" Source: "assets\flash0\font\*.*"; DestDir: "{app}\assets\flash0\font" Source: "dx9sdk\8.1\Redist\D3D\x64\d3dcompiler_47.dll"; DestDir: "{app}" diff --git a/source_assets/image/buttons.svg b/source_assets/image/buttons.svg index 644c2bc86b..edcca85473 100644 --- a/source_assets/image/buttons.svg +++ b/source_assets/image/buttons.svg @@ -12,7 +12,7 @@ height="1052.3622047" id="svg2" version="1.1" - inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" sodipodi:docname="buttons.svg"> @@ -657,7 +657,11 @@ + inkscape:label="Drop Shadow" + x="-0.054592123" + y="-0.05570625" + width="1.1091842" + height="1.1114125"> + inkscape:label="Drop Shadow" + x="-0.04962921" + y="-0.06902453" + width="1.105516" + height="1.1380491"> + inkscape:label="Drop Shadow" + x="-0.036887906" + y="-0.097644459" + width="1.0737758" + height="1.1952889"> + inkscape:label="Drop Shadow" + x="-0.02998049" + y="-0.081521392" + width="1.0568565" + height="1.1630411"> + inkscape:label="Drop Shadow" + x="-0.508148" + y="-0.254074" + width="2.016296" + height="1.3785184"> + inkscape:label="Drop Shadow" + x="-0.062045457" + y="-0.072835148" + width="1.1240909" + height="1.1455263"> + inkscape:label="Drop Shadow" + x="-0.1358691" + y="-0.11974271" + width="1.2717382" + height="1.2394854"> + inkscape:label="Drop Shadow" + x="-0.19164064" + y="-0.11974273" + width="1.3832813" + height="1.2394855"> + inkscape:label="Drop Shadow" + x="-0.031096265" + y="-0.13509237" + width="1.0621925" + height="1.2701847"> + inkscape:label="Drop Shadow" + x="-0.026115784" + y="-0.13509236" + width="1.0522316" + height="1.2701847"> + inkscape:label="Drop Shadow" + x="-0.055887848" + y="-0.055882291" + width="1.1117757" + height="1.1117646"> + inkscape:label="Drop Shadow" + x="-0.1428398" + y="-0.072277018" + width="1.2856796" + height="1.144554"> + inkscape:label="Drop Shadow" + x="-0.062221817" + y="-0.40834883" + width="1.1244436" + height="1.8166977"> + inkscape:label="Drop Shadow" + x="-0.053283034" + y="-0.061528298" + width="1.1065661" + height="1.1230566"> + inkscape:label="Drop Shadow" + x="-0.05898663" + y="-0.058986649" + width="1.1179733" + height="1.1179733"> + inkscape:label="Drop Shadow" + x="-0.033653883" + y="-0.034340698" + width="1.0673078" + height="1.0686814"> + inkscape:label="Drop Shadow" + x="-0.01355557" + y="-0.013832215" + width="1.0271111" + height="1.0276644"> + inkscape:label="Drop Shadow" + x="-0.062221817" + y="-0.061394242" + width="1.1244436" + height="1.1227885"> + inkscape:label="Drop Shadow" + x="-0.26503537" + y="-0.2139469" + width="1.5432305" + height="1.634546"> + width="1.3394475" + height="1.3227315" + x="-0.16972376" + y="-0.16136573"> + id="filter4775" + x="-0.20105123" + y="-0.11971503" + width="1.4021025" + height="1.2394301"> + id="filter4775-3" + x="-0.13065391" + y="-0.11971503" + width="1.2613078" + height="1.2394301"> + id="filter4775-3-9" + x="-0.16877672" + y="-0.11971503" + width="1.3375534" + height="1.2394301"> + id="filter4775-3-0" + x="-0.14845062" + y="-0.11538705" + width="1.2969012" + height="1.2307741"> + id="filter4775-3-02" + x="-0.14241796" + y="-0.11971503" + width="1.2848359" + height="1.2394301"> + id="filter4775-3-97" + x="-0.20831532" + y="-0.11971503" + width="1.4166306" + height="1.2394301"> + id="filter4775-3-8" + x="-0.18579475" + y="-0.11971503" + width="1.3715895" + height="1.2394301"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:document-rotation="0" + inkscape:pagecheckerboard="0"> @@ -1637,27 +2157,27 @@ inkscape:export-xdpi="135" inkscape:export-filename="D:\Dev\Emulatorer\potemkin\gfx\round.png" transform="matrix(0.12501803,0,0,0.12501803,39.336944,16.936311)" + id="path4099" + style="fill:#ffffff;fill-opacity:0.67021275;stroke:none" d="m 257.14286,175.21933 a 142.85715,140 0 1 1 -285.714294,0 142.85715,140 0 1 1 285.714294,0 z" + sodipodi:type="arc" sodipodi:ry="140" sodipodi:rx="142.85715" sodipodi:cy="175.21933" - sodipodi:cx="114.28571" - id="path4099" - style="fill:#ffffff;fill-opacity:0.67021275;stroke:none" - sodipodi:type="arc" /> + sodipodi:cx="114.28571" /> + sodipodi:cx="114.28571" /> @@ -1706,6 +2226,33 @@ id="rect4948-9" style="fill:#ffffff;fill-opacity:0.67021275;stroke:none" /> + + + + + sodipodi:cx="114.28571" /> + sodipodi:cx="114.28571" /> + inkscape:export-ydpi="135" + d="m 257.14286,175.21933 a 142.85715,140 0 1 1 -285.714294,0 142.85715,140 0 1 1 285.714294,0 z" + sodipodi:type="arc" + sodipodi:ry="140" + sodipodi:rx="142.85715" + sodipodi:cy="175.21933" + sodipodi:cx="114.28571" /> + + + + inkscape:export-ydpi="135" + d="m 257.14286,175.21933 a 142.85715,140 0 1 1 -285.714294,0 142.85715,140 0 1 1 285.714294,0 z" + sodipodi:type="arc" + sodipodi:ry="140" + sodipodi:rx="142.85715" + sodipodi:cy="175.21933" + sodipodi:cx="114.28571" /> E + + + + + + + + + + + + + + + + + + + + + + diff --git a/source_assets/image/folder_line.png b/source_assets/image/folder_line.png index 08cd10b575..1d950a4a16 100644 Binary files a/source_assets/image/folder_line.png and b/source_assets/image/folder_line.png differ diff --git a/source_assets/image/folder_open_line.png b/source_assets/image/folder_open_line.png new file mode 100644 index 0000000000..d6bbbe5f65 Binary files /dev/null and b/source_assets/image/folder_open_line.png differ diff --git a/source_assets/image/gear2.png b/source_assets/image/gear2.png new file mode 100644 index 0000000000..31c601af8c Binary files /dev/null and b/source_assets/image/gear2.png differ diff --git a/source_assets/image/info.png b/source_assets/image/info.png new file mode 100644 index 0000000000..4b01a85801 Binary files /dev/null and b/source_assets/image/info.png differ diff --git a/source_assets/image/radio_off.png b/source_assets/image/radio_off.png new file mode 100644 index 0000000000..8179e5829d Binary files /dev/null and b/source_assets/image/radio_off.png differ diff --git a/source_assets/image/radio_on.png b/source_assets/image/radio_on.png new file mode 100644 index 0000000000..9ecafd8969 Binary files /dev/null and b/source_assets/image/radio_on.png differ diff --git a/source_assets/image/square_shape.png b/source_assets/image/square_shape.png new file mode 100644 index 0000000000..2cb47a7455 Binary files /dev/null and b/source_assets/image/square_shape.png differ diff --git a/source_assets/image/square_shape_line.png b/source_assets/image/square_shape_line.png new file mode 100644 index 0000000000..c897cc17d1 Binary files /dev/null and b/source_assets/image/square_shape_line.png differ diff --git a/source_assets/image/warning.png b/source_assets/image/warning.png new file mode 100644 index 0000000000..4db14b7f8d Binary files /dev/null and b/source_assets/image/warning.png differ diff --git a/unittest/UnitTest.cpp b/unittest/UnitTest.cpp index b0585bc05b..50611ba241 100644 --- a/unittest/UnitTest.cpp +++ b/unittest/UnitTest.cpp @@ -40,13 +40,15 @@ #include #endif +#include "Common/Data/Text/Parsers.h" +#include "Common/Data/Text/WrapText.h" +#include "Common/Data/Encoding/Utf8.h" +#include "Common/File/Path.h" +#include "Common/Input/InputState.h" +#include "Common/Math/math_util.h" +#include "Common/Render/DrawBuffer.h" #include "Common/System/NativeApp.h" #include "Common/System/System.h" -#include "Common/Input/InputState.h" -#include "Common/File/Path.h" -#include "Common/Math/math_util.h" -#include "Common/Data/Text/Parsers.h" -#include "Common/Data/Encoding/Utf8.h" #include "Common/ArmEmitter.h" #include "Common/BitScan.h" @@ -659,6 +661,85 @@ static bool TestAndroidContentURI() { return true; } +class UnitTestWordWrapper : public WordWrapper { +public: + UnitTestWordWrapper(const char *str, float maxW, int flags) + : WordWrapper(str, maxW, flags) { + } + +protected: + float MeasureWidth(const char *str, size_t bytes) override { + // Simple case for unit testing. + int w = 0; + for (UTF8 utf(str); !utf.end() && utf.byteIndex() < bytes; ) { + uint32_t c = utf.next(); + switch (c) { + case ' ': + case '.': + w += 1; + break; + case 0x00AD: + // No width for soft hyphens. + break; + default: + w += 2; + break; + } + } + + return w; + } +}; + +#define EXPECT_WORDWRAP_EQ_STR(a, l, f, b) if (UnitTestWordWrapper(a, l, f).Wrapped() != b) { printf("%s: Test Fail (%d, %s)\n%s\nvs\n%s\n", __FUNCTION__, l, #f, UnitTestWordWrapper(a, l, f).Wrapped().c_str(), std::string(b).c_str()); return false; } + +static bool TestWrapText() { + // If there's enough space, it shouldn't wrap. This is exactly enough. + EXPECT_WORDWRAP_EQ_STR("Hello", 10, 0, "Hello"); + EXPECT_WORDWRAP_EQ_STR("Hello", 10, FLAG_WRAP_TEXT, "Hello"); + EXPECT_WORDWRAP_EQ_STR("Hello", 10, FLAG_ELLIPSIZE_TEXT, "Hello"); + EXPECT_WORDWRAP_EQ_STR("Hello", 10, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "Hello"); + + // Try a single word that doesn't fit in the space. + EXPECT_WORDWRAP_EQ_STR("Hello", 6, 0, "Hello"); + EXPECT_WORDWRAP_EQ_STR("Hello", 6, FLAG_WRAP_TEXT, "Hel\nlo"); + EXPECT_WORDWRAP_EQ_STR("Hello", 6, FLAG_ELLIPSIZE_TEXT, "H..."); + EXPECT_WORDWRAP_EQ_STR("Hello", 6, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "H..."); + + // Now, multiple words. + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 14, 0, "Hello goodbye"); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 14, FLAG_WRAP_TEXT, "Hello \ngoodbye"); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 14, FLAG_ELLIPSIZE_TEXT, "Hello..."); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 14, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "Hello \ngoodbye"); + + // Multiple words with something short after... + EXPECT_WORDWRAP_EQ_STR("Hello goodbye yes", 14, 0, "Hello goodbye "); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye yes", 14, FLAG_WRAP_TEXT, "Hello \ngoodbye \nyes"); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye yes", 14, FLAG_ELLIPSIZE_TEXT, "Hello..."); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye yes", 14, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "Hello \ngoodbye \nyes"); + + // Now, multiple words, but only the first fits. + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 10, 0, "Hello "); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 10, FLAG_WRAP_TEXT, "Hello \ngoodb\nye"); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 10, FLAG_ELLIPSIZE_TEXT, "Hel..."); + EXPECT_WORDWRAP_EQ_STR("Hello goodbye", 10, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "Hello \ngoo..."); + + // How about the shy character? + const std::string shyTestString = StringFromFormat("Very%c%clong", 0xC2, 0xAD); + EXPECT_WORDWRAP_EQ_STR(shyTestString.c_str(), 10, 0, shyTestString); + EXPECT_WORDWRAP_EQ_STR(shyTestString.c_str(), 10, FLAG_WRAP_TEXT, "Very-\nlong"); + EXPECT_WORDWRAP_EQ_STR(shyTestString.c_str(), 10, FLAG_ELLIPSIZE_TEXT, "Very..."); + EXPECT_WORDWRAP_EQ_STR(shyTestString.c_str(), 10, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "Very-\nlong"); + + // Newlines should not be removed and should influence wrapping. + EXPECT_WORDWRAP_EQ_STR("Hello\ngoodbye yes\nno", 14, 0, "Hello\ngoodbye "); + EXPECT_WORDWRAP_EQ_STR("Hello\ngoodbye yes\nno", 14, FLAG_WRAP_TEXT, "Hello\ngoodbye \nyes\nno"); + EXPECT_WORDWRAP_EQ_STR("Hello\ngoodbye yes\nno", 14, FLAG_ELLIPSIZE_TEXT, "Hello\ngoodb...\nno"); + EXPECT_WORDWRAP_EQ_STR("Hello\ngoodbye yes\nno", 14, FLAG_WRAP_TEXT | FLAG_ELLIPSIZE_TEXT, "Hello\ngoodbye \nyes\nno"); + + return true; +} + typedef bool (*TestFunc)(); struct TestItem { const char *name; @@ -699,6 +780,7 @@ TestItem availableTests[] = { TEST_ITEM(Path), TEST_ITEM(AndroidContentURI), TEST_ITEM(ThreadManager), + TEST_ITEM(WrapText), }; int main(int argc, const char *argv[]) {