diff --git a/CMakeLists.txt b/CMakeLists.txt index 69f1bd4fcb..dcdb2f55ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1396,10 +1396,13 @@ elseif(IOS AND NOT LIBRETRO) Common/Battery/AppleBatteryClient.m ) - list(APPEND nativeExtraLibs "-framework Foundation -framework MediaPlayer -framework AudioToolbox -framework CoreGraphics -framework CoreMotion -framework QuartzCore -framework UIKit -framework GLKit -framework OpenAL -framework AVFoundation -framework CoreLocation -framework CoreText -framework CoreVideo -framework CoreMedia -framework CoreServices -framework Metal -framework IOSurface" ) + list(APPEND nativeExtraLibs "-framework Foundation -framework MediaPlayer -framework AudioToolbox -framework CoreGraphics -framework CoreMotion -framework QuartzCore -framework UIKit -framework GLKit -framework OpenAL -framework AVFoundation -framework CoreLocation -framework CoreText -framework CoreVideo -framework CoreMedia -framework CoreServices -framework Metal -framework IOSurface -framework Photos" ) if(EXISTS "${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks/GameController.framework") list(APPEND nativeExtraLibs "-weak_framework GameController") endif() + if(EXISTS "${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks/PhotosUI.framework") + list(APPEND nativeExtraLibs "-weak_framework PhotosUI") + endif() if(NOT ICONV_LIBRARY) list(APPEND nativeExtraLibs iconv) diff --git a/Common/Data/Encoding/Utf8.cpp b/Common/Data/Encoding/Utf8.cpp index 73c48c4819..09abf6090d 100644 --- a/Common/Data/Encoding/Utf8.cpp +++ b/Common/Data/Encoding/Utf8.cpp @@ -312,14 +312,19 @@ size_t encode_utf8_modified(uint32_t code_point, unsigned char* output) { // A function to convert regular UTF-8 to Java Modified UTF-8. Only used on Android. // Written by ChatGPT and corrected and modified. void ConvertUTF8ToJavaModifiedUTF8(std::string *output, std::string_view input) { + // The overflow can't really happen on 64-bit, but let's do the check anyway. + if (input.length() > SIZE_MAX / 6) { + output->clear(); + return; + } output->resize(input.length() * 6); // worst case: every input character is encoded as 6 bytes. Can't really plausibly happen, though. size_t out_idx = 0; for (size_t i = 0; i < input.length(); ) { unsigned char c = input[i]; if (c == 0) { // Encode null character as 0xC0 0x80. TODO: We probably don't need to support this? - output[out_idx++] = (char)0xC0; - output[out_idx++] = (char)0x80; + (*output)[out_idx++] = (char)0xC0; + (*output)[out_idx++] = (char)0x80; i++; } else if ((c & 0xF0) == 0xF0) { // 4-byte sequence (U+10000 to U+10FFFF) if (i + 4 > input.length()) { diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 29c5baeeae..711e2a3fb5 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -446,8 +446,8 @@ void VulkanRenderManager::StopThreads() { // Not sure this is a sensible check - should be ok even if not. // _dbg_assert_(steps_.empty()); - if (useRenderThread_) { - _dbg_assert_(renderThread_.joinable()); + _dbg_assert_(renderThread_.joinable()); + if (useRenderThread_ && renderThread_.joinable()) { // Tell the render thread to quit when it's done. VKRRenderThreadTask *task = new VKRRenderThreadTask(VKRRunType::EXIT); task->frame = vulkan_->GetCurFrame(); @@ -470,10 +470,12 @@ void VulkanRenderManager::StopThreads() { { std::unique_lock lock(compileQueueMutex_); runCompileThread_ = false; // Compiler and present thread both look at this bool. - _assert_(compileThread_.joinable()); + _dbg_assert_(compileThread_.joinable()); compileCond_.notify_one(); } - compileThread_.join(); + if (compileThread_.joinable()) { + compileThread_.join(); + } if (presentWaitThread_.joinable()) { presentWaitThread_.join(); diff --git a/Common/Log/LogManager.cpp b/Common/Log/LogManager.cpp index dd9836100f..3c1a4b3bb6 100644 --- a/Common/Log/LogManager.cpp +++ b/Common/Log/LogManager.cpp @@ -199,13 +199,14 @@ void LogManager::SetFileLogPath(const Path &filename) { fclose(fp_); } - if (!filename.empty() && (outputs_ & LogOutput::File)) { - logFilename_ = Path(filename); + logFilename_ = Path(filename); + + if (outputs_ & LogOutput::File) { File::CreateFullPath(logFilename_.NavigateUp()); fp_ = File::OpenCFile(logFilename_, "at"); logFileOpenFailed_ = fp_ == nullptr; if (logFileOpenFailed_) { - printf("Failed to open log file %s\n", filename.c_str()); + printf("Failed to open log file %s\n", logFilename_.c_str()); } } } diff --git a/Common/UI/PopupScreens.h b/Common/UI/PopupScreens.h index 06677036e0..4a6792d037 100644 --- a/Common/UI/PopupScreens.h +++ b/Common/UI/PopupScreens.h @@ -43,7 +43,7 @@ public: notificationLevel_ = noticeLevel; notificationString_ = str; } - virtual UI::Margins RootMargins() const { return UI::Margins(12, 24); } + virtual UI::Margins RootMargins() const override { return UI::Margins(12, 24); } protected: virtual bool FillVertical() const { return false; } diff --git a/Common/UI/Root.cpp b/Common/UI/Root.cpp index e2d4e9016b..12c81db67c 100644 --- a/Common/UI/Root.cpp +++ b/Common/UI/Root.cpp @@ -19,6 +19,34 @@ bool focusForced; static std::function soundCallback; +// Repeat key handling below. +// TODO: Figure out where this should really live. +// Simple simulation of key repeat on platforms and for gamepads where we don't +// automatically get it. + +static int frameCount; + +// Ignore deviceId when checking for matches. Turns out that Ouya for example sends +// completely broken input where the original keypresses have deviceId = 10 and the repeats +// have deviceId = 0. +struct HeldKey { + InputKeyCode key; + InputDeviceID deviceId; + double triggerTime; + + // Ignores startTime + bool operator <(const HeldKey &other) const { + if (key < other.key) return true; + return false; + } + bool operator ==(const HeldKey &other) const { return key == other.key; } +}; + +static std::set heldKeys; + +const double repeatDelay = 15 * (1.0 / 60.0f); // 15 frames like before. +const double repeatInterval = 5 * (1.0 / 60.0f); // 5 frames like before. + struct DispatchQueueItem { Event *e; EventParams params; @@ -93,6 +121,8 @@ void EnableFocusMovement(bool enable) { if (focusedView) { focusedView->FocusChanged(FF_LOSTFOCUS); } + focusMoves.clear(); + heldKeys.clear(); focusedView = nullptr; } } @@ -145,33 +175,6 @@ void PlayUISound(UISound sound) { } } -// TODO: Figure out where this should really live. -// Simple simulation of key repeat on platforms and for gamepads where we don't -// automatically get it. - -static int frameCount; - -// Ignore deviceId when checking for matches. Turns out that Ouya for example sends -// completely broken input where the original keypresses have deviceId = 10 and the repeats -// have deviceId = 0. -struct HeldKey { - InputKeyCode key; - InputDeviceID deviceId; - double triggerTime; - - // Ignores startTime - bool operator <(const HeldKey &other) const { - if (key < other.key) return true; - return false; - } - bool operator ==(const HeldKey &other) const { return key == other.key; } -}; - -static std::set heldKeys; - -const double repeatDelay = 15 * (1.0 / 60.0f); // 15 frames like before. -const double repeatInterval = 5 * (1.0 / 60.0f); // 5 frames like before. - bool IsScrollKey(const KeyInput &input) { switch (input.keyCode) { case NKCODE_PAGE_UP: diff --git a/Common/UI/View.h b/Common/UI/View.h index 00b6ce5978..b9ccd91fd5 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -835,7 +835,7 @@ public: rightText_ = text; } protected: - void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const; + void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const override; private: std::string text_; @@ -1085,7 +1085,7 @@ class ClickableTextView : public TextView { public: ClickableTextView(std::string_view text, LayoutParams *layoutParams = 0) : TextView(text, layoutParams) {} - bool Touch(const TouchInput &input); + bool Touch(const TouchInput &input) override; Event OnClick; private: diff --git a/Core/CwCheat.cpp b/Core/CwCheat.cpp index 6b04c46b82..81beacd036 100644 --- a/Core/CwCheat.cpp +++ b/Core/CwCheat.cpp @@ -1064,6 +1064,8 @@ void CWCheatEngine::ExecuteOp(const CheatOperation &op, const CheatCode &cheat, if ((line.part1 >> 28) == 0x3) { walkOffset = -walkOffset; } + // TODO: I've seen crashes here. Presumably an unaligned pointer just off the edge of memory. + // We should probably check pointer validity and invalidate the cheat if this happens. base = Memory::Read_U32(base + walkOffset); switch (line.part2 >> 28) { case 0x2: diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index b0891ea50f..5fbcf4543e 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -430,19 +430,21 @@ static void DoFrameTiming(bool throttle, bool *skipFrame, float scaledTimestep, } // Auto-frameskip automatically if speed limit is set differently than the default. - const int frameSkipNum = g_Config.iFrameSkip; if (autoFrameSkip) { // autoframeskip // Argh, we are falling behind! Let's skip a frame and see if we catch up. if (curFrameTime > nextFrameTime && doFrameSkip) { *skipFrame = true; } - } else if (frameSkipNum >= 1) { - // fixed frameskip - if (numSkippedFrames >= frameSkipNum) - *skipFrame = false; - else - *skipFrame = true; + } else { + const int frameSkipNum = g_Config.iFrameSkip; + if (frameSkipNum >= 1) { + // fixed frameskip + if (numSkippedFrames >= frameSkipNum) + *skipFrame = false; + else + *skipFrame = true; + } } if (curFrameTime < nextFrameTime && throttle) { diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 82f7b989f8..c81607eba7 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -1096,8 +1096,8 @@ static PSPModule *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 load // In this case it's definitely not compressed. Added assert below. } - // Don't accept ELFs over 24MB. - if (decryptedSize > 24 * 1024 * 1024) { + // Don't accept ELFs over 24MB - nor ones with negative size, of course. + if (decryptedSize < 0 || decryptedSize > 24 * 1024 * 1024) { *error_string = StringFromFormat("ELF/PRX corrupt, unreasonable decrypted size: %d", (u32)decryptedSize); // TODO: Might be the wrong error code. error = SCE_KERNEL_ERROR_FILEERR; @@ -1110,7 +1110,7 @@ static PSPModule *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 load // Can't decompress in place so we need a temporary buffer. u8 *temp = (u8 *)malloc(decryptedSize); - _assert_msg_(temp != nullptr, "Failed to allocate gzip decompression buffer"); + _assert_msg_(temp != nullptr, "Failed to allocate gzip decompression buffer (decryptedSize: %d)", decryptedSize); memcpy(temp, ptr, decryptedSize); int outBytes = gzipDecompress((u8 *)ptr, maxElfSize, temp); if (outBytes < 0) { diff --git a/Core/HLE/sceNetInet.cpp b/Core/HLE/sceNetInet.cpp index aa8431742e..83683c7c94 100644 --- a/Core/HLE/sceNetInet.cpp +++ b/Core/HLE/sceNetInet.cpp @@ -252,6 +252,10 @@ int sceNetInetSelect(int nfds, u32 readfdsPtr, u32 writefdsPtr, u32 exceptfdsPtr if (readfds && (NetInetFD_ISSET(i, readfds))) { SOCKET sock = g_socketManager.GetHostSocketFromInetSocket(i); _dbg_assert_(sock != 0); + if (sock < 0) { + ERROR_LOG(Log::sceNet, "Bad socket #%d in readfds", i); + continue; + } hostSockets[i] = sock; if (sock > maxHostSocket) maxHostSocket = sock; @@ -266,6 +270,10 @@ int sceNetInetSelect(int nfds, u32 readfdsPtr, u32 writefdsPtr, u32 exceptfdsPtr if (writefds && (NetInetFD_ISSET(i, writefds))) { SOCKET sock = g_socketManager.GetHostSocketFromInetSocket(i); _dbg_assert_(sock != 0); + if (sock < 0) { + ERROR_LOG(Log::sceNet, "Bad socket #%d in writefds", i); + continue; + } hostSockets[i] = sock; if (sock > maxHostSocket) maxHostSocket = sock; @@ -280,6 +288,10 @@ int sceNetInetSelect(int nfds, u32 readfdsPtr, u32 writefdsPtr, u32 exceptfdsPtr if (exceptfds && (NetInetFD_ISSET(i, exceptfds))) { SOCKET sock = g_socketManager.GetHostSocketFromInetSocket(i); _dbg_assert_(sock != 0); + if (sock < 0) { + ERROR_LOG(Log::sceNet, "Bad socket #%d in exceptfds", i); + continue; + } hostSockets[i] = sock; if (sock > maxHostSocket) maxHostSocket = sock; diff --git a/Core/HW/Display.cpp b/Core/HW/Display.cpp index 1a4911ec68..888f4a2df0 100644 --- a/Core/HW/Display.cpp +++ b/Core/HW/Display.cpp @@ -299,6 +299,7 @@ void __DisplayForgetFlip(FlipCallback callback, void *userdata) { // This is called when launching a new executable. We do clear vblankListeners here, they will get // set up again if needed. However we can't clear fliplisteners, that is used for RetroAchievements updates. void DisplayHWReset() { + std::lock_guard guard(listenersLock); vblankListeners.clear(); } diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp index 52c6afaa01..288ec7c679 100644 --- a/Core/KeyMapDefaults.cpp +++ b/Core/KeyMapDefaults.cpp @@ -277,7 +277,6 @@ static const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, - {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBL}, {VIRTKEY_PAUSE , NKCODE_BUTTON_SELECT }, {VIRTKEY_PAUSE , NKCODE_BUTTON_L2 }, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index c07abf7ad0..db8ac6b5a6 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -37,6 +37,33 @@ static std::vector shaderInfo; // Okay, not really "post" shaders, but related. static std::vector textureShaderInfo; +static Draw::GPUVendor VendorFromString(const std::string &vendor) { + Draw::GPUVendor::VENDOR_UNKNOWN; + // TODO: This should probably be a function somewhere. + if (vendor == "ARM") { + return Draw::GPUVendor::VENDOR_ARM; + } else if (vendor == "Qualcomm") { + return Draw::GPUVendor::VENDOR_QUALCOMM; + } else if (vendor == "IMGTEC") { + return Draw::GPUVendor::VENDOR_IMGTEC; + } else if (vendor == "NVIDIA") { + return Draw::GPUVendor::VENDOR_NVIDIA; + } else if (vendor == "AMD") { + return Draw::GPUVendor::VENDOR_AMD; + } else if (vendor == "Broadcom") { + return Draw::GPUVendor::VENDOR_BROADCOM; + } else if (vendor == "Apple") { + return Draw::GPUVendor::VENDOR_APPLE; + } else if (vendor == "Intel") { + return Draw::GPUVendor::VENDOR_INTEL; + } else if (vendor == "Mesa") { + return Draw::GPUVendor::VENDOR_MESA; + } else if (vendor == "Vivante") { + return Draw::GPUVendor::VENDOR_VIVANTE; + } + return Draw::GPUVendor::VENDOR_UNKNOWN; +} + // Scans the directories for shader ini files and collects info about all the shaders found. void LoadPostShaderInfo(Draw::DrawContext *draw, const std::vector &directories) { @@ -106,33 +133,12 @@ void LoadPostShaderInfo(Draw::DrawContext *draw, const std::vector &direct 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; - } else if (item == "Mesa") { - blacklistedVendor = Draw::GPUVendor::VENDOR_MESA; - } + const Draw::GPUVendor blacklistedVendor = VendorFromString(item); if (blacklistedVendor == gpuVendor && blacklistedVendor != Draw::GPUVendor::VENDOR_UNKNOWN) { skipped = true; break; } } - if (skipped) { continue; } diff --git a/README.md b/README.md index d40d30d860..a4429d5418 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,18 @@ To download fresh development builds for Android, Windows and Mac, [go to the /d For game compatibility, see [community compatibility feedback](https://report.ppsspp.org/games). +What's new in 1.20.3 +-------------------- + +- Fix issue preventing ad hoc relay servers from working when RetroAchievements are enabled on Windows ([#21420]) +- Fix crash/failure setting the background on iOS ([#21409]) +- Fix logging to file ([#21412]) +- Networking settings cleanup ([#21418]) +- Some fixes for assorted rare crashes ([#21422]) +- Fix issues when unpausing using a controller binding ([#21424]), DualSense Edge detection on Windows ([#21426]) +- Fix missing savestate undo button ([#21425]) +- MMPX texture upscaling algorithm has been restored, the new one has been improved ([#21376]) and renamed MMPX Advanced ([#21421]) + What's new in 1.20.2 -------------------- @@ -32,7 +44,7 @@ What's new in 1.20.2 - Fix broken multitouch on iOS with OpenGL ([#21350]) - Ad hoc relay connection improvements ([#21352]) - Fix a lot of minor UI issues ([#21400], [#21362]) -- Fix background image selection on Android and iOS ([#21345], [#21384], [#21371]) +- Fix background image selection on Android ~~and iOS~~ ([#21345], [#21384], [#21371]) - Fix file permission issue on iOS ([#21374]) - Add a "hold" version of axis swap toggle ([#21357]) - Fix regression in Gripshift ([#21377]) @@ -104,6 +116,8 @@ What's new in 1.20 - Linux - Loongarch improvements by KatyushaScarlet ([#20683], [#20644], [#20599], [#20594]), text rendering improvements ([#21163]) - SDL fullscreen problems fixed ([#21300], more) + - UWP + - Migrate code base to C++/WinRT ([#21100]) - Debugger - ImDebugger improvements ([#20861], [#20779], [#20657], [#20637], [#20550], [#20523]) @@ -431,4 +445,15 @@ See [history.md](history.md). [#21357]: https://github.com/hrydgard/ppsspp/issues/21357 "Add a \"hold\" version of the axis swap toggle. Often more convenient." [#21377]: https://github.com/hrydgard/ppsspp/issues/21377 "Windows audio fix, Gripshift glitch workaround" [#21341]: https://github.com/hrydgard/ppsspp/issues/21341 "Fix crash on audio device switch in Windows" -[#21393]: https://github.com/hrydgard/ppsspp/issues/21393 "Windows input optimizations" \ No newline at end of file +[#21393]: https://github.com/hrydgard/ppsspp/issues/21393 "Windows input optimizations" +[#21100]: https://github.com/hrydgard/ppsspp/issues/21100 "UWP: Migrate from C++/CX to C++/WinRT" +[#21420]: https://github.com/hrydgard/ppsspp/issues/21420 "Misc: Update aemu_postoffice, add confirmation dialog when creating game configs" +[#21409]: https://github.com/hrydgard/ppsspp/issues/21409 "Image picker on iOS: Fix crash, use a newer method that opens a lot quicker" +[#21412]: https://github.com/hrydgard/ppsspp/issues/21412 "Fix logging to file, assorted minor fixes" +[#21418]: https://github.com/hrydgard/ppsspp/issues/21418 "Networking settings: Some reordering and naming cleanup, link to quickstart guide" +[#21422]: https://github.com/hrydgard/ppsspp/issues/21422 "Fixes for some rarer crashes from Play reports" +[#21424]: https://github.com/hrydgard/ppsspp/issues/21424 "Fix control input issues when toggling the pause menu using a controller" +[#21425]: https://github.com/hrydgard/ppsspp/issues/21425 "Fix accidentally missing undo button on the savestate popup." +[#21376]: https://github.com/hrydgard/ppsspp/issues/21376 "enhance MMPX algorithm bug fixes and logic optimizations" +[#21421]: https://github.com/hrydgard/ppsspp/issues/21421 "Split MMPX texture upscaling shader into regular and advanced" +[#21426]: https://github.com/hrydgard/ppsspp/issues/21426 "Add detection of Dualsense Edge controllers on Windows, update README.md" \ No newline at end of file diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock index 7f56fe5cd1..99a7c1c588 100644 --- a/Tools/langtool/Cargo.lock +++ b/Tools/langtool/Cargo.lock @@ -1090,9 +1090,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "aws-lc-rs", "bytes", diff --git a/UI/DebugOverlay.cpp b/UI/DebugOverlay.cpp index 8a4e9e9ff3..2804fef75a 100644 --- a/UI/DebugOverlay.cpp +++ b/UI/DebugOverlay.cpp @@ -140,7 +140,7 @@ static void DrawFrameTiming(UIContext *ctx, const Bounds &bounds) { // NOTE: This is not necessarily the same as the actual present mode. snprintf(statBuf, sizeof(statBuf), - "Presentation mode: %s Needs skip: %s\n" + "Presentation mode: %s Needs skip for ff: %s\n" "Actual presentation mode: %s", Draw::PresentModeToString(g_frameTiming.PresentMode()), g_frameTiming.FastForwardNeedsSkipFlip() ? "true" : "false", diff --git a/UI/DeveloperToolsScreen.cpp b/UI/DeveloperToolsScreen.cpp index ebfa18baba..8bba489edc 100644 --- a/UI/DeveloperToolsScreen.cpp +++ b/UI/DeveloperToolsScreen.cpp @@ -166,6 +166,20 @@ void DeveloperToolsScreen::CreateGeneralTab(UI::LinearLayout *list) { screenManager()->push(new LogConfigScreen()); }); list->Add(new CheckBox(&g_Config.bEnableFileLogging, dev->T("Log to file")))->SetEnabledPtr(&g_Config.bEnableLogging); + if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_DESKTOP) { + list->Add(new Choice(dev->T("Show log file in folder")))->OnClick.Add([](UI::EventParams &e) { + Path logFilePath = g_logManager.GetLogFilePath(); + if (logFilePath.empty()) { + ERROR_LOG(Log::System, "No log file path configured."); + return; + } + if (File::Exists(logFilePath)) { + System_ShowFileInFolder(logFilePath); + } else { + System_LaunchUrl(LaunchUrlType::LOCAL_FILE, logFilePath.NavigateUp().ToString()); + } + }); + } list->Add(new CheckBox(&g_Config.bLogFrameDrops, dev->T("Log Dropped Frame Statistics"))); if (GetGPUBackend() == GPUBackend::VULKAN) { list->Add(new CheckBox(&g_Config.bGpuLogProfiler, dev->T("GPU log profiler"))); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index edfe4b41aa..e746cd132a 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -481,7 +481,7 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) graphicsSettings->Add(new ItemHeader(gr->T("Speed Hacks", "Speed Hacks (can cause rendering errors!)"))); CheckBox *skipBufferEffects = graphicsSettings->Add(new CheckBox(&g_Config.bSkipBufferEffects, gr->T("Skip Buffer Effects"))); - graphicsSettings->Add(new SettingHint(gr->T("RenderingMode NonBuffered Tip", "Faster, but graphics may be missing in some games"))); + graphicsSettings->Add(new SettingHint(gr->T("RenderingMode NonBuffered Tip", "Faster, but graphics may be missing in some games"), skipBufferEffects)); skipBufferEffects->OnClick.Add([=](EventParams &e) { if (g_Config.bSkipBufferEffects) { g_Config.bAutoFrameSkip = false; @@ -511,32 +511,32 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) CheckBox *texBackoff = graphicsSettings->Add(new CheckBox(&g_Config.bTextureBackoffCache, gr->T("Lazy texture caching", "Lazy texture caching (speedup)"))); texBackoff->SetDisabledPtr(&g_Config.bSoftwareRendering); - graphicsSettings->Add(new SettingHint(gr->T("Lazy texture caching Tip", "Faster, but can cause text problems in a few games"))); + graphicsSettings->Add(new SettingHint(gr->T("Lazy texture caching Tip", "Faster, but can cause text problems in a few games"), texBackoff)); static const char *quality[] = { "Low", "Medium", "High" }; PopupMultiChoice *bezierQuality = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iSplineBezierQuality, gr->T("LowCurves", "Spline/Bezier curves quality"), quality, 0, ARRAY_SIZE(quality), I18NCat::GRAPHICS, screenManager())); bezierQuality->SetDefault(2); - graphicsSettings->Add(new SettingHint(gr->T("LowCurves Tip", "Only used by some games, controls smoothness of curves"))); + graphicsSettings->Add(new SettingHint(gr->T("LowCurves Tip", "Only used by some games, controls smoothness of curves"), bezierQuality)); static const char *bloomHackOptions[] = {"Off", "Safe", "Balanced", "Aggressive"}; PopupMultiChoice *bloomHack = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iBloomHack, gr->T("Lower resolution for effects"), bloomHackOptions, 0, ARRAY_SIZE(bloomHackOptions), I18NCat::GRAPHICS, screenManager())); bloomHack->SetEnabledFunc([] { return !g_Config.bSoftwareRendering && g_Config.iInternalResolution != 1; }); - graphicsSettings->Add(new SettingHint(gr->T("Reduces artifacts"))); + graphicsSettings->Add(new SettingHint(gr->T("Reduces artifacts"), bloomHack)); graphicsSettings->Add(new ItemHeader(gr->T("Performance"))); CheckBox *frameDuplication = graphicsSettings->Add(new CheckBox(&g_Config.bRenderDuplicateFrames, gr->T("Render duplicate frames to 60hz"))); frameDuplication->SetEnabledFunc([] { return !g_Config.bSkipBufferEffects && g_Config.iFrameSkip == 0; }); - graphicsSettings->Add(new SettingHint(gr->T("RenderDuplicateFrames Tip", "Can make framerate smoother in games that run at lower framerates"))); + graphicsSettings->Add(new SettingHint(gr->T("RenderDuplicateFrames Tip", "Can make framerate smoother in games that run at lower framerates"), frameDuplication)); if (draw->GetDeviceCaps().setMaxFrameLatencySupported) { static const char *bufferOptions[] = { "No buffer", "Up to 1", "Up to 2" }; PopupMultiChoice *inflightChoice = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iInflightFrames, gr->T("Buffer graphics commands"), bufferOptions, 1, ARRAY_SIZE(bufferOptions), I18NCat::GRAPHICS, screenManager())); inflightChoice->OnChoice.Handle(this, &GameSettingsScreen::OnInflightFramesChoice); - graphicsSettings->Add(new SettingHint(gr->T("Faster, input lag"))); // TODO: This hint could use improvement. + graphicsSettings->Add(new SettingHint(gr->T("Faster, input lag"), inflightChoice)); // TODO: This hint could use improvement. } if (GetGPUBackend() == GPUBackend::VULKAN) { @@ -555,14 +555,14 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) CheckBox *swSkin = graphicsSettings->Add(new CheckBox(&g_Config.bSoftwareSkinning, gr->T("Software Skinning"))); swSkin->SetDisabledPtr(&g_Config.bSoftwareRendering); - graphicsSettings->Add(new SettingHint(gr->T("SoftwareSkinning Tip", "Combine skinned model draws on the CPU, faster in most games"))); + graphicsSettings->Add(new SettingHint(gr->T("SoftwareSkinning Tip", "Combine skinned model draws on the CPU, faster in most games"), swSkin)); if (DoesBackendSupportHWTess()) { CheckBox *tessellationHW = graphicsSettings->Add(new CheckBox(&g_Config.bHardwareTessellation, gr->T("Hardware Tessellation"))); tessellationHW->SetEnabledFunc([]() { return !g_Config.bSoftwareRendering && g_Config.bHardwareTransform; }); - graphicsSettings->Add(new SettingHint(gr->T("HardwareTessellation Tip", "Uses hardware to make curves"))); + graphicsSettings->Add(new SettingHint(gr->T("HardwareTessellation Tip", "Uses hardware to make curves"), tessellationHW)); } graphicsSettings->Add(new ItemHeader(gr->T("Texture upscaling"))); @@ -601,7 +601,7 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) texScalingChoice->HideChoice(3); // 3x texScalingChoice->HideChoice(5); // 5x } - graphicsSettings->Add(new SettingHint(gr->T("UpscaleLevel Tip", "CPU heavy - some scaling may be delayed to avoid stutter"))); + graphicsSettings->Add(new SettingHint(gr->T("UpscaleLevel Tip", "CPU heavy - some scaling may be delayed to avoid stutter"), texScalingChoice)); texScalingChoice->SetEnabledFunc([]() { return !g_Config.bSoftwareRendering && !UsingHardwareTextureScaling(); @@ -611,7 +611,7 @@ void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) deposterize->SetEnabledFunc([]() { return !g_Config.bSoftwareRendering && !UsingHardwareTextureScaling(); }); - graphicsSettings->Add(new SettingHint(gr->T("Deposterize Tip", "Fixes visual banding glitches in upscaled textures"))); + graphicsSettings->Add(new SettingHint(gr->T("Deposterize Tip", "Fixes visual banding glitches in upscaled textures"), deposterize)); graphicsSettings->Add(new ItemHeader(gr->T("Texture Filtering"))); static const char *anisoLevels[] = { "Off", "2x", "4x", "8x", "16x" }; @@ -747,7 +747,7 @@ void GameSettingsScreen::CreateAudioSettings(UI::ViewGroup *audioSettings) { static const int bufferSizes[] = {128, 256, 512, 1024, 2048}; PopupSliderChoice *bufferSize = audioSettings->Add(new PopupSliderChoice(&g_Config.iSDLAudioBufferSize, 0, 2048, 256, a->T("Buffer size"), screenManager())); bufferSize->RestrictChoices(bufferSizes, ARRAY_SIZE(bufferSizes)); - audioSettings->Add(new SettingHint(di->T("This change will not take effect until PPSSPP is restarted."))); + audioSettings->Add(new SettingHint(di->T("This change will not take effect until PPSSPP is restarted."), bufferSize)); #endif #if PPSSPP_PLATFORM(WINDOWS) @@ -809,7 +809,9 @@ void GameSettingsScreen::CreateAudioSettings(UI::ViewGroup *audioSettings) { if (!micList.empty()) { audioSettings->Add(new ItemHeader(a->T("Microphone"))); PopupMultiChoiceDynamic *MicChoice = audioSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sMicDevice, a->T("Microphone Device"), micList, I18NCat::NONE, screenManager())); - MicChoice->OnChoice.Handle(this, &GameSettingsScreen::OnMicDeviceChange); + MicChoice->OnChoice.Add([](UI::EventParams &e) { + Microphone::onMicDeviceChange(); + }); } } @@ -899,7 +901,7 @@ void GameSettingsScreen::CreateControlsSettings(UI::ViewGroup *controlsSettings) // Sticky D-pad. CheckBox *stickyDpad = controlsSettings->Add(new CheckBox(&g_Config.bStickyTouchDPad, co->T("Sticky D-Pad"))); stickyDpad->SetEnabledPtr(&g_Config.bShowTouchControls); - controlsSettings->Add(new SettingHint(co->T("Easier sweeping movements"))); + controlsSettings->Add(new SettingHint(co->T("Easier sweeping movements"), stickyDpad)); // Re-centers itself to the touch location on touch-down. CheckBox *floatingAnalog = controlsSettings->Add(new CheckBox(&g_Config.bAutoCenterTouchAnalog, co->T("Auto-centering analog stick"))); @@ -920,9 +922,9 @@ void GameSettingsScreen::CreateControlsSettings(UI::ViewGroup *controlsSettings) #if defined(USING_WIN_UI) controlsSettings->Add(new CheckBox(&g_Config.bIgnoreWindowsKey, co->T("Ignore Windows Key"))); #endif // #if defined(USING_WIN_UI) - auto analogLimiter = new PopupSliderChoiceFloat(&g_Config.fAnalogLimiterDeadzone, 0.0f, 1.0f, 0.6f, co->T("Analog Limiter"), 0.10f, screenManager(), "/ 1.0"); + PopupSliderChoiceFloat *analogLimiter = new PopupSliderChoiceFloat(&g_Config.fAnalogLimiterDeadzone, 0.0f, 1.0f, 0.6f, co->T("Analog Limiter"), 0.10f, screenManager(), "/ 1.0"); controlsSettings->Add(analogLimiter); - controlsSettings->Add(new SettingHint(co->T("AnalogLimiter Tip", "When the analog limiter button is pressed"))); + controlsSettings->Add(new SettingHint(co->T("AnalogLimiter Tip", "When the analog limiter button is pressed"), analogLimiter)); controlsSettings->Add(new PopupSliderChoice(&g_Config.iRapidFireInterval, 1, 10, 5, co->T("Rapid fire interval"), screenManager(), "frames")); #if defined(USING_WIN_UI) || defined(SDL) || PPSSPP_PLATFORM(ANDROID) bool enableMouseSettings = true; @@ -941,7 +943,7 @@ void GameSettingsScreen::CreateControlsSettings(UI::ViewGroup *controlsSettings) wheelUpDelaySlider->SetFormat(di->T("%d ms")); CheckBox *mouseControl = controlsSettings->Add(new CheckBox(&g_Config.bMouseControl, co->T("Use Mouse Control"))); - controlsSettings->Add(new SettingHint(co->T("MouseControl Tip", "You can now map mouse in control mapping screen by pressing the 'M' icon."))); + controlsSettings->Add(new SettingHint(co->T("MouseControl Tip", "You can now map mouse in control mapping screen by pressing the 'M' icon."), mouseControl)); #if !PPSSPP_PLATFORM(ANDROID) controlsSettings->Add(new CheckBox(&g_Config.bMouseConfine, co->T("Confine Mouse", "Trap mouse within window/display area")))->SetEnabledPtr(&g_Config.bMouseControl); @@ -1009,17 +1011,15 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti networkingSettings->Add(new ItemHeader(ms->T("Networking"))); - Choice *wiki = networkingSettings->Add(new Choice(n->T("Open PPSSPP Multiplayer Wiki Page"), ImageID("I_LINK_OUT"))); - wiki->OnClick.Handle(this, &GameSettingsScreen::OnAdhocGuides); + Choice *quickstart = networkingSettings->Add(new Choice(n->T("Quick start guide for multiplayer"), ImageID("I_LINK_OUT"))); + quickstart->OnClick.Add([](EventParams &e) { + auto n = GetI18NCategory(I18NCat::NETWORKING); + std::string url(n->T("MultiplayerQuickStartURL", "https://www.ppsspp.org/docs/multiplayer/quickstart/")); + System_LaunchUrl(LaunchUrlType::BROWSER_URL, url); + }); networkingSettings->Add(new CheckBox(&g_Config.bEnableWlan, n->T("Enable networking", "Enable networking/wlan (beta)"))); - networkingSettings->Add(new MacAddressChooser(GetRequesterToken(), gamePath_, &g_Config.sMACAddress, n->T("Change Mac Address"), screenManager())); - static const char *wlanChannels[] = { "Auto", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" }; - auto wlanChannelChoice = networkingSettings->Add(new PopupMultiChoice(&g_Config.iWlanAdhocChannel, n->T("WLAN Channel"), wlanChannels, 0, ARRAY_SIZE(wlanChannels), I18NCat::NETWORKING, screenManager())); - for (int i = 0; i < 4; i++) { - wlanChannelChoice->HideChoice(i + 2); - wlanChannelChoice->HideChoice(i + 7); - } + networkingSettings->Add(new MacAddressChooser(GetRequesterToken(), gamePath_, &g_Config.sMACAddress, n->T("MAC address"), screenManager())); networkingSettings->Add(new ItemHeader(n->T("Ad Hoc multiplayer"))); @@ -1030,11 +1030,11 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti static const char *relayModes[] = {"Auto", "Yes", "No"}; PopupMultiChoice *relayModePopup = networkingSettings->Add(new PopupMultiChoice(&g_Config.iAdhocServerRelayMode, n->T("Try to use server-provided packet relay"), relayModes, 0, ARRAY_SIZE(relayModes), I18NCat::DIALOG, screenManager())); relayModePopup->SetEnabled(!PSP_IsInited()); - networkingSettings->Add(new SettingHint(n->T("PacketRelayHint", "Available on servers that provide 'aemu_postoffice' packet relay, like socom.cc. Disable this for LAN or VPN play. Can be more reliable, but sometimes slower."))); + networkingSettings->Add(new SettingHint(n->T("PacketRelayHint", "Available on servers that provide 'aemu_postoffice' packet relay, like socom.cc. Disable this for LAN or VPN play. Can be more reliable, but sometimes slower."), relayModePopup)); networkingSettings->Add(new PopupTextInputChoice(GetRequesterToken(), &g_Config.sNickName, sy->T("Change Nickname"), "", 32, screenManager())); - networkingSettings->Add(new CheckBox(&g_Config.bEnableAdhocServer, n->T("Enable built-in PRO Adhoc Server", "Enable built-in PRO Adhoc Server"))); + networkingSettings->Add(new CheckBox(&g_Config.bEnableAdhocServer, n->T("Enable built-in ad hoc server"))); networkingSettings->Add(new ItemHeader(n->T("Infrastructure"))); if (g_Config.sInfrastructureUsername.empty()) { @@ -1052,8 +1052,8 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti networkingSettings->Add(new ItemHeader(n->T("UPnP (port-forwarding)"))); networkingSettings->Add(new CheckBox(&g_Config.bEnableUPnP, n->T("Enable UPnP", "Enable UPnP (need a few seconds to detect)"))); - auto useOriPort = networkingSettings->Add(new CheckBox(&g_Config.bUPnPUseOriginalPort, n->T("UPnP use original port", "UPnP use original port (Enabled = PSP compatibility)"))); - networkingSettings->Add(new SettingHint(n->T("UseOriginalPort Tip", "May not work for all devices or games, see wiki."))); + auto *useOriPort = networkingSettings->Add(new CheckBox(&g_Config.bUPnPUseOriginalPort, n->T("UPnP use original port", "UPnP use original port (Enabled = PSP compatibility)"))); + networkingSettings->Add(new SettingHint(n->T("UseOriginalPort Tip", "May not work for all devices or games, see wiki."), useOriPort)); useOriPort->SetEnabledPtr(&g_Config.bEnableUPnP); @@ -1109,7 +1109,20 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti #endif networkingSettings->Add(new ItemHeader(n->T("Misc", "Misc (default = compatibility)"))); - networkingSettings->Add(new PopupSliderChoice(&g_Config.iPortOffset, 0, 60000, 10000, n->T("Port offset", "Port offset (0 = PSP compatibility)"), 100, screenManager())); + Choice *wiki = networkingSettings->Add(new Choice(n->T("Open PPSSPP Multiplayer Wiki Page"), ImageID("I_LINK_OUT"))); + wiki->OnClick.Add([](EventParams &e) { + auto n = GetI18NCategory(I18NCat::NETWORKING); + std::string url(n->T("MultiplayerHowToURL", "https://github.com/hrydgard/ppsspp/wiki/How-to-play-multiplayer-games-with-PPSSPP")); + System_LaunchUrl(LaunchUrlType::BROWSER_URL, url); + }); + static const char *wlanChannels[] = {"Auto", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}; + auto wlanChannelChoice = networkingSettings->Add(new PopupMultiChoice(&g_Config.iWlanAdhocChannel, n->T("WLAN Channel"), wlanChannels, 0, ARRAY_SIZE(wlanChannels), I18NCat::NETWORKING, screenManager())); + for (int i = 0; i < 4; i++) { + wlanChannelChoice->HideChoice(i + 2); + wlanChannelChoice->HideChoice(i + 7); + } + PopupSliderChoice *portOffset = networkingSettings->Add(new PopupSliderChoice(&g_Config.iPortOffset, 0, 60000, 10000, n->T("Port offset"), 100, screenManager())); + networkingSettings->Add(new SettingHint(n->T("PortOffsetHint"), portOffset)); networkingSettings->Add(new PopupSliderChoice(&g_Config.iMinTimeout, 0, 15000, 0, n->T("Minimum Timeout", "Minimum Timeout (override in ms, 0 = default)"), 50, screenManager()))->SetFormat(di->T("%d ms")); networkingSettings->Add(new CheckBox(&g_Config.bForcedFirstConnect, n->T("Forced First Connect", "Forced First Connect (faster Connect)"))); networkingSettings->Add(new CheckBox(&g_Config.bAllowSpeedControlWhileConnected, n->T("Allow speed control while connected (not recommended)"))); @@ -1440,7 +1453,9 @@ void GameSettingsScreen::CreateSystemSettings(UI::ViewGroup *systemSettings) { if (cameraList.size() >= 1) { systemSettings->Add(new ItemHeader(gr->T("Camera"))); PopupMultiChoiceDynamic *cameraChoice = systemSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sCameraDevice, gr->T("Camera Device"), cameraList, I18NCat::NONE, screenManager())); - cameraChoice->OnChoice.Handle(this, &GameSettingsScreen::OnCameraDeviceChange); + cameraChoice->OnChoice.Add([](UI::EventParams &e) { + Camera::onCameraDeviceChange(); + }); #if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) systemSettings->Add(new CheckBox(&g_Config.bCameraMirrorHorizontal, gr->T("Mirror camera image"))); #endif @@ -1516,12 +1531,6 @@ void GameSettingsScreen::CreateVRSettings(UI::ViewGroup *vrSettings) { vrSettings->Add(new CheckBox(&g_Config.bManualForceVR, vr->T("Manual switching between flat screen and VR using SCREEN key"))); } -void GameSettingsScreen::OnAdhocGuides(UI::EventParams &e) { - auto n = GetI18NCategory(I18NCat::NETWORKING); - std::string url(n->T("MultiplayerHowToURL", "https://github.com/hrydgard/ppsspp/wiki/How-to-play-multiplayer-games-with-PPSSPP")); - System_LaunchUrl(LaunchUrlType::BROWSER_URL, url.c_str()); -} - void GameSettingsScreen::OnImmersiveModeChange(UI::EventParams &e) { System_Notify(SystemNotification::IMMERSIVE_MODE_CHANGE); if (g_Config.iAndroidHwScale != 0) { @@ -1785,14 +1794,6 @@ void GameSettingsScreen::OnInflightFramesChoice(UI::EventParams &e) { } } -void GameSettingsScreen::OnCameraDeviceChange(UI::EventParams& e) { - Camera::onCameraDeviceChange(); -} - -void GameSettingsScreen::OnMicDeviceChange(UI::EventParams& e) { - Microphone::onMicDeviceChange(); -} - void GameSettingsScreen::OnAudioDevice(UI::EventParams &e) { auto a = GetI18NCategory(I18NCat::AUDIO); if (g_Config.sAudioDevice == a->T("Auto")) { diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 001949107e..0ffee0f0ce 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -81,8 +81,6 @@ private: void OnRenderingBackend(UI::EventParams &e); void OnRenderingDevice(UI::EventParams &e); void OnInflightFramesChoice(UI::EventParams &e); - void OnCameraDeviceChange(UI::EventParams& e); - void OnMicDeviceChange(UI::EventParams& e); void OnAudioDevice(UI::EventParams &e); void OnJitAffectingSetting(UI::EventParams &e); void OnShowMemstickScreen(UI::EventParams &e); @@ -93,8 +91,6 @@ private: void OnImmersiveModeChange(UI::EventParams &e); void OnSustainedPerformanceModeChange(UI::EventParams &e); - void OnAdhocGuides(UI::EventParams &e); - void TriggerRestartOrDo(std::function callback); // Temporaries to convert setting types, cache enabled, etc. diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 7238043aed..e9fed96d57 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1459,18 +1459,19 @@ void MainScreen::CreateViews() { LinearLayout *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); rightColumnItems->SetSpacing(0.0f); ViewGroup *logo = new LogoView(false, new LinearLayoutParams(FILL_PARENT, 80.0f)); -#if !defined(MOBILE_DEVICE) - auto gr = GetI18NCategory(I18NCat::GRAPHICS); - Button *fullscreenButton = logo->Add(new Button("", ImageID(), new AnchorLayoutParams(48, 48, NONE, 0, 0, NONE, Centering::None))); - fullscreenButton->SetIgnoreText(true); - fullscreenButton->OnClick.Add([](UI::EventParams &e) { - g_Config.bFullScreen = !g_Config.bFullScreen; - System_ApplyFullscreenState(); - }); - fullscreenButton->SetImageIDFunc([]() { - return g_Config.bFullScreen ? ImageID("I_RESTORE") : ImageID("I_FULLSCREEN"); - }); -#endif + + if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_DESKTOP) { + auto gr = GetI18NCategory(I18NCat::GRAPHICS); + Button *fullscreenButton = logo->Add(new Button("", ImageID(), new AnchorLayoutParams(48, 48, NONE, 0, 0, NONE, Centering::None))); + fullscreenButton->SetIgnoreText(true); + fullscreenButton->OnClick.Add([](UI::EventParams &e) { + g_Config.bFullScreen = !g_Config.bFullScreen; + System_ApplyFullscreenState(); + }); + fullscreenButton->SetImageIDFunc([]() { + return g_Config.bFullScreen ? ImageID("I_RESTORE") : ImageID("I_FULLSCREEN"); + }); + } rightColumnItems->Add(logo); LinearLayout *rightColumnChoices = rightColumnItems; diff --git a/UI/MiscViews.cpp b/UI/MiscViews.cpp index c5b8d3e6c4..34e2b17051 100644 --- a/UI/MiscViews.cpp +++ b/UI/MiscViews.cpp @@ -292,15 +292,16 @@ void GameInfoBGView::Draw(UIContext &dc) { } } -SettingHint::SettingHint(std::string_view text) - : UI::TextView(text, new UI::LinearLayoutParams(UI::FILL_PARENT, UI::WRAP_CONTENT)) { +SettingHint::SettingHint(std::string_view text, UI::View *setting) + : UI::TextView(text, new UI::LinearLayoutParams(UI::FILL_PARENT, UI::WRAP_CONTENT)), setting_(setting) { SetTextSize(UI::TextSize::Tiny); SetPadding(UI::Margins(14, 0, 12, 8)); SetAlign(FLAG_WRAP_TEXT); } void SettingHint::Draw(UIContext &dc) { - UI::Style style = dc.GetTheme().itemStyle; + const bool enabled = setting_ ? setting_->IsEnabled() : true; + const UI::Style &style = enabled ? dc.GetTheme().itemStyle : dc.GetTheme().itemDisabledStyle; SetTextColor(style.fgColor); // bit hacky but works dc.FillRect(style.background, bounds_); UI::TextView::Draw(dc); diff --git a/UI/MiscViews.h b/UI/MiscViews.h index 7730a5786b..f0b813f69e 100644 --- a/UI/MiscViews.h +++ b/UI/MiscViews.h @@ -92,8 +92,10 @@ protected: class SettingHint : public UI::TextView { public: - SettingHint(std::string_view text); + SettingHint(std::string_view text, UI::View *setting); void Draw(UIContext &dc) override; +private: + UI::View *setting_; }; void AddRotationPicker(ScreenManager *screenManager, UI::ViewGroup *parent, bool text); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index f324b2511e..cf2b0974da 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -650,6 +650,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch } if (fileToLog) { + // Start logging immediately. g_logManager.EnableOutput(LogOutput::File); g_logManager.SetFileLogPath(Path(fileToLog)); } else { diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 1d737e0135..f23aacb3f0 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -114,7 +114,7 @@ protected: if (undoEnabled || hasUndo) { // Show the undo button if state undo is enabled in settings, OR one is available. We can load it // even if making new undo states is not enabled. - Choice *undoButton = new Choice(pa->T("Undo last save")); + undoButton = new Choice(pa->T("Undo last save")); undoButton->SetEnabled(hasUndo); } @@ -780,6 +780,7 @@ void GamePauseScreen::dialogFinished(const Screen *dialog, DialogResult dr) { finishNextFrame_ = true; } else if (dr != DR_CANCEL && dr != DR_BACK) { // Just go back to the pause menu, but refresh the savestate thumbnails in case something changed. + SaveState::Rescan(saveStatePrefix_); RecreateViews(); } } else { @@ -788,6 +789,7 @@ void GamePauseScreen::dialogFinished(const Screen *dialog, DialogResult dr) { } else if (tag != "MessagePopupScreen" && tag != "Prompt" && tag != "ContextMenuPopup" && tag != "ContextMenuCallbackPopup" && tag != "Report" && tag != "listpopup") { // Maybe should invert the logic here, so many cases.. // There may have been changes to our savestates, so let's recreate. + SaveState::Rescan(saveStatePrefix_); RecreateViews(); } } @@ -872,13 +874,20 @@ void GamePauseScreen::OnReportFeedback(UI::EventParams &e) { void GamePauseScreen::OnCreateConfig(UI::EventParams &e) { std::shared_ptr info = g_gameInfoCache->GetInfo(NULL, gamePath_, GameInfoFlags::PARAM_SFO); if (info->Ready(GameInfoFlags::PARAM_SFO)) { - std::string gameId = info->id; - g_Config.CreateGameConfig(gameId); - g_Config.SaveGameConfig(gameId, info->GetTitle()); - if (info) { - info->hasConfig = true; - } - RecreateViews(); + auto ga = GetI18NCategory(I18NCat::GAME); + auto di = GetI18NCategory(I18NCat::DIALOG); + screenManager()->push(new UI::MessagePopupScreen(info->GetTitle(), ga->T("Are you sure you want to create a game-specific config?"), di->T("Yes"), di->T("No"), + [this, info](bool result) { + if (result) { + std::string gameId = info->id; + g_Config.CreateGameConfig(gameId); + g_Config.SaveGameConfig(gameId, info->GetTitle()); + if (info) { + info->hasConfig = true; + } + RecreateViews(); + } + })); } } @@ -886,6 +895,7 @@ void GamePauseScreen::OnDeleteConfig(UI::EventParams &e) { auto di = GetI18NCategory(I18NCat::DIALOG); const bool trashAvailable = System_GetPropertyBool(SYSPROP_HAS_TRASH_BIN); screenManager()->push( + // TODO: This string should be changed to better match the one in OnCreateConfig. new UI::MessagePopupScreen(di->T("Delete"), di->T("DeleteConfirmGameConfig", "Do you really want to delete the settings for this game?"), trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"), [this](bool yes) { if (!yes) { diff --git a/UI/ReportScreen.cpp b/UI/ReportScreen.cpp index 5268239360..02080aaf3b 100644 --- a/UI/ReportScreen.cpp +++ b/UI/ReportScreen.cpp @@ -176,13 +176,12 @@ ScreenRenderFlags ReportScreen::PreRender(ScreenRenderMode mode) { File::CreateDir(path); } screenshotFilename_ = screenshotPath; - ScheduleScreenshot(screenshotFilename_, ScreenshotFormat::JPG, ScreenshotType::Display, 4, [this](ScreenshotResult result) { + ScheduleScreenshot(screenshotFilename_, ScreenshotFormat::JPG, ScreenshotType::Display, 4, [](ScreenshotResult result) { if (result == ScreenshotResult::Success) { // Redo the views already, now with a screenshot included. - RecreateViews(); + System_PostUIMessage(UIMessage::RECREATE_VIEWS); } }); - tookScreenshot_ = true; } else if (g_Config.bSkipBufferEffects && !tookScreenshot_) { // Delete a leftover screenshot if we didn't take one now. @@ -190,7 +189,6 @@ ScreenRenderFlags ReportScreen::PreRender(ScreenRenderMode mode) { tookScreenshot_ = true; screenshotFilename_.clear(); } - return ScreenRenderFlags::NONE; } diff --git a/UI/SystemInfoScreen.cpp b/UI/SystemInfoScreen.cpp index 7d315e4d9c..dcaed401b9 100644 --- a/UI/SystemInfoScreen.cpp +++ b/UI/SystemInfoScreen.cpp @@ -77,13 +77,12 @@ void SystemInfoScreen::CreateTabs() { auto si = GetI18NCategory(I18NCat::SYSINFO); - AddTab("Storage", si->T("Storage"), [this](UI::LinearLayout *parent) { - CreateStorageTab(parent); - }); - AddTab("Device Info", si->T("Device Info"), [this](UI::LinearLayout *parent) { CreateDeviceInfoTab(parent); }); + AddTab("Storage", si->T("Storage"), [this](UI::LinearLayout *parent) { + CreateStorageTab(parent); + }); AddTab("DevSystemInfoBuildConfig", si->T("Build Config"), [this](UI::LinearLayout *parent) { CreateBuildConfigTab(parent); }); diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index b07e7af435..a89ee1f48c 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -12,6 +12,7 @@ #include "Common/GPU/thin3d_create.h" #include "Common/Common.h" +#include "Common/OSVersion.h" #include "Common/Audio/AudioBackend.h" #include "Common/Input/InputState.h" #include "Common/File/VFS/VFS.h" @@ -316,6 +317,50 @@ void UWPGraphicsContext::Shutdown() { delete draw_; } +bool IsXBox() { + auto deviceInfo = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo(); + return deviceInfo.DeviceFamily() == L"Windows.Xbox"; +} + +bool IsMobile() { + auto deviceInfo = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo(); + return deviceInfo.DeviceFamily() == L"Windows.Mobile"; +} + +void GetVersionInfo(uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision) { + winrt::hstring deviceFamilyVersion = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamilyVersion(); + uint64_t version = std::stoull(std::wstring(deviceFamilyVersion)); + + major = static_cast((version & 0xFFFF000000000000L) >> 48); + minor = static_cast((version & 0x0000FFFF00000000L) >> 32); + build = static_cast((version & 0x00000000FFFF0000L) >> 16); + revision = static_cast(version & 0x000000000000FFFFL); +} + +std::string GetSystemName() { + std::string osName = "Microsoft Windows 10"; + + if (IsXBox()) { + osName = "Xbox OS"; + } else { + uint32_t major = 0, minor = 0, build = 0, revision = 0; + GetVersionInfo(major, minor, build, revision); + + if (build >= 22000) { + osName = "Microsoft Windows 11"; + } + } + return osName + " " + GetWindowsSystemArchitecture(); +} + +std::string GetWindowsBuild() { + uint32_t major = 0, minor = 0, build = 0, revision = 0; + GetVersionInfo(major, minor, build, revision); + + char buffer[50]; + sprintf_s(buffer, sizeof(buffer), "%u.%u.%u (rev. %u)", major, minor, build, revision); + return std::string(buffer); +} std::string System_GetProperty(SystemProperty prop) { static bool hasCheckedGPUDriverVersion = false; switch (prop) { diff --git a/UWP/UWPHelpers/InputHelpers.cpp b/UWP/UWPHelpers/InputHelpers.cpp index c512a4d688..56138ca2dc 100644 --- a/UWP/UWPHelpers/InputHelpers.cpp +++ b/UWP/UWPHelpers/InputHelpers.cpp @@ -239,49 +239,4 @@ std::string GetLangRegion() { return langRegion; } -bool IsXBox() { - auto deviceInfo = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo(); - return deviceInfo.DeviceFamily() == L"Windows.Xbox"; -} - -bool IsMobile() { - auto deviceInfo = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo(); - return deviceInfo.DeviceFamily() == L"Windows.Mobile"; -} - -void GetVersionInfo(uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision) { - winrt::hstring deviceFamilyVersion = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamilyVersion(); - uint64_t version = std::stoull(std::wstring(deviceFamilyVersion)); - - major = static_cast((version & 0xFFFF000000000000L) >> 48); - minor = static_cast((version & 0x0000FFFF00000000L) >> 32); - build = static_cast((version & 0x00000000FFFF0000L) >> 16); - revision = static_cast(version & 0x000000000000FFFFL); -} - -std::string GetSystemName() { - std::string osName = "Microsoft Windows 10"; - - if (IsXBox()) { - osName = "Xbox OS"; - } - else { - uint32_t major = 0, minor = 0, build = 0, revision = 0; - GetVersionInfo(major, minor, build, revision); - - if (build >= 22000) { - osName = "Microsoft Windows 11"; - } - } - return osName + " " + GetWindowsSystemArchitecture(); -} - -std::string GetWindowsBuild() { - uint32_t major = 0, minor = 0, build = 0, revision = 0; - GetVersionInfo(major, minor, build, revision); - - char buffer[50]; - sprintf_s(buffer, sizeof(buffer), "%u.%u.%u (rev. %u)", major, minor, build, revision); - return std::string(buffer); -} #pragma endregion diff --git a/Windows/Hid/HidInputDevice.cpp b/Windows/Hid/HidInputDevice.cpp index 3673bbe072..7f5bc59f82 100644 --- a/Windows/Hid/HidInputDevice.cpp +++ b/Windows/Hid/HidInputDevice.cpp @@ -63,6 +63,7 @@ static const HIDControllerInfo g_psInfos[] = { {SONY_VID, 0x05C4, HIDControllerType::DualShock, "DS4 v.1"}, {SONY_VID, 0x09CC, HIDControllerType::DualShock, "DS4 v.2"}, {SONY_VID, 0x0CE6, HIDControllerType::DualSense, "DualSense"}, + {SONY_VID, 0x0DF2, HIDControllerType::DualSense, "DualSense Edge"}, {SONY_VID, PS_CLASSIC, HIDControllerType::DualShock, "PS Classic"}, {NINTENDO_VID, SWITCH_PRO_PID, HIDControllerType::SwitchPro, "Switch Pro"}, // {PSSubType::DS4, DS4_WIRELESS}, @@ -98,54 +99,61 @@ static HANDLE OpenFirstHIDController(HIDControllerType *subType, int *reportSize auto* detailData = reinterpret_cast(buffer.data()); detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - if (SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &interfaceData, detailData, requiredSize, nullptr, nullptr)) { - HANDLE handle = CreateFile(detailData->DevicePath, GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); - if (handle != INVALID_HANDLE_VALUE) { - HIDD_ATTRIBUTES attr{sizeof(HIDD_ATTRIBUTES)}; - if (!HidD_GetAttributes(handle, &attr)) { - return nullptr; - } - const HIDControllerInfo *info = GetGamepadInfo(attr); - *outInfo = info; - if (info) { - *subType = info->type; - INFO_LOG(Log::UI, "Found supported gamepad. PID: %04x", info->productId); - HIDP_CAPS caps; - PHIDP_PREPARSED_DATA preparsedData; - - HidD_GetPreparsedData(handle, &preparsedData); - HidP_GetCaps(preparsedData, &caps); - HidD_FreePreparsedData(preparsedData); - - *reportSize = caps.InputReportByteLength; - *outReportSize = caps.OutputReportByteLength; - - INFO_LOG(Log::UI, "Initializing gamepad. out report size=%d", *outReportSize); - bool result; - switch (*subType) { - case HIDControllerType::DualSense: - result = InitializeDualSense(handle, *outReportSize); - break; - case HIDControllerType::DualShock: - result = InitializeDualShock(handle, *outReportSize); - break; - case HIDControllerType::SwitchPro: - result = InitializeSwitchPro(handle); - break; - } - - if (!result) { - ERROR_LOG(Log::UI, "Controller initialization failed"); - } - - SetupDiDestroyDeviceInfoList(deviceInfoSet); - - return handle; - } - CloseHandle(handle); - } + if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &interfaceData, detailData, requiredSize, nullptr, nullptr)) { + continue; } + + HANDLE handle = CreateFile(detailData->DevicePath, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + if (handle == INVALID_HANDLE_VALUE) { + continue; + } + + HIDD_ATTRIBUTES attr{sizeof(HIDD_ATTRIBUTES)}; + if (!HidD_GetAttributes(handle, &attr)) { + CloseHandle(handle); + continue; + } + + const HIDControllerInfo *info = GetGamepadInfo(attr); + *outInfo = info; + if (!info) { + CloseHandle(handle); + continue; + } + + *subType = info->type; + INFO_LOG(Log::UI, "Found supported gamepad. PID: %04x", info->productId); + HIDP_CAPS caps; + PHIDP_PREPARSED_DATA preparsedData; + + HidD_GetPreparsedData(handle, &preparsedData); + HidP_GetCaps(preparsedData, &caps); + HidD_FreePreparsedData(preparsedData); + + *reportSize = caps.InputReportByteLength; + *outReportSize = caps.OutputReportByteLength; + + INFO_LOG(Log::UI, "Initializing gamepad. out report size=%d", *outReportSize); + bool result; + switch (*subType) { + case HIDControllerType::DualSense: + result = InitializeDualSense(handle, *outReportSize); + break; + case HIDControllerType::DualShock: + result = InitializeDualShock(handle, *outReportSize); + break; + case HIDControllerType::SwitchPro: + result = InitializeSwitchPro(handle); + break; + } + + if (!result) { + ERROR_LOG(Log::UI, "Controller initialization failed"); + } + + SetupDiDestroyDeviceInfoList(deviceInfoSet); + return handle; } SetupDiDestroyDeviceInfoList(deviceInfoSet); return nullptr; diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 34819d06f3..f3bfa10d15 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -581,6 +581,7 @@ ZIP file detected (Require UnRAR) = ‎الملف مضغوط (ZIP).\nمن فضل ZIP file detected (Require WINRAR) = ‎الملف مضغوط (ZIP).\nمن فضلك فك الضغط أولاً (جرب WinRAR). [Game] +Are you sure you want to create a game-specific config? = هل أنت متأكد أنك تريد إنشاء إعدادات خاصة باللعبة؟ # AI translated Are you sure you want to reset the played time counter? = هل أنت متأكد أنك تريد إعادة ضبط عداد الوقت الذي تم تشغيله؟ # AI translated Asia = ‎أسيا Calculate CRC = Calculate CRC @@ -987,8 +988,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = تلقائي Autoconfigure = Autoconfigure -Change Mac Address = ‎MAC تغيير عنوان الـ -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -1003,7 +1003,7 @@ Custom server list = قائمة الخوادم المخصصة # AI translated Disconnected from AdhocServer = AdhocServer تم قطع الاتصال في سيرفرات DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = تفعيل الشات عبر الشبكه Enable networking = networking/WLAN تفعيل Enable UPnP = (يحتاج لبعض الوقت للكشف) UPnP تفعيل @@ -1028,6 +1028,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = عناوين الشبكة المحلية # AI translated +MAC address = ‎MAC تغيير عنوان الـ Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = متصل بالشبكة @@ -1037,14 +1038,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = وضع P2P # AI translated PacketRelayHint = متاح على الخوادم التي تقدم إعادة توجيه الحزمة 'aemu_postoffice'، مثل socom.cc. قم بتعطيل ذلك للعب الشبكة المحلية أو VPN. قد يكون أكثر موثوقية، لكنه أحيانًا أبطأ. Please change your Port Offset = Please change your port offset -Port offset = Port offset (0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = التحويل الافتراضي للمنافذ هو 10000. قم بتغييره إلى 0 للتوافق مع وحدات PSP غير المعدلة. # AI translated Public server list = قائمة الخوادم العامة # AI translated Quick Chat 1 = الشات السريع 1 Quick Chat 2 = الشات السريع 2 Quick Chat 3 = الشات السريع 3 Quick Chat 4 = الشات السريع 4 Quick Chat 5 = الشات السريع 5 +Quick start guide for multiplayer = دليل البداية السريع للعب المتعدد # AI translated QuickChat = الشات السريع Randomize = عشوائي Relay server mode = وضع خادم الترحيل # AI translated @@ -1525,6 +1528,7 @@ Off = معطل TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index ee60ab07ad..82355a6b92 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -120,7 +120,7 @@ Circular stick input = Dairəvi çubuq girişi Classic = Klassik Confine Mouse = Siçanı pəncərə/görüntü içində tut Control mapping = Yönəltmə xəritələnişi -Custom touch button setup = Custom touch button setup +Custom touch button setup = Özəl toxunuşlu düymə quruluşu Customize = Özəlləşdir # Customize Touch Controls = Toxunuşlu yönəltmə düzənini düzəlt... D-PAD = D-Pad Deadzone radius = Ölü bölgə radiusu @@ -128,7 +128,7 @@ Disable D-Pad diagonals (4-way touch) = D-Pad diaqonallarını bağla (4-yönlü Disable diagonal input = Diaqonal girişi bağla Double tap = İkili basma Easier sweeping movements = Asan sürükləmə hərəkətləri -Edit touch control layout = Edit touch control layout +Edit touch control layout = Toxunuşlu yönəltmə qaplamasını düzəlt Enable analog stick gesture = Analoq çubuğunun hərəkətini aç Enable gesture control = Hərəkət yönəltməsini aç Enable standard shortcut keys = Standart qısayol düymələrini aç @@ -161,7 +161,7 @@ Mouse wheel button-release delay = Siçan təkər düyməsinin buraxılış geci MouseControl Tip = 'M' simgəsini basaraq, Siz artıq yönləndirmə xəritələnişi ekranında siçanı xəritələyə bilərsiniz. None (Disabled) = Heç nə (bağlıdır) Off = Sönülü -On-screen touch controls = On-screen touch controls +On-screen touch controls = Ekranüstü toxunuş yönəltmələri Portrait = Portret Portrait Reversed = Tərs Portret PSP Action Buttons = PSP eyləm düymələri @@ -185,7 +185,7 @@ Tilt Sensitivity along X axis = X oxu yönündə Əyim həssaslığı Tilt Sensitivity along Y axis = Y oxu yönündə Əyim həssaslığı To Calibrate = Qurğunu üstün gördüyün bucaqda tutaraq "Kalibirlə"ni bas. Toggle mode = Dəyişim modu -Touch Control Visibility = Toxunma yönəltmə görsənişi +Touch Control Visibility = Toxunuşlu Yönəltmə Görünürlüyü Use custom right analog = Özəl sağ analoq işlət Use Mouse Control = Siçan Yönəltməsini İşlət Visibility = Görsəniş @@ -211,7 +211,7 @@ Backend = &Arxa-uc işlənişi (PPSSPP'nı Y. Başladır) Bicubic = &Bikub Break = Qırılış Break on Load = Yükləniş qırılışı -Buy PPSSPP Gold = PPSSPP &Gold'u satın al +Buy Gold = &Gold'u satın al Control Mapping... = &Yönəltmə Xəritələnişi... Copy PSP memory base address = PSP yaddaş dabanının &adresini köçürt Debugging = &Yolaqoyuş @@ -375,8 +375,8 @@ Texture ini file created = Toxuma ini faylı yaradıldı Texture Replacement = Toxuma dəyişimi Audio Debug = Səs Yolaqoyuşu Control Debug = Yönəltmə Yolaqoyuşu -Toggle Freeze = Donma Keçirisici -Touchscreen Test = Toxunuşlu ekran yoxlanışı +Toggle Freeze = Donma Keçiricisi +Touchscreen Test = Toxunuşlu ekranın yoxlanışı Ubershaders = Uber-kölgələndiricilər Use FFMPEG for all compressed audio = Bütün sıxılmış səslər üçün FFMPEG işlət Use locally hosted remote debugger = Yerli saxlanmış uzaqdan yolaqoyucunu işlət @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = fayl sıxılıb (ZIP).\nÖncə onu geri aç ZIP file detected (Require WINRAR) = fayl sıxılıb (ZIP).\nÖncə onu geri açın (WinRAR ilə yoxlayın). [Game] +Are you sure you want to create a game-specific config? = Oyun spesifik konfiqurasiya yaratmaq istədiyinizə əminsiniz? # AI translated Are you sure you want to reset the played time counter? = Əminsinizmi, oynanılan vaxt sayğacını sıfırlamaq istəyirsiniz? # AI translated Asia = Asiya Calculate CRC = CRC'ni hesabla @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Qoşulu ikən sürət y AM: Data from Unknown Port = AM: Bilinməyən Port Veriləni Auto = Özbaşına Autoconfigure = Özü-görkəmləniş -Change Mac Address = MAC adresi dəyiş -Change proAdhocServer Address = PRO ad hoc qulluqçu IP adresini dəyiş +Change proAdhocServer Address = Ad hoc qulluqçu IP adresini dəyiş Change proAdhocServer address hint = (localhost = çoxlu örnək) ChangeMacSaveConfirm = Yeni MAC adresi yaradılsın? ChangeMacSaveWarning = Bir sıra oyun qorunuş verilənini yükləyərkən MAC adresi yoxlayır, buna görə bu, köhnə qorunuşları korlaya bilər. @@ -995,7 +995,7 @@ Custom server list = Özelleştirilmiş server siyahısı # AI translated Disconnected from AdhocServer = Ad hoc qulluqçusundan ayrılıb DNS Error Resolving = DNS yanlışınən çözülüşü DNS server = DNS qulluqçusu -Enable built-in PRO Adhoc Server = Hazır PRO ad hoc qulluqçusunu işlət +Enable built-in ad hoc server = Hazır ad hoc qulluqçusunu işlət Enable network chat = Bağlantılı danışığı aç Enable networking = Bağlantını/WLAN aç Enable UPnP = UPnP'ni aç (tapılması bir neçə saniyə alır) @@ -1020,6 +1020,7 @@ Infrastructure = İnfrastruktur Infrastructure server provided by: = İnfrastruktur qulluqçusunu təmin edən: Invalid IP or hostname = Keçərsiz IP ya da sahibin adı Local network addresses = Yerli şəbəkə ünvanları # AI translated +MAC address = MAC adresi dəyiş Minimum Timeout = Ən aşağı vaxt doluşu (gecikmə msan'də, 0 = vasrayılan) Misc = Çeşidli (varsayılan = PSP uyumluğu) Network connected = BAğlantı qoşulub @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Bu oyunun çalışası olan baş P2P mode = P2P rejimi # AI translated PacketRelayHint = Socom.cc kimi 'aemu_postoffice' paket relayi təqdim edən serverlərdə mövcuddur. LAN və ya VPN oyunu üçün bunu deaktiv edin. Daha etibarlı ola bilər, amma bəzən yavaşdır. Please change your Port Offset = Port keçidinizi dəyişin -Port offset = Port keçdi(0 = PSP uyumluğu) Open PPSSPP Multiplayer Wiki Page = PPSSPP çox oyunçu Viki Səhifəsini aç +Port offset = Port keçdi +PortOffsetHint = Default port offset 10000-dır. Dəyişdirin 0-a, dəyişdirilməmiş PSP konsolları ilə uyğunluğu üçün. # AI translated Public server list = İctimai serverlərin siyahısı # AI translated Quick Chat 1 = Tez danışıq 1 Quick Chat 2 = Tez danışıq 2 Quick Chat 3 = Tez danışıq 3 Quick Chat 4 = Tez danışıq 4 Quick Chat 5 = Tez danışıq 5 +Quick start guide for multiplayer = Çox oyunculu üçün tez başlama təlimatı # AI translated QuickChat = Tez danışıq Randomize = Təsadüfi Relay server mode = Relay server rejimi # AI translated @@ -1341,7 +1344,7 @@ GPU Information = GİB bilgisi High precision float range = Üzgünün yüksək kəsinlik mənzili High precision int range = Bütövlüyün yüksək kəsinlik mənzili Icon cache = Simgə önyaddaşı -Instance = Örək +Instance = Örnək JIT available = JIT əlçatandır Lang/Region = Dil/Bölgə Memory Page Size = Yaddaş səhifəsi ölçüsü @@ -1517,6 +1520,7 @@ Off = Sönülüdür TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index a1cc8266f2..89ca610e67 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = File is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = File is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = Вы ўпэўнены, што хочаце стварыць канфігурацыю для гульні? # AI translated Are you sure you want to reset the played time counter? = Вы ўпэўнены, што хочаце скідаць лічыльнік часу гульні? # AI translated Asia = Азія Calculate CRC = Разлічыць CRC @@ -946,11 +947,10 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Аўта Autoconfigure = Аўтаканфігураванне -Change Mac Address = Змяніць MAC-адрас Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Chat = Чат Chat Button Position = Пазіцыя кнопкі чата Chat Here = Чат тут @@ -962,7 +962,7 @@ Custom server list = Список карыстальніцкіх сервера Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS-сервер -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -987,6 +987,7 @@ Infrastructure = Інфраструктура Infrastructure server provided by: = Сервер інфраструктуры прадастаўлены: Invalid IP or hostname = Няправільны IP-адрас або імя хоста Local network addresses = Лакальныя сеткавыя адрасы # AI translated +MAC address = Змяніць MAC-адрас Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -996,14 +997,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Рэжым P2P # AI translated PacketRelayHint = Даступна на серверах, якія прапануюць реле пакета 'aemu_postoffice', як socom.cc. Адключыце гэта для LAN або VPN гульні. Можа быць больш надзейным, але часам павольным. Please change your Port Offset = Please change your port offset -Port offset = Port offset (0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Паводле змаўчання, зрушэнне порта складае 10000. Змяніце яго на 0 для сумяшчальнасці з незмененымі консолямі PSP. # AI translated Public server list = Спіс публічных сервераў # AI translated Quick Chat 1 = Хуткі чат 1 Quick Chat 2 = Хуткі чат 2 Quick Chat 3 = Хуткі чат 3 Quick Chat 4 = Хуткі чат 4 Quick Chat 5 = Хуткі чат 5 +Quick start guide for multiplayer = Хуткі стартовы даведнік для шматкарыстальніцкай гульні # AI translated QuickChat = Хуткі чат Randomize = Randomize Relay server mode = Рэжым сервера перасылкі # AI translated @@ -1517,6 +1520,7 @@ Off = Выкл. TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = Няма адпаведных налад '%1' diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index d236ef8f60..adcf1d1d08 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Файла е архивиран (ZIP).\nМ ZIP file detected (Require WINRAR) = Файла е архивиран (ZIP).\nМоля първо разархивирайте (опитайте с WinRAR). [Game] +Are you sure you want to create a game-specific config? = Сигурни ли сте, че искате да създадете конфигурация за игра? # AI translated Are you sure you want to reset the played time counter? = Сигурни ли сте, че искате да нулирате брояча на изигрането време? # AI translated Asia = Азия Calculate CRC = Изчислете CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Списък с персонализирани сървър Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS сървър -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Активиране на мрежов чат Enable networking = Активиране на мрежа/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Невалиден IP адрес или име на хост Local network addresses = Локални мрежови адреси # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P режим # AI translated PacketRelayHint = Наличен на сървъри, предоставящи реле на пакети 'aemu_postoffice', като socom.cc. Деактивирайте това за LAN или VPN игра. Може да е по-надеждно, но понякога по-бавно. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Стандартното портово отместване е 10000. Променете го на 0 за съвместимост с немодифицирани конзоли PSP. # AI translated Public server list = Списък с публични сървъри # AI translated 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 +Quick start guide for multiplayer = Бързо ръководство за мултиплеър # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Режим на релейния сървър # AI translated @@ -1517,6 +1520,7 @@ Off = Изключено TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 40e8f325b2..592bf0c567 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = Estàs segur que vols crear una configuració específica per al joc? # AI translated Are you sure you want to reset the played time counter? = Esteu segurs que voleu restablir el comptador del temps jugat? # AI translated Asia = Àsia Calculate CRC = Calcular valor CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Llistat de servidors personalitzats # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Adreces de xarxa locals # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Mode P2P # AI translated PacketRelayHint = Disponible en servidors que ofereixen el relleu de paquets 'aemu_postoffice', com socom.cc. Desactiveu-ho per a jocs LAN o VPN. Pot ser més fiable, però de vegades més lent. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = L'offset de port per defecte és 10000. Canvia-ho a 0 per a la compatibilitat amb consoles PSP sense modificar. # AI translated Public server list = Llista de servidors públics # AI translated 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 +Quick start guide for multiplayer = Guia d'inici ràpid per al multijugador # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Mode de servidor de relleu # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 525db335df..e158ca7d9d 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Soubor je komprimován (ZIP).\nNejdříve ho ZIP file detected (Require WINRAR) = Soubor je komprimován (ZIP).\nNejdříve ho prosím rozbalte (zkuste WinRAR). [Game] +Are you sure you want to create a game-specific config? = Jste si jisti, že chcete vytvořit specifickou konfiguraci pro hru? # AI translated Are you sure you want to reset the played time counter? = Jste si jisti, že chcete resetovat časovač odehraného času? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Změnit MAC adresu -Change proAdhocServer Address = Změnit IP adresu serveru PRO ad hoc +Change proAdhocServer Address = Změnit IP adresu serveru ad hoc Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Seznam vlastních serverů # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Povolit zabudovaný server PRO ad hoc +Enable built-in ad hoc server = Povolit zabudovaný server ad hoc Enable network chat = Enable network chat Enable networking = Povolit síť/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Místní síťové adresy # AI translated +MAC address = Změnit MAC adresu Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Režim P2P # AI translated PacketRelayHint = K dispozici na serverech, které poskytují přenos paketů 'aemu_postoffice', jako je socom.cc. Vypněte to pro hraní LAN nebo VPN. Může být spolehlivější, ale někdy pomalejší. Please change your Port Offset = Please change your port offset -Port offset = Odchylka portu (0 = Kompatibilita s PSP) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Odchylka portu +PortOffsetHint = Výchozí posun portu je 10000. Změňte to na 0 pro kompatibilitu s nemodifikovanými konzolemi PSP. # AI translated Public server list = Seznam veřejných serverů # AI translated 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 +Quick start guide for multiplayer = Rychlý průvodce pro více hráčů # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Režim reléového serveru # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index f4a0274016..ecc4718382 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Fil er pakket (ZIP).\nPak venligst ud først ZIP file detected (Require WINRAR) = Fil er pakket (ZIP).\nPak venligst ud først (prøv WinRAR). [Game] +Are you sure you want to create a game-specific config? = Er du sikker på, at du vil oprette en spil-specifik konfiguration? # AI translated Are you sure you want to reset the played time counter? = Er du sikker på, at du vil nulstille timeren for spilletid? # AI translated Asia = Asien Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Ændre MAC adressen -Change proAdhocServer Address = Ændre PRO ad hoc server IP adresse +Change proAdhocServer Address = Ændre ad hoc server IP adresse Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Tilpasset serverliste # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Tillad indbygget PRO ad hoc server +Enable built-in ad hoc server = Tillad indbygget ad hoc server Enable network chat = Enable network chat Enable networking = Aktiver netværk/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Lokale netværksadresser # AI translated +MAC address = Ændre MAC adressen Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P-tilstand # AI translated PacketRelayHint = Tilgængelig på servere, der leverer 'aemu_postoffice' paketredegivelse, såsom socom.cc. Deaktiver dette til LAN- eller VPN-spil. Kan være mere pålidelig, men nogle gange langsommere. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP kompatibilitet) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Standard portoffset er 10000. Skift det til 0 for at være kompatibel med umodificerede PSP-konsoller. # AI translated Public server list = Liste over offentlige servere # AI translated 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 +Quick start guide for multiplayer = Hurtig startguide til multiplayer # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Relayserver-tilstand # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index b44676ce16..35514b37a2 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -572,6 +572,7 @@ ZIP file detected (Require UnRAR) = Datei ist komprimiert (ZIP).\nBitte zuerst e ZIP file detected (Require WINRAR) = Datei ist komprimiert (ZIP).\nBitte zuerst entpacken (z.B. mit WinRAR). [Game] +Are you sure you want to create a game-specific config? = Sind Sie sicher, dass Sie eine spiel spezifische Konfiguration erstellen möchten? # AI translated Are you sure you want to reset the played time counter? = Sind Sie sicher, dass Sie den gespielten Zeit-Zähler zurücksetzen möchten? # AI translated Asia = Asien Calculate CRC = CRC berechnen @@ -978,7 +979,6 @@ Allow speed control while connected (not recommended) = Geschwindigkeitsregelung AM: Data from Unknown Port = AM: Daten von unbekanntem Port Auto = Autom. Autoconfigure = Autom. konfigurieren -Change Mac Address = MAC-Adresse ändern Change proAdhocServer Address = proAdhocServer-IP-Adresse ändern Change proAdhocServer address hint = (localhost = mehrere Instanzen) ChangeMacSaveConfirm = Eine neue MAC-Adresse generieren? @@ -994,7 +994,7 @@ Custom server list = Benutzerdefinierte Serverliste # AI translated Disconnected from AdhocServer = Vom Ad-hoc-Server getrennt DNS Error Resolving = DNS-Fehlerbehebung DNS server = DNS-Server -Enable built-in PRO Adhoc Server = Integrierten PRO-ad-hoc-Server aktivieren +Enable built-in ad hoc server = Integrierten PRO-ad-hoc-Server aktivieren Enable network chat = Netzwerk-Chat aktivieren Enable networking = Netzwerk/Wlan aktivieren Enable UPnP = UPnP aktivieren (braucht ein paar Sekunden) @@ -1019,6 +1019,7 @@ Infrastructure = Infrastruktur Infrastructure server provided by: = Infrastruktur-Server bereitgestellt von: Invalid IP or hostname = Ungültige IP oder Hostnamen Local network addresses = Lokale Netzwerkadressen # AI translated +MAC address = MAC-Adresse ändern Minimum Timeout = Minimale Zeitüberschreitung (Überschreibung in ms, 0 = Vorgabe) Misc = Verschiedenes (Vorgabe = PSP-Kompatibilität) Network connected = Netzwerk verbunden @@ -1028,14 +1029,16 @@ Other versions of this game that should work: = Andere Versionen dieses Spiels, P2P mode = P2P-Modus # AI translated PacketRelayHint = Verfügbar auf Servern, die 'aemu_postoffice' Paketweiterleitung wie socom.cc anbieten. Deaktivieren Sie dies für LAN- oder VPN-Spiel. Kann zuverlässiger sein, aber manchmal langsamer. Please change your Port Offset = Bitte ändere deinen Port-Offset -Port offset = Portverschiebung (0 = PSP-Kompatibilität) Open PPSSPP Multiplayer Wiki Page = PPSSPP-Ad-Hoc-Wiki-Seite +Port offset = Portverschiebung +PortOffsetHint = Der Standard-Portoffset beträgt 10000. Ändern Sie es auf 0 für die Kompatibilität mit unmodifizierten PSP-Konsolen. # AI translated Public server list = Öffentliche Serverliste # AI translated Quick Chat 1 = Schnell-Chat 1 Quick Chat 2 = Schnell-Chat 2 Quick Chat 3 = Schnell-Chat 3 Quick Chat 4 = Schnell-Chat 4 Quick Chat 5 = Schnell-Chat 5 +Quick start guide for multiplayer = Schnellstartanleitung für Mehrspieler # AI translated QuickChat =Schnell-Chat Randomize = Randomisieren Relay server mode = Relay-Server-Modus # AI translated @@ -1516,6 +1519,7 @@ Off = Aus TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpin diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 94e8f9e0c5..7748e124e7 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = Apakah Anda yakin ingin membuat konfigurasi spesifik game? # AI translated Are you sure you want to reset the played time counter? = Apakah Anda yakin ingin mengatur ulang penghitung waktu yang dimainkan? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Daftar server kustom # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Alamat jaringan lokal # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Mode P2P # AI translated PacketRelayHint = Tersedia di server yang menyediakan relai paket 'aemu_postoffice', seperti socom.cc. Nonaktifkan ini untuk permainan LAN atau VPN. Bisa lebih andal, tapi kadang-kadang lebih lambat. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Offset port default adalah 10000. Ubah menjadi 0 untuk kompatibilitas dengan konsol PSP yang tidak dimodifikasi. # AI translated Public server list = Daftar server publik # AI translated 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 +Quick start guide for multiplayer = Panduan memulai cepat untuk permainan multipemain # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Mode server relay # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index c766067fa7..2141c896ef 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -597,6 +597,7 @@ ZIP file detected (Require UnRAR) = File is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = File is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = Are you sure you want to create a game-specific config? Are you sure you want to reset the played time counter? = Are you sure you want to reset the played time counter? Asia = Asia Calculate CRC = Calculate CRC @@ -970,11 +971,10 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here @@ -986,7 +986,7 @@ Custom server list = Custom server list Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1011,6 +1011,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Local network addresses +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1020,14 +1021,16 @@ Other versions of this game that should work: = Other versions of this game that PacketRelayHint = Available on servers that provide 'aemu_postoffice' packet relay, like socom.cc. Disable this for LAN or VPN play. Can be more reliable, but sometimes slower. P2P mode = P2P mode Please change your Port Offset = Please change your port offset -Port offset = Port offset (0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = The default port offset is 10000. Change it to 0 for compatibility with unmodified PSP consoles. Public server list = Public server list 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 +Quick start guide for multiplayer = Quick start guide for multiplayer QuickChat = Quick chat Randomize = Randomize Relay server mode = Relay server mode @@ -1541,6 +1544,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = No settings matched '%1' diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index dd3f72e8bc..d08769dcaa 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -574,6 +574,7 @@ ZIP file detected (Require UnRAR) = El archivo está comprimido (ZIP).\nDdescomp ZIP file detected (Require WINRAR) = El archivo está comprimido (ZIP).\nDdescomprímelo primero (usa WinRAR). [Game] +Are you sure you want to create a game-specific config? = ¿Estás seguro de que deseas crear una configuración específica para el juego? # AI translated Are you sure you want to reset the played time counter? = ¿Está seguro de que desea restablecer el contador de tiempo jugado? # AI translated Asia = Asia Calculate CRC = Calcular CRC @@ -980,7 +981,6 @@ Allow speed control while connected (not recommended) = Permitir control de velo AM: Data from Unknown Port = AM: Datos de puerto desconocido Auto = Automático Autoconfigure = Autoconfigurar -Change Mac Address = Cambiar dirección MAC Change proAdhocServer Address = Cambiar dirección IP del servidor Ad-Hoc PRO Change proAdhocServer address hint = (localhost = varias instancias) ChangeMacSaveConfirm = ¿Generar una nueva dirección MAC? @@ -996,7 +996,7 @@ Custom server list = Lista de servidores personalizados # AI translated Disconnected from AdhocServer = Desconectado de servidor Ad-Hoc DNS Error Resolving = Resolviendo error DNS DNS server = Servidor DNS -Enable built-in PRO Adhoc Server = Activar servidor Ad-Hoc PRO integrado +Enable built-in ad hoc server = Activar servidor Ad-Hoc PRO integrado Enable network chat = Activar chat de red Enable networking = Activar redes/WLAN Enable UPnP = Activar UPnP (necesita unos segundos para detectarlo) @@ -1021,6 +1021,7 @@ Infrastructure = Infrastructura Infrastructure server provided by: = Servidor de infraestructura proporcionado por: Invalid IP or hostname = IP o nombre de host no válido Local network addresses = Direcciones de red local # AI translated +MAC address = Cambiar dirección MAC Minimum Timeout = Tiempo de espera mínimo (en ms, 0 = por defecto) Misc = Otros ajustes (por defecto = compatibilidad PSP) Network connected = Red conectada @@ -1031,13 +1032,15 @@ Other versions of this game that should work: = Otras versiones de este juego qu P2P mode = Modo P2P # AI translated PacketRelayHint = Disponible en servidores que proporcionan el relé de paquetes 'aemu_postoffice', como socom.cc. Desactívelo para juegos LAN o VPN. Puede ser más fiable, pero a veces más lento. Please change your Port Offset = Por favor cambia el desplazamiento del puerto -Port offset = Desplazamiento puerto (0 = compatibilidad PSP) +Port offset = Desplazamiento puerto +PortOffsetHint = El desplazamiento de puerto predeterminado es 10000. Cambia a 0 para compatibilidad con consolas PSP sin modificar. # AI translated Public server list = Lista de servidores públicos # AI translated 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 +Quick start guide for multiplayer = Guía de inicio rápido para multijugador # AI translated QuickChat = Chat rápido Randomize = Aleatorio Relay server mode = Modo servidor de retransmisión # AI translated @@ -1518,6 +1521,7 @@ Off = Deshabilitar Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ TexMMPX = TexMMPX +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpino diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 0196e1468c..fc2c82648c 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Se ha detectado un archivo ZIP.\nUtiliza UnR ZIP file detected (Require WINRAR) = Se ha detectado un archivo ZIP.\nUtiliza compresores como WinRar o WinZip para descomprimirlo. [Game] +Are you sure you want to create a game-specific config? = ¿Estás seguro de que quieres crear una configuración específica para el juego? # AI translated Are you sure you want to reset the played time counter? = ¿Está seguro de que desea reiniciar el contador de tiempo jugado? # AI translated Asia = Asia Calculate CRC = Calcular valor CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Datos de puerto desconocido Auto = Auto Autoconfigure = Autoconfigurar -Change Mac Address = Cambiar dirección MAC -Change proAdhocServer Address = Cambiar dirección IP de\nservidor PRO Adhoc (localhost = multiples instancias) +Change proAdhocServer Address = Cambiar dirección IP de\nservidor ad hoc (localhost = multiples instancias) Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = ¿Generar una nueva dirección MAC? ChangeMacSaveWarning = Algunos juegos verifican la dirección MAC al cargar datos guardados, por lo que esto puede dañar los guardados antiguos. @@ -995,7 +995,7 @@ Custom server list = Lista de servidores personalizados # AI translated Disconnected from AdhocServer = Desconectado del servidor Adhoc DNS Error Resolving = Resolviendo error DNS DNS server = DNS server -Enable built-in PRO Adhoc Server = Activar servidor Adhoc PRO integrado +Enable built-in ad hoc server = Activar servidor ad hoc 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) @@ -1020,6 +1020,7 @@ Infrastructure = Infraestructura Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = IP o nombre de host no válido Local network addresses = Direcciones de red local # AI translated +MAC address = Cambiar dirección MAC Minimum Timeout = Tiempo de espera mínimo (en ms, 0 = por defecto) Misc = Otros ajustes (por defecto = compatibilidad con PSP) Network connected = Red conectada @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Modo P2P # AI translated PacketRelayHint = Disponible en servidores que proporcionan el relé de paquetes 'aemu_postoffice', como socom.cc. Desactívelo para jugar en LAN o VPN. Puede ser más confiable, pero a veces más lento. Please change your Port Offset = Por favor cambia el offset del puerto. -Port offset = Variar puerto de red (0 = compatibilidad con PSP) Open PPSSPP Multiplayer Wiki Page = Página wiki sobre PPSSPP Ad-Hoc +Port offset = Variar puerto de red +PortOffsetHint = El desplazamiento de puerto predeterminado es 10000. Cambia a 0 para la compatibilidad con las consolas PSP sin modificar. # AI translated Public server list = Lista de servidores públicos # AI translated 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 +Quick start guide for multiplayer = Guía rápida de inicio para multijugador # AI translated QuickChat = Chat rápido Randomize = Randomize Relay server mode = Modo de servidor de retransmisión # AI translated @@ -1519,6 +1522,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 378209a0a7..22a26a56dd 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = ‎\n.فشرده سازی شده است ZIP ZIP file detected (Require WINRAR) = ‎\n.فشرده سازی شده است ZIP این فایل با فرمت\n.آن را از حالت فشرده خارج کنید WinRAR لطفا با نرم افزار [Game] +Are you sure you want to create a game-specific config? = آیا مطمئن هستید که می‌خواهید یک پیکربندی خاص بازی ایجاد کنید؟ # AI translated Are you sure you want to reset the played time counter? = آیا مطمئن هستید که می‌خواهید شمارنده زمان بازی شده را بازنشانی کنید؟ # AI translated Asia = اسیا Calculate CRC = Calculate CRC @@ -979,7 +980,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = خودکار Autoconfigure = Autoconfigure -Change Mac Address = تغییر آدرس مک Change proAdhocServer Address = ویرایش آدرس IP سرور ادهاک (localhost = چند نمونه) Change proAdhocServer address hint = (localhost = چند نمونه) ChangeMacSaveConfirm = ایجاد آدرس مک جدید؟ @@ -995,7 +995,7 @@ Custom server list = فهرست سرورهای سفارشی # AI translated Disconnected from AdhocServer = از سرور ادهاک جدا شدید. DNS Error Resolving = خطا در دریافت DNS DNS server = DNS server -Enable built-in PRO Adhoc Server = فعال کردن سرور ادهاک داخلی +Enable built-in ad hoc server = فعال کردن سرور ادهاک داخلی Enable network chat = فعال کردن گپ درون شبکه Enable networking = فعال کردن شبکه/WLAN Enable UPnP = فعال کردن UPnP (شناسایی چند ثانیه طول می‌کشد) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = IP یا نام میزبان نامعتبر Local network addresses = آدرس‌های شبکه محلی # AI translated +MAC address = تغییر آدرس مک Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = متفرقه (پیش‌فرض = سازگاری با PSP) Network connected = شبکه متصل شد @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = حالت P2P # AI translated PacketRelayHint = در دسترس بر روی سرورهایی که انتقال بسته 'aemu_postoffice' را ارائه می‌دهند، مانند socom.cc. این را برای بازی LAN یا VPN غیرفعال کنید. می‌تواند قابل اعتمادتر باشد، اما گاهی اوقات کندتر. Please change your Port Offset = لطفا port offset را تغییر دهید -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = باز کردن ویکی چندنفره PPSSPP +Port offset = Port offset +PortOffsetHint = پرت‌افزار پیش‌فرض 10000 است. آن را به 0 تغییر دهید تا با کنسول‌های PSP بدون تغییر سازگار شود. # AI translated Public server list = فهرست سرورهای عمومی # AI translated Quick Chat 1 = گپ سریع ۱ Quick Chat 2 = گپ سریع ۲ Quick Chat 3 = گپ سریع ۳ Quick Chat 4 = گپ سریع ۴ Quick Chat 5 = گپ سریع ۵ +Quick start guide for multiplayer = راهنمای شروع سریع برای چندنفره # AI translated QuickChat = گپ سریع Randomize = تصادفی‌سازی Relay server mode = حالت سرور رله # AI translated @@ -1517,6 +1520,7 @@ Off = خاموش TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 8952c1fb87..bfe762b55a 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Tiedosto on pakattu (ZIP).\nPura ensin (esim ZIP file detected (Require WINRAR) = Tiedosto on pakattu (ZIP).\nPura ensin (esim. WinRAR). [Game] +Are you sure you want to create a game-specific config? = Oletko varma, että haluat luoda pelikohtaisen asetuksen? # AI translated Are you sure you want to reset the played time counter? = Oletko varma, että haluat nollata pelattujen aikojen laskurin? # AI translated Asia = Aasia Calculate CRC = Laske CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Automaattinen Autoconfigure = Autoconfigure -Change Mac Address = Vaihda MAC-osoite -Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Change proAdhocServer Address = Change ad hoc server IP address (localhost = multiple instances) Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Mukautettu palvelinlistar # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Paikalliset verkkosositteet # AI translated +MAC address = Vaihda MAC-osoite Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P-tila # AI translated PacketRelayHint = Saatavilla palvelimilla, jotka tarjoavat 'aemu_postoffice' -pakettivälityksen, kuten socom.cc. Poista tämä käytöstä LAN- tai VPN-pelissä. Voi olla luotettavampi, mutta joskus hitaampi. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Oletusporttiosuus on 10000. Muuta se 0:ksi yhteensopivaksi muokkaamattomien PSP-konsolien kanssa. # AI translated Public server list = Julkisten palvelimien lista # AI translated 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 +Quick start guide for multiplayer = Nopea aloitusopas moninpelille # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Väyläpalvelimen tila # AI translated @@ -1517,6 +1520,7 @@ Off = Pois TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index c028dd4cf7..ea5fc3a3fa 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Le fichier est compressé (.zip).\nVeuillez ZIP file detected (Require WINRAR) = Le fichier est compressé (.zip).\nVeuillez d'abord le décompresser (essayez WinRAR). [Game] +Are you sure you want to create a game-specific config? = Êtes-vous sûr de vouloir créer une configuration spécifique au jeu ? # AI translated Are you sure you want to reset the played time counter? = Êtes-vous sûr de vouloir réinitialiser le compteur de temps de jeu ? # AI translated Asia = Asie Calculate CRC = Calculate CRC @@ -979,7 +980,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Automatique Autoconfigure = Autoconfigure -Change Mac Address = Modifier l'adresse MAC Change proAdhocServer Address = Modifier l'adresse IP du serveur ad hoc Change proAdhocServer address hint = (localhost = plusieurs instances) ChangeMacSaveConfirm = Generate a new MAC address? @@ -995,7 +995,7 @@ Custom server list = Liste de serveurs personnalisés # AI translated Disconnected from AdhocServer = Déconnecté du serveur ad hoc DNS Error Resolving = Erreur DNS pour résoudre DNS server = DNS server -Enable built-in PRO Adhoc Server = Activer le serveur ad hoc intégré +Enable built-in ad hoc server = Activer le serveur ad hoc intégré Enable network chat = Activer le chat Enable networking = Activer le réseau/WLAN Enable UPnP = Activer UPnP (nécessite quelques secondes pour la détection) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = IP ou nom de domaine invalide Local network addresses = Adresses réseau locales # AI translated +MAC address = Modifier l'adresse MAC Minimum Timeout = Temps d'expiration minimum (forçage en ms, 0 = par défaut) Misc = Divers (par défaut = compatibilité PSP) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Mode P2P # AI translated PacketRelayHint = Disponible sur des serveurs proposant le relais de paquets 'aemu_postoffice', comme socom.cc. Désactivez cela pour le jeu en LAN ou VPN. Peut être plus fiable, mais parfois plus lent. Please change your Port Offset = Veuillez changer votre décalage de port -Port offset = Décalage de port (0 = compatibilité PSP) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Décalage de port +PortOffsetHint = Le décalage de port par défaut est de 10000. Changez-le en 0 pour compatibilité avec des consoles PSP non modifiées. # AI translated Public server list = Liste des serveurs publics # AI translated Quick Chat 1 = Chat rapide 1 Quick Chat 2 = Chat rapide 2 Quick Chat 3 = Chat rapide 3 Quick Chat 4 = Chat rapide 4 Quick Chat 5 = Chat rapide 5 +Quick start guide for multiplayer = Guide de démarrage rapide pour multijoueur # AI translated QuickChat = Chat rapide Randomize = Randomize Relay server mode = Mode serveur relais # AI translated @@ -1508,6 +1511,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 6afdaad6b2..8b5b72a1ae 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Arquivo comprimido (ZIP).\nNecesita ser desc ZIP file detected (Require WINRAR) = Arquivo comprimido (ZIP).\nNecesita ser descomprimido (usa WinRAR). [Game] +Are you sure you want to create a game-specific config? = Está seguro de que quere crear unha configuración específica do xogo? # AI translated Are you sure you want to reset the played time counter? = Está seguro de que quere restablecer o contador de tempo xogado? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,7 +980,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Cambiar dirección MAC Change proAdhocServer Address = Cambiar IP de proAdhocServer Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? @@ -995,7 +995,7 @@ Custom server list = Lista de servidores personalizados # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Activar servidor Adhoc PRO integrado +Enable built-in ad hoc server = Activar servidor ad hoc integrado Enable network chat = Enable network chat Enable networking = Activar xogo en rede/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Direccións de rede local # AI translated +MAC address = Cambiar dirección MAC Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Modo P2P # AI translated PacketRelayHint = Disponible en servidores que ofrecen o relé de paquetes 'aemu_postoffice', como socom.cc. Desactívao para xogar en LAN ou VPN. Pode ser máis fiable, pero ás veces máis lento. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = O offset de puerto por defecto é 10000. Cambia a 0 para compatibilidade coas consolas PSP sen modificar. # AI translated Public server list = Lista de servidores públicos # AI translated 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 +Quick start guide for multiplayer = Guía rápida para multijugador # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Modo servidor de retransmisión # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 13648287c9..44b9f1e6a8 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Το αρχείο είναι συμπισμ ZIP file detected (Require WINRAR) = Το αρχείο είναι συμπισμένο (ZIP).\nΠαρακαλώ αποσυμπιέστε το πρώτα (δοκιμάστε το WinRAR). [Game] +Are you sure you want to create a game-specific config? = Είστε σίγουρος ότι θέλετε να δημιουργήσετε μια ρυθμίσεις συγκεκριμένη για το παιχνίδι; # AI translated Are you sure you want to reset the played time counter? = Είστε σίγουρος ότι θέλετε να επαναφέρετε τον μετρητή χρόνου παιχνιδιού; # AI translated Asia = Ασία Calculate CRC = Calculate CRC @@ -979,7 +980,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Αλλαγή φυσικής διεύθυνσης (MAC) Change proAdhocServer Address = Αλλαγή διεύθυνσης IP proAdhocServer Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? @@ -995,7 +995,7 @@ Custom server list = Λίστα προσαρμοσμένων διακομιστ Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Ενεργοποίηση ενσωματωμένου PRO Adhoc Server +Enable built-in ad hoc server = Ενεργοποίηση ενσωματωμένου ad hoc Server Enable network chat = Enable network chat Enable networking = Ενεργοποίηση Δικτύου/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Μη έγκυρη IP or hostname Local network addresses = Τοπικές διευθύνσεις δικτύου # AI translated +MAC address = Αλλαγή φυσικής διεύθυνσης (MAC) Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Λειτουργία P2P # AI translated PacketRelayHint = Διαθέσιμο σε διακομιστές που παρέχουν τη μετάδοση πακέτων 'aemu_postoffice', όπως το socom.cc. Απενεργοποιήστε αυτό για παιχνίδι LAN ή VPN. Μπορεί να είναι πιο αξιόπιστο, αλλά μερικές φορές πιο αργό. Please change your Port Offset = Please change your port offset -Port offset = Offset πήλης(0 = για συμβατότητα PSP) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Offset πήλης +PortOffsetHint = Η προεπιλεγμένη μετατόπιση θύρας είναι 10000. Αλλάξτε την σε 0 για συμβατότητα με μη τροποποιημένες κονσόλες PSP. # AI translated Public server list = Λίστα δημόσιων διακομιστών # AI translated 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 +Quick start guide for multiplayer = Γρήγορος οδηγός εκκίνησης για multiplayer # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Λειτουργία διακομιστή αναμετάδοσης # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index 034f5c9300..eb2932d9cb 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = האם אתה בטוח שאתה רוצה ליצור קביעת תצורה ספציפית למשחק? # AI translated Are you sure you want to reset the played time counter? = האם אתה בטוח שברצונך לאפס את ספירת זמן המשחק? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = רשימת שרתים מותאמים אישית # AI transl Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = כתובות רשת מקומיות # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = מצב P2P # AI translated PacketRelayHint = זמין בשרתים המספקים העברת מנות 'aemu_postoffice', כמו socom.cc. השבת זאת למשחק LAN או VPN. עשוי להיות אמין יותר, אך לפעמים איטי יותר. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = הסטיית פורט ברירת המחדל היא 10000. שנה אותה ל-0 כדי להתאים לקונסולות PSP ללא שינוי. # AI translated Public server list = רשימת שרתים ציבוריים # AI translated 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 +Quick start guide for multiplayer = מדריך התחלה מהירה עבור ריבוי משתתפים # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = מצב שרת ריליי # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 08e1c00bae..f2b27a54d6 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = האם אתה בטוח שאתה רוצה ליצור קביעת תצורה ספציפית למשחק? # AI translated Are you sure you want to reset the played time counter? = האם אתה בטוח שברצונך לאפס את ספירת זמן המשחק? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = שרתים מותאמים אישית # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = םילוק תוקל תודע # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = מצב P2P # AI translated PacketRelayHint = זמין בשרתים המספקים העברת מנות 'aemu_postoffice', כמו socom.cc. השבת זאת למשחק LAN או VPN. עשוי להיות אמין יותר, אך לפעמים איטי יותר. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = הסטיית פורט ברירת המחדל היא 10000. שנה אותה ל-0 כדי להתאים לקונסולות PSP ללא שינוי. # AI translated Public server list = רתש ביב;רשימה # AI translated 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 +Quick start guide for multiplayer = ריבוי משתתפים עבור מהירה התחלה מדריך # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = מצב שרת ריליי # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index d04e02ef10..8da0995240 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Datoteka je pakirana (ZIP).\nPrvo raspakiraj ZIP file detected (Require WINRAR) = Datoteka je pakirana (ZIP).\nPrvo raspakirajte (probaj WinRAR). [Game] +Are you sure you want to create a game-specific config? = Jeste li sigurni da želite stvoriti konfiguraciju specifičnu za igru? # AI translated Are you sure you want to reset the played time counter? = Jeste li sigurni da želite resetirati brojač vremena odigranog? # AI translated Asia = Azija Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Promijeni MAC addresu -Change proAdhocServer Address = Promijeni PRO ad hoc server IP addresu +Change proAdhocServer Address = Promijeni ad hoc server IP addresu Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Popis prilagođenih poslužitelja # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Uključi ugrađen PRO ad hoc server +Enable built-in ad hoc server = Uključi ugrađen ad hoc server Enable network chat = Enable network chat Enable networking = Uključi networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Nevažeći IP ili domaćin Local network addresses = Lokalne mrežne adrese # AI translated +MAC address = Promijeni MAC addresu Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P način # AI translated PacketRelayHint = Dostupno na poslužiteljima koji pružaju 'aemu_postoffice' prijenos paketa, poput socom.cc. Onemogućite ovo za LAN ili VPN igre. Može biti pouzdanije, ali ponekad sporije. Please change your Port Offset = Please change your port offset -Port offset = Port offset (0 = PSP kompatibilnost) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Zadani pomak porta je 10000. Promijenite ga na 0 radi kompatibilnosti s neizmijenjenim PSP konzolama. # AI translated Public server list = Popis javnih poslužitelja # AI translated 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 +Quick start guide for multiplayer = Brzi vodič za više igrača # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Način relay servera # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 30634b4a52..22f2fe412e 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = A fájl tömörített (ZIP).\nElőbb csomago ZIP file detected (Require WINRAR) = A fájl tömörített (ZIP).\nElőbb csomagold ki (próbáld WinRAR-ral). [Game] +Are you sure you want to create a game-specific config? = Biztos, hogy létre akar hozni egy játék-specifikus konfigurációt? # AI translated Are you sure you want to reset the played time counter? = Biztos benne, hogy vissza akarja állítani a lejátszott idő számlálót? # AI translated Asia = Ázsia Calculate CRC = CRC kiszámítása @@ -979,7 +980,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: ismeretlen portról származó adat Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = MAC cím megváltoztatása Change proAdhocServer Address = ProAdhoc szerver címe Change proAdhocServer address hint = (localhost = több példány) ChangeMacSaveConfirm = Biztosan új MAC címet generálsz? @@ -995,7 +995,7 @@ Custom server list = Személyre szabott szerverlista # AI translated Disconnected from AdhocServer = Lecsatlakozva az ad hoc szerverről DNS Error Resolving = DNS feloldási hiba DNS server = DNS server -Enable built-in PRO Adhoc Server = Beépített ProAdhoc szerver engedélyezése +Enable built-in ad hoc server = Beépített ProAdhoc szerver engedélyezése Enable network chat = Chat engedélyezése Enable networking = Hálózat/WLAN engedélyezése Enable UPnP = UPnP engedélyezése (pár mp az észlelésig) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Érvénytelen IP vagy hostnév Local network addresses = Helyi hálózati címek # AI translated +MAC address = MAC cím megváltoztatása Minimum Timeout = Minimum időtúllépés (felülírás ms-ban, 0 = default) Misc = Egyéb (alapértelmezett = PSP kompatibilitás) Network connected = Hálózat csatlakozva @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P mód # AI translated PacketRelayHint = Elérhető azokon a szervereken, amelyek 'aemu_postoffice' csomagátvitelt biztosítanak, mint például a socom.cc. Tiltsa le ezt LAN vagy VPN játékhoz. Lehet, hogy megbízhatóbb, de néha lassabb. Please change your Port Offset = Kérlek változtasd meg a port offsetet! -Port offset = Port eltolás/offset (0 = PSP kompatibilitás) Open PPSSPP Multiplayer Wiki Page = PPSSPP multiplayer wiki oldal megnyitása… (angolul) +Port offset = Port eltolás/offset +PortOffsetHint = Az alapértelmezett porteltolás 10000. Módosítsa 0-ra, hogy kompatibilis legyen a módosítatlan PSP konzolokkal. # AI translated Public server list = Nyilvános szerver lista # AI translated Quick Chat 1 = Gyorsüzenet 1 Quick Chat 2 = Gyorsüzenet 2 Quick Chat 3 = Gyorsüzenet 3 Quick Chat 4 = Gyorsüzenet 4 Quick Chat 5 = Gyorsüzenet 5 +Quick start guide for multiplayer = Gyors kezdő útmutató többjátékoshoz # AI translated QuickChat = Gyors chat Randomize = Véletlenszerű Relay server mode = Relay szerver mód # AI translated @@ -1517,6 +1520,7 @@ Off = Kikapcsolva TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index b79243281d..6f1df7c40b 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Berkas terkompresi (ZIP).\nSilakan ekstrak d ZIP file detected (Require WINRAR) = Berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba WinRAR). [Game] +Are you sure you want to create a game-specific config? = Apakah Anda yakin ingin membuat konfigurasi khusus permainan? # AI translated Are you sure you want to reset the played time counter? = Apakah Anda yakin ingin mereset penghitung waktu yang dimainkan? # AI translated Asia = Asia Calculate CRC = Kalkulasi CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Izinkan kontrol kecepata AM: Data from Unknown Port = AM: Data dari port tidak dikenal Auto = Otomatis Autoconfigure = Konfigurasi otomatis -Change Mac Address = Ganti alamat MAC -Change proAdhocServer Address = Ganti alamat IP pelayan PRO ad hoc (lokal) +Change proAdhocServer Address = Ganti alamat IP pelayan ad hoc (lokal) Change proAdhocServer address hint = (localhost = lebih dari satu instansi) ChangeMacSaveConfirm = Hasilkan alamat MAC baru? ChangeMacSaveWarning = Beberapa game memverifikasi alamat MAC saat memuat data tersimpan, jadi ini dapat merusak penyimpanan lama. @@ -995,7 +995,7 @@ Custom server list = Daftar server kustom # AI translated Disconnected from AdhocServer = Terputus dari server Ad Hoc DNS Error Resolving = Penyelesaian kesalahan DNS DNS server = Server DNS -Enable built-in PRO Adhoc Server = Hidupkan pelayan PRO Ad Hoc bawaan +Enable built-in ad hoc server = Hidupkan pelayan ad hoc bawaan Enable network chat = Aktifkan jaringan obrolan Enable networking = Hidupkan jaringan/WLAN Enable UPnP = Aktifkan UPnP (perlu beberapa detik untuk mendeteksi) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastruktur Infrastructure server provided by: = Server infrastruktur disediakan oleh: Invalid IP or hostname = IP atau nama host tidak valid Local network addresses = Alamat jaringan lokal # AI translated +MAC address = Ganti alamat MAC Minimum Timeout = Batas waktu minimum (batas dalam ms, 0 = bawaan) Misc = Lain-lain (bawaan= kompatibilitas PSP) Network connected = Tersambung ke jaringan @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Versi lain dari game ini yang se P2P mode = Mode P2P # AI translated PacketRelayHint = Tersedia di server yang menyediakan relai paket 'aemu_postoffice', seperti socom.cc. Nonaktifkan ini untuk permainan LAN atau VPN. Bisa lebih handal, tetapi kadang-kadang lebih lambat. Please change your Port Offset = Harap ubah letak port Anda -Port offset = Letak port (0 = kecocokan dengan PSP) Open PPSSPP Multiplayer Wiki Page = Halaman Wiki PPSSPP Ad-Hoc +Port offset = Letak port +PortOffsetHint = Offset port default adalah 10000. Ubah ke 0 untuk kompatibilitas dengan konsol PSP yang tidak dimodifikasi. # AI translated Public server list = Daftar server publik # AI translated 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 +Quick start guide for multiplayer = Panduan cepat untuk multiplayer # AI translated QuickChat = Obrolan cepat Randomize = Acak Relay server mode = Mode server relay # AI translated @@ -1517,6 +1520,7 @@ Off = Mati TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index b6d3dc0545..a46426336b 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Il file è compresso (ZIP).\nPrima si deve d ZIP file detected (Require WINRAR) = Il file è compresso (ZIP).\nPrima si deve decomprimere (prova WinRAR). [Game] +Are you sure you want to create a game-specific config? = Sei sicuro di voler creare una configurazione specifica per il gioco? # AI translated Are you sure you want to reset the played time counter? = Sei sicuro di voler ripristinare il contatore del tempo di gioco? # AI translated Asia = Asia Calculate CRC = Calcola CRC @@ -947,7 +948,6 @@ Allow speed control while connected (not recommended) = Consenti il controllo de AM: Data from Unknown Port = AM: Dati da porta sconosciuta Auto = Auto Autoconfigure = Auto-configura -Change Mac Address = Cambia indirizzo MAC Change proAdhocServer Address = Cambia indirizzo server IP PRO ad hoc Change proAdhocServer address hint = (localhost = istanze multiple) ChangeMacSaveConfirm = Generare un nuovo indirizzo MAC? @@ -963,7 +963,7 @@ Custom server list = Elenco server personalizzati # AI translated Disconnected from AdhocServer = Disconnesso dal server ad hoc DNS Error Resolving = Errore risoluzione DNS DNS server = DNS server -Enable built-in PRO Adhoc Server = Attiva server integrato PRO ad hoc +Enable built-in ad hoc server = Attiva server integrato PRO ad hoc Enable network chat = Attiva chat di rete Enable networking = Attiva la rete/WLAN Enable UPnP = Attiva UPnP (serviranno pochi secondi per rilevarlo) @@ -988,6 +988,7 @@ Infrastructure = Infrastruttura Infrastructure server provided by: = Server infrastruttura fornito da: Invalid IP or hostname = Indirizzo IP o nome del dominio non valido Local network addresses = Indirizzi di rete locali # AI translated +MAC address = Cambia indirizzo MAC Minimum Timeout = Timeout minimo (forza in ms, 0 = predefinito) Misc = Varie (predefinito = compatibilità PSP) Network connected = Rete connessa @@ -997,14 +998,16 @@ Other versions of this game that should work: = Altre versioni di questo gioco c P2P mode = Modalità P2P # AI translated PacketRelayHint = Disponibile su server che forniscono il relay di pacchetti 'aemu_postoffice', come socom.cc. Disabilita questo per il gioco LAN o VPN. Può essere più affidabile, ma a volte più lento. Please change your Port Offset = Prego, cambiare l'offset della porta -Port offset = Offset Porta (0 = compatibilità PSP) Open PPSSPP Multiplayer Wiki Page = Pagina Wiki Ad-Hoc PPSSPP +Port offset = Offset Porta +PortOffsetHint = L'offset di porta predefinito è 10000. Modificalo a 0 per la compatibilità con le console PSP non modificate. # AI translated Public server list = Elenco server pubblici # AI translated Quick Chat 1 = Chat rapida 1 Quick Chat 2 = Chat rapida 2 Quick Chat 3 = Chat rapida 3 Quick Chat 4 = Chat rapida 4 Quick Chat 5 = Chat rapida 5 +Quick start guide for multiplayer = Guida rapida per il multiplayer # AI translated QuickChat = Chat rapida Randomize = Randomizza Relay server mode = Modalità server relay # AI translated @@ -1521,6 +1524,7 @@ Off = Disattiva TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index b4814dad7a..3cdd80ad6e 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = ファイルが圧縮されています (ZIP ZIP file detected (Require WINRAR) = ファイルが圧縮されています (ZIP)。\nまず解凍してください (WinRARを使う)。 [Game] +Are you sure you want to create a game-specific config? = ゲーム固有の設定を作成してもよろしいですか? # AI translated Are you sure you want to reset the played time counter? = プレイ時間カウンターをリセットしてもよろしいですか? # AI translated Asia = アジア Calculate CRC = CRCを算出 @@ -946,7 +947,6 @@ Allow speed control while connected (not recommended) = 接続中に速度制御 AM: Data from Unknown Port = AM: 不明なポートからのデータ Auto = 自動 Autoconfigure = DNSの自動構成 -Change Mac Address = MACアドレスを変更する Change proAdhocServer Address = PROアドホックサーバのIPアドレスを変更する Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = 新しいMACアドレスを生成しますか? @@ -962,7 +962,7 @@ Custom server list = カスタムサーバーリスト # AI translated Disconnected from AdhocServer = アドホックサーバーから切断する DNS Error Resolving = DNSエラーの解決 DNS server = DNSサーバー -Enable built-in PRO Adhoc Server = 内蔵PROアドホックサーバーを有効にする +Enable built-in ad hoc server = 内蔵PROアドホックサーバーを有効にする Enable network chat = ネットワークチャットを有効にする Enable networking = ネットワーク/WLANを有効にする Enable UPnP = UPnPを有効にする (検出に数秒必要) @@ -987,6 +987,7 @@ Infrastructure = インフラストラクチャモード Infrastructure server provided by: = インフラストラクチャ サーバーの提供元: Invalid IP or hostname = 無効なIPまたはホスト名 Local network addresses = ローカルネットワークアドレス # AI translated +MAC address = MACアドレスを変更する Minimum Timeout = 最小タイムアウト (低遅延をオーバーライド、単位ms) Misc = その他 (デフォルト = PSP互換) Network connected = ネットワークに接続完了 @@ -996,14 +997,16 @@ Other versions of this game that should work: = このゲームで動作する P2P mode = P2Pモード # AI translated PacketRelayHint = socom.ccのように、'aemu_postoffice'パケットリレーを提供するサーバーで利用可能です。LANまたはVPNプレイにはこれを無効にしてください。信頼性が高い場合もありますが、時には遅いことがあります。 Please change your Port Offset = ポートオフセットを変更してください -Port offset = ポートオフセット (0 = PSP互換) Open PPSSPP Multiplayer Wiki Page = PPSSPPのアドホック接続Wikiページを開く (英語) +Port offset = ポートオフセット +PortOffsetHint = デフォルトのポートオフセットは10000です。修正されていないPSPコンソールと互換性を持たせるために0に変更してください。 # AI translated Public server list = パブリックサーバーリスト # AI translated Quick Chat 1 = クイックチャット1 Quick Chat 2 = クイックチャット2 Quick Chat 3 = クイックチャット3 Quick Chat 4 = クイックチャット4 Quick Chat 5 = クイックチャット5 +Quick start guide for multiplayer = マルチプレイヤーのクイックスタートガイド # AI translated QuickChat = クイックチャット Randomize = ランダム化 Relay server mode = リレサーバーモード # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = 高山 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 5c583ed125..768db4edc3 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = berkas iki terkompres (ZIP).\nMohon bongkar ZIP file detected (Require WINRAR) = berkas iki terkompres (ZIP).\nMohon bongkar dahulu (coba WinRAR). [Game] +Are you sure you want to create a game-specific config? = Apa sampeyan yakin sampeyan pengin nggawe konfigurasi khusus game? # AI translated Are you sure you want to reset the played time counter? = Apa sampeyan yakin pengen mbalekake counter wektu sing wis diputer? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Ubah alamat MAC -Change proAdhocServer Address = Ubah alamat pelayan IP PRO ad hoc +Change proAdhocServer Address = Ubah alamat pelayan IP ad hoc Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Dhaptar server kustom # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Ngatifke pelayan PRO ad hoc bawaan +Enable built-in ad hoc server = Ngatifke pelayan ad hoc bawaan Enable network chat = Enable network chat Enable networking = Ngatifke jaringan/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Alamat jaringan lokal # AI translated +MAC address = Ubah alamat MAC Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Mode P2P # AI translated PacketRelayHint = Tersedia ing server sing nyedhiyakake relai paket 'aemu_postoffice', kaya socom.cc. Nonaktifake iki kanggo dolanan LAN utawa VPN. Bisa luwih bisa dipercaya, nanging kadhangkala luwih alon. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Offset port standar yaiku 10000. Ganti dadi 0 kanggo kompatibilitas karo konsol PSP sing ora dimodifikasi. # AI translated Public server list = Dhaptar server publik # AI translated 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 +Quick start guide for multiplayer = Pandhuan wiwitan cepet kanggo multiplayer # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Mode server relay # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index a45b919586..fd6730db93 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = 파일은 (ZIP으로) 압축되어 있습니 ZIP file detected (Require WINRAR) = 파일은 (ZIP으로) 압축되어 있습니다.\n먼저 압축을 해제하세요 (WinRAR 시도). [Game] +Are you sure you want to create a game-specific config? = 게임 전용 구성 생성을 원하십니까? # AI translated Are you sure you want to reset the played time counter? = 재생 시간 카운터를 재설정하시겠습니까? # AI translated Asia = 아시아 Calculate CRC = CRC 계산 @@ -946,11 +947,10 @@ Allow speed control while connected (not recommended) = 연결된 동안 속도 AM: Data from Unknown Port = AM: 알 수 없는 포트의 데이터 Auto = 자동 Autoconfigure = 자동구성 -Change Mac Address = MAC 주소 변경 Change proAdhocServer address hint = (로컬호스트 = 다중 인스턴스) ChangeMacSaveConfirm = 새로운 MAC 주소를 생성하겠습니까? ChangeMacSaveWarning = 일부 게임은 저장 데이터를 불러올 때 MAC 주소를 확인하므로 이전 저장이 손상될 수 있습니다. -Change proAdhocServer Address = PRO ad hoc 서버 IP 주소 변경 +Change proAdhocServer Address = Ad hoc 서버 IP 주소 변경 Chat = 채팅 Chat Button Position = 채팅 버튼 위치 Chat Here = 여기에서 채팅 @@ -962,7 +962,7 @@ Custom server list = 사용자 지정 서버 목록 # AI translated Disconnected from AdhocServer = Ad Hoc 서버에서 연결 해제됨 DNS Error Resolving = DNS 오류 해결 DNS server = DNS 서버 -Enable built-in PRO Adhoc Server = 내장 PRO Ad Hoc 서버 활성화 +Enable built-in ad hoc server = 내장 ad hoc 서버 활성화 Enable network chat = 네트워크 채팅 활성화 Enable networking = 네트워킹/무선랜 활성화 Enable UPnP = UPnP 활성화 (감지하는 데 몇 초 필요) @@ -987,6 +987,7 @@ Infrastructure = 인프라 Infrastructure server provided by: = 다음의 인프라 서버 제공: Invalid IP or hostname = 잘못된 IP 또는 호스트 이름 Local network addresses = 로컬 네트워크 주소 # AI translated +MAC address = MAC 주소 변경 Minimum Timeout = 최소 시간 초과 (ms 단위로 재정의, 0 = 기본값) Misc = 기타 (기본값 = PSP 호환성) Network connected = 네트워크 연결됨 @@ -996,14 +997,16 @@ Other versions of this game that should work: = 작동해야 하는 이 게임 P2P mode = P2P 모드 # AI translated PacketRelayHint = socom.cc와 같이 'aemu_postoffice' 패킷 릴레이를 제공하는 서버에서 사용할 수 있습니다. LAN 또는 VPN 게임을 위해 이를 비활성화하십시오. 보다 신뢰할 수 있지만 때때로 느릴 수 있습니다. Please change your Port Offset = 포트 오프셋을 변경하세요. -Port offset = 포트 오프셋 (0 = PSP 호환성) Open PPSSPP Multiplayer Wiki Page = PPSSPP 멀티플레이어 위키 페이지 열기 +Port offset = 포트 오프셋 +PortOffsetHint = 기본 포트 오프셋은 10000입니다. 수정되지 않은 PSP 콘솔과의 호환성을 위해 0으로 변경하세요. # AI translated Public server list = 공개 서버 목록 # AI translated Quick Chat 1 = 빠른 채팅 1 Quick Chat 2 = 빠른 채팅 2 Quick Chat 3 = 빠른 채팅 3 Quick Chat 4 = 빠른 채팅 4 Quick Chat 5 = 빠른 채팅 5 +Quick start guide for multiplayer = 멀티플레이어용 빠른 시작 가이드 # AI translated QuickChat = 빠른 채팅 Randomize = 무작위화 Relay server mode = 릴레이 서버 모드 # AI translated @@ -1517,6 +1520,7 @@ Off = 끔 TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = '%1'과(와) 일치하는 설정이 없음 diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index 442fdb8357..166573b114 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -587,6 +587,7 @@ ZIP file detected (Require UnRAR) = File is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = File is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = Ma waxaad hubtaa inaad rabto inaad abuurto qaabeynta gaarka ah ee ciyaarta? # AI translated Are you sure you want to reset the played time counter? = ماپۆلین تۆ بەرز دەکەیت بەرەوی ئەوەی کە حەسەبەری کات لە بازین بپەرنەوە؟ # AI translated Asia = ئاسیا Calculate CRC = Calculate CRC @@ -960,11 +961,10 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Chat = Chat Chat Button Position = Chat button position Chat Here = Chat here @@ -976,7 +976,7 @@ Custom server list = Lîsteya serveran a taybet # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1001,6 +1001,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Navnîşanên torê xwe # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1010,14 +1011,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Rejîma P2P # AI translated PacketRelayHint = Li ser serverên ku 'aemu_postoffice' paşverevaniya pakêtê pêşkêş dikin, wek socom.cc, amade ye. Ev ji bo lîstokê LAN an VPN vekirînin. Dikare be îtimadî bêtin, lê hinek caran hêsan e. Please change your Port Offset = Please change your port offset -Port offset = Port offset (0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Hêza portê default 10000 e. Bihêlin 0 bo compatibilitiyê bi konsolên PSP yên neşûndekirî. # AI translated Public server list = Lîsteya serverên giştî # AI translated 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 +Quick start guide for multiplayer = Hidalgoya destpêkê ya zû ji bo multiplayer # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Rejim serverê relê # AI translated @@ -1531,6 +1534,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = No settings matched '%1' diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 820dc35215..e70752cb32 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = ໄຟລຖືກບີບອັດ (ZIP).\ ZIP file detected (Require WINRAR) = ໄຟລ໌ຖືກບີບອັດ (ZIP).\nກະລຸນາແຕກໄຟລ໌ກ່ອນ (ລອງໃຊ້ WinRAR). [Game] +Are you sure you want to create a game-specific config? = ອາດຈະຫມານບໍລິເສດວັງຢູ່ຄຸ້ມຄ່ານຄວາມອອກໄວ່ດ້ວຍ? # AI translated Are you sure you want to reset the played time counter? = ທ່ານແນ່ໃ່ແລ້ວບໍ່ວ່າຈະບັນທຶກປະເພດໃນໄວ່ລຳບົບຄະແນນຂອງຄວາມປິ່ນປູກ? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = ປ່ຽນຄ່າທີ່ຢູ່ MAC -Change proAdhocServer Address = ປ່ຽນໄອພີທີ່ຢູ່ຂອງເຊີບເວີ Pro Adhoc +Change proAdhocServer Address = ປ່ຽນໄອພີທີ່ຢູ່ຂອງເຊີບເວີ ad hoc Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = ລາຍຊື່ເຄື່ອງສົ່ງປັບ Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = ເປີດການໃຊ້ງານເຊີບເວີ PRO Adhoc +Enable built-in ad hoc server = ເປີດການໃຊ້ງານເຊີບເວີ ad hoc Enable network chat = Enable network chat Enable networking = ເປີດການໃຊ້ງານລະບົບເຄື່ອຂ່າຍ / WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = ທີ່ຢູ່ເຄືອຄ່າສັນທາງໃນແລະ # AI translated +MAC address = ປ່ຽນຄ່າທີ່ຢູ່ MAC Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = ແບບ P2P # AI translated PacketRelayHint = ມີໃຫ້ໃນເຊິ່ອບບໍ່ດຽວກັນໃນເຊິ່ອບ 'aemu_postoffice' ຂອງບໍ່ດຽວ , ເຊັ່ນນໍາ socom.cc. ປິດການນີ້ໃນການເລີ່ມງານ LAN ຫຼື VPN. ສາມາດເປັນຄວາມເຊື່ອງໄດ້, ແຕ່ບໍ່ໄດ້ສະເລີຍບໍ່ສະເພາະແຂງ. Please change your Port Offset = Please change your port offset -Port offset = ພອຣ໌ດຊົດເຊີຍ (0 = ຄ່າເລີ່ມຕົ້ນຂອງ PSP) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = ພອຣ໌ດຊົດເຊີຍ +PortOffsetHint = ຄໍາສັ່ງສະຖານທີ່ດັ່ງໃຈ 10000 ຄືການແປຄັນໃຈ. ແກ້ໄຂເປັນ 0 ສໍາລັບການສ຺ບຄັດເພື່ອໃຫ້ບວກສຽງ. # AI translated Public server list = ບຽິກລາຍຊື່ສະເຖິບສາດສາທ່ຽມສໍາພັນ # AI translated 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 +Quick start guide for multiplayer = ຄູ່ມື ສໍາລັບ ການເປີດໃໝ່ ສໍາລັບ ມິດບໍລອດ # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = ແບບເຄື່ອງລົດລາ # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 302c1f90dc..d61fb14e96 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Failas yra suspaustas (ZIP formato).\nReikia ZIP file detected (Require WINRAR) = Failas yra suspaustas (ZIP formato).\nReikia išpausti jį (pabandykite WinRAR). [Game] +Are you sure you want to create a game-specific config? = Ar tikrai norite sukurti žaidimui specifinę konfigūraciją? # AI translated Are you sure you want to reset the played time counter? = Ar tikrai norite iš naujo nustatyti sužaisto laiko skaitiklį? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Pritaikytų serverių sąrašas # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Vietiniai tinklo adresai # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P režimas # AI translated PacketRelayHint = Pasiekiama serveriuose, kurie teikia 'aemu_postoffice' paketų perdavimą, pvz., socom.cc. Išjunkite tai LAN arba VPN žaidimams. Gali būti patikimesnis, bet kartais lėtesnis. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Numatytas prievado poslinkis yra 10000. Pakeiskite jį į 0, kad būti suderinamu su nepakeistomis PSP konsolėmis. # AI translated Public server list = Viešųjų serverių sąrašas # AI translated 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 +Quick start guide for multiplayer = Greitas pradžios vadovas daugialyčiams # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Relės serverio režimas # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index cb5122a925..2c3079c375 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Fail dimampatkan (ZIP).\nSila nyah-mampatkan ZIP file detected (Require WINRAR) = Fail dimampatkan (ZIP).\nSila nyah-mampatkan dahulu (cuba WinRAR). [Game] +Are you sure you want to create a game-specific config? = Adakah anda pasti ingin mencipta konfigurasi khusus permainan? # AI translated Are you sure you want to reset the played time counter? = Adakah anda pasti ingin menetapkan semula pengira masa yang dimainkan? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Change MAC address -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Senarai pelayan tersuai # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Alamat rangkaian tempatan # AI translated +MAC address = MAC address Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Mod P2P # AI translated PacketRelayHint = Tersedia di server yang menyediakan relay paket 'aemu_postoffice', seperti socom.cc. Matikan ini untuk permainan LAN atau VPN. Mungkin lebih dipercayai, tetapi kadang-kadang lebih perlahan. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Offset port lalai adalah 10000. Tukar kepada 0 untuk keserasian dengan konsol PSP yang tidak diubahsuai. # AI translated Public server list = Senarai pelayan awam # AI translated 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 +Quick start guide for multiplayer = Panduan permulaan cepat untuk permainan berbilang # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Mod pelayan relay # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index d16c47ca1d..24d743590e 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = het bestand is verkleind (ZIP).\nPak het bes ZIP file detected (Require WINRAR) = het bestand is verkleind (ZIP).\nPak het bestand eerst uit (probeer WinRAR) [Game] +Are you sure you want to create a game-specific config? = Weet je zeker dat je een spel-specifieke configuratie wilt maken? # AI translated Are you sure you want to reset the played time counter? = Weet je zeker dat je de afspeeltijd teller wilt resetten? # AI translated Asia = Azië Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = MAC-adres wijzigen -Change proAdhocServer Address = IP-adres van PRO Ad hoc-server wijzigen +Change proAdhocServer Address = IP-adres van ad hoc-server wijzigen Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Aangepaste serverlijst # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Ingebouwde PRO Ad hoc-server inschakelen +Enable built-in ad hoc server = Ingebouwde ad hoc-server inschakelen Enable network chat = Enable network chat Enable networking = Netwerk/WLAN inschakelen Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Lokale netwerkadressen # AI translated +MAC address = MAC-adres wijzigen Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P-modus # AI translated PacketRelayHint = Beschikbaar op servers die 'aemu_postoffice' pakketdoorsturing bieden, zoals socom.cc. Schakel dit uit voor LAN- of VPN-spel. Kan betrouwbaarder zijn, maar is soms langzamer. Please change your Port Offset = Please change your port offset -Port offset = Poortoffset (0 = PSP-compatibiliteit) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Poortoffset +PortOffsetHint = De standaardpoortenoffset is 10000. Wijzig deze naar 0 voor compatibiliteit met onveranderde PSP-consoles. # AI translated Public server list = Lijst met openbare servers # AI translated 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 +Quick start guide for multiplayer = Snelle startgids voor multiplayer # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Relayservermodus # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index 7b9356848a..9330d5cf7e 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). [Game] +Are you sure you want to create a game-specific config? = Er du sikker på at du vil opprette en spillspesifikk konfigurasjon? # AI translated Are you sure you want to reset the played time counter? = Er du sikker på at du vil tilbakestille teller for spiltid? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Auto-oppsett -Change Mac Address = Endre MAC-adresse -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Egendefinert serverliste # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Lokale nettverksadresser # AI translated +MAC address = Endre MAC-adresse Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = P2P-modus # AI translated PacketRelayHint = Tilgjengelig på servere som tilbyr 'aemu_postoffice' pakkeforbindelse, som socom.cc. Deaktiver dette for LAN- eller VPN-spill. Kan være mer pålitelig, men noen ganger tregere. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Standard portoffset er 10000. Endre det til 0 for kompatibilitet med UMODIFISERTE PSP-konsoller. # AI translated Public server list = Liste over offentlige servere # AI translated Quick Chat 1 = Hurtigchat 1 Quick Chat 2 = Hurtigchat 2 Quick Chat 3 = Hurtigchat 3 Quick Chat 4 = Hurtigchat 4 Quick Chat 5 = Hurtigchat 5 +Quick start guide for multiplayer = Rask startguide for flerspiller # AI translated QuickChat = Hurtigchat Randomize = Tilfeldiggjør Relay server mode = Relayservermodus # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpin diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 1dc48fd47a..f818f6d624 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -577,6 +577,7 @@ ZIP file detected (Require UnRAR) = Wykryto plik ZIP.\nRozpakuj go przed użycie ZIP file detected (Require WINRAR) = Wykryto plik ZIP.\nRozpakuj go przed użyciem (spróbuj WinRAR). [Game] +Are you sure you want to create a game-specific config? = Czy jesteś pewien, że chcesz utworzyć konfigurację specyficzną dla gry? # AI translated Are you sure you want to reset the played time counter? = Czy jesteś pewien, że chcesz zresetować licznik czasu gry? # AI translated Asia = Azja Calculate CRC = Oblicz sumę kontrolną (CRC) @@ -983,7 +984,6 @@ Allow speed control while connected (not recommended) = Zezwalaj na kontrolę pr AM: Data from Unknown Port = AM: Dane z nieznanego portu Auto = Automatycznie Autoconfigure = Automatyczna konfiguracja -Change Mac Address = Zmień adres MAC Change proAdhocServer Address = Zmień adres IP serwera PRO dla trybu ad hoc Change proAdhocServer address hint = (localhost = wiele instancji) ChangeMacSaveConfirm = Wygenerować nowy adres MAC? @@ -999,7 +999,7 @@ Custom server list = Lista serwerów dostosowanych # AI translated Disconnected from AdhocServer = Rozłączono z serwerem Ad-Hoc DNS Error Resolving = Rozwiązywanie błędów DNS DNS server = Serwer DNS -Enable built-in PRO Adhoc Server = Włącz wbudowany serwer PRO dla trybu Ad-Hoc +Enable built-in ad hoc server = Włącz wbudowany serwer PRO dla trybu Ad-Hoc Enable network chat = Uruchom czat Enable networking = Włącz sieć/WLAN Enable UPnP = Uruchom UPnP (potrzebuje kilka sekund na wykrycie) @@ -1025,6 +1025,7 @@ Infrastructure = Infrastruktura Infrastructure server provided by: = Infrastruktura serwera dostarczona przez: Invalid IP or hostname = Niepoprawny adres IP lub nazwa hosta Local network addresses = Adresy lokalnej sieci # AI translated +MAC address = Zmień adres MAC Minimum Timeout = Minimalny czas oczekiwania (podaj w ms, domyślnie 0) Misc = Inne (domyślnie = Kompatybilność z PSP) Network connected = Połączono do sieci @@ -1034,14 +1035,16 @@ Other versions of this game that should work: = Inne wersje tej gry, które powi P2P mode = Tryb P2P # AI translated PacketRelayHint = Dostępne na serwerach, które zapewniają przesył pakietów 'aemu_postoffice', takich jak socom.cc. Wyłącz to do gry w LAN lub VPN. Może być bardziej niezawodne, ale czasami wolniejsze. Please change your Port Offset = Proszę zmienić port -Port offset = Zmień port (0 = zgodne z PSP) Open PPSSPP Multiplayer Wiki Page = Przejdź do strony PPSSPP pomocy dla wielu graczy. +Port offset = Zmień port +PortOffsetHint = Domyślny offset portu to 10000. Zmień go na 0, aby uzyskać zgodność z niezmienionymi konsolami PSP. # AI translated Public server list = Lista publicznych serwerów # AI translated Quick Chat 1 = Szybki czat 1 Quick Chat 2 = Szybki czat 2 Quick Chat 3 = Szybki czat 3 Quick Chat 4 = Szybki czat 4 Quick Chat 5 = Szybki czat 5 +Quick start guide for multiplayer = Szybki przewodnik po trybie wieloosobowym # AI translated QuickChat = Szybki czat Randomize = Losuj Relay server mode = Tryb serwera relay # AI translated @@ -1525,6 +1528,7 @@ Off = Wył. TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index b056951973..22765dd181 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -85,7 +85,7 @@ This game has no achievements = Este jogo não tem conquistas Top players = Os melhores jogadores Unlocked = Destrancadas Unofficial = Não oficiais -Unofficial achievements = Conquistas não oficiais # AI translated +Unofficial achievements = Conquistas não oficiais Unsupported = Não suportadas Win = Vitórias @@ -354,8 +354,8 @@ Enable shader cache = Ativar o cache do shader Enter address = Inserir endereço Fast = Rápido Fragment = Fragmento +Framebuffer list = Lista do framebuffer FPU = FPU -Framebuffer list = Framebuffer list Framedump tests = Testes do dump dos frames Frame Profiler = Analista dos frames Frame timing = Tempo do frame @@ -415,7 +415,7 @@ VFPU = VFPU %d seconds = %d segundos * PSP res = * Resolução do PSP Active = Ativo -Are you sure you want to delete %1? = Tem certeza de que deseja excluir %1? # AI translated +Are you sure you want to delete %1? = Você tem certeza que você quer apagar o %1? Are you sure you want to delete the file? = Você tem certeza que você quer apagar o arquivo? Are you sure you want to exit? = Você tem certeza que você quer sair? Auto = Auto @@ -597,6 +597,7 @@ ZIP file detected (Require UnRAR) = O arquivo está comprimido (ZIP).\nPor favor ZIP file detected (Require WINRAR) = O arquivo está comprimido (ZIP).\nPor favor descomprima-o primeiro (tente o WinRAR). [Game] +Are you sure you want to create a game-specific config? = Você tem certeza de que deseja criar uma configuração específica para o jogo? # AI translated Are you sure you want to reset the played time counter? = Você tem certeza que você quer resetar o contador do tempo jogado? Asia = Ásia Calculate CRC = Calcular CRC @@ -882,8 +883,8 @@ Analog limiter = Limitador do analógico Analog speed = Velocidade do analógico Analog Stick = Direcional analógico Audio/Video Recording = Gravação de Áudio/Vídeo -Axis swap (hold) = Trocar eixos (segurar) # AI translated -Axis swap (toggle) = Trocar eixos (alternar) # AI translated +Axis swap (hold) = Trocar eixos (pressionado) +Axis swap (toggle) = Trocar eixos (alternar) Circle = Círculo Cross = Cruz Custom %d = Personalizar %d @@ -962,31 +963,30 @@ Display Portrait Reversed = Exibir Retrato Invertido [Networking] Ad Hoc multiplayer = Multiplayer do Ad Hoc -Ad hoc server address = Endereço do servidor ad-hoc: -Add server = Adicionar servidor # AI translated +Add server = Adicionar servidor AdHoc server = Servidor Ad-hoc +Ad hoc server address = Endereço do servidor Ad hoc AdhocServer Failed to Bind Port = O servidor Ad-hoc falhou em se associar com a porta Allow speed control while connected (not recommended) = Permitir controle de velocidade enquanto conectado (não recomendado) AM: Data from Unknown Port = AM: Dados de uma Porta Desconhecida Auto = Auto Autoconfigure = Auto-configurar -Change Mac Address = Mudar o endereço do MAC Change proAdhocServer address hint = (localhost = múltiplas instâncias) ChangeMacSaveConfirm = Gerar um novo endereço pro MAC? ChangeMacSaveWarning = Alguns jogos verificam o endereço do MAC quando carregam os dados do save então isto pode quebrar os saves antigos. -Change proAdhocServer Address = Mudar o endereço de IP do servidor Ad Hoc PRO +Change proAdhocServer Address = Mudar o endereço de IP do servidor ad hoc 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 -Connected to relay = Conectado ao relay # AI translated -Connection to relay has recovered = A conexão com o relay foi recuperada # AI translated -Custom server list = Lista de servidores personalizados # AI translated +Connected to relay = Conectado ao transmissor +Connection to relay has recovered = A conexão com o transmissor foi recuperada +Custom server list = Lista de servidores personalizados Disconnected from AdhocServer = Desconectado do servidor ad-hoc DNS Error Resolving = Resolução dos erros do DNS DNS server = Servidor DNS -Enable built-in PRO Adhoc Server = Ativar o servidor ad-hoc PRO embutido +Enable built-in ad hoc server = Ativar o servidor ad-hoc PRO embutido Enable network chat = Ativar bate-papo na rede Enable networking = Ativar rede/WLAN Enable UPnP = Ativar UPnP (precisa de alguns segundos pra detectar) @@ -998,8 +998,8 @@ Enter Quick Chat 3 = Entrar no bate-papo rápido 3 Enter Quick Chat 4 = Entrar no bate-papo rápido 4 Enter Quick Chat 5 = Entrar no bate-papo rápido 5 Error = Erro -Failed connecting to relay server = Falha ao conectar ao servidor de retransmissão # AI translated -Failed connecting to relay server for %1 seconds, relay disabled = Falha ao conectar ao servidor de relay por %1 segundos, relay desativado # AI translated +Failed connecting to relay server = Falhou em conectar com o servidor do transmissor +Failed connecting to relay server for %1 seconds, relay disabled = Falhou em conectar com o servidor do transmissor por %1 segundos, transmissão desativada Failed to Bind Localhost IP = Falhou em associar com o IP do hospedeiro local Failed to Bind Port = Falhou em associar com a porta Failed to connect to Adhoc Server = Falhou em conectar ao servidor ad hoc @@ -1010,24 +1010,27 @@ Hostname = Nome do hospedeiro Infrastructure = Infra-estrutura Infrastructure server provided by: = Servidor da infra-estrutura fornecido pelo Invalid IP or hostname = IP ou nome do hospedeiro inválido -Local network addresses = Endereços de rede local # AI translated +Local network addresses = Endereços da rede local +MAC address = Mudar o endereço do MAC Minimum Timeout = Tempo mínimo pra encerrar (substituição em ms, 0 = padrão) Misc = Miscelânea (padrão = compatibilidade com o PSP) Network connected = Rede conectada Network functionality in this game is not guaranteed =A funcionalidade da rede neste jogo não é garantida Network initialized = Rede inicializada Other versions of this game that should work: = Outras versões deste jogo que devem funcionar: -P2P mode = Modo P2P PacketRelayHint = Disponível em servers que fornecem transmissão de pacotes 'aemu_postoffice', tipo o socom.cc. Desative isto pra jogos em LAN ou VPN. Pode ser mais confiável mas as vezes é mais lento. +P2P mode = Modo P2P Please change your Port Offset = Por favor mude seu deslocamento da porta -Port offset = Deslocamento da porta (0 = Compatibilidade com o PSP) Open PPSSPP Multiplayer Wiki Page = Abrir a Página do Multiplayer do Wiki do PPSSPP -Public server list = Lista de servidores públicos # AI translated +Port offset = Deslocamento da porta +PortOffsetHint = O deslocamento de porta padrão é 10000. Mude para 0 para compatibilidade com consoles PSP não modificados. # AI translated +Public server list = Lista de servidores públicos Quick Chat 1 = Bate-papo rápido 1 Quick Chat 2 = Bate-papo rápido 2 Quick Chat 3 = Bate-papo rápido 3 Quick Chat 4 = Bate-papo rápido 4 Quick Chat 5 = Bate-papo rápido 5 +Quick start guide for multiplayer = Guia de início rápido para multiplayer # AI translated QuickChat = Bate-papo rápido Randomize = Tornar aleatório Relay server mode = Modo do servidor de transmissão @@ -1541,6 +1544,7 @@ Off = Desligado TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = Nenhuma das configurações combinou com o '%1' diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 4a63a2366b..58a1406573 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -597,6 +597,7 @@ ZIP file detected (Require UnRAR) = O ficheiro está comprimido (.zip).\nPor fav ZIP file detected (Require WINRAR) = O ficheiro está comprimido (.zip).\nPor favor descomprima-o primeiro (tente usar o WinRAR). [Game] +Are you sure you want to create a game-specific config? = Tem certeza de que deseja criar uma configuração específica para o jogo? # AI translated Are you sure you want to reset the played time counter? = Tens a certeza que desejas reiniciar o contador de tempo jogado? Asia = Ásia Calculate CRC = Calcular CRC @@ -971,11 +972,10 @@ Allow speed control while connected (not recommended) = Permitir controlos relat AM: Data from Unknown Port = AM: Dados de uma porta desconhecida. Auto = Automático Autoconfigure = Definir automaticamente -Change Mac Address = Mudar endereço MAC Change proAdhocServer address hint = (localhost = múltiplas instâncias) ChangeMacSaveConfirm = Gerar um novo endereço MAC? ChangeMacSaveWarning = Alguns jogos verificam o endereço MAC quando carregam o salvamento, isto poderá fazer com que salvamentos antigos parem de funcionar nestes jogos. -Change proAdhocServer Address = Mudar endereço IP do servidor Ad Hoc PRO +Change proAdhocServer Address = Mudar endereço IP do servidor ad hoc Chat = Chat Chat Button Position = Posição do botão de chat Chat Here = Chat aqui @@ -987,7 +987,7 @@ Custom server list = Lista de servidores personalizados # AI translated Disconnected from AdhocServer = Desconectado do servidor Ad Hoc DNS Error Resolving = Resolução de erros de DNS DNS server = Servidor DNS -Enable built-in PRO Adhoc Server = Ativar o servidor Ad Hoc PRO embutido +Enable built-in ad hoc server = Ativar o servidor ad hoc embutido Enable network chat = Ativar chat na rede Enable networking = Ativar rede / WLAN Enable UPnP = Ativar UPnP (precisa de alguns segundos para ser detetado) @@ -1012,6 +1012,7 @@ Infrastructure = Infraestrutura Infrastructure server provided by: = Servidor de infraestrutura fornecido por: Invalid IP or hostname = IP ou nome de hospedeiro inválido Local network addresses = Endereços de rede local # AI translated +MAC address = Mudar endereço MAC Minimum Timeout = Tempo mínimo para encerrar (em ms, 0 = padrão) Misc = Miscelânea (padrão = compatibilidade com a PSP) Network connected = Conectado à rede @@ -1021,14 +1022,16 @@ Other versions of this game that should work: = Outras versões deste jogo que d P2P mode = Modo P2P # AI translated PacketRelayHint = Disponível em servidores que oferecem retransmissão de pacotes 'aemu_postoffice', como socom.cc. Desativa isto para jogos LAN ou VPN. Pode ser mais compatível, mas por vezes mais lento. Please change your Port Offset = Por favor muda o teu offset da porta -Port offset = Offset da porta (0 = Compatibilidade com a PSP) Open PPSSPP Multiplayer Wiki Page = Abrir a página de multiplayer da wiki da PPSSPP +Port offset = Offset da porta +PortOffsetHint = O deslocamento de porta padrão é 10000. Altere para 0 para compatibilidade com consolas PSP não modificadas. # AI translated Public server list = Lista de servidores públicos # AI translated 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 +Quick start guide for multiplayer = Guia de início rápido para multijogador # AI translated QuickChat = Chat rápido Randomize = Aleatorizar Relay server mode = Modo de servidor relay # AI translated @@ -1542,6 +1545,7 @@ Off = Desativado TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = Nenhuma das definições se parece com '%1' diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 1562b6ae97..1ba5eac582 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -574,6 +574,7 @@ ZIP file detected (Require UnRAR) = Fișierul e compresat(ZIP).\nVă rog decompr ZIP file detected (Require WINRAR) = Fișierul e compresat(ZIP).\nVă rog decompresați întâi (încercați WINRAR). [Game] +Are you sure you want to create a game-specific config? = Ești sigur că vrei să creezi o configurație specifică jocului? # AI translated Are you sure you want to reset the played time counter? = Ești sigur că vrei să resetezi contorul de timp jucat? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -980,8 +981,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Schimbă adresa MAC -Change proAdhocServer Address = Schimbă adresa IP a serverului PRO ad hoc +Change proAdhocServer Address = Schimbă adresa IP a serverului ad hoc Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -996,7 +996,7 @@ Custom server list = Lista serverelor personalizate # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Activează serverul PRO ad hoc integrat +Enable built-in ad hoc server = Activează serverul ad hoc integrat Enable network chat = Enable network chat Enable networking = Activează rețelistică/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1021,6 +1021,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Adrese de rețea locale # AI translated +MAC address = Schimbă adresa MAC Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1030,14 +1031,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Mod P2P # AI translated PacketRelayHint = Disponibil pe servere care oferă redirecționarea pachetelor 'aemu_postoffice', cum ar fi socom.cc. Dezactivați aceasta pentru jocurile LAN sau VPN. Poate fi mai fiabil, dar uneori mai lent. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Offset-ul portului implicit este 10000. Schimbați-l în 0 pentru compatibilitate cu consolele PSP neîncălcate. # AI translated Public server list = Lista serverelor publice # AI translated 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 +Quick start guide for multiplayer = Ghid rapid de început pentru multiplayer # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Mod server relay # AI translated @@ -1518,6 +1521,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 64d7b4ac7b..035f82ca50 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = файл сжат (ZIP).\nПожалуйст ZIP file detected (Require WINRAR) = файл сжат (ZIP).\nПожалуйста, распакуйте (попробуйте WinRAR). [Game] +Are you sure you want to create a game-specific config? = Вы уверены, что хотите создать отдельную конфигурацию для игры? Are you sure you want to reset the played time counter? = Вы уверены, что хотите сбросить время в игре? Asia = Азия Calculate CRC = Вычислить CRC @@ -946,7 +947,6 @@ Allow speed control while connected (not recommended) = Разрешать из AM: Data from Unknown Port = AM: Данные от неизвестного порта Auto = Авто Autoconfigure = Автонастройка -Change Mac Address = Изменить MAC-адрес Change proAdhocServer Address = Изменить IP-адрес ad-hoc сервера Change proAdhocServer address hint = (localhost = множество экземпляров) ChangeMacSaveConfirm = Сгенерировать новый MAC-адрес? @@ -962,7 +962,7 @@ Custom server list = Список пользовательских сервер Disconnected from AdhocServer = Соединение с ad-hoc сервером отключено DNS Error Resolving = Устранение ошибок DNS DNS server = DNS-сервер -Enable built-in PRO Adhoc Server = Использовать встроенный ad-hoc сервер +Enable built-in ad hoc server = Использовать встроенный ad-hoc сервер Enable network chat = Включить сетевой чат Enable networking = Включить сеть Enable UPnP = Включить UPnP (требуется несколько секунд для обнаружения) @@ -987,6 +987,7 @@ Infrastructure = Инфраструктура Infrastructure server provided by: = Инфраструктурный сервер предоставлен: Invalid IP or hostname = Некорректный IP или имя хоста Local network addresses = Адреса локальной сети +MAC address = MAC-адрес Minimum Timeout = Минимальный таймаут (задержка в мс, 0 = по умолчанию) Misc = Прочее (по умолчанию = совместимость с PSP) Network connected = Сеть подключена @@ -996,14 +997,16 @@ Other versions of this game that should work: = Другие версии это P2P mode = Режим P2P PacketRelayHint = Доступно на серверах, предоставляющих ретрансляцию пакета 'aemu_postoffice', таких как socom.cc. Отключите для игр в LAN или VPN. Может быть надежнее, но иногда медленнее. Please change your Port Offset = Пожалуйста, измените ваше смещение порта -Port offset = Смещение порта (0 = совместимость с PSP) Open PPSSPP Multiplayer Wiki Page = Открыть wiki-страницу мультиплеера PPSSPP +Port offset = Смещение порта +PortOffsetHint = Смещение порта по умолчанию составляет 10000. Измените его на 0 для совместимости с немодифицированными консолями PSP. Public server list = Список публичных серверов Quick Chat 1 = Быстрый чат 1 Quick Chat 2 = Быстрый чат 2 Quick Chat 3 = Быстрый чат 3 Quick Chat 4 = Быстрый чат 4 Quick Chat 5 = Быстрый чат 5 +Quick start guide for multiplayer = Краткое руководство по мультиплееру QuickChat = Быстрый чат Randomize = Случайный Relay server mode = Режим релейного сервера @@ -1517,6 +1520,7 @@ Off = Выкл. TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 5737dce8ec..dba557d200 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -574,6 +574,7 @@ ZIP file detected (Require UnRAR) = filen är komprimerad (ZIP).\nPacka upp file ZIP file detected (Require WINRAR) = filen är komprimerad (ZIP).\nPacka upp filen först (prova WinRAR). [Game] +Are you sure you want to create a game-specific config? = Är du säker på att du vill skapa en spel-specifik konfiguration? # AI translated Are you sure you want to reset the played time counter? = Är du säker på att du vill återställa spelad tid-räknaren? # AI translated Asia = Asia Calculate CRC = Beräkna CRC @@ -947,7 +948,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: data från okänd port Auto = Automatisk Autoconfigure = Autokonfigurera -Change Mac Address = Ändra Mac-adress Change proAdhocServer Address = Ändra proAdhocServer-adress Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generera en ny MAC-address? @@ -963,7 +963,7 @@ Custom server list = Anpassad serverlista # AI translated Disconnected from AdhocServer = Bortkopplad från Adhoc-servern DNS Error Resolving = DNS-fel vid addressupplösning DNS server = DNS-server -Enable built-in PRO Adhoc Server = Kör den inbyggda PRO Adhoc-servern +Enable built-in ad hoc server = Kör den inbyggda ad hoc-servern Enable network chat = Nätverkschatt Enable networking = Nätverk/wlan Enable UPnP = Använd UPnP (tar några sekunder att detektera) @@ -988,6 +988,7 @@ Infrastructure = Infrastruktur Infrastructure server provided by: = Infrastruktur-server tillhandahålls av: Invalid IP or hostname = Ogiltigt IP eller hostname Local network addresses = Lokala nätverksadresser # AI translated +MAC address = Ändra Mac-adress Minimum Timeout = Minimal timeout (overrida i ms, 0 = default) Misc = Miscellaneous (default = PSP-kompatibilitet) Network connected = Nätverk uppkopplat @@ -997,14 +998,16 @@ Other versions of this game that should work: = Andra versioner av spelet som b P2P mode = P2P-läge # AI translated PacketRelayHint = Tillgänglig på servrar som tillhandahåller 'aemu_postoffice' paketviderebefordran, som socom.cc. Stäng av detta för LAN- eller VPN-spel. Kan vara mer pålitligt, men ibland långsammare. Please change your Port Offset = Vänligen ändra din port-offset -Port offset = Port offset (0 = PSP-kompatibilitet) Open PPSSPP Multiplayer Wiki Page = Öppna PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Standardport-offsetet är 10000. Ändra det till 0 för kompatibilitet med oförändrade PSP-konsoler. # AI translated Public server list = Lista över offentliga servrar # AI translated Quick Chat 1 = Snabbchatt 1 Quick Chat 2 = Snabbchatt 2 Quick Chat 3 = Snabbchatt 3 Quick Chat 4 = Snabbchatt 4 Quick Chat 5 = Snabbchatt 5 +Quick start guide for multiplayer = Snabbstartsguide för flerspelarläge # AI translated QuickChat = Snabbchatt Randomize = Slumpa Relay server mode = Relayserverläge # AI translated @@ -1518,6 +1521,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpin diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index ba17660289..535c0934ab 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -574,6 +574,7 @@ ZIP file detected (Require UnRAR) = Ang File ay na Compress (ZIP).\nPaki-decompr ZIP file detected (Require WINRAR) = Ang File ay na Compress (ZIP).\nPaki-decompress muna (subukan sa WinRAR). [Game] +Are you sure you want to create a game-specific config? = Сиз ўйин учун махсус конфигурация яратишни исташингизга ишончингиз комилmi? # AI translated Are you sure you want to reset the played time counter? = Шумо шубҳа доред, ки мехоҳед ҳисобкунаки вақти бозишро баргардонед? # AI translated Asia = Asia Calculate CRC = Kalkulahin ang CRC @@ -980,8 +981,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data mula sa Hindi Kilalang Port Auto = Awto Autoconfigure = Autoconfigure -Change Mac Address = Baguhin ang MAC Address -Change proAdhocServer Address = Baguhin ang IP address ng PRO ad hoc server +Change proAdhocServer Address = Baguhin ang IP address ng ad hoc server Change proAdhocServer address hint = (localhost = maraming instances) ChangeMacSaveConfirm = Bumuo ng bagong MAC address? ChangeMacSaveWarning = Bine-verify ng ilang laro ang MAC address kapag naglo-load ng savedata, kaya maaari nitong masira ang mga lumang save. @@ -996,7 +996,7 @@ Custom server list = Феҳристи серверҳои фармоишӣ # AI t Disconnected from AdhocServer = Hindi nakakonekta sa ad hoc server DNS Error Resolving = Pagresolba ng error sa DNS DNS server = DNS server -Enable built-in PRO Adhoc Server = Paganahin ang built-in na PRO ad hoc server +Enable built-in ad hoc server = Paganahin ang built-in na ad hoc server Enable network chat = Paganahin ang network chat Enable networking = Paganahin ang networking/WLAN Enable UPnP = Paganahin ang UPnP (kailangan ng ilang segundo upang matukoy) @@ -1021,6 +1021,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Di-wastong IP o Pangalan ng host Local network addresses = Номери шабакаи маҳаллӣ # AI translated +MAC address = Baguhin ang MAC Address Minimum Timeout = Pinakamababang timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Konektado ang network @@ -1030,14 +1031,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Режими P2P # AI translated PacketRelayHint = Доступен на серверах, которые предоставляют ретрансляцию пакетов 'aemu_postoffice', таких как socom.cc. Отключите это для игр в LAN или VPN. Может быть более надежным, но иногда медленнее. Please change your Port Offset = Mangyaring baguhin ang iyong port offset -Port offset = Port offset (0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Buksan ang PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Нишони порти стандартӣ 10000 мебошад. Ба 0 мубодила кунед, то бо консолҳои PSP, ки тағйир наёфтаанд, мутобиқат кунад. # AI translated Public server list = Fahristi serverhohoi ommav # AI translated Quick Chat 1 = Mabilis na chat 1 Quick Chat 2 = Mabilis na chat 2 Quick Chat 3 = Mabilis na chat 3 Quick Chat 4 = Mabilis na chat 4 Quick Chat 5 = Mabilis na chat 5 +Quick start guide for multiplayer = Раҳнамои шурӯъкунандаи зуд барои бозӣ бо бисёриҳо # AI translated QuickChat = Mabilis na chat Randomize = I-randomize Relay server mode = Режими сервери релей # AI translated @@ -1520,6 +1523,7 @@ Off = Nakapatay TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index f3cf90f1be..ee943fe6b4 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -589,6 +589,7 @@ ZIP file detected (Require UnRAR) = ไฟล์นี้ถูกบีบอ ZIP file detected (Require WINRAR) = ไฟล์นี้ถูกบีบอัดมา (ZIP) โปรดแตกไฟล์ก่อน (ลองใช้ WinRAR หรือ Zarchiver) [Game] +Are you sure you want to create a game-specific config? = คุณแน่ใจหรือไม่ว่าต้องการสร้างการตั้งค่าที่เฉพาะสำหรับเกม? # AI translated Are you sure you want to reset the played time counter? = คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตตัวนับจำนวนเวลาเล่นเกม? Asia = AS (โซนเอเชีย) Calculate CRC = คำนวณค่า CRC @@ -989,7 +990,7 @@ WhatsThis = นี่คืออะไร? [Networking] Ad Hoc multiplayer = การเล่นหลายคน Ad Hoc Ad Hoc server = เซิร์ฟเวอร์ Ad Hoc -Ad hoc server address = ที่อยู่ของเซิร์ฟเวอร์ Pro Adhoc: +Ad hoc server address = ที่อยู่ของเซิร์ฟเวอร์ ad hoc: Add server = เพิ่มเซิร์ฟเวอร์ AdHoc server = เซิร์ฟเวอร์ Ad Hoc AdhocServer Failed to Bind Port = เซิร์ฟเวอร์ Adhoc ล้มเหลวในการเชื่อมโยงพอร์ต @@ -997,8 +998,7 @@ Allow speed control while connected (not recommended) = เปิดให้ค AM: Data from Unknown Port = AM: ข้อมูลมาจากพอร์ตที่ไม่รู้จัก Auto = อัตโนมัติ Autoconfigure = กำหนดค่าอัตโนมัติ -Change Mac Address = เปลี่ยนค่าที่อยู่ Mac -Change proAdhocServer Address = เปลี่ยนไอพีที่อยู่ของเซิร์ฟเวอร์ Pro Adhoc +Change proAdhocServer Address = เปลี่ยนไอพีที่อยู่ของเซิร์ฟเวอร์ ad hoc Change proAdhocServer address hint = (localhost = แลนในเครื่องเดียวกัน) ChangeMacSaveConfirm = ต้องการสร้างค่า MAC address ใหม่? ChangeMacSaveWarning = บางเกมจะตรวจสอบค่า MAC address ตอนโหลดข้อมูลเซฟ เพราะงั้นอาจจะทำให้เซฟอันเก่าใช้งานไม่ได้ @@ -1014,7 +1014,7 @@ Custom server list = รายการเซิร์ฟเวอร์ที Disconnected from AdhocServer = เซิร์ฟเวอร์ Adhoc ถูกตัดขาดการเชื่อมต่อ DNS Error Resolving = กำลังแก้ไขข้อผิดพลาดของ DNS DNS server = เซิร์ฟเวอร์ DNS -Enable built-in PRO Adhoc Server = เปิดการใช้งานเซิร์ฟเวอร์ Pro Adhoc +Enable built-in ad hoc server = เปิดการใช้งานเซิร์ฟเวอร์ ad hoc Enable network chat = เปิดหน้าต่างแชทเครือข่าย Enable networking = เปิดการใช้งานระบบเครือข่าย/WLAN Enable UPnP = เปิดการใช้งาน UPnP (ใช้เวลาสักครู่ในการตรวจสอบ) @@ -1039,6 +1039,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = เซิร์ฟเวอร์ Infrastructure จัดทำโดย: Invalid IP or hostname = ไอพี หรือ ชื่อโฮสต์ ไม่ถูกต้อง Local network addresses = ที่อยู่เครือข่ายภายใน +MAC address = เปลี่ยนค่าที่อยู่ Mac Minimum Timeout = เวลาขั้นต่ำที่ใช้เชื่อมต่อ (แทนที่ค่าความหน่วงในมิลลิวินาที) Misc = อื่นๆ (ค่าดั้งเดิม = ดีสุดแล้ว) Network connected = เชื่อมต่อกับเครือข่ายแล้ว @@ -1048,14 +1049,16 @@ Other versions of this game that should work: = เวอร์ชั่นอ P2P mode = โหมด P2P PacketRelayHint = สำหรับเซิร์ฟเวอร์ที่รองรับส่งต่อแพ็กเก็ต 'aemu_postoffice' เช่น socom.cc ปิดการใช้งานนี้สำหรับการเล่น LAN หรือ VPN อาจเชื่อถือได้มากขึ้น แต่บางครั้งช้ากว่า Please change your Port Offset = กรุณาเปลี่ยนค่าของพอร์ตชดเชย -Port offset = พอร์ตชดเชย (0 = ค่าเริ่มต้นของ PSP) Open PPSSPP Multiplayer Wiki Page = ไปที่หน้าเว็บ PPSSPP Ad-Hoc Wiki +Port offset = พอร์ตชดเชย +PortOffsetHint = ค่าการเบี่ยงเบนพอร์ตเริ่มต้นคือ 10000 เปลี่ยนเป็น 0 เพื่อความเข้ากันได้กับคอนโซล PSP ที่ไม่ได้แก้ไข # AI translated Public server list = รายชื่อเซิร์ฟเวอร์สาธารณะ Quick Chat 1 = แชทด่วน 1 Quick Chat 2 = แชทด่วน 2 Quick Chat 3 = แชทด่วน 3 Quick Chat 4 = แชทด่วน 4 Quick Chat 5 = แชทด่วน 5 +Quick start guide for multiplayer = คำแนะนำเริ่มต้นอย่างรวดเร็วสำหรับผู้เล่นหลายคน # AI translated QuickChat = แชทด่วน Randomize = กดสุ่มค่า Relay server mode = โหมดเซิร์ฟเวอร์รีเลย์ @@ -1558,6 +1561,7 @@ Off = ปิด TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = อัลไพน์ diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index e78d198553..18a6c23845 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -575,6 +575,7 @@ ZIP file detected (Require UnRAR) = Dosya sıkıştırılmış (ZIP).\nLütfen i ZIP file detected (Require WINRAR) = Dosya sıkıştırlmış (ZIP).\nLütfen ilk olarak dosyayı çıkartın (WinRAR deneyin). [Game] +Are you sure you want to create a game-specific config? = Oyun için özel bir yapı oluşturmak istediğinize emin misiniz? # AI translated Are you sure you want to reset the played time counter? = Oynanan süre sayacını sıfırlamak istediğinizden emin misiniz? # AI translated Asia = Asya Calculate CRC = CRC Hesapla @@ -973,7 +974,7 @@ WhatsThis = Bu nedir? [Networking] Ad Hoc multiplayer = Ad Hoc çok oyunculu # AI translated -Ad hoc server address = Pro Adhoc Sunucu Adresi: +Ad hoc server address = Ad hoc Sunucu Adresi: Add server = Sunucu ekle # AI translated AdHoc server = AdHoc Sunucusu AdhocServer Failed to Bind Port = Adhoc sunucusu portu bağlayamadı @@ -981,8 +982,7 @@ Allow speed control while connected (not recommended) = Bağlıyken hız kontrol AM: Data from Unknown Port = AM: Bilinmeyen Porttan Veri Auto = Otomatik Autoconfigure = Autoconfigure -Change Mac Address = Mac Adresini Değiştir -Change proAdhocServer Address = Pro Adhoc Sunucu Adresini Değiştir +Change proAdhocServer Address = Ad hoc Sunucu Adresini Değiştir Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Yeni MAC adresi yaratılsın mı? ChangeMacSaveWarning = Bazı oyunlar, kayıtlı verileri yüklerken MAC adresini doğrular; dolayısıyla bu, eski kayıtların bozulmasına neden olabilir. @@ -997,7 +997,7 @@ Custom server list = Özel sunucu listesi # AI translated Disconnected from AdhocServer = Ad hoc sunucu bağlantısı kesildi DNS Error Resolving = DNS hatası teşhis ediliyor DNS server = DNS Sunucu -Enable built-in PRO Adhoc Server = Yerleşik Pro Adhoc Sunucusunu Etkinleştir +Enable built-in ad hoc server = Yerleşik ad hoc Sunucusunu Etkinleştir Enable network chat = Ağ Sohbetini Etkinleştir Enable networking = Ağı Etkinleştir Enable UPnP = UPnP Etkinleştir @@ -1022,6 +1022,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Altyapı sunucusunu sağlayan: Invalid IP or hostname = Geçersiz IP veya ana makine adı Local network addresses = Yerel ağ adresleri # AI translated +MAC address = Mac Adresini Değiştir Minimum Timeout = En Düşük Zaman Aşımı Misc = Çeşitli Network connected = Ağ bağlandı @@ -1031,14 +1032,16 @@ Other versions of this game that should work: = Bu oyunun çalışması gereken P2P mode = P2P modu # AI translated PacketRelayHint = socom.cc gibi 'aemu_postoffice' paket iletimi sağlayan sunucularda mevcuttur. Bunun LAN veya VPN oyunlarında devre dışı bırakın. Daha güvenilir olabilir, ancak bazen yavaşlayabilir. Please change your Port Offset = Lütfen Port Ofsetinizi değiştirin -Port offset = Port Ofset Open PPSSPP Multiplayer Wiki Page = PPSSPP Çok Oyunculu Wiki Sayfasını Aç +Port offset = Port Ofset +PortOffsetHint = Varsayılan port ofseti 10000'dir. Değiştirilmemiş PSP konsollarıyla uyumluluk için 0 olarak değiştirin. # AI translated Public server list = Herkese açık sunucu listesi # AI translated Quick Chat 1 = Hızlı Sohbet 1 Quick Chat 2 = Hızlı Sohbet 2 Quick Chat 3 = Hızlı Sohbet 3 Quick Chat 4 = Hızlı Sohbet 4 Quick Chat 5 = Hızlı Sohbet 5 +Quick start guide for multiplayer = Çok oyunculu için hızlı başlangıç kılavuzu # AI translated QuickChat = Hızlı Sohbet Randomize = Rastgeleleştir Relay server mode = Relay sunucu modu # AI translated @@ -1518,6 +1521,7 @@ Off = Kapalı TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 93229e87ab..55c3cf4f42 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = Файл стиснуто (ZIP).\nБудь ZIP file detected (Require WINRAR) = Файл стиснуто (ZIP).\nБудь ласка, розархівуйте (спробуйте WinRAR). [Game] +Are you sure you want to create a game-specific config? = Ви впевнені, що хочете створити конфігурацію, специфічну для гри? # AI translated Are you sure you want to reset the played time counter? = Ви впевнені, що хочете скинути лічильник часу гри? # AI translated Asia = Азія Calculate CRC = Обчислити CRC @@ -979,7 +980,6 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Дані з невідомого порту Auto = Авто Autoconfigure = Автоналаштування -Change Mac Address = Змінити Mac-адресу Change proAdhocServer Address = Спеціальна адреса серверу Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Створити нову MAC-адресу? @@ -995,7 +995,7 @@ Custom server list = Список користувацьких серверів Disconnected from AdhocServer = Відключено від ad hoc сервера DNS Error Resolving = Усунення помилок DNS DNS server = DNS-сервер -Enable built-in PRO Adhoc Server = Використовувати вбудовану адресу серверу +Enable built-in ad hoc server = Використовувати вбудовану адресу серверу Enable network chat = Увімкнути мережеву теревеню Enable networking = Увімкнути мережу Enable UPnP = Увімкніть UPnP (потрібно кілька секунд, щоб виявити) @@ -1020,6 +1020,7 @@ Infrastructure = Інфраструктура Infrastructure server provided by: = Інфраструктурний сервер надається: Invalid IP or hostname = Недійсне IP або ім'я хоста Local network addresses = Локальні мережеві адреси # AI translated +MAC address = Змінити Mac-адресу Minimum Timeout = Мінімальний тайм-аут (перевизначити в ms, 0 = за замовчуванням) Misc = Різне (за замовчуванням = PSP сумісність) Network connected = Підключено до мережі @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Режим P2P # AI translated PacketRelayHint = Доступно на серверах, що забезпечують реле пакетів 'aemu_postoffice', таких як socom.cc. Вимкніть це для LAN або VPN ігор. Може бути більш надійним, але іноді повільнішим. Please change your Port Offset = Будь ласка, змініть зміщення порту -Port offset = Зсув порту (0 = сумісність з PSP) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Зсув порту +PortOffsetHint = За замовчуванням зміщення порту становить 10000. Змініть його на 0 для сумісності з незмінними консолями PSP. # AI translated Public server list = Список публічних серверів # AI translated Quick Chat 1 = Швидка теревеня 1 Quick Chat 2 = Швидка теревеня 2 Quick Chat 3 = Швидка теревеня 3 Quick Chat 4 = Швидка теревеня 4 Quick Chat 5 = Швидка теревеня 5 +Quick start guide for multiplayer = Швидкий стартовий посібник для мультиплеєра # AI translated QuickChat = Швидка теревеня Randomize = рандомізувати Relay server mode = Режим релейного сервера # AI translated @@ -1517,6 +1520,7 @@ Off = Вимкнути TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 234cbbfe87..6e089e8de3 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = đây là file nén (ZIP).\nXin hãy giải ZIP file detected (Require WINRAR) = đây là file nén (ZIP).\nXin hãy giải nén trước (Thử dùng WinRAR). [Game] +Are you sure you want to create a game-specific config? = Bạn có chắc chắn muốn tạo cấu hình riêng cho trò chơi không? # AI translated Are you sure you want to reset the played time counter? = Bạn có chắc chắn muốn đặt lại bộ đếm thời gian đã chơi không? # AI translated Asia = Asia Calculate CRC = Calculate CRC @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = Allow speed control whil AM: Data from Unknown Port = AM: Data from Unknown Port Auto = Auto Autoconfigure = Autoconfigure -Change Mac Address = Đổi địa chỉ MAC -Change proAdhocServer Address = Change PRO ad hoc server IP address +Change proAdhocServer Address = Change ad hoc server IP address Change proAdhocServer address hint = (localhost = multiple instances) ChangeMacSaveConfirm = Generate a new MAC address? ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves. @@ -995,7 +995,7 @@ Custom server list = Danh sách máy chủ tùy chỉnh # AI translated Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server -Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable built-in ad hoc server = Enable built-in ad hoc server Enable network chat = Enable network chat Enable networking = Enable networking/WLAN Enable UPnP = Enable UPnP (need a few seconds to detect) @@ -1020,6 +1020,7 @@ Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname Local network addresses = Địa chỉ mạng nội bộ # AI translated +MAC address = Đổi địa chỉ MAC Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1029,14 +1030,16 @@ Other versions of this game that should work: = Other versions of this game that P2P mode = Chế độ P2P # AI translated PacketRelayHint = Có sẵn trên các máy chủ cung cấp dịch vụ chuyển tiếp gói 'aemu_postoffice', như socom.cc. Vô hiệu hóa điều này cho trò chơi LAN hoặc VPN. Có thể đáng tin cậy hơn, nhưng đôi khi chậm hơn. Please change your Port Offset = Please change your port offset -Port offset = Port offset(0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page +Port offset = Port offset +PortOffsetHint = Giá trị lệch cổng mặc định là 10000. Thay đổi thành 0 để đảm bảo tương thích với các máy chơi game PSP không thay đổi. # AI translated Public server list = Danh sách máy chủ công cộng # AI translated 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 +Quick start guide for multiplayer = Hướng dẫn khởi động nhanh cho chơi đa người # AI translated QuickChat = Quick chat Randomize = Randomize Relay server mode = Chế độ máy chủ relay # AI translated @@ -1517,6 +1520,7 @@ Off = Off TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 27f5624a3c..539c1c7535 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = 这是ZIP压缩文件。\n请尝试使用UnR ZIP file detected (Require WINRAR) = 这是ZIP压缩文件。\n请尝试使用WinRAR进行解压缩。 [Game] +Are you sure you want to create a game-specific config? = 您确定要创建游戏特定的配置吗? # AI translated Are you sure you want to reset the played time counter? = 您确定要重置已播放时间计数器吗? # AI translated Asia = 亚洲 Calculate CRC = 计算CRC码 @@ -979,8 +980,7 @@ Allow speed control while connected (not recommended) = 允许在连接时控制 AM: Data from Unknown Port = AM:来自未知端口的数据 Auto = 自动 Autoconfigure = 自动配置 -Change Mac Address = 更改MAC地址 -Change proAdhocServer Address = 更改PRO Ad Hoc服务器IP地址 +Change proAdhocServer Address = 更改ad hoc服务器IP地址 Change proAdhocServer address hint = (localhost=模拟器多开联机) ChangeMacSaveConfirm = 确认随机生成新的MAC地址? ChangeMacSaveWarning = 一部分游戏在载入存档时会验证MAC地址,\n可能会损坏存档,建议先备份您的存档或MAC地址。 @@ -995,7 +995,7 @@ Custom server list = 自定义服务器列表 # AI translated Disconnected from AdhocServer = 与Ad Hoc服务器断开连接 DNS Error Resolving = DNS解析错误 DNS server = DNS 服务器 -Enable built-in PRO Adhoc Server = 启用内置PRO Ad Hoc服务器 +Enable built-in ad hoc server = 启用内置ad hoc服务器 Enable network chat = 启用聊天 Enable networking = 启用联网功能 Enable UPnP = 启用UPnP (检测需要一定时间) @@ -1020,6 +1020,7 @@ Infrastructure = 基础服务器 Infrastructure server provided by: = 基础服务器由提供: Invalid IP or hostname = IP或主机名是无效的 Local network addresses = 本地网络地址 # AI translated +MAC address = 更改MAC地址 Minimum Timeout = 最短超时 (0=默认) Misc = 其他 (默认=兼容PSP) Network connected = 网络已连接 @@ -1029,15 +1030,17 @@ Other versions of this game that should work: = 此游戏的其他版本应该 P2P mode = P2P模式 # AI translated PacketRelayHint = 可在提供'aemu_postoffice'数据包中继的服务器上使用,如socom.cc。对于LAN或VPN游戏,请禁用此功能。可能更可靠,但有时较慢。 Please change your Port Offset = 请更改您的端口偏移 -Port offset = 端口偏移 (0 = 兼容PSP) Open PPSSPP Multiplayer Wiki Page = PPSSPP多人联机Wiki页面 MultiplayerHowToURL = https://github.com/hrydgard/ppsspp/wiki/如何使用PPSSPP多人联机游戏 +Port offset = 端口偏移 +PortOffsetHint = 默认端口偏移量为10000。将其更改为0,以与未修改的PSP控制台兼容。 # AI translated Public server list = 公共服务器列表 # AI translated Quick Chat 1 = 快速聊天1 Quick Chat 2 = 快速聊天2 Quick Chat 3 = 快速聊天3 Quick Chat 4 = 快速聊天4 Quick Chat 5 = 快速聊天5 +Quick start guide for multiplayer = 多人游戏快速入门指南 # AI translated QuickChat = 快速聊天 Randomize = 随机生成 Relay server mode = 中继服务器模式 # AI translated @@ -1511,6 +1514,7 @@ Off = 关闭 TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Themes] Alpine = Alpine diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 09e450e8e7..1ab257c05b 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -573,6 +573,7 @@ ZIP file detected (Require UnRAR) = 檔案已壓縮 (ZIP)\n請先解壓縮 (嘗 ZIP file detected (Require WINRAR) = 檔案已壓縮 (ZIP)\n請先解壓縮 (嘗試 WinRAR) [Game] +Are you sure you want to create a game-specific config? = 您確定要創建特定於遊戲的配置嗎? # AI translated Are you sure you want to reset the played time counter? = 您確定要重置已播放時間計數器嗎? # AI translated Asia = 亞州 Calculate CRC = 計算 CRC @@ -946,7 +947,6 @@ Allow speed control while connected (not recommended) = 允許在連線時控制 AM: Data from Unknown Port = AM:來自不明連接埠的資料 Auto = 自動 Autoconfigure = 自動組態 -Change Mac Address = 變更 MAC 位址 Change proAdhocServer address hint = (本機主機 = 多重執行個體) ChangeMacSaveConfirm = 產生新的 MAC 位址? ChangeMacSaveWarning = 某些遊戲在載入儲存資料時會驗證 MAC 位址,這可能會損毀舊存檔 @@ -962,7 +962,7 @@ Custom server list = 自訂伺服器列表 # AI translated Disconnected from AdhocServer = 從臨機操作伺服器中斷連線 DNS Error Resolving = DNS 解析錯誤 DNS server = DNS 伺服器 -Enable built-in PRO Adhoc Server = 啟用內建 PRO 臨機操作伺服器 +Enable built-in ad hoc server = 啟用內建 PRO 臨機操作伺服器 Enable network chat = 啟用網路聊天 Enable networking = 啟用網路功能/WLAN Enable UPnP = 啟用 UPnP (需要數秒鐘來偵測) @@ -987,6 +987,7 @@ Infrastructure = 基礎伺服器 Infrastructure server provided by: = 基礎伺服器提供者: Invalid IP or hostname = 無效的 IP 或主機名稱 Local network addresses = 本地網絡地址 # AI translated +MAC address = 變更 MAC 位址 Minimum Timeout = 最小逾時 (單位為毫秒,0 = 預設) Misc = 雜項 (預設 = PSP 相容性) Network connected = 網路已連線 @@ -996,14 +997,16 @@ Other versions of this game that should work: = 此遊戲其他應該可工作 P2P mode = P2P模式 # AI translated PacketRelayHint = 可在提供'aemu_postoffice'數據包中繼的伺服器上使用,如socom.cc。對於LAN或VPN遊戲,請禁用此功能。可能更可靠,但有時速度較慢。 Please change your Port Offset = 請變更您的連接埠位移 -Port offset = 連接埠位移 (0 = PSP 相容性) Open PPSSPP Multiplayer Wiki Page = 開啟 PPSSPP 多人遊戲維基頁面 +Port offset = 連接埠位移 +PortOffsetHint = 預設埠偏移量為10000。更改為0以與未修改的PSP控制台相容。 # AI translated Public server list = 公共伺服器列表 # AI translated Quick Chat 1 = 快速聊天 1 Quick Chat 2 = 快速聊天 2 Quick Chat 3 = 快速聊天 3 Quick Chat 4 = 快速聊天 4 Quick Chat 5 = 快速聊天 5 +Quick start guide for multiplayer = 多人遊戲快速入門指南 # AI translated QuickChat = 快速聊天 Randomize = 隨機 Relay server mode = 中繼伺服器模式 # AI translated @@ -1517,6 +1520,7 @@ Off = 關閉 TexMMPX = TexMMPX Tex2xBRZ = Tex2xBRZ Tex4xBRZ = Tex4xBRZ +TexMMPXAdvanced = TexMMPXAdvanced [Search] No settings matched '%1' = 沒有與「%1」相符的設定 diff --git a/assets/shaders/defaultshaders.ini b/assets/shaders/defaultshaders.ini index b51c8101e7..5666be8eb8 100644 --- a/assets/shaders/defaultshaders.ini +++ b/assets/shaders/defaultshaders.ini @@ -212,7 +212,13 @@ Name=MMPX (2x) Author=Morgan McGuire and Mara Gagiu Compute=tex_mmpx.csh Scale=2 -VendorBlacklist=Apple +[TexMMPXAdvanced] +Type=Texture +Name=MMPX Advanced (2x) +Author=CrashGG, Morgan McGuire and Mara Gagiu +Compute=tex_mmpx_adv.csh +Scale=2 +VendorBlacklist=Apple,Vivante,Qualcomm,Broadcom,IMGTEC,ARM [RedBlue] Type=StereoToMono Name=Red/Blue glasses (anaglyph) diff --git a/assets/shaders/tex_mmpx.csh b/assets/shaders/tex_mmpx.csh index e2900566e2..4016d7d270 100644 --- a/assets/shaders/tex_mmpx.csh +++ b/assets/shaders/tex_mmpx.csh @@ -2,1318 +2,111 @@ 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. + This is an optimized GLSL port of that version by Morgan McGuire and Mara Gagiu. - 2025 Enhanced by CrashGG. */ // Performs 2x upscaling. -/* 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... +#define ABGR8 uint - readColoru is a built-in function (implementation depends on rendering engine) that reads unsigned integer format color data from texture/framebuffer. - Normalization loss: Using readColor (without 'u') reads as floats (vec4), mapping integer range (0-255) to [0.0, 1.0], causing precision loss (255→1.0, 1→0.0039215686...). - The unpackUnorm4x8 function in MMPX converts uint to vec4 (normalized floats) - this step is lossy. -*/ -uint src(int x, int y) { +// 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))); } -// RGB visual weight + alpha segmentation -int luma(uint C) { - - if (C==0) return 7340032; - - int alpha = int(C >> 24); - // CRT era BT.601 standard (255 × (299 + 587 + 114), output range: 0~255000) - int rgbsum = int(((C >> 16) & 0xFF) *299 + ((C >> 8) & 0xFF) *587 + (C & 0xFF) *114); - // R G B average - //int rgbsum = ((C >> 16) & 0xFF) + ((C >> 8) & 0xFF) + (C & 0xFF); - - // 2^20 * n to facilitate subsequent removal of alpha weighting using bit shifts - int alphafactor = - (alpha == 0) ? 7340032 : // Fully transparent - (alpha > 217) ? 1048576 : // Two golden sections 0.854102 ×255≈217.8 - (alpha > 157) ? 2097152 : // 1 golden section 0.618034 ×255≈157.6 - (alpha > 97) ? 3145728 : // 1 golden section (short) 0.381966 ×255≈97.4 - (alpha > 37) ? 4194304 : 5242880; // Two golden sections (short) 0.145898 ×255≈37.2 - - return rgbsum + alphafactor; - +uint luma(ABGR8 C) { + uint alpha = (C & 0xFF000000u) >> 24; + return (((C & 0x00FF0000u) >> 16) + ((C & 0x0000FF00u) >> 8) + (C & 0x000000FFu) + 1u) * (256u - alpha); } -bool checkblack(vec4 col) { - if (col.r > 0.1 || col.g > 0.078 || col.b > 0.1) return false; - - return true; +bool all_eq2(ABGR8 B, ABGR8 A0, ABGR8 A1) { + return ((B ^ A0) | (B ^ A1)) == 0u; } -//bool checkwhite(vec4 col) { -// if (col.r < 0.9 || col.g < 0.92 || col.b < 0.9) return false; -// return true; -//} - -bool sim(vec4 rgbaC1, vec4 rgbaC2, int Lv) { - - vec4 diff = abs(rgbaC1 - rgbaC2); - - // 1. Fast component difference check - float chDiff = Lv==1 ? 0.09652388 : Lv==2 ? 0.145898 : 0.2527; - if ( diff.r > chDiff || diff.g > chDiff || diff.b > chDiff || diff.a > 0.145898 ) return false; - - vec3 rgbC1 = rgbaC1.rgb; - vec3 rgbC2 = rgbaC2.rgb; - - // 2. Quickly filter out identical pixels and very dark/bright pixels after clamping - vec3 clampCol1 = clamp(rgbC1, vec3(0.078),vec3(0.92)); - vec3 clampCol2 = clamp(rgbC2, vec3(0.078),vec3(0.92)); - vec3 clampdiff = clampCol1 - clampCol2; - vec3 absclampdiff = abs(clampdiff); - if ( absclampdiff.r < 0.05572809 && absclampdiff.g < 0.021286 && absclampdiff.b < 0.05572809 ) return true; - - // Cube of Euclidean distance between two points, 2+1, 2 short golden sections - float dotdist = Lv==1 ? 0.00931686 : Lv==2 ? 0.024391856 : 0.0638587; - - // 3. Fast squared distance check - float dot_diff = dot(diff.rgb, diff.rgb); - if (dot_diff > dotdist) return false; - - // 4. Re-check squared distance after adding opposite channels - float teamA = 0.0; - float teamB = 0.0; - - if (clampdiff.r > 0.0) teamA += absclampdiff.r; else teamB += absclampdiff.r; - if (clampdiff.g > 0.0) teamA += absclampdiff.g; else teamB += absclampdiff.g; - if (clampdiff.b > 0.0) teamA += absclampdiff.b; else teamB += absclampdiff.b; - float team = min(teamA,teamB); - // Testing shows at least 3 times the opposite channel value needs to be added. (+1x draws, +2x creates an increasing trend) - if (dot_diff + team*team*3.0 > dotdist) return false; - - // 5. Check for gray pixels - float sum1 = rgbC1.r + rgbC1.g + rgbC1.b; - float avg1 = sum1 * 0.3333333; - float threshold1 = avg1 * 0.08; - - float sum2 = rgbC2.r + rgbC2.g + rgbC2.b; - float avg2 = sum2 * 0.3333333; - float threshold2 = avg2 * 0.08; - - bool Col1isGray = all(lessThan(abs(rgbC1 - vec3(avg1)), vec3(threshold1))); - bool Col2isGray = all(lessThan(abs(rgbC2 - vec3(avg2)), vec3(threshold2))); - - // Return true if both are gray or both are not gray - return Col1isGray == Col2isGray; +bool all_eq3(ABGR8 B, ABGR8 A0, ABGR8 A1, ABGR8 A2) { + return ((B ^ A0) | (B ^ A1) | (B ^ A2)) == 0u; } -bool sim1(uint C1, uint C2) { - if (C1 == C2) return true; - vec4 rgbaC1 = unpackUnorm4x8(C1); - vec4 rgbaC2 = unpackUnorm4x8(C2); - return sim(rgbaC1, rgbaC2, 1); +bool all_eq4(ABGR8 B, ABGR8 A0, ABGR8 A1, ABGR8 A2, ABGR8 A3) { + return ((B ^ A0) | (B ^ A1) | (B ^ A2) | (B ^ A3)) == 0u; } -bool v4i_sim1(vec4 rgbaE, uint C) { - vec4 rgbaC = unpackUnorm4x8(C); - return sim(rgbaE, rgbaC, 1); +bool any_eq3(ABGR8 B, ABGR8 A0, ABGR8 A1, ABGR8 A2) { + return B == A0 || B == A1 || B == A2; } -bool v4i_sim2(vec4 rgbaE, uint C) { - vec4 rgbaC = unpackUnorm4x8(C); - return sim(rgbaE, rgbaC, 2); +bool none_eq2(ABGR8 B, ABGR8 A0, ABGR8 A1) { + return (B != A0) && (B != A1); } -bool v4_sim3(vec4 C1, vec4 C2) { - return sim(C1, C2, 3); -} - -bool mixcheck(vec4 col1, vec4 col2) { - - // Cannot mix if one is transparent and the other is not - bool col1alpha0 = col1.a < 0.003; - bool col2alpha0 = col2.a < 0.003; - if (col1alpha0!=col2alpha0) return false; - - vec4 diff = col1 - col2; - vec4 absdiff = abs(diff); - - // 1. Fast component difference check - if ( absdiff.r > 0.618034 || absdiff.g > 0.618034 || absdiff.b > 0.618034 || absdiff.a > 0.5 ) return false; - // Quickly filter out similar pixels (0.4377 divided by 6, square root max can be 0.27) - if ( absdiff.r < 0.27 && absdiff.g < 0.27 && absdiff.b < 0.27 ) return true; - - // 3. Fast squared distance check - float dot_diff = dot(diff.rgb, diff.rgb); - if (dot_diff > 0.4377) return false; // One short golden section of Euclidean distance - - // 4. Re-check squared distance after adding opposite channels - float teamA = 0.0; - float teamB = 0.0; - - if (diff.r > 0.0) teamA += absdiff.r; else teamB += absdiff.r; - if (diff.g > 0.0) teamA += absdiff.g; else teamB += absdiff.g; - if (diff.b > 0.0) teamA += absdiff.b; else teamB += absdiff.b; - float team = min(teamA,teamB); - // Testing shows at least 3 times the opposite channel value needs to be added. (+1x draws, +2x creates a positive trend) - if (dot_diff + team*team*3.0 > 0.4377) return false; - - return true; -} - -bool eq(uint C1, uint C2){ - if (C1 == C2) return true; - - int rgbC1 = int(C1 & 0x00FFFFFF); - int rgbC2 = int(C2 & 0x00FFFFFF); - - if (rgbC1 != rgbC2) return false; - - int alphaC1 = int(C1 >> 24); - int alphaC2 = int(C2 >> 24); - - return abs(alphaC1-alphaC2)<38; -} - -bool noteq(uint B, uint A0){ - return !eq(B,A0); -} -/* -bool fullnoteq(uint B, uint A0){ - return B != A0; -} - -bool rgb_eq(vec4 col1, vec4 col2) { - vec4 diff = abs(col1 - col2); - if (diff.r > 0.004 || diff.g > 0.004 || diff.b > 0.004) return false; - return true; -} -*/ -bool v4_noteq(vec4 col1, vec4 col2) { - vec4 diff = abs(col1 - col2); - - if (diff.r > 0.004 || diff.g > 0.004 || diff.b > 0.004 || diff.a > 0.021286) return true; - - return false; -} - -bool all_eq2(uint B, uint A0, uint A1) { - return (eq(B,A0) && eq(B,A1)); -} - -bool any_eq2(uint B, uint A0, uint A1) { - return (eq(B,A0) || eq(B,A1)); -} - -bool any_eq3(uint B, uint A0, uint A1, uint A2) { - return (eq(B,A0) || eq(B,A1) || eq(B,A2)); -} - -bool none_eq2(uint B, uint A0, uint A1) { - return (noteq(B,A0) && noteq(B,A1)); -} - -/////////////////////// Test Colors /////////////////////// -//const vec4 testcolor = vec4(1.0, 0.0, 1.0, 1.0); // Magenta (Opaque) -//const vec4 testcolor2 = vec4(0.0, 1.0, 1.0, 1.0); // Cyan (Opaque) -//const vec4 testcolor3 = vec4(1.0, 1.0, 0.0, 1.0); // Yellow (Opaque) -//const vec4 testcolor4 = vec4(1.0, 1.0, 1.0, 1.0); // White (Opaque) - -// "Concave + Cross" type Weak mixing (Weak Mix / None) -vec4 admixC(uint X, vec4 rgbaE) { - - vec4 rgbaX = unpackUnorm4x8(X); - - // Transparent pixels already filtered in main logic - - bool mixok = mixcheck(rgbaX, rgbaE); - - return mixok ? mix(rgbaX, rgbaE, 0.618034) : rgbaE; -} - -// K type Forced weak mixing (Weaker Mix / Even Weaker) -vec4 admixK(uint X, vec4 rgbaE) { - - vec4 rgbaX = unpackUnorm4x8(X); - - // Transparent pixels already filtered in main logic - - bool mixok = mixcheck(rgbaX, rgbaE); - - return mixok ? mix(rgbaX, rgbaE, 0.618034) : mix(rgbaX, rgbaE, 0.8541); -} - -vec4 admixL(vec4 rgbaX, vec4 rgbaE, uint S) { - - // If E is fully transparent, copy target X - //if (rgbaE.a < 0.01) return rgbaX; - - // If X is fully transparent, return original value E - //if (rgbaX.a < 0.01) return rgbaE; - - - vec4 rgbaS = unpackUnorm4x8(S); - // If target X and reference S(sample) are different, it means it has been mixed once already, then just copy the target. - if (v4_noteq(rgbaX, rgbaS)) return rgbaX; - - bool mixok = mixcheck(rgbaX, rgbaE); - - return mixok ? mix(rgbaX, rgbaE, 0.381966) : rgbaX; -} - -/******************************************************************************************************************************************** - * main slope + X cross-processing mechanism * - *******************************************************************************************************************************************/ -vec4 admixX(uint A, uint B, uint C, uint D, uint E, uint F, uint G, uint H, uint I, uint P, uint PA, uint PC, uint Q, uint QA, uint QG, uint R, uint RC, uint RI, uint S, uint SG, uint SI, uint AA, uint CC, uint GG, int El, int Bl, int Dl, int Fl, int Hl, vec4 rgbaE) { - - // Pre-define 3 types of special exits - const vec4 slopeBAD = vec4(2.0); - const vec4 theEXIT = vec4(8.0); - const vec4 slopEND = vec4(33.0); - - //pre-cal - bool eq_B_C = eq(B, C); - bool eq_D_G = eq(D, G); - - // Exit if sandwiched by straight walls on both sides - if (eq_B_C && eq_D_G) return slopeBAD; - - vec4 rgbaB = unpackUnorm4x8(B); - vec4 rgbaD; - vec4 rgbaX; - // Remove alpha channel weighting - int rgbBl = Bl & 0xFFFFF; - int rgbDl = Dl & 0xFFFFF; - int rgbEl = El & 0xFFFFF; - int rgbFl = Fl & 0xFFFFF; - int rgbHl = Hl & 0xFFFFF; - - bool eq_B_D = eq(B,D); - if (eq_B_D) { - - rgbaX = rgbaB; - if ( B != D ) { - float alphaD = float(D >> 24) * 0.0039215686; // 1/255 - rgbaX.a = min(rgbaB.a , alphaD); - } - } else { - // Exit if E-A equality does not meet preset logic - if (eq(E,A)) return slopeBAD; - - // If D and B are not equal, and the difference between them is greater than the difference between either one and the center point E, exit. - int diffBD = abs(rgbBl-rgbDl); - int diffEB = abs(rgbEl-rgbBl); - int diffED = abs(rgbEl-rgbDl); - if (diffBD > diffEB || diffBD > diffED) return slopeBAD; - - // Generate X using the intermediate value of B-D - rgbaD = unpackUnorm4x8(D); - rgbaX = vec4( mix(rgbaB.rgb,rgbaD.rgb,0.5), min(rgbaB.a,rgbaD.a) ); - } - - - // Avoid single-pixel font edges being squeezed by black background on both sides (font and background brightness difference usually exceeds 0.5) - // Note: If BD are not equal, cannot use average for judgment, both must satisfy the black condition. - bool Xisblack = eq_B_D ? checkblack(rgbaB) : checkblack(rgbaB)&&checkblack(rgbaD); - if ( Xisblack && rgbEl > 127500 ) { // 127500/255000 = 0.5/1 - // Use Fl Hl to save cost - if ( rgbFl<19890 || rgbHl<19890 ) return theEXIT; // 19890/255000 = 0.078/1 - } - - //Pre-declare - bool eq_A_B; bool eq_A_D; bool eq_A_P; bool eq_A_Q; - bool eq_B_P; bool eq_B_PA; bool eq_B_PC; - bool eq_D_Q; bool eq_D_QA; bool eq_D_QG; - bool eq_E_F; bool eq_E_H; bool eq_E_I; bool En3; bool En4square; - bool B_slope; bool B_tower; bool B_wall; - bool D_slope; bool D_tower; bool D_wall; - bool comboA3; bool mixok; - -// B != D -if (!eq_B_D){ - - eq_A_B = eq(A,B); - if ( !Xisblack && eq_A_B && eq_D_G && eq(B,P) ) return slopeBAD; - - eq_A_D = eq(A,D); - if ( !Xisblack && eq_A_D && eq_B_C && eq(D,Q) ) return slopeBAD; - - - // B D not connected to anything? Not applicable here (Can eliminate some artifacts, but also loses some shapes, especially in non-native pixel art, e.g., character portraits in Double Dragon) - - eq_A_P = eq(A,P); - eq_A_Q = eq(A,Q); - comboA3 = eq_A_P && eq_A_Q; - mixok = mixcheck(rgbaX,rgbaE); - - // A-side three in a row, high priority - if (comboA3) return mixok ? mix(rgbaX,rgbaE,0.381966) +slopEND : rgbaX +slopEND; - - // Official original rule - if ( eq(E,C) || eq(E,G) ) return mixok ? mix(rgbaX,rgbaE,0.381966) +slopEND : rgbaX +slopEND; - // Enhanced original rule Practice: Beneficial for non-native pixel art, but harmful for native pixel art (JoJo's wall and clock) - if ( !eq_D_G&&eq(E,QG)&&v4i_sim2(rgbaE,G) || !eq_B_C&&eq(E,PC)&&v4i_sim2(rgbaE,C) ) return mixok ? mix(rgbaX,rgbaE,0.381966) +slopEND : rgbaX +slopEND; - - eq_E_F = eq(E, F); - eq_E_H = eq(E, H); - En3 = eq_E_F && eq_E_H; - - - if (!Xisblack){ - if ( eq_A_B&&eq_B_C || eq_A_D&&eq_D_G ) return slopeBAD; - } - if ( eq(F,H) ) return mixok ? mix(rgbaX,rgbaE,0.381966) +slopEND : rgbaX +slopEND; - // Exclude "two-cell single-side wall" situations, merged with next rule - //if (eq_A_B||eq_A_D) return slopeBAD; - // The rest are single pixels without logic but similar within sim2 range, so use weak mixing??? Just give up! - return slopeBAD; -} // B != D - - //pre-cal B == D - bool eq_E_A = eq(E,A); - bool eq_E_C = eq(E,C); - bool eq_E_G = eq(E,G); - bool sim_EC = eq_E_C || v4i_sim2(rgbaE,C); - bool sim_EG = eq_E_G || v4i_sim2(rgbaE,G); - - bool ThickBorder; - -// Enhanced original main rule using sim -if ( (sim_EC || sim_EG) && !eq_E_A ){ - -/* Approach: - 1. Handle continuous boundary shapes without mixing - 2. Special handling for long slopes - 3. Original rules - 4. Handle E-zone inlines like En4 En3 F-H, leaving single sticks and single pixels - 5. Handle L-shaped inward and outward single sticks - 5. Normal fallback -*/ - - eq_A_B = eq(A,B); - eq_B_P = eq(B,P); - eq_B_PC = eq(B,PC); - eq_D_Q = eq(D,Q); - eq_D_QG = eq(D,QG); - eq_B_PA = eq(B,PA); - eq_D_QA = eq(D,QA); - B_slope = eq_B_PC && !eq_B_P && !eq_B_C; - B_tower = eq_B_P && !eq_B_PC && !eq_B_C && !eq_B_PA; - D_slope = eq_D_QG && !eq_D_Q && !eq_D_G; - D_tower = eq_D_Q && !eq_D_QG && !eq_D_G && !eq_D_QA; - - // step1: - // B + D + their respective extension shapes - // Note: Only used for judging X without mixing, different from the "rule capture return" logic in the final section. - - if ( (B_slope||B_tower) && (D_slope||D_tower) && !eq_A_B) return rgbaX +slopEND; - - - eq_A_P = eq(A, P); - eq_A_Q = eq(A, Q); - comboA3 = eq_A_P && eq_A_Q; - mixok = mixcheck(rgbaX,rgbaE); - ThickBorder = eq_A_B && (eq_A_P||eq_A_Q|| eq(A,AA)&&(eq_B_PA||eq_D_QA)); - if (ThickBorder && !Xisblack) mixok=false; - - // A-side three in a row - if (comboA3) { - if (!eq_A_B) return rgbaX + slopEND; - else mixok=false; - } - - // XE_messL B-D-E L-shape highly similar with sim2 WIP - // bool XE_messL = (eq_B_C && !sim_EG || eq_D_G && !sim_EC) ; - - eq_E_F = eq(E, F); - B_wall = eq_B_C && !eq_B_PC && !eq_B_P; - - // Long slope clear long slope (Not thick solid edge. Strong trend!) - // Long slope case is slightly special, judged separately - if ( B_wall && D_tower ) { - if (eq_E_G || sim_EG&&eq(E,QG) ) { // Original rule + Original enhancement - if (eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966): rgbaX; // Has thickness - return rgbaX; // Hollow - } - // Clear Z-shaped snake, exclude XE_messL ??? - //if (eq_A_B && !XE_messL) return slopeBAD; // WIP - if (eq_A_B) return slopeBAD; - // 2-cell with subsequent long slope - if (eq_E_F ) return rgbaX; - // 1-cell without subsequent long slope - return rgbaX +slopEND; - } - - eq_E_H = eq(E, H); - D_wall = eq_D_G && !eq_D_QG&& !eq_D_Q; - - if ( B_tower && D_wall ) { - if (eq_E_C || sim_EC&&eq(E,PC) ) { // Original rule + Original enhancement - if (eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966): rgbaX; // Has thickness - return rgbaX; // Hollow - } - if (eq_A_B) return slopeBAD; - // 2-cell with subsequent long slope - if (eq_E_H ) return rgbaX; - // 1-cell without subsequent long slope - return rgbaX +slopEND; - } - - - // Official original rule (placed after the special shapes above, special shapes specify no mixing!) - if (eq_E_C || eq_E_G) return mixok ? mix(rgbaX,rgbaE,0.381966) : rgbaX; - - // Original rule enhancement 1 - if (sim_EG&&!eq_D_G&&eq(E,QG) || sim_EC&&!eq_B_C&&eq(E,PC)) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - - // Original rule enhancement 2 - if (sim_EC && sim_EG) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - - - // F-H inline trend (Skip En4 En3) - if ( eq(F,H) ) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - - // Relaxed rule finally cleans up two long slopes (non-clear shapes) - // Practice: This section handles long slopes and is different from F-H. Default is draw, unless it's a cube. - if ( eq_B_C && eq_D_Q) { - // Double cube exit - if (eq_B_P && eq_B_PC && eq_A_B && eq_D_QA && !eq_D_QG && eq_E_F && eq(H,I) ) return theEXIT; - - return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - } - - if ( eq_D_G && eq_B_P) { - // Double cube exit - if (eq_D_Q && eq_D_QG && eq_A_B && eq_B_PA && !eq_B_PC && eq_E_H && eq(F,I) ) return theEXIT; - - return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - } - - eq_E_I = eq(E, I); - - // L-shaped corner (clear) inward single stick (parallel), exit - if (eq_A_B && !ThickBorder && !eq_E_I ) { - if (B_wall && eq_E_F) return theEXIT; - if (D_wall && eq_E_H) return theEXIT; - } - - // Skip next step and return early if colors are similar - if (mixok) return mix(rgbaX,rgbaE,0.381966)+slopEND; - - // L-shaped corner (hollow) outward single stick (any direction), exit (solves font edge issues) - if ( !eq_A_B && (eq_E_F||eq_E_H) && !eq_E_I) { - if (B_tower && !eq_D_Q && !eq_D_QG) return theEXIT; - if (D_tower && !eq_B_P && !eq_B_PC) return theEXIT; - } - - // Fallback processing - return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - -} // sim2 base - - -/*=================================================== - E - A Cross - ===============================================zz */ - -if (eq_E_A) { - - // When judging crosses ✕, have a concept of "area" and "trend". Conditions need tightening for different areas. - - // B D not connected to anything exit? Not needed here!!! - - // X fully transparent exit (slope transparent B D cutting the crossing E A doesn't make logical sense) - bool X_alpha0 = rgbaX.a < 0.003; - if (X_alpha0) return slopeBAD; - - eq_E_F = eq(E, F); - eq_E_H = eq(E, H); - eq_E_I = eq(E, I); - En3 = eq_E_F&&eq_E_H; - En4square = En3 && eq_E_I; - - // Special shape: Square - if ( En4square ) { - if( noteq(G,H) && noteq(C,F) // Independent clear 4-cell square / 6-cell rectangle (both sides satisfy simultaneously) - && (eq(H,S) == eq(I,SI) && eq(F,R) == eq(I,RI)) ) return theEXIT; - //else return mixok ? mix(rgbaX,rgbaE,0.381966) : rgbaX; Note: Cannot return directly. Need to enter the chessboard decision rule because adjacent B, D areas might also form bubbles with square structures. - } - - // Special shape: Dithering pattern - // Practice 1: !eq_E_F, !eq_E_H Not using !sim, because it loses some shapes. - // Practice 2: Force mixing, otherwise shapes are lost. (Gouketsuji horse, WWF Super Wrestlemania 2) - - bool Eisblack = checkblack(rgbaE); - mixok = mixcheck(rgbaX,rgbaE); - - // 1. Dithering center - if ( eq_E_C && eq_E_G && eq_E_I && !eq_E_F && !eq_E_H ) { - - // Exit if center E is black (KOF96 power gauge, Punisher's belt) Avoid mixing with too high contrast. - if (Eisblack) return theEXIT; - // Example of dithering created by changing transparency against same-color background: Black Rock Shooter - //if ( rgb_eq(rgbaX,rgbaE) ) return slopeBAD; - - return mixok ? mix(rgbaX, rgbaE, 0.381966)+slopEND : mix(rgbaX, rgbaE, 0.618034)+slopEND; - } - - eq_A_P = eq(A,P); - eq_A_Q = eq(A,Q); - eq_B_PA = eq(B,PA); - - // 2. Dithering edge - if ( eq_A_P && eq_A_Q && eq(A,AA) && noteq(A,PA) && noteq(A,QA) ) { - if (Eisblack) return theEXIT; - - // Layered progressive edge, use strong mixing - if ( !eq_B_PA && eq(PA,QA) ) return mixok ? mix(rgbaX, rgbaE, 0.381966)+slopEND : mix(rgbaX, rgbaE, 0.618034)+slopEND; - // Remaining 1. Perfect cross, must be dithering edge, use weak mixing. - // Remaining 2. Fallback weak mixing - return mixok ? mix(rgbaX, rgbaE, 0.618034)+slopEND : mix(rgbaX, rgbaE, 0.8541)+slopEND; - // Note: No need to specify health bar border separately. - } - - eq_D_QA = eq(D,QA); - eq_D_QG = eq(D,QG); - eq_B_PC = eq(B,PC); - - // 3. Half dithering Usually shadow expression on contour edges, use weak mixing - if ( eq_E_C && eq_E_G && eq_A_P && eq_A_Q && - (eq_B_PC || eq_D_QG) && - eq_D_QA && eq_B_PA) { - - return mixok ? mix(rgbaX, rgbaE, 0.618034)+slopEND : mix(rgbaX, rgbaE, 0.8541)+slopEND; - } - - // 4. Quarter dithering, prone to ugly little finger effect - - if ( eq_E_C && eq_E_G && eq_A_P - && eq_B_PA &&eq_D_QA && eq_D_QG - && eq_E_H - ) return mixok ? mix(rgbaX, rgbaE, 0.618034)+slopEND : mix(rgbaX, rgbaE, 0.8541)+slopEND; - - if ( eq_E_C && eq_E_G && eq_A_Q - && eq_B_PA &&eq_D_QA && eq_B_PC - && eq_E_F - ) return mixok ? mix(rgbaX, rgbaE, 0.618034)+slopEND : mix(rgbaX, rgbaE, 0.8541)+slopEND; - - - // E-side three in a row (Must be after dithering) - if ( eq_E_C && eq_E_G ) return rgbaX+slopEND; - - comboA3 = eq_A_P && eq_A_Q; - - // A-side three in a row (Must be after dithering) Because E-A are the same, prefer mixing over direct copy. - if (comboA3) return mixok ? mix(rgbaX, rgbaE, 0.381966)+slopEND : rgbaX+slopEND; - - - // B-D part of long slope - eq_B_P = eq(B,P); - eq_D_Q = eq(D,Q); - B_wall = eq_B_C && !eq_B_P; - B_tower = eq_B_P && !eq_B_C; - D_tower = eq_D_Q && !eq_D_G; - D_wall = eq_D_G && !eq_D_Q; - - int scoreE = 0; int scoreB = 0; int scoreD = 0; int scoreZ = 0; - - -// E B D area chessboard scoring rule - -// E Zone - if (En3) { - scoreE += 1; - if (B_wall || B_tower || D_tower || D_wall) scoreZ = 1; - } - - if (eq_E_C) { - scoreE += 1; - scoreE += int(eq_E_F); - } - - if (eq_E_G) { - scoreE += 1; - scoreE += int(eq_E_H); - - } - - if (scoreE==0) { - // 1 stick - if (eq_E_F ||eq_E_H) return theEXIT; - } - - if ( eq(F,H) ) { - scoreE += 1; - if ( scoreZ==0 && B_wall && (eq(F,R) || eq(G,H) || eq(F,I)) ) scoreZ = 1; - if ( scoreZ==0 && D_wall && (eq(C,F) || eq(H,S) || eq(F,I)) ) scoreZ = 1; - } - - bool Bn3 = eq_B_P&&eq_B_C; - bool Dn3 = eq_D_G&&eq_D_Q; - -// B Zone - scoreB -= int(Bn3); - scoreB -= int(eq(C,P)); - if (scoreB < 0) scoreZ = 0; - - if (eq_B_PA) { - scoreB -= 1; - scoreB -= int(eq(P,PA)); - } - -// D Zone - scoreD -= int(Dn3); - scoreD -= int(eq(G,Q)); - if (scoreD < 0) scoreZ = 0; - - if (eq_D_QA) { - scoreD -= 1; - scoreD -= int(eq(Q,QA)); - } - - int scoreFinal = scoreE + scoreB + scoreD + scoreZ ; - - if (scoreE >= 1 && scoreB >= 0 && scoreD >=0) scoreFinal += 1; - - if (scoreFinal >= 2) return rgbaX; - - if (scoreFinal == 1) return mixok ? mix(rgbaX,rgbaE,0.381966) : rgbaX; - - // Final supplement: Total score zero, and B, D zones have no deductions, forming a long slope shape. - if (scoreB >= 0 && scoreD >=0) { - if (B_wall&&D_tower) return rgbaX; - if (B_tower&&D_wall) return rgbaX; - } - - return slopeBAD; - -} // eq_E_A - - - -/*========================================================= - F - H / -B - D- Extension New Rules - ==================================================== zz */ - -// This section is different from the sim section. The center point and related En4square and BD logic naturally have a wall separating them. -// Judgment rules are different from the sim side. - - eq_B_P = eq(B, P); - eq_B_PC = eq(B, PC); - eq_D_Q = eq(D, Q); - eq_D_QG = eq(D, QG); - - // B D not connected to anything exit (Practice: This branch section needs it) - if ( !eq_B_C && !eq_B_P && !eq_B_PC && !eq_D_G && !eq_D_Q && !eq_D_QG ) return slopeBAD; - - mixok = mixcheck(rgbaX,rgbaE); - eq_E_I = eq(E, I); - - // Exit if center point E is a high-contrast pixel, visually very different from surrounding pixels. - int E_lumDiff = rgbEl>234600 ? 37204 : 97401; // 234600/255000=0.92/1 37204=0.145898/1 97401=0.382/1 - bool E_ally = mixok || abs(rgbEl-rgbFl)127500) && (eq_H_S == eq(I, SI) && eq_F_R == eq(I, RI)) ) return theEXIT; - - return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - } - - // Wall enclosed triangle - if ( En3 ) { - if (sim_X_E) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - if (eq_H_S && eq_F_R) return theEXIT; // Both sides extend simultaneously (building edges) - // Inner bend - if (eq_B_C || eq_D_G) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - // Return directly if has thickness (Z-shaped snake can flatten the outer bend below) - if (eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - // Outer bend - if (eq_B_P || eq_D_Q) return theEXIT; - - return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - // The last two rules are based on experience. Principle: Connect L inner bend, do not connect L outer bend (Double Dragon Jimmy's eyebrow) - } - - // F - H - // Principle: Connect L inner bend, do not connect L outer bend - if ( eq(F,H) ) { - if (sim_X_E) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - // Solid L enclosed, avoid bilateral symmetric full enclosure squeezing single pixel - if ( eq_B_C && eq_A_B && (eq_G_H||!eq_F_R) &&eq(F, I) ) return slopeBAD; - if ( eq_D_G && eq_A_B && (eq_C_F||!eq_H_S) &&eq(F, I) ) return slopeBAD; - - //Inner bend - if (eq_B_C && (eq_F_R||eq_G_H||eq(F, I))) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - if (eq_D_G && (eq_C_F||eq_H_S||eq(F, I))) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - // E-I F-H cross破坏 trend - if (eq_E_I) return slopeBAD; - // Z-shaped outer - if (eq_B_P && eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - if (eq_D_Q && eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - // Outer bend unless the opposite side forms a long L-shaped trend - if (eq_B_P && (eq_C_F&&eq_H_S)) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - if (eq_D_Q && (eq_F_R&&eq_G_H)) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - - return slopeBAD; - } - - - // Relaxed rule finally cleans up two long slopes (non-clear shapes) - // Note: This section handles long slopes differently from the sim2 section. Solid corners exit. - if ( eq_B_C && eq_D_Q || eq_D_G && eq_B_P) { - // Note: Must clear eq_A_B first, otherwise edge single pixels will be chipped away (Everlasting Secret) - if (eq_A_B) return theEXIT; - return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - } - - - // A-side three in a row, MUST NOT be used separately without !eq_A_B !!!!!!!!!!!! - // if (comboA3) return rgbaX+slopEND; - - - // Use B + D bidirectional extension to capture once more, priority higher than L inner/outer single stick below. - if ( (B_slope||B_tower) && (eq_D_QG&&!eq_D_G||D_tower) ) return rgbaX +slopEND; - if ( (D_slope||D_tower) && (eq_B_PC&&!eq_B_C||B_tower) ) return rgbaX +slopEND; - - - // L-shaped corner (clear) inward single stick, exit - if (eq_A_B && !ThickBorder && !eq_E_I ) { - - if (B_wall && eq_E_F) return theEXIT; - if (D_wall && eq_E_H) return theEXIT; - } - - - // L-shaped corner (hollow) outward single stick, exit (Connect inside corner, not outside corner) - // Practice: Can prevent font edges from being shaved (Captain Commando) - if ( (B_tower || D_tower) && (eq_E_F||eq_E_H) && !eq_A_B && !eq_E_I) return theEXIT; - - // Final B or D individual extension judgment - - // Farthest distance a slope can utilize - if ( B_slope && eq(PC,CC) && noteq(PC,RC) && !eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - if ( D_slope && eq(QG,GG) && noteq(QG,SG) && !eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - - // With X E being close, the slope can have one less judgment point, and some restrictions internally. - if ( mixok && !eq_A_B ) { - if ( B_slope && (!eq_C_F||eq(F,RC)) ) return mix(rgbaX,rgbaE,0.381966)+slopEND; - if ( D_slope && (!eq_G_H||eq(H,SG)) ) return mix(rgbaX,rgbaE,0.381966)+slopEND; - } - - // Tower type relax eq_A_B to form Z-shaped snake, and one side can be wall, slope. But the other side cannot be tower and wall (naturally forbidden) - if ( eq_B_P && !eq_B_PA && !eq_D_Q && eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - if ( eq_D_Q && !eq_D_QA && !eq_B_P && eq_A_B) return mixok ? mix(rgbaX,rgbaE,0.381966)+slopEND : rgbaX+slopEND; - - return theEXIT; - -} // admixX - -vec4 admixS(uint A, uint B, uint C, uint D, uint E, uint F, uint G, uint H, uint I, uint R, uint RC, uint RI, uint S, uint SG, uint SI, uint II, bool eq_B_D, bool eq_E_D, int El, int Bl, vec4 rgbaE) { - - // A B C . - // Q D 🄴 🅵 🆁 Zone 4 - // 🅶 🅷 I - // S - int rgbBl = Bl & 0xFFFFF; - int rgbEl = El & 0xFFFFF; - - if (any_eq2(F,C,I)) return rgbaE; - - if (eq(R, RI) && noteq(R,I)) return rgbaE; - if (eq(H, S) && noteq(H,I)) return rgbaE; - - if ( eq(R, RC) || eq(G,SG) ) return rgbaE; - // 97401/255000 = 0.382/1 - if ( ( eq_B_D&&eq(B,C)&&abs(rgbEl-rgbBl)<97401 || eq_E_D&&v4i_sim2(rgbaE,C) ) && - (any_eq3(I,H,S,RI) || eq(SI,RI)&¬eq(I,II)) ) return unpackUnorm4x8(F); - - return rgbaE; +bool none_eq4(ABGR8 B, ABGR8 A0, ABGR8 A1, ABGR8 A2, ABGR8 A3) { + return B != A0 && B != A1 && B != A2 && B != A3; } void applyScaling(uvec2 xy) { int srcX = int(xy.x); int srcY = int(xy.y); - uint D = src(srcX - 1, srcY + 0), E = src(srcX, srcY + 0), F = src(srcX + 1, srcY + 0); + 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); + ABGR8 G = src(srcX - 1, srcY + 1), H = src(srcX, srcY + 1), I = src(srcX + 1, srcY + 1); - // Predefine default output for easy conditional return later + ABGR8 J = E, K = E, L = E, M = E; + + if (((A ^ E) | (B ^ E) | (C ^ E) | (D ^ E) | (F ^ E) | (G ^ E) | (H ^ E) | (I ^ E)) != 0u) { + ABGR8 P = src(srcX, srcY - 2), S = src(srcX, srcY + 2); + ABGR8 Q = src(srcX - 2, srcY), R = src(srcX + 2, srcY); + ABGR8 Bl = luma(B), Dl = luma(D), El = luma(E), Fl = luma(F), Hl = luma(H); + + // 1:1 slope rules + if ((D == B && D != H && D != F) && (El >= Dl || E == A) && any_eq3(E, A, C, G) && ((El < Dl) || A != D || E != P || E != Q)) J = D; + if ((B == F && B != D && B != H) && (El >= Bl || E == C) && any_eq3(E, A, C, I) && ((El < Bl) || C != B || E != P || E != R)) K = B; + if ((H == D && H != F && H != B) && (El >= Hl || E == G) && any_eq3(E, A, G, I) && ((El < Hl) || G != H || E != S || E != Q)) L = H; + if ((F == H && F != B && F != D) && (El >= Fl || E == I) && any_eq3(E, C, G, I) && ((El < Fl) || I != H || E != R || E != S)) M = F; + + // Intersection rules + if ((E != F && all_eq4(E, C, I, D, Q) && all_eq2(F, B, H)) && (F != src(srcX + 3, srcY))) K = M = F; + if ((E != D && all_eq4(E, A, G, F, R) && all_eq2(D, B, H)) && (D != src(srcX - 3, srcY))) J = L = D; + if ((E != H && all_eq4(E, G, I, B, P) && all_eq2(H, D, F)) && (H != src(srcX, srcY + 3))) L = M = H; + if ((E != B && all_eq4(E, A, C, H, S) && all_eq2(B, D, F)) && (B != src(srcX, srcY - 3))) J = K = B; + if (Bl < El && all_eq4(E, G, H, I, S) && none_eq4(E, A, D, C, F)) J = K = B; + if (Hl < El && all_eq4(E, A, B, C, P) && none_eq4(E, D, G, I, F)) L = M = H; + if (Fl < El && all_eq4(E, A, D, G, Q) && none_eq4(E, B, C, I, H)) K = M = F; + 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 != 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 (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 (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 + + // Write four pixels at once. ivec2 destXY = ivec2(xy) * 2; - vec4 rgbaE = unpackUnorm4x8(E); - vec4 J = rgbaE, K = rgbaE, L = rgbaE, M = rgbaE; - - bool eq_E_D = eq(E,D); - bool eq_E_F = eq(E,F); - -// Skip same-color horizontal 3x1 block -if ( eq_E_D && eq_E_F ) { - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; -} - - uint B = src(srcX, srcY - 1), H = src(srcX, srcY + 1); - bool eq_E_B = eq(E,B); - bool eq_E_H = eq(E,H); - -// Skip same-color vertical 3x1 block -if ( eq_E_B && eq_E_H ) { - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; -} - - bool eq_B_H = eq(B,H); - bool eq_D_F = eq(D,F); - -// Skip mirrored block surrounding center point -if ( eq_B_H && eq_D_F ) { - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; -} - - uint A = src(srcX - 1, srcY - 1), C = src(srcX + 1, srcY - 1); - uint G = src(srcX - 1, srcY + 1), I = src(srcX + 1, srcY + 1); - - uint P = src(srcX, srcY - 2), S = src(srcX, srcY + 2); - uint Q = src(srcX - 2, srcY), R = src(srcX + 2, srcY); - - int Bl = luma(B), Dl = luma(D), El = luma(E), Fl = luma(F), Hl = luma(H); - -// Continue expanding to 5x5 - uint PA = src(srcX-1, srcY-2); - uint PC = src(srcX+1, srcY-2); - uint QA = src(srcX-2, srcY-1); - uint QG = src(srcX-2, srcY+1); // AA PA [P] PC CC - uint RC = src(srcX+2, srcY-1); // ┌───┬───┬───┐ - uint RI = src(srcX+2, srcY+1); // QA │ A │ B │ C │ RC - uint SG = src(srcX-1, srcY+2); // ├───┼───┼───┤ - uint SI = src(srcX+1, srcY+2); // [Q] │ D │ E │ F │ [R] - uint AA = src(srcX-2, srcY-2); // ├───┼───┼───┤ - uint CC = src(srcX+2, srcY-2); // QG │ G │ H │ I │ RI - uint GG = src(srcX-2, srcY+2); // └───┴───┴───┘ - uint II = src(srcX+2, srcY+2); // GG SG [S] SI II - - -// 1:1 slope rules (P95) - - // main slops - bool eq_B_D = eq(B,D); - bool eq_B_F = eq(B,F); - bool eq_D_H = eq(D,H); - bool eq_F_H = eq(F,H); - - // Any mirrored block surrounding center point - bool oppoPix = eq_B_H || eq_D_F; - // Flag indicating entry into adminxX function if caught by 1:1 slope rule - bool slope1 = false; bool slope2 = false; bool slope3 = false; bool slope4 = false; - // Standard pixel that successfully passed the 1:1 slope rule and returned normally - bool slope1ok = false; bool slope2ok = false; bool slope3ok = false; bool slope4ok = false; - // slopeBAD entered adminxX, but (at least one of JKLM) returned E point - bool slopeBAD = false; bool slopEND = false; - - // B - D - if ( (!eq_E_B&&!eq_E_D&&!oppoPix) && (!eq_D_H&&!eq_B_F) && (El>=Dl&&El>=Bl || eq(E,A)) && ( (El 1.0 ) { - if (J.b > 30.0 ) {J=J-33.0; slopEND=true;} - if (J.b == 8.0 ) { - J=rgbaE; - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; - } - if (J.b == 2.0 ) {slopeBAD=true; J=rgbaE;} - } else slope1ok = true; - } - // B - F - if ( !slope1 && (!eq_E_B&&!eq_E_F&&!oppoPix) && (!eq_B_D&&!eq_F_H) && (El>=Bl&&El>=Fl || eq(E,C)) && ( (El 1.0 ) { - if (K.b > 30.0 ) {K=K-33.0; slopEND=true;} - if (K.b == 8.0 ) { - K=rgbaE; - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; - } - if (K.b == 2.0 ) {slopeBAD=true; K=rgbaE;} - } else {slope2ok = true;} - } - // D - H - if ( !slope1 && (!eq_E_D&&!eq_E_H&&!oppoPix) && (!eq_F_H&&!eq_B_D) && (El>=Hl&&El>=Dl || eq(E,G)) && ((El 1.0 ) { - if (L.b > 30.0 ) {L=L-33.0; slopEND=true;} - if (L.b == 8.0 ) { - L=rgbaE; - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; - } - if (L.b == 2.0 ) {slopeBAD=true; L=rgbaE;} - } else {slope3ok = true;} - } - // F - H - if ( !slope2 && !slope3 && (!eq_E_F&&!eq_E_H&&!oppoPix) && (!eq_B_F&&!eq_D_H) && (El>=Fl&&El>=Hl || eq(E,I)) && ((El 1.0 ) { - if (M.b > 30.0 ) {M=M-33.0; slopEND=true;} - if (M.b == 8.0 ) { - M=rgbaE; - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; - } - if (M.b == 2.0 ) {slopeBAD=true; M=rgbaE;} - } else {slope4ok = true;} - } - - -if (slopEND) { - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; -} - - -// long gentle 2:1 slope (P100) - - bool longslope = false; - - if (slope4ok && eq_F_H) { //zone4 long slope - // Original rule extension 1. adminxL third parameter passes adjacent pixel for comparison, ensuring no double mixing. - // Original rule extension 2. Cannot have L shape again within the two-pixel gap on the opposite side, unless forming a wall. - if (eq(G,H) && eq(F,R) && noteq(R, RC) && (noteq(Q,G)||eq(Q, QA))) {L=admixL(M,L,H); longslope = true;} - // virtical - if (eq(C,F) && eq(H,S) && noteq(S, SG) && (noteq(P,C)||eq(P, PA))) {K=admixL(M,K,F); longslope = true;} - } - - - if (slope3ok && eq_D_H) { //zone3 long slope - // horizontal - if (eq(D,Q) && eq(H,I) && noteq(Q, QA) && (noteq(R,I)||eq(R, RC))) {M=admixL(L,M,H); longslope = true;} - // virtical - if (eq(A,D) && eq(H,S) && noteq(S, SI) && (noteq(A,P)||eq(P, PC))) {J=admixL(L,J,D); longslope = true;} - } - - if (slope2ok && eq_B_F) { //zone2 long slope - // horizontal - if (eq(A,B) && eq(F,R) && noteq(R, RI) && (noteq(A,Q)||eq(Q, QG))) {J=admixL(K,J,B); longslope = true;} - // virtical - if (eq(F,I) && eq(B,P) && noteq(P, PA) && (noteq(I,S)||eq(S, SG))) {M=admixL(K,M,F); longslope = true;} - } - - if (slope1ok && eq_B_D) { //zone1 long slope - // horizontal - if (eq(B,C) && eq(D,Q) && noteq(Q, QG) && (noteq(C,R)||eq(R, RI))) {K=admixL(J,K,B); longslope = true;} - // virtical - if (eq(D,G) && eq(B,P) && noteq(P, PC) && (noteq(G,S)||eq(S, SI))) {L=admixL(J,L,D); longslope = true;} - } - - -// longslope formed can exit, basically won't form sawslope on the diagonal -if (longslope) { - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; -} - -bool sawslope = false; - -bool slopeok = slope1ok||slope2ok||slope3ok||slope4ok; - -// Note: sawslope cannot exclude slopEND (few) and slopeBAD (very few), but can exclude slopeok (strong shape) -if (!oppoPix && !slopeok) { - - - // horizontal bottom - if (!eq_E_H && none_eq2(H,A,C)) { - - // A B C . - // Q D 🄴 🅵 🆁 Zone 4 - // 🅶 🅷 I - // S - // (!slope3 && !eq_D_H) Such consecutive use is quite well - if ( (!slope2 && !eq_B_F) && (!slope3 && !eq_D_H) && !eq_F_H && - !eq_E_F && (eq_B_D || eq_E_D) && eq(R,H) && eq(F,G) ) { - M = admixS(A,B,C,D,E,F,G,H,I,R,RC,RI,S,SG,SI,II,eq_B_D,eq_E_D,El,Bl,rgbaE); - sawslope = true;} - - // . A B C - // 🆀 🅳 🄴 F R Zone 3 - // G 🅷 🅸 - // S - if ( !sawslope && (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_D_H && - !eq_E_D && (eq_B_F || eq_E_F) && eq(Q,H) && eq(D,I) ) { - L = admixS(C,B,A,F,E,D,I,H,G,Q,QA,QG,S,SI,SG,GG,eq_B_F,eq_E_F,El,Bl,rgbaE); - sawslope = true;} - } - - // horizontal up - if ( !sawslope && !eq_E_B && none_eq2(B,G,I)) { - - // P - // 🅐 🅑 C - // Q D 🄴 🅵 🆁 Zone 2 - // G H I . - if ( (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_B_F && - !eq_E_F && (eq_D_H || eq_E_D) && eq(B,R) && eq(A,F) ) { - K = admixS(G,H,I,D,E,F,A,B,C,R,RI,RC,P,PA,PC,CC,eq_D_H,eq_E_D,El,Hl,rgbaE); - sawslope = true;} - - // P - // A 🅑 🅲 - // 🆀 🅳 🄴 F R Zone 1 - // . G H I - if ( !sawslope && (!slope2 && !eq_B_F) && (!slope3 && !eq_D_H) && !eq_B_D && - !eq_E_D && (eq_F_H || eq_E_F) && eq(B,Q) && eq(C,D) ) { - J = admixS(I,H,G,F,E,D,C,B,A,Q,QG,QA,P,PC,PA,AA,eq_F_H,eq_E_F,El,Hl,rgbaE); - sawslope = true;} - - } - - // vertical left - if ( !sawslope && !eq_E_D && none_eq2(D,C,I) ) { - - // 🅐 B C - // Q 🅳 🄴 F R - // G 🅷 I Zone 3 - // 🆂 . - if ( (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_D_H && - !eq_E_H && (eq_B_F || eq_E_B) && eq(D,S) && eq(A,H) ) { - L = admixS(C,F,I,B,E,H,A,D,G,S,SI,SG,Q,QA,QG,GG,eq_B_F,eq_E_B,El,Fl,rgbaE); - sawslope = true;} - - // 🅟 . - // A 🅑 C - // Q 🅳 🄴 F R Zone 1 - // 🅶 H I - if ( !sawslope && (!slope3 && !eq_D_H) && (!slope2 && !eq_B_F) && !eq_B_D && - !eq_E_B && (eq_F_H || eq_E_H) && eq(P,D) && eq(B,G) ) { - J = admixS(I,F,C,H,E,B,G,D,A,P,PC,PA,Q,QG,QA,AA,eq_F_H,eq_E_H,El,Fl,rgbaE); - sawslope = true;} - - } - - // vertical right - if ( !sawslope && !eq_E_F && none_eq2(F,A,G) ) { // right - - // A B 🅲 - // Q D 🄴 🅵 R - // G 🅷 I Zone 4 - // . 🆂 - if ( (!slope2 && !eq_B_F) && (!slope3 && !eq_D_H) && !eq_F_H && - !eq_E_H && (eq_B_D || eq_E_B) && eq(S,F) && eq(H,C) ) { - M = admixS(A,D,G,B,E,H,C,F,I,S,SG,SI,R,RC,RI,II,eq_B_D,eq_E_B,El,Dl,rgbaE); - sawslope = true;} - - // . 🅟 - // A 🅑 C - // Q D 🄴 🅵 R Zone 2 - // G H 🅸 - if ( !sawslope && (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_B_F && - !eq_E_B && (eq_D_H || eq_E_H) && eq(P,F) && eq(B,I) ) { - K = admixS(G,D,A,H,E,B,I,F,C,P,PA,PC,R,RI,RC,CC,eq_D_H,eq_E_H,El,Dl,rgbaE); - sawslope = true;} - - } // vertical right -} // sawslope - -// sawslope formed can exit, slopeBAD is not suitable for the CnC below -// Exit early if all 5 points (up, down, left, right, center) are fully transparent -if (sawslope||slopeBAD||El>=7340032||Bl>=7340032||Dl>=7340032||Fl>=7340032||Hl>=7340032) { - writeColorf(destXY, J); - writeColorf(destXY + ivec2(1, 0), K); - writeColorf(destXY + ivec2(0, 1), L); - writeColorf(destXY + ivec2(1, 1), M); - return; -} - - -/************************************************** - * "Concave + Cross" type (P100) * - *************************************************/ -// The far end of the cross star uses similar pixels, useful for some horizontal lines + sawtooth and layered gradient shapes. E.g., glowing text in SFIII 3rd Strike intro, Japanese houses in SFZ3Mix, Garou Mark of the Wolves intro. -// Practice: CnC cannot exclude slopEND (weak shape) and slopeok (strong shape) but can exclude slopeBAD !!! - -bool cnc = false; uint X; - if (!slope3 && !slope4 && - Bl= 0 && x < params.width && y >= 0 && y < params.height) + ? readColoru(uvec2(x, y)) + : 0u; +} + + +// RGB perceptual weight + alpha segmentation +float luma(vec4 col) { + + // BT.601 standard (CRT era) - result divided by 10, range [0.0 - 0.1] + float rgbsum =dot(col.rgb, vec3(0.0299, 0.0587, 0.0114)); + + // Subsequent fractional extraction *10 removes alpha weighting + float alphafactor = + (col.a > 0.854102) ? 1.0 : // 2x short golden ratio (larger segment) + (col.a > 0.618034) ? 2.0 : // 1x golden ratio + (col.a > 0.381966) ? 3.0 : // 1x short golden ratio + (col.a > 0.145898) ? 4.0 : // 2x short golden ratio + (col.a > 0.002) ? 5.0 : 8.0; // Fully transparent + + return rgbsum + alphafactor; + +} + +/* Constant explanations: +0.145898 : 2x short golden ratio of 1.0 +0.0638587 : Squared value after 2x short golden ratio on RGB Euclidean distance +0.024391856 : Squared value after 2x short golden ratio + 1x golden ratio on RGB Euclidean distance +0.00931686 : Squared value after 3x short golden ratio on RGB Euclidean distance +0.001359312 : Squared value after 4x short golden ratio on RGB Euclidean distance +0.4377 : Squared value after 1x short golden ratio on RGB Euclidean distance +0.75 : Squared value after halving RGB Euclidean distance +*/ +// Pixel similarity check LV1 +bool sim1(vec4 col1, vec4 col2) { + + vec4 diff = col1 - col2; + vec4 absdiff = abs(diff); + + // 1. Fast component difference check + if ( absdiff.r > 0.1 || absdiff.g > 0.1 || absdiff.b > 0.1 || absdiff.a > 0.145898 ) return false; // xxx.alpha + + // 2. Fast squared distance check + float dot_diff = dot(diff.rgb, diff.rgb); // xxx.alpha + if (dot_diff < 0.001359312) return true; + + // 3. Gradual pixel check + float min_diff = min(diff.r, min(diff.g, diff.b)); + float max_diff = max(diff.r, max(diff.g, diff.b)); + if ( max_diff-min_diff>0.096 ) return false; // Exit if difference exceeds int24 + if ( max_diff-min_diff<0.024 && dot_diff<0.024391856) return true; // Consider gradual pixel if difference ≤ int6. Relax threshold by one level. + + // 4. Grayscale pixel check + float sum1 = dot(col1.rgb, vec3(1.0)); // Sum of RGB channels //xxx.alpha + float sum2 = dot(col2.rgb, vec3(1.0)); //xxx.alpha + float avg1 = sum1 * 0.3333333; + float avg2 = sum2 * 0.3333333; + + vec3 graydiff1 = col1.rgb - vec3(avg1); //xxx.alpha + vec3 graydiff2 = col2.rgb - vec3(avg2); //xxx.alpha + float dotgray1 = dot(graydiff1,graydiff1); + float dotgray2 = dot(graydiff2,graydiff2); + // 0.002: Max single-channel difference allowed is int13 when avg=20. + // 0.0004: Max single-channel difference allowed is int6, or int3+4 for dual channels + float tolerance1 = avg1<0.08 ? 0.002 : 0.0004; + float tolerance2 = avg2<0.08 ? 0.002 : 0.0004; + // 0.078 limits max green channel value to 19 (perceptible threshold to human eye) + bool Col1isGray = sum1<0.078||dotgray10.381966) return false; + + // 1. Clamp RGB dark areas + vec3 clampCol1 = max(col1.rgb, vec3(0.078)); //xxx.alpha + vec3 clampCol2 = max(col2.rgb, vec3(0.078)); //xxx.alpha + + vec3 clampdiff = clampCol1 - clampCol2; + + // 2x short + 1x, 2x short golden ratio of RGB Euclidean distance between two points + float dotdist = Lv==2 ? 0.024391856 : 0.0638587; + + return dot(clampdiff, clampdiff) < dotdist; +} + +bool sim2(vec4 colC1, uint C1, uint C2) { + if (C1==C2) return true; + return sim2n3(colC1, unpackUnorm4x8(C2), 2); +} + +bool sim3(vec4 col1, vec4 col2) { + return sim2n3(col1, col2, 3); +} + +bool mixcheck(vec4 col1, vec4 col2) { + + // Do not mix if either is transparent //xxx.alpha + bool col1alpha0 = col1.a < 0.003; + bool col2alpha0 = col2.a < 0.003; + if (col1alpha0!=col2alpha0) return false; + + // Cannot mix if transparency difference exceeds 50% //xxx.alpha + if (abs(col1.a - col2.a)>0.5) return false; + + vec3 diff = col1.rgb - col2.rgb; + + // Gradual pixel check + float min_diff = min(diff.r, min(diff.g, diff.b)); + float max_diff = max(diff.r, max(diff.g, diff.b)); + if ( max_diff-min_diff>0.618034 ) return false; + + float dot_diff = dot(diff, diff); + if( max_diff-min_diff<0.024 && dot_diff<0.75) return true; // 0.020 ≤ int5 0.024 ≤ int6 + + // Accumulate positive/negative values separately using max/min + float team_pos = abs(dot(max(diff, 0.0), vec3(1.0))); + float team_neg = abs(dot(min(diff, 0.0), vec3(1.0))); + // Find opposing channels and add to squared distance for judgment + float team_rebel = min(team_pos, team_neg); + // Empirical: At least 3x opposing channel value needs to be added. (+1x to break even, +2x to form increasing trend) + return dot_diff + team_rebel*team_rebel*3.0 < 0.4377; +} + +// RGB must be identical, small alpha channel difference allowed +bool eq(uint C1, uint C2){ + if (C1 == C2) return true; + + uint rgbC1 = C1 & 0x00FFFFFFu; + uint rgbC2 = C2 & 0x00FFFFFFu; + + if (rgbC1 != rgbC2) return false; + + uint alphaC1 = C1 >> 24; + uint alphaC2 = C2 >> 24; + + // Note: abs(alphaC1-alphaC2) cannot be used with uint! + uint alphaDiff = (alphaC1 > alphaC2) ? (alphaC1 - alphaC2) : (alphaC2 - alphaC1); + + return alphaDiff < 38u; //2x short golden ratio of 255u + +} + +#define noteq(a,b) (a!=b) + +bool vec_noteq(vec4 col1, vec4 col2) { + vec4 diff = abs(col1 - col2); + // Allow total RGB channel difference of int2, alpha channel difference of int5 + return dot(diff.rgb, vec3(1.0)) > 0.008 || diff.a > 0.021286; +} + +bool all_eq2(uint B, uint A0, uint A1) { + return (eq(B,A0) && eq(B,A1)); +} + +bool any_eq2(uint B, uint A0, uint A1) { + return (eq(B,A0) || eq(B,A1)); +} + +bool any_eq3(uint B, uint A0, uint A1, uint A2) { + return (eq(B,A0) || eq(B,A1) || eq(B,A2)); +} + +bool none_eq2(uint B, uint A0, uint A1) { + return (noteq(B,A0) && noteq(B,A1)); +} + +// Pre-define +//#define testcolor vec4(1.0, 0.0, 1.0, 1.0) // Magenta +//#define testcolor2 vec4(0.0, 1.0, 1.0, 1.0) // Cyan +//#define testcolor3 vec4(1.0, 1.0, 0.0, 1.0) // Yellow +//#define testcolor4 vec4(1.0, 1.0, 1.0, 1.0) // White + +#define slopeBAD vec4(2.0) +#define theEXIT vec4(4.0) +#define slopOFF vec4(8.0) +#define Mix382 mix(colX,colE,0.381966) +#define Mix618 mix(colX,colE,0.618034) +#define Mix854 mix(colX,colE,0.8541) +#define Mix382off Mix382+slopOFF +#define Mix618off Mix618+slopOFF +#define Mix854off Mix854+slopOFF +#define Xoff colX+slopOFF +#define checkblack(col) ((col).g < 0.078 && (col).r < 0.1 && (col).b < 0.1) +#define diffEB abs(El-Bl) +#define diffED abs(El-Dl) +#define writeJKLM writeColorf(destXY,J);writeColorf(destXY+ivec2(1,0),K);writeColorf(destXY+ivec2(0,1),L);writeColorf(destXY+ivec2(1,1),M) + +//pin zz +// Concave + Cross shape - weak blending (weak/none) +vec4 admixC(vec4 colX, vec4 colE) { + // Transparent pixels already filtered in main line + + bool mixok = mixcheck(colX, colE); + + return mixok ? Mix618 : colE; + +} + +// K shape - forced weak blending (weak/weaker) +vec4 admixK(vec4 colX, vec4 colE) { + // Transparent pixels already filtered in main line + + bool mixok = mixcheck(colX, colE); + + return mixok ? Mix618 : Mix854; + +} + +// L shape 2:1 slope - extension of main corner +// Note: This rule requires all 4 pixels on the slope to be identical. Otherwise, various visual artifacts will appear! +vec4 admixL(vec4 colX, vec4 colE, vec4 colS) { + + // Check eqX,E: originally captured large number of duplicate pixels, now filtered via slopeok in main line. + + // If target X differs from reference S (sample), it means blending has already occurred once. + // Copy directly without re-blending + if (vec_noteq(colX, colS)) return colX; + + bool mixok = mixcheck(colX, colE); + + return mixok ? Mix382 : colX; +} + +/******************************************************************************************************************************************** + * main slope + X cross-processing mechanism * + *******************************************************************************************************************************************/ +vec4 admixX(uint A, uint B, uint C, uint D, uint E, uint F, uint G, uint H, uint I, uint P, uint PA, uint PC, uint Q, uint QA, uint QG, uint R, uint RC, uint RI, uint S, uint SG, uint SI, uint AA, uint CC, uint GG, float El, float Bl, float Dl, float Fl, float Hl, vec4 colE, vec4 colB, vec4 colD) { + + // xxx.alpha + // 1. Normal rule: center E has higher luma - transparency in BD is illogical + // 2. B/D may be transparent when E-A are identical, but using transparent B/D to cut solid crossed E-A violates design + if (colB.a<0.002||colD.a<0.002) return slopeBAD; + + bool eq_B_C = eq(B, C); + bool eq_D_G = eq(D, G); + + // Exit if surrounded by straight walls on both sides + if (eq_B_C && eq_D_G) return slopeBAD; + + //Pre-declare + bool eq_A_B; bool eq_A_D; bool eq_A_P; bool eq_A_Q; + bool eq_B_P; bool eq_B_PA; bool eq_B_PC; + bool eq_D_Q; bool eq_D_QA; bool eq_D_QG; + bool eq_E_F; bool eq_E_H; bool eq_E_I; bool En3; + bool B_slope; bool B_tower; bool B_wall; + bool D_slope; bool D_tower; bool D_wall; + vec4 colX; bool Xisblack; + bool mixok; + + bool eq_B_D = eq(B,D); + bool eq_E_A = eq(E,A); + + #define comboA3 eq_A_P && eq_A_Q + #define En4square En3 && eq_E_I + + // E is nearly transparent but not fully transparent - mostly edges //xxx.alpha + bool EalphaL = colE.a <0.381966 && colE.a >0.002; + + // Remove alpha channel weighting + Bl = fract(Bl) *10.0; + Dl = fract(Dl) *10.0; + El = fract(El) *10.0; + Fl = fract(Fl) *10.0; + Hl = fract(Hl) *10.0; + +/*========================================= + B != D + ==================================== zz */ +if (!eq_B_D){ + + // Exit if E-A equality violates preset logic + if (eq_E_A) return slopeBAD; + + // Exit if B/D differ significantly (greater than E's difference with either side) + float diffBD = abs(Bl-Dl); + if (diffBD > diffEB || diffBD > diffED) return slopeBAD; + + // Avoid single-pixel font edges being squeezed by black background on both sides + // (Brightness difference between font and background usually exceeds 0.5) + // Note: If BD are not equal, cannot use average for judgment - both must meet black condition + Xisblack = checkblack(colB) && checkblack(colD); + if ( Xisblack && El >0.5 && (Fl<0.078 || Hl<0.078) ) return theEXIT; + +// Exclusion rule before original logic (triangle vertices cannot protrude) + eq_A_B = eq(A,B); + if ( !Xisblack && eq_A_B && eq_D_G && eq(B,P) ) return slopeBAD; + + eq_A_D = eq(A,D); + if ( !Xisblack && eq_A_D && eq_B_C && eq(D,Q) ) return slopeBAD; + + // B/D unconnected to any? Not applicable here (eliminates some artifacts but loses shapes, + // especially non-native pixel art like Double Dragon attract mode character sprites) + + // X is blend of B/D + colX = mix(colB, colD, 0.5); + colX.a = min(colB.a, colD.a); // xxx.alpha + + mixok = mixcheck(colX,colE); + + eq_A_P = eq(A,P); + eq_A_Q = eq(A,Q); + // A-side triple consecutive (eq_A_P && eq_A_Q) - high priority + if (comboA3) return mixok ? Mix382off : Xoff; + + // Official original rule + if ( eq(E,C) || eq(E,G) ) return mixok ? Mix382off : Xoff; + + // Enhanced original rule 1 - good at capturing trends, but enhanced 2 cannot be used (wall bypass issue) + if ( !eq_D_G&&eq(E,QG)&&sim2(colE,E,G) || !eq_B_C&&eq(E,PC)&&sim2(colE,E,C) ) return mixok ? Mix382off : Xoff; + + + // Exclude "3-pixel single-side wall" case + if (!Xisblack){ + if ( eq_A_B&&eq_B_C || eq_A_D&&eq_D_G ) return slopeBAD; + } + + //xxx.alpha + if (EalphaL) return mixok ? Mix382off : Xoff; + + // F-H inline trend (includes En3) - placed after wall rules since blocked by 3-pixel wall rule + if ( eq(F,H) ) return mixok ? Mix382off : Xoff; + + // Remaining "2-pixel single-side wall" and unlogical single pixels - abandon + return slopeBAD; +} // B != D + +/******* B == D prepare *******/ + + // Avoid single-pixel font edges being squeezed by black background on both sides + Xisblack = checkblack(colB); + if ( Xisblack && El >0.5 && (Fl<0.078 || Hl<0.078) ) return theEXIT; + + colX = colB; + colX.a = min(colB.a , colD.a); + + bool eq_E_C = eq(E,C); + bool eq_E_G = eq(E,G); + bool sim_EC = eq_E_C || sim2n3(colE,unpackUnorm4x8(C),2); + bool sim_EG = eq_E_G || sim2n3(colE,unpackUnorm4x8(G),2); + + bool ThickBorder; + + +/*=============================================== + Original main rule (sim2 enhanced) + ========================================== zz */ +if ( (sim_EC || sim_EG) && !eq_E_A ){ + +/* Logic: + 1. Handle non-blending for continuous border shapes + 2. Special handling for long slopes + 3. Original rules + 4. Handle E-area inline (En4, En3, F-H etc.), remaining single strip and single pixel + 5. Handle L-shaped inner single strip and outer single strip + 5. Default fallback return +*/ + + eq_A_B = eq(B,A); + eq_B_P = eq(B,P); + eq_B_PC = eq(B,PC); + eq_B_PA = eq(B,PA); + eq_D_Q = eq(D,Q); + eq_D_QG = eq(D,QG); + eq_D_QA = eq(D,QA); + B_slope = eq_B_PC && !eq_B_P && !eq_B_C; + B_tower = eq_B_P && !eq_B_PC && !eq_B_C && !eq_B_PA; + D_slope = eq_D_QG && !eq_D_Q && !eq_D_G; + D_tower = eq_D_Q && !eq_D_QG && !eq_D_G && !eq_D_QA; + + + // B+ D+ each extend shape (strong shape) - no blending, return Xoff + if ( (B_slope||B_tower) && (D_slope||D_tower) && !eq_A_B) return Xoff; + + + eq_A_P = eq(A, P); + eq_A_Q = eq(A, Q); + mixok = mixcheck(colX,colE); + ThickBorder = eq_A_B && (eq_A_P||eq_A_Q|| eq(A,AA)&&(eq_B_PA||eq_D_QA)); + if (ThickBorder && !Xisblack) mixok=false; + + // A-side triple consecutive (eq_A_P && eq_A_Q) + if (comboA3) { + if (!eq_A_B) return Xoff; + else mixok=false; + } + + // XE_messL B-D-E L-shape with sim2 high similarity WIP + // bool XE_messL = (eq_B_C && !sim_EG || eq_D_G && !sim_EC) ; + + eq_E_F = eq(E, F); + B_wall = eq_B_C && !eq_B_PC && !eq_B_P; + + // Long slope (clear, non-thick solid edge - strong trend!) + // Special condition for long slopes + if ( B_wall && D_tower ) { + if (eq_E_G || sim_EG&&eq(E,QG) ) { // Original rule + enhanced original + if (eq_A_B) return mixok ? Mix382 : colX; // Has thickness + return colX; // Hollow + } + // Clear Z-shaped snake - exclude eq_A_B + XE_messL ??? + //if (eq_A_B && !XE_messL) return ; // Poor effect + if (eq_A_B) return slopeBAD; + // 2-pixel with subsequent long slope + if (eq_E_F ) return colX; + // 1-pixel without subsequent long slope + return Xoff; + } + + eq_E_H = eq(E, H); + D_wall = eq_D_G && !eq_D_QG && !eq_D_Q; + + if ( B_tower && D_wall ) { + if (eq_E_C || sim_EC&&eq(E,PC) ) { // Original rule + enhanced original + if (eq_A_B) return mixok ? Mix382 : colX; // Has thickness + return colX; // Hollow + } + // Clear Z-shaped snake - exclude eq_A_B + XE_messL ??? + //if (eq_A_B && !XE_messL) return ; // Poor effect + if (eq_A_B) return slopeBAD; + // 2-pixel with subsequent long slope + if (eq_E_H ) return colX; + // 1-pixel without subsequent long slope + return Xoff; + } + + + // Official original rule (placed after special shapes - special shapes have designated no-blending!) + if (eq_E_C || eq_E_G) return mixok ? Mix382 : colX; + + // Enhanced original rule 1 + if (sim_EG&&!eq_D_G&&eq(E,QG) || sim_EC&&!eq_B_C&&eq(E,PC)) return mixok ? Mix382off : Xoff; + + // Enhanced original rule 2 + if (sim_EC && sim_EG) return mixok ? Mix382off : Xoff; + + + // F-H inline trend (skip En4, En3) + if ( eq(F,H) ) return mixok ? Mix382off : Xoff; + + // Relaxed rule for final long slope cleanup (non-clear shapes) + // Empirical: This block handles different slopes than F-H. Default to break-even unless cube shape. + if (eq_B_C && eq_D_Q) { + // Exit for double cube + if (eq_B_P && eq_B_PC && eq_A_B && eq_D_QA && !eq_D_QG && eq_E_F && eq(H,I) ) return theEXIT; + + return mixok ? Mix382off : Xoff; + } + + if ( eq_D_G && eq_B_P) { + // Exit for double cube + if (eq_D_Q && eq_D_QG && eq_A_B && eq_B_PA && !eq_B_PC && eq_E_H && eq(F,I) ) return theEXIT; + + return mixok ? Mix382off : Xoff; + } + + eq_E_I = eq(E, I); + + // Exit for clear L-shaped corner with inner parallel single strip + if (eq_A_B && !ThickBorder && !eq_E_I ) { + if (B_wall && eq_E_F) return theEXIT; + if (D_wall && eq_E_H) return theEXIT; + } + + // Early return if colors are similar (skip next step) + if (mixok) return Mix382off; + if (EalphaL) return mixok ? Mix382off : Xoff; //xxx.alpha + + // Exit for hollow L-shaped corner with outer single strip (any direction) - fixes font edge issues + if ( !eq_A_B && (eq_E_F||eq_E_H) && !eq_E_I) { + if (B_tower && !eq_D_Q && !eq_D_QG) return theEXIT; + if (D_tower && !eq_B_P && !eq_B_PC) return theEXIT; + } + + // Fallback handling + return mixok ? Mix382off : Xoff; + +} // sim2 base + + +/*=================================================== + E - A cross + ============================================== zz */ +if (eq_E_A) { + + // Cross ✕ judgment requires "region" and "trend" concepts - tighter conditions for different regions + + // No need to exit for unconnected B/D! ! ! + + eq_E_F = eq(E, F); + eq_E_H = eq(E, H); + eq_E_I = eq(E, I); + + En3 = eq_E_F&&eq_E_H; + + // Special shape: square (En3 && eq_E_I) + if ( En4square ) { + if( noteq(G,H) && noteq(C,F) // Independent clear 4-pixel square / 6-pixel rectangle (both sides meet) + && (eq(H,S) == eq(I,SI) && eq(F,R) == eq(I,RI)) ) return theEXIT; + //else return mixok ? mix(X,E,0.381966) : X; Note: Do not return directly. Need to enter chessboard scoring rule, + // as adjacent B/D areas may also form bubbles with squares + } + + // Special shape: dot pattern + // Empirical 1: !eq_E_F, !eq_E_H - do not use !sim (loses some shapes) + // Empirical 2: Force blending (otherwise lose shapes - Horse from Gouketsuji Ichizoku, Saturday Night Slam Masters 2) + + bool Eisblack = checkblack(colE); + mixok = mixcheck(colX,colE); + + // 1. Dot pattern center + if ( eq_E_C && eq_E_G && eq_E_I && !eq_E_F && !eq_E_H ) { + + // Exit if center E is black (KOF '96 power bar, Punisher's belt) - avoid over-blending with high contrast + if (Eisblack) return theEXIT; + // Empirical 1: Do not capture black B points (normal logic entry) + // Empirical 2: No need to check eq_F_H separately (95%+ probability) + layered gradient in power bar, 0.5 fallback blending + return mixok ? Mix382off : Mix618off; + } + + eq_A_P = eq(A,P); + eq_A_Q = eq(A,Q); + eq_B_PA = eq(B,PA); + + // 2. Dot pattern edge + if ( eq_A_P && eq_A_Q && eq(A,AA) && noteq(A,PA) && noteq(A,QA) ) { + if (Eisblack) return theEXIT; + + // Layered gradient edge - use strong blending + if ( !eq_B_PA && eq(PA,QA) ) return mixok ? Mix382off : Mix618off; + // Remaining perfect cross - definitely dot pattern edge, use weak blending + // Fallback weak blending - no need to specify power bar border case separately + return mixok ? Mix618off : Mix854off; + } + + // xxx.alpha + if (colE.a<0.002) return colX; + + eq_D_QA = eq(D,QA); + eq_D_QG = eq(D,QG); + eq_B_PC = eq(B,PC); + + // 3. Half dot pattern - usually shadow expression on outline edges, use weak blending + if ( eq_E_C && eq_E_G && eq_A_P && eq_A_Q && + (eq_B_PC || eq_D_QG) && + eq_D_QA && eq_B_PA) { + //if (Eisblack) return ; Unnecessary + + return mixok ? Mix618off : Mix854off; + } + + // 4. Quarter dot pattern - prone to ugly "pinkie effect" (Guile's Sonic Boom in SF2, Dino Crisis select screen) + + if ( eq_E_C && eq_E_G && eq_A_P + && eq_B_PA &&eq_D_QA && eq_D_QG + && eq_E_H + ) return mixok ? Mix618off : Mix854off; + + if ( eq_E_C && eq_E_G && eq_A_Q + && eq_B_PA &&eq_D_QA && eq_B_PC + && eq_E_F + ) return mixok ? Mix618off : Mix854off; + + + // E-side triple consecutive (must come after dot pattern) + if ( eq_E_C && eq_E_G ) return Xoff; + + // A-side triple consecutive (eq_A_P && eq_A_Q) - must come after dot pattern. + // Prefer blending over direct copy since E-A are identical + if (comboA3) return mixok ? Mix382off : Xoff; + + + // B-D part of long slope + eq_B_P = eq(B,P); + eq_D_Q = eq(D,Q); + B_wall = eq_B_C && !eq_B_P; + B_tower = eq_B_P && !eq_B_C; + D_tower = eq_D_Q && !eq_D_G; + D_wall = eq_D_G && !eq_D_Q; + + int scoreE = 0; int scoreB = 0; int scoreD = 0; int scoreZ = 0; + + +// E B D area chessboard scoring rule + +// E Zone + if (En3) { + scoreE += 1; + if (B_wall || B_tower || D_tower || D_wall) scoreZ = 1; + } + + if (eq_E_C) { + scoreE += 1; + scoreE += int(eq_E_F); + } + + if (eq_E_G) { + scoreE += 1; + scoreE += int(eq_E_H); + + } + + if (scoreE==0) { + // Single strip + if (eq_E_F ||eq_E_H) return theEXIT; + } + + if ( eq(F,H) ) { + scoreE += 1; + if ( scoreZ==0 && B_wall && (eq(F,R) || eq(G,H) || eq(F,I)) ) scoreZ = 1; + if ( scoreZ==0 && D_wall && (eq(C,F) || eq(H,S) || eq(F,I)) ) scoreZ = 1; + } + + + #define Bn3 eq_B_P&&eq_B_C + #define Dn3 eq_D_G&&eq_D_Q + +// B Zone + scoreB -= int(Bn3); + scoreB -= int(eq(C,P)); + if (scoreB < 0) scoreZ = 0; + + if (eq_B_PA) { + scoreB -= 1; + scoreB -= int(eq_B_P); //Replace eq(P,PA) + } + +// D Zone + scoreD -= int(Dn3); + scoreD -= int(eq(G,Q)); + if (scoreD < 0) scoreZ = 0; + + if (eq_D_QA) { + scoreD -= 1; + scoreD -= int(eq_D_Q); //Replace eq(Q,QA) + } + + int scoreFinal = scoreE + scoreB + scoreD + scoreZ ; + + if (scoreE >= 1 && scoreB >= 0 && scoreD >=0) scoreFinal += 1; + + if (scoreFinal >= 2) return colX; + + if (scoreFinal == 1) return mixok ? Mix382 : colX; + + // Final supplement: total score 0, no deductions in B/D areas - forms long slope shape + if (scoreB >= 0 && scoreD >=0) { + if (B_wall&&D_tower) return colX; + if (B_tower&&D_wall) return colX; + } + + return slopeBAD; + +} // eq_E_A + + +/*========================================================= + F - H / B+ D+ extension new rule + ==================================================== zz */ + +// This block differs from sim block - center point and related En4square/BD are naturally isolated by a wall +// Therefore judgment rules differ from sim side + + eq_B_P = eq(B, P); + eq_B_PC = eq(B, PC); + eq_D_Q = eq(D, Q); + eq_D_QG = eq(D, QG); + + // Exit if B/D unconnected to any (Empirical: required for this branch block) + if ( !eq_B_C && !eq_B_P && !eq_B_PC && !eq_D_G && !eq_D_Q && !eq_D_QG ) return slopeBAD; + + mixok = mixcheck(colX,colE); + eq_E_I = eq(E, I); + + // Exit if center E is single high-contrast pixel + // Tighten threshold if E is highlight + float E_lumDiff = El > 0.92 ? 0.145898 : 0.381966; + // Large difference with surroundings + if ( !mixok && !eq_E_I && !EalphaL && abs(El-Fl)>E_lumDiff && abs(El-Hl)>E_lumDiff ) return slopeBAD; //xxx.alpha + + + eq_A_B = eq(A, B); + eq_A_P = eq(A, P); + eq_A_Q = eq(A, Q); + eq_B_PA = eq(B,PA); + eq_D_QA = eq(D,QA); + + ThickBorder = eq_A_B && (eq_A_P||eq_A_Q|| eq(A,AA)&&(eq_B_PA||eq_D_QA)); + + if (ThickBorder && !Xisblack) mixok=false; + + B_slope = eq_B_PC && !eq_B_P && !eq_B_C; + B_tower = eq_B_P && !eq_B_PC && !eq_B_C && !eq_B_PA; + D_slope = eq_D_QG && !eq_D_Q && !eq_D_G; + D_tower = eq_D_Q && !eq_D_QG && !eq_D_G && !eq_D_QA; + + if (!eq_A_B) { + // B + D + each extend shape + // Empirical 1: Looser conditions for one side if the other has clear shape + // Empirical 2: Outer side of "厂" shape break-even, inner side not break-even (can be tower but not wall) + if ( (B_slope||B_tower) && (eq_D_QG&&!eq_D_G||D_tower) ) return Xoff; + if ( (D_slope||D_tower) && (eq_B_PC&&!eq_B_C||B_tower) ) return Xoff; + + // A-side triple consecutive (eq_A_P && eq_A_Q) - high priority + if (comboA3) return Xoff; + + // combo 2x2 as supplement to above + if ( B_slope && eq_A_P ) return mixok ? Mix382off : Xoff; + if ( D_slope && eq_A_Q ) return mixok ? Mix382off : Xoff; + } + + eq_E_F = eq(E, F); + B_wall = eq_B_C && !eq_B_PC && !eq_B_P; + + // Long slope (clear, non-solid edge - strong trend!) + // Special condition for long slopes + if ( B_wall && D_tower ) { + if (eq_A_B ) return slopeBAD; + if (eq_E_F ) return colX; //wip: Test direct X no blending + return mixok ? Mix382off : Xoff; + } + + eq_E_H = eq(E, H); + D_wall = eq_D_G && !eq_D_QG&& !eq_D_Q; + + if ( B_tower && D_wall ) { + if (eq_A_B ) return slopeBAD; + if (eq_E_H ) return colX; + return mixok ? Mix382off : Xoff; + } + + + bool sim_X_E = sim3(colX,colE); + bool eq_G_H = eq(G, H); + bool eq_C_F = eq(C, F); + bool eq_H_S = eq(H, S); + bool eq_F_R = eq(F, R); + + En3 = eq_E_F&&eq_E_H; + + // 4-pixel rectangle inside wall (En3 && eq_E_I) + if ( En4square ) { // This square detection must come after previous rule + if (sim_X_E) return mixok ? Mix382off : Xoff; + // Exit for solid L-shaped inner wrap (fixes font edge corners and non-rounded building corners (Mega Man 7)) + if ( (eq_B_C || eq_D_G) && eq_A_B ) return theEXIT; + //if (eq_H_S && eq_F_R) return theEXIT; // Extend both sides + // L-shaped inner wrap (hollow corner) / high-contrast independent clear 4-pixel square / 6-pixel rectangle (note rectangle edges) + if ( ( eq_B_C&&!eq_G_H || eq_D_G&&!eq_C_F || !eq_G_H&&!eq_C_F&&diffEB>0.5) && (eq_H_S == eq(I, SI) && eq_F_R == eq(I, RI)) ) return theEXIT; + + return mixok ? Mix382off : Xoff; + } + + // Triangle inside wall + if ( En3 ) { + if (sim_X_E) return mixok ? Mix382off : Xoff; + if (eq_H_S && eq_F_R) return theEXIT; // Extend both sides (building edges) + // Inner curve + if (eq_B_C || eq_D_G) return mixok ? Mix382off : Xoff; + // Direct return if has thickness (Z-shaped snake can break-even outer curve below) + if (eq_A_B) return mixok ? Mix382off : Xoff; + // Outer curve + if (eq_B_P || eq_D_Q) return theEXIT; + + return mixok ? Mix382off : Xoff; + // Final two rules based on experience - principle: connect inner L curve, not outer (Jimmy's eyebrows in Double Dragon) + } + + // F - H + // Principle: connect inner L curve, not outer + if ( eq(F,H) ) { + if (sim_X_E||EalphaL) return mixok ? Mix382off : Xoff; //xxx.alpha + // Exit for solid L-shaped inner wrap - avoid single pixel squeezed by symmetric double wrap + if ( eq_B_C && eq_A_B && (eq_G_H||!eq_F_R) &&eq(F, I) ) return slopeBAD; + if ( eq_D_G && eq_A_B && (eq_C_F||!eq_H_S) &&eq(F, I) ) return slopeBAD; + + //Inner curve + if (eq_B_C && (eq_F_R||eq_G_H||eq(F, I))) return mixok ? Mix382off : Xoff; + if (eq_D_G && (eq_C_F||eq_H_S||eq(F, I))) return mixok ? Mix382off : Xoff; + // E-I F-H cross breaks trend + if (eq_E_I) return slopeBAD; + // Outer Z-shape + if (eq_B_P && eq_A_B) return mixok ? Mix382off : Xoff; + if (eq_D_Q && eq_A_B) return mixok ? Mix382off : Xoff; + // Outer curve - unless opposite side forms long L-shaped trend + if (eq_B_P && (eq_C_F&&eq_H_S)) return mixok ? Mix382off : Xoff; + if (eq_D_Q && (eq_F_R&&eq_G_H)) return mixok ? Mix382off : Xoff; + + return slopeBAD; + } + + + // Relaxed rule for final long slope cleanup (non-clear shapes) + // Note: This block handles different slopes than sim2 block - exit for solid corners + if ( eq_B_C && eq_D_Q || eq_D_G && eq_B_P) { + // Note: Clear eq_A_B first - otherwise single edge pixels get "corner cut" (eternal secret) + if (eq_A_B) return theEXIT; + return mixok ? Mix382off : Xoff; + } + + + // A-side triple consecutive - NEVER use without !eq_A_B ! ! ! ! ! ! ! ! + // if (comboA3) return X+slopeOFF; + + + // One more check for B + D bidirectional extension - higher priority than inner/outer L single strip below + if ( (B_slope||B_tower) && (eq_D_QG&&!eq_D_G||D_tower) ) return Xoff; + if ( (D_slope||D_tower) && (eq_B_PC&&!eq_B_C||B_tower) ) return Xoff; + + + // Exit for clear L-shaped corner with inner single strip (sim_X_E no exemption) + if (eq_A_B && !ThickBorder && !eq_E_I ) { + + if (B_wall && eq_E_F) return theEXIT; + if (D_wall && eq_E_H) return theEXIT; + } + +if (sim_X_E||EalphaL) return mixok ? Mix382off : Xoff; //xxx.alpha + // Exit for hollow L-shaped corner with outer single strip (connect inner corner, not outer) + // Empirical: Avoids font edge cutting (Captain Commando) + if ( (B_tower || D_tower) && (eq_E_F||eq_E_H) && !eq_A_B && !eq_E_I) return theEXIT; + + // Final individual extension check for B or D + + // Maximum distance usable for slope + if ( B_slope && !eq_A_B && eq(PC,CC) && noteq(PC,RC)) return mixok ? Mix382off : Xoff; + if ( D_slope && !eq_A_B && eq(QG,GG) && noteq(QG,SG)) return mixok ? Mix382off : Xoff; + + // Slope can use one less judgment point if X-E are close, with internal logic restrictions + if ( mixok && !eq_A_B ) { + if ( B_slope && (!eq_C_F||eq(F,RC)) ) return Mix382off; + if ( D_slope && (!eq_G_H||eq(H,SG)) ) return Mix382off; + } + + // Exclude single strip for Z-shaped snake below (necessary) + if ((eq_E_F||eq_E_H) && !eq_E_I ) return theEXIT; + + // Z-shaped snake (eq_A_B has thickness, one side is tower (can be wall/slope) but other side cannot be tower/wall (naturally prohibited)) + if ( eq_B_P && !eq_B_PA && !eq_D_Q && eq_A_B) return mixok ? Mix382off : Xoff; + if ( eq_D_Q && !eq_D_QA && !eq_B_P && eq_A_B) return mixok ? Mix382off : Xoff; + + return theEXIT; + +} // admixX + +vec4 admixS(uint A, uint B, uint C, uint D, uint E, uint F, uint G, uint H, uint I, uint R, uint RC, uint RI, uint S, uint SG, uint SI, uint II, bool eq_B_D, bool eq_E_D, float El, float Bl, vec4 colE, vec4 colF) { + + // ABC . + // QD🄴 🅵 🆁 Zone 4 + // 🅶 🅷 I + // S + // Empirical 1: sim E B(C) conforms to original logic - E single pixel won't look abrupt when inserted by saw in practice + // Empirical 2: Can E equal I? Yes! + + if (any_eq2(F,C,I)) return colE; + //if (any_eq3(F,A,C,I)) return colE; + + if (eq(R, RI) && noteq(R,I)) return colE; + if (eq(H, S) && noteq(H,I)) return colE; + + if ( eq(R, RC) || eq(G,SG) ) return colE; + + // Remove alpha channel weighting + Bl = fract(Bl) *10.0; + El = fract(El) *10.0; + + if ( ( eq_B_D&&eq(B,C)&&diffEB<0.381966 || eq_E_D&&sim2(colE,E,C) ) && + (any_eq3(I,H,S,RI) || eq(SI,RI)&¬eq(I,II)) ) return colF; + + return colE; +} + + +//////////////////////////////////////////// main line /////////////////////////////////////////////// pin zz + +void applyScaling(uvec2 xy) { + int srcX = int(xy.x); + int srcY = int(xy.y); + ivec2 destXY = ivec2(xy) * 2; + + uint E = src(srcX, srcY); + uint B = src(srcX, srcY-1); + uint D = src(srcX-1, srcY); + uint F = src(srcX+1, srcY); + uint H = src(srcX, srcY+1); + + vec4 colE = unpackUnorm4x8(E); + vec4 J = colE, K = colE, L = colE, M = colE; + + bool eq_E_D = eq(E,D); + bool eq_E_F = eq(E,F); + bool eq_E_B = eq(E,B); + bool eq_E_H = eq(E,H); + +// Skip horizontal/vertical 3x1 +if ( eq_E_D && eq_E_F || eq_E_B && eq_E_H) {writeJKLM;return;} + + bool eq_B_H = eq(B,H); + bool eq_D_F = eq(D,F); +// Skip center surrounded by mirrored blocks +if ( eq_B_H && eq_D_F ) {writeJKLM;return;} + + // Capture 5x5 + uint A = src(srcX-1, srcY-1); + uint C = src(srcX+1, srcY-1); + uint G = src(srcX-1, srcY+1); + uint I = src(srcX+1, srcY+1); + uint P = src(srcX, srcY-2); + uint Q = src(srcX-2, srcY); + uint R = src(srcX+2, srcY); + uint S = src(srcX, srcY+2); + + + uint PA = src(srcX-1, srcY-2); + uint PC = src(srcX+1, srcY-2); + uint QA = src(srcX-2, srcY-1); + uint QG = src(srcX-2, srcY+1); // AA PA [P] PC CC + uint RC = src(srcX+2, srcY-1); // ┌──┬──┬──┐ + uint RI = src(srcX+2, srcY+1); // QA │ A │ B │ C │ RC + uint SG = src(srcX-1, srcY+2); // ├──┼──┼──┤ + uint SI = src(srcX+1, srcY+2); // [Q] │ D │ E │ F │ [R] + uint AA = src(srcX-2, srcY-2); // ├──┼──┼──┤ + uint CC = src(srcX+2, srcY-2); // QG │ G │ H │ I │ RI + uint GG = src(srcX-2, srcY+2); // └──┴──┴──┘ + uint II = src(srcX+2, srcY+2); // GG SG [S] SI II + + + vec4 colB = unpackUnorm4x8(B); + vec4 colD = unpackUnorm4x8(D); + vec4 colF = unpackUnorm4x8(F); + vec4 colH = unpackUnorm4x8(H); + + float Bl = luma(colB), Dl = luma(colD), El = luma(colE), Fl = luma(colF), Hl = luma(colH); + + +// 1:1 slope rules (P95) + bool eq_B_D = eq(B,D); + bool eq_B_F = eq(B,F); + bool eq_D_H = eq(D,H); + bool eq_F_H = eq(F,H); + + // Center surrounded by any mirrored blocks + bool oppoPix = eq_B_H || eq_D_F; + // Flag for admixX entry via 1:1 slope rule + bool slope1 = false; bool slope2 = false; bool slope3 = false; bool slope4 = false; + // Standard pixel returned normally via 1:1 slope rule + bool slope1ok = false; bool slope2ok = false; bool slope3ok = false; bool slope4ok = false; + // slopeBAD: entered admixX but (at least one of JKLM) returns E point + // slopOFF: returned with OFF flag - no long slope calculation + bool slopeBAD_flag = false; + + // B - D + if ( (!eq_E_B&&!eq_E_D&&!oppoPix) && (!eq_D_H&&!eq_B_F) && (El>=Dl&&El>=Bl || eq(E,A)) && ( (El 1.0 ) { + if (J.b > 7.0 ) J=J-8.0; //slopOFF + if (J.b == 4.0 ) { + J=colE; + writeJKLM; + return; + } + if (J.b == 2.0 ) J=colE; //slopeBAD + } else slope1ok = true; + } + // B - F + if ( !slope1 && (!eq_E_B&&!eq_E_F&&!oppoPix) && (!eq_B_D&&!eq_F_H) && (El>=Bl&&El>=Fl || eq(E,C)) && ( (El 1.0 ) { + if (K.b > 7.0 ) K=K-8.0; + if (K.b == 4.0 ) { + K=colE; + writeJKLM; + return; + } + if (K.b == 2.0 ) K=colE; + } else {slope2ok = true;} + } + // D - H + if ( !slope1 && (!eq_E_D&&!eq_E_H&&!oppoPix) && (!eq_F_H&&!eq_B_D) && (El>=Hl&&El>=Dl || eq(E,G)) && ((El 1.0 ) { + if (L.b > 7.0 ) L=L-8.0; + if (L.b == 4.0 ) { + L=colE; + writeJKLM; + return; + } + if (L.b == 2.0 ) L=colE; + } else {slope3ok = true;} + } + // F - H + if ( !slope2 && !slope3 && (!eq_E_F&&!eq_E_H&&!oppoPix) && (!eq_B_F&&!eq_D_H) && (El>=Fl&&El>=Hl || eq(E,I)) && ((El 1.0 ) { + if (M.b > 7.0 ) M=M-8.0; + if (M.b == 4.0 ) { + M=colE; + writeJKLM; + return; + } + if (M.b == 2.0 ) M=colE; + } else {slope4ok = true;} + } + + +// long gentle 2:1 slope (P100) + + bool longslope = false; + + if (slope4ok && eq_F_H) { //zone4 long slope + // Extended original rule 1. Pass adjacent pixel to admixL third parameter to prevent double blending + // Extended original rule 2. No L-shape allowed in opposite two-pixel interval unless wall formed + if (eq(G,H) && eq(F,R) && noteq(R, RC) && (noteq(Q,G)||eq(Q, QA))) {L=admixL(M,L,colH); longslope = true;} + // vertical + if (eq(C,F) && eq(H,S) && noteq(S, SG) && (noteq(P,C)||eq(P, PA))) {K=admixL(M,K,colF); longslope = true;} + } + + + if (slope3ok && eq_D_H) { //zone3 long slope + // horizontal + if (eq(D,Q) && eq(H,I) && noteq(Q, QA) && (noteq(R,I)||eq(R, RC))) {M=admixL(L,M,colH); longslope = true;} + // vertical + if (eq(A,D) && eq(H,S) && noteq(S, SI) && (noteq(A,P)||eq(P, PC))) {J=admixL(L,J,colD); longslope = true;} + } + + if (slope2ok && eq_B_F) { //zone2 long slope + // horizontal + if (eq(A,B) && eq(F,R) && noteq(R, RI) && (noteq(A,Q)||eq(Q, QG))) {J=admixL(K,J,colB); longslope = true;} + // vertical + if (eq(F,I) && eq(B,P) && noteq(P, PA) && (noteq(I,S)||eq(S, SG))) {M=admixL(K,M,colF); longslope = true;} + } + + if (slope1ok && eq_B_D) { //zone1 long slope + // horizontal + if (eq(B,C) && eq(D,Q) && noteq(Q, QG) && (noteq(C,R)||eq(R, RI))) {K=admixL(J,K,colB); longslope = true;} + // vertical + if (eq(D,G) && eq(B,P) && noteq(P, PC) && (noteq(G,S)||eq(S, SI))) {L=admixL(J,L,colD); longslope = true;} + } + +// Exit after longslope formation - sawslope rarely forms on diagonal +bool skiprest = longslope; + +bool slopeok = slope1ok||slope2ok||slope3ok||slope4ok; + + +// Note: sawslope cannot exclude slopeOFF (few cases) and slopeBAD (very rare), but can exclude slopeok (strong shape) +if (!skiprest && !oppoPix && !slopeok) { + + + // horizontal bottom + if (!eq_E_H && none_eq2(H,A,C)) { + + // A B C ・ + // Q D 🄴 🅵 🆁 Zone 4 + // 🅶 🅷 I + // S + // (!slope3 && !eq_D_H) clever combination + if ( (!slope2 && !eq_B_F) && (!slope3 && !eq_D_H) && !eq_F_H && + !eq_E_F && (eq_B_D || eq_E_D) && eq(R,H) && eq(F,G) ) { + M = admixS(A,B,C,D,E,F,G,H,I,R,RC,RI,S,SG,SI,II,eq_B_D,eq_E_D,El,Bl,colE,colF); + skiprest = true;} + + // ・ A B C + // 🆀 🅳 🄴 F R Zone 3 + // G 🅷 🅸 + // S + if ( !skiprest && (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_D_H && + !eq_E_D && (eq_B_F || eq_E_F) && eq(Q,H) && eq(D,I) ) { + L = admixS(C,B,A,F,E,D,I,H,G,Q,QA,QG,S,SI,SG,GG,eq_B_F,eq_E_F,El,Bl,colE,colD); + skiprest = true;} + } + + // horizontal up + if ( !skiprest && !eq_E_B && none_eq2(B,G,I)) { + + // P + // 🅐 🅑 C + // QD 🄴 🅵 🆁 Zone 2 + // G H I . + if ( (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_B_F && + !eq_E_F && (eq_D_H || eq_E_D) && eq(B,R) && eq(A,F) ) { + K = admixS(G,H,I,D,E,F,A,B,C,R,RI,RC,P,PA,PC,CC,eq_D_H,eq_E_D,El,Hl,colE,colF); + skiprest = true;} + + // P + // A 🅑 🅲 + // 🆀 🅳 🄴 F R Zone 1 + // . G H I + if ( !skiprest && (!slope2 && !eq_B_F) && (!slope3 && !eq_D_H) && !eq_B_D && + !eq_E_D && (eq_F_H || eq_E_F) && eq(B,Q) && eq(C,D) ) { + J = admixS(I,H,G,F,E,D,C,B,A,Q,QG,QA,P,PC,PA,AA,eq_F_H,eq_E_F,El,Hl,colE,colD); + skiprest = true;} + + } + + // vertical left + if ( !skiprest && !eq_E_D && none_eq2(D,C,I) ) { + + // 🅐 B C + // Q 🅳 🄴 F R + // G 🅷 I Zone 3 + // 🆂 ・ + if ( (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_D_H && + !eq_E_H && (eq_B_F || eq_E_B) && eq(D,S) && eq(A,H) ) { + L = admixS(C,F,I,B,E,H,A,D,G,S,SI,SG,Q,QA,QG,GG,eq_B_F,eq_E_B,El,Fl,colE,colH); + skiprest = true;} + + // 🅟 ・ + // A 🅑 C + // Q 🅳 🄴 F R Zone 1 + // 🅶 HI + if ( !skiprest && (!slope3 && !eq_D_H) && (!slope2 && !eq_B_F) && !eq_B_D && + !eq_E_B && (eq_F_H || eq_E_H) && eq(P,D) && eq(B,G) ) { + J = admixS(I,F,C,H,E,B,G,D,A,P,PC,PA,Q,QG,QA,AA,eq_F_H,eq_E_H,El,Fl,colE,colB); + skiprest = true;} + + } + + // vertical right + if ( !skiprest && !eq_E_F && none_eq2(F,A,G) ) { // right + + // A B 🅲 + // Q D 🄴 🅵 R + // G 🅷 I Zone 4 + // . 🆂 + if ( (!slope2 && !eq_B_F) && (!slope3 && !eq_D_H) && !eq_F_H && + !eq_E_H && (eq_B_D || eq_E_B) && eq(S,F) && eq(H,C) ) { + M = admixS(A,D,G,B,E,H,C,F,I,S,SG,SI,R,RC,RI,II,eq_B_D,eq_E_B,El,Dl,colE,colH); + skiprest = true;} + + // ・ 🅟 + // A 🅑 C + // Q D 🄴 🅵 R Zone 2 + // G H 🅸 + if ( !skiprest && (!slope1 && !eq_B_D) && (!slope4 && !eq_F_H) && !eq_B_F && + !eq_E_B && (eq_D_H || eq_E_H) && eq(P,F) && eq(B,I) ) { + K = admixS(G,D,A,H,E,B,I,F,C,P,PA,PC,R,RI,RC,CC,eq_D_H,eq_E_H,El,Dl,colE,colB); + skiprest = true;} + + } // vertical right +} // sawslope + +// Exit after sawslope formation - legacy approach: skiprest||slopeBAD (also uses slopeOFF (weak) and slopok (strong) but poor effect) +skiprest = skiprest||slope1||slope2||slope3||slope4||El>7.0||Bl>7.0||Dl>7.0||Fl>7.0||Hl>7.0; + +/************************************************** + Concave + Cross shape (P100) + *************************************************/ +// Use approximate pixels for cross star far end - useful for horizontal line + sawtooth and layered gradient shapes. +// E.g. glowing text in SFIII: New Generation intro, Japanese houses in SFZ3 Mix, Fatal Fury: Wild Ambition intro + + vec4 colX; //Define temp X + + if (!skiprest && + Bl +#import #import @@ -10,6 +11,7 @@ @interface PPSSPPBaseViewController : UIViewController< UIImagePickerControllerDelegate, UINavigationControllerDelegate, + PHPickerViewControllerDelegate, CameraFrameDelegate, LocationHandlerDelegate, UIKeyInput, UIGestureRecognizerDelegate, iCadeEventDelegate> diff --git a/ios/ViewControllerCommon.mm b/ios/ViewControllerCommon.mm index ccf3ef3806..4964db869a 100644 --- a/ios/ViewControllerCommon.mm +++ b/ios/ViewControllerCommon.mm @@ -2,6 +2,8 @@ #import "ios/ViewControllerCommon.h" #import "ios/Controls.h" #import "ios/IAPManager.h" +#import +#import #include "Common/System/Request.h" #include "Common/Input/InputState.h" #include "Common/System/NativeApp.h" @@ -13,8 +15,6 @@ #include "Core/Config.h" @interface PPSSPPBaseViewController () { - int imageRequestId; - NSString *imageFilename; CameraHelper *cameraHelper; LocationHelper *locationHelper; ICadeTracker g_iCadeTracker; @@ -31,6 +31,35 @@ UIScreenEdgePanGestureRecognizer *mBackGestureRecognizer; } +// Strange idiom for generating unique IDs (within the process, at least). +static const void *kPickerFilenameKey = &kPickerFilenameKey; +static const void *kPickerRequestIdKey = &kPickerRequestIdKey; + +static void SetPickerContext(id picker, NSString *filename, int requestId) { + objc_setAssociatedObject(picker, kPickerFilenameKey, filename, OBJC_ASSOCIATION_COPY_NONATOMIC); + objc_setAssociatedObject(picker, kPickerRequestIdKey, @(requestId), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static NSString *GetPickerFilename(id picker) { + return (NSString *)objc_getAssociatedObject(picker, kPickerFilenameKey); +} + +static int GetPickerRequestId(id picker) { + NSNumber *requestIdNumber = (NSNumber *)objc_getAssociatedObject(picker, kPickerRequestIdKey); + return requestIdNumber ? requestIdNumber.intValue : -1; +} + +- (void)savePickedImage:(UIImage *)image toFilename:(NSString *)targetFilename requestId:(int)requestId { + NSData *jpegData = UIImageJPEGRepresentation(image, 0.9); + if (jpegData) { + [jpegData writeToFile:targetFilename atomically:YES]; + NSLog(@"Saved JPEG image to %@", targetFilename); + g_requestManager.PostSystemSuccess(requestId, "", 1); + } else { + g_requestManager.PostSystemFailure(requestId); + } +} + - (id)init { self = [super init]; if (self) { @@ -182,31 +211,71 @@ } - (void)pickPhoto:(NSString *)saveFilename requestId:(int)requestId { - imageRequestId = requestId; - imageFilename = saveFilename; NSLog(@"Picking photo to save to %@ (id: %d)", saveFilename, requestId); + NSString *targetFilename = [saveFilename copy]; + + if (@available(iOS 14.0, *)) { + PHPickerConfiguration *config = [[PHPickerConfiguration alloc] initWithPhotoLibrary:PHPhotoLibrary.sharedPhotoLibrary]; + config.selectionLimit = 1; + config.filter = [PHPickerFilter imagesFilter]; + + PHPickerViewController *picker = [[PHPickerViewController alloc] initWithConfiguration:config]; + picker.delegate = self; + SetPickerContext(picker, targetFilename, requestId); + [self presentViewController:picker animated:YES completion:nil]; + return; + } UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; + // Images only keeps the picker from doing extra video-related setup. + picker.mediaTypes = @[@"public.image"]; picker.delegate = self; + SetPickerContext(picker, targetFilename, requestId); [self presentViewController:picker animated:YES completion:nil]; } +- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray *)results API_AVAILABLE(ios(14.0)) { + NSString *targetFilename = GetPickerFilename(picker); + int requestId = GetPickerRequestId(picker); + + [picker dismissViewControllerAnimated:YES completion:nil]; + + if (results.count == 0) { + NSLog(@"User cancelled photo picker"); + g_requestManager.PostSystemFailure(requestId); + [self hideKeyboard]; + return; + } + + NSItemProvider *itemProvider = results.firstObject.itemProvider; + if (![itemProvider canLoadObjectOfClass:[UIImage class]]) { + NSLog(@"Photo picker result does not provide UIImage"); + g_requestManager.PostSystemFailure(requestId); + [self hideKeyboard]; + return; + } + + [itemProvider loadObjectOfClass:[UIImage class] completionHandler:^(UIImage *image, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (error || !image) { + NSLog(@"Failed loading picked image: %@", error); + g_requestManager.PostSystemFailure(requestId); + } else { + [self savePickedImage:image toFilename:targetFilename requestId:requestId]; + } + [self hideKeyboard]; + }); + }]; +} + - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { + NSString *targetFilename = GetPickerFilename(picker); + int requestId = GetPickerRequestId(picker); UIImage *image = info[UIImagePickerControllerOriginalImage]; - - // Convert to JPEG with 90% quality - NSData *jpegData = UIImageJPEGRepresentation(image, 0.9); - if (jpegData) { - // Do something with the JPEG data (e.g., save to file) - [jpegData writeToFile:imageFilename atomically:YES]; - NSLog(@"Saved JPEG image to %@", imageFilename); - g_requestManager.PostSystemSuccess(imageRequestId, "", 1); - } else { - g_requestManager.PostSystemFailure(imageRequestId); - } + [self savePickedImage:image toFilename:targetFilename requestId:requestId]; [picker dismissViewControllerAnimated:YES completion:nil]; @@ -215,11 +284,12 @@ - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { NSLog(@"User cancelled image picker"); + int requestId = GetPickerRequestId(picker); [picker dismissViewControllerAnimated:YES completion:nil]; // You can also call your custom callback or use the requestId here - g_requestManager.PostSystemFailure(imageRequestId); + g_requestManager.PostSystemFailure(requestId); [self hideKeyboard]; }